@buoy-design/cli 0.3.36 → 0.3.37

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 (26) hide show
  1. package/dist/commands/check.js.sync-conflict-20260313-114446-6PCZ3ZU.map +1 -0
  2. package/dist/commands/dock.js.sync-conflict-20260313-172700-6PCZ3ZU.map +1 -0
  3. package/dist/commands/show.d.ts.map +1 -1
  4. package/dist/commands/show.js +131 -12
  5. package/dist/commands/show.js.map +1 -1
  6. package/dist/config/loader.d.ts.sync-conflict-20260313-145931-6PCZ3ZU.map +1 -0
  7. package/dist/config/schema.sync-conflict-20260313-173553-6PCZ3ZU.d.ts +1812 -0
  8. package/dist/config/schema.sync-conflict-20260313-173553-6PCZ3ZU.d.ts.map +1 -0
  9. package/dist/config/schema.sync-conflict-20260313-173553-6PCZ3ZU.js +214 -0
  10. package/dist/config/schema.sync-conflict-20260313-173553-6PCZ3ZU.js.map +1 -0
  11. package/dist/detect/frameworks.sync-conflict-20260313-150557-6PCZ3ZU.js +252 -0
  12. package/dist/detect/monorepo-patterns.sync-conflict-20260311-182757-6PCZ3ZU.js +209 -0
  13. package/dist/hooks/index.sync-conflict-20260311-082258-6PCZ3ZU.js +616 -0
  14. package/dist/output/reporters.js.sync-conflict-20260313-164629-6PCZ3ZU.map +1 -0
  15. package/dist/services/drift-analysis.d.ts +2 -0
  16. package/dist/services/drift-analysis.d.ts.map +1 -1
  17. package/dist/services/drift-analysis.js +1 -0
  18. package/dist/services/drift-analysis.js.map +1 -1
  19. package/dist/services/drift-analysis.js.sync-conflict-20260313-152307-6PCZ3ZU.map +1 -0
  20. package/dist/services/remote-check.d.ts +4 -0
  21. package/dist/services/remote-check.d.ts.map +1 -1
  22. package/dist/services/remote-check.js +15 -1
  23. package/dist/services/remote-check.js.map +1 -1
  24. package/dist/services/skill-export.js.sync-conflict-20260313-155735-6PCZ3ZU.map +1 -0
  25. package/dist/services/skill-export.sync-conflict-20260313-161246-6PCZ3ZU.js +737 -0
  26. package/package.json +3 -3
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.sync-conflict-20260313-173553-6PCZ3ZU.d.ts","sourceRoot":"","sources":["../../src/config/schema.sync-conflict-20260313-173553-6PCZ3ZU.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,214 @@
1
+ import { z } from 'zod';
2
+ // Base component source config (shared by all component scanners)
3
+ export const ComponentSourceConfigSchema = z.object({
4
+ enabled: z.boolean().default(true),
5
+ include: z.array(z.string()),
6
+ exclude: z.array(z.string()).default(['**/*.test.*', '**/*.spec.*', '**/*.stories.*']),
7
+ designSystemPackage: z.string().optional(),
8
+ });
9
+ // React source config
10
+ export const ReactConfigSchema = ComponentSourceConfigSchema.extend({
11
+ include: z.array(z.string()).default(['src/**/*.tsx', 'src/**/*.jsx']),
12
+ });
13
+ // Next.js source config
14
+ export const NextJSConfigSchema = ComponentSourceConfigSchema.extend({
15
+ include: z.array(z.string()).default(['app/**/*.tsx', 'app/**/*.jsx', 'src/**/*.tsx', 'src/**/*.jsx', 'components/**/*.tsx', 'components/**/*.jsx']),
16
+ /** Whether to scan App Router structure (default: true) */
17
+ appRouter: z.boolean().default(true),
18
+ /** Whether to scan CSS modules (default: true) */
19
+ cssModules: z.boolean().default(true),
20
+ /** Whether to validate next/image usage (default: true) */
21
+ validateImage: z.boolean().default(true),
22
+ });
23
+ // Vue source config
24
+ export const VueConfigSchema = ComponentSourceConfigSchema.extend({
25
+ include: z.array(z.string()).default(['src/**/*.vue']),
26
+ });
27
+ // Svelte source config
28
+ export const SvelteConfigSchema = ComponentSourceConfigSchema.extend({
29
+ include: z.array(z.string()).default(['src/**/*.svelte']),
30
+ });
31
+ // Angular source config
32
+ // Note: Defaults to **/*.ts to catch Angular Material-style naming (e.g., button.ts, tab.ts)
33
+ // as well as standard *.component.ts files
34
+ export const AngularConfigSchema = ComponentSourceConfigSchema.extend({
35
+ include: z.array(z.string()).default(['src/**/*.ts']),
36
+ });
37
+ // Web component source config (Lit, Stencil)
38
+ export const WebComponentConfigSchema = ComponentSourceConfigSchema.extend({
39
+ include: z.array(z.string()).default(['src/**/*.ts']),
40
+ framework: z.enum(['lit', 'stencil', 'auto']).default('auto'),
41
+ });
42
+ // Template source config (Blade, ERB, Twig, etc.)
43
+ export const TemplateConfigSchema = z.object({
44
+ enabled: z.boolean().default(true),
45
+ include: z.array(z.string()),
46
+ exclude: z.array(z.string()).default(['**/vendor/**', '**/cache/**']),
47
+ type: z.enum([
48
+ // Server-side templates
49
+ 'blade', 'erb', 'twig', 'php', 'html', 'njk', 'razor', 'hbs', 'mustache',
50
+ 'ejs', 'pug', 'liquid', 'slim', 'haml', 'jinja', 'django', 'thymeleaf',
51
+ 'freemarker', 'go-template', 'edge', 'eta', 'heex', 'velocity', 'xslt',
52
+ // JS frameworks
53
+ 'astro', 'solid', 'qwik', 'marko', 'lit', 'fast', 'angular', 'stencil',
54
+ 'alpine', 'htmx',
55
+ // Static site generators
56
+ 'hugo', 'jekyll', 'eleventy', 'shopify',
57
+ // Documentation
58
+ 'markdown', 'mdx', 'asciidoc',
59
+ // Graphics
60
+ 'svg',
61
+ // Data templates
62
+ 'yaml-template', 'json-template'
63
+ ]),
64
+ });
65
+ // Figma source config
66
+ export const FigmaConfigSchema = z.object({
67
+ enabled: z.boolean().default(false),
68
+ accessToken: z.string().optional(),
69
+ fileKeys: z.array(z.string()).default([]),
70
+ componentPageName: z.string().default('Components'),
71
+ tokenPageName: z.string().default('Design Tokens'),
72
+ });
73
+ // Storybook source config
74
+ export const StorybookConfigSchema = z.object({
75
+ enabled: z.boolean().default(false),
76
+ url: z.string().optional(),
77
+ staticDir: z.string().optional(),
78
+ });
79
+ // Token source config
80
+ export const TokenConfigSchema = z.object({
81
+ enabled: z.boolean().default(true),
82
+ files: z.array(z.string()).default([]),
83
+ cssVariablePrefix: z.string().optional(),
84
+ /** Glob patterns for canonical (source-of-truth) token files */
85
+ canonical: z.array(z.string()).default([]),
86
+ });
87
+ // Tailwind source config (for arbitrary value detection)
88
+ export const TailwindConfigSchema = z.object({
89
+ enabled: z.boolean().default(true),
90
+ files: z.array(z.string()).default(['src/**/*.tsx', 'src/**/*.jsx', 'src/**/*.vue', 'src/**/*.svelte']),
91
+ exclude: z.array(z.string()).default(['**/node_modules/**', '**/dist/**', '**/.next/**']),
92
+ });
93
+ // Sources config
94
+ export const SourcesConfigSchema = z.object({
95
+ // JS Frameworks
96
+ react: ReactConfigSchema.optional(),
97
+ nextjs: NextJSConfigSchema.optional(),
98
+ vue: VueConfigSchema.optional(),
99
+ svelte: SvelteConfigSchema.optional(),
100
+ angular: AngularConfigSchema.optional(),
101
+ webcomponent: WebComponentConfigSchema.optional(),
102
+ // Templates
103
+ templates: TemplateConfigSchema.optional(),
104
+ // CSS Frameworks
105
+ tailwind: TailwindConfigSchema.optional(),
106
+ // Design tools
107
+ figma: FigmaConfigSchema.optional(),
108
+ storybook: StorybookConfigSchema.optional(),
109
+ tokens: TokenConfigSchema.optional(),
110
+ });
111
+ // Shared filter fields for ignore/promote/enforce rules
112
+ const DriftRuleFilterFields = {
113
+ type: z.string().optional(),
114
+ severity: z.enum(['info', 'warning', 'critical']).optional(),
115
+ file: z.string().optional(),
116
+ component: z.string().optional(),
117
+ token: z.string().optional(),
118
+ value: z.string().optional(),
119
+ };
120
+ // Drift ignore rule — all filter fields optional, multiple = AND
121
+ export const DriftIgnoreSchema = z.object({
122
+ ...DriftRuleFilterFields,
123
+ reason: z.string().optional(),
124
+ });
125
+ // Drift promote rule — elevate severity of matching drifts
126
+ export const DriftPromoteSchema = z.object({
127
+ ...DriftRuleFilterFields,
128
+ to: z.enum(['info', 'warning', 'critical']),
129
+ reason: z.string(),
130
+ });
131
+ // Drift enforce rule — always set matching drifts to critical
132
+ export const DriftEnforceSchema = z.object({
133
+ type: z.string().optional(),
134
+ file: z.string().optional(),
135
+ component: z.string().optional(),
136
+ token: z.string().optional(),
137
+ value: z.string().optional(),
138
+ reason: z.string(),
139
+ });
140
+ // Aggregation config for grouping drift signals
141
+ export const AggregationConfigSchema = z.object({
142
+ /** Strategy order: value, suggestion, path, entity */
143
+ strategies: z.array(z.enum(['value', 'suggestion', 'path', 'entity'])).default(['value', 'suggestion', 'path', 'entity']),
144
+ /** Minimum signals to form a group */
145
+ minGroupSize: z.number().min(1).default(2),
146
+ /** Path patterns for path-based grouping (e.g., "src/legacy/**") */
147
+ pathPatterns: z.array(z.string()).default([]),
148
+ });
149
+ // Per-drift-type config
150
+ export const DriftTypeConfigSchema = z.object({
151
+ enabled: z.boolean().default(true),
152
+ severity: z.enum(['info', 'warning', 'critical']).optional(),
153
+ minOccurrences: z.number().min(2).optional(),
154
+ matching: z.enum(['exact', 'tight', 'loose']).optional(),
155
+ }).passthrough();
156
+ // Drift config
157
+ export const DriftConfigSchema = z.object({
158
+ ignore: z.array(DriftIgnoreSchema).default([]),
159
+ promote: z.array(DriftPromoteSchema).default([]),
160
+ enforce: z.array(DriftEnforceSchema).default([]),
161
+ severity: z.record(z.enum(['info', 'warning', 'critical'])).default({}),
162
+ aggregation: AggregationConfigSchema.default({}),
163
+ types: z.record(DriftTypeConfigSchema).default({}),
164
+ /** Severity threshold for exit code 1 in drift check */
165
+ failOn: z.enum(['info', 'warning', 'critical', 'none']).optional(),
166
+ /** Drift types to exclude from scanning */
167
+ exclude: z.array(z.string()).optional(),
168
+ });
169
+ // Claude config
170
+ export const ClaudeConfigSchema = z.object({
171
+ enabled: z.boolean().default(false),
172
+ model: z.string().default('claude-sonnet-4-20250514'),
173
+ autoExplain: z
174
+ .object({
175
+ enabled: z.boolean().default(false),
176
+ minSeverity: z.enum(['info', 'warning', 'critical']).default('warning'),
177
+ })
178
+ .optional(),
179
+ });
180
+ // Project config
181
+ export const ProjectConfigSchema = z.object({
182
+ name: z.string(),
183
+ apiEndpoint: z.string().optional(),
184
+ });
185
+ // Output config
186
+ export const OutputConfigSchema = z.object({
187
+ format: z.enum(['table', 'json', 'markdown']).default('table'),
188
+ colors: z.boolean().default(true),
189
+ });
190
+ // Health config — CI gating on health score
191
+ export const HealthConfigSchema = z.object({
192
+ /** Minimum health score (0-100) — exit code 1 if below */
193
+ failBelow: z.number().min(0).max(100).optional(),
194
+ });
195
+ // Experimental features config (repeatedPatternDetection is now always-on, kept for backwards compat)
196
+ export const ExperimentalConfigSchema = z.object({
197
+ repeatedPatternDetection: z.boolean().optional(),
198
+ }).default({});
199
+ // Main config schema
200
+ export const BuoyConfigSchema = z.object({
201
+ project: ProjectConfigSchema,
202
+ preset: z.enum(['strict', 'relaxed', 'default']).optional(),
203
+ sources: SourcesConfigSchema.default({}),
204
+ drift: DriftConfigSchema.default({}),
205
+ health: HealthConfigSchema.default({}),
206
+ claude: ClaudeConfigSchema.default({}),
207
+ output: OutputConfigSchema.default({}),
208
+ experimental: ExperimentalConfigSchema.default({}),
209
+ });
210
+ // Helper to define config (for user-facing config files)
211
+ export function defineConfig(config) {
212
+ return BuoyConfigSchema.parse(config);
213
+ }
214
+ //# sourceMappingURL=schema.sync-conflict-20260313-173553-6PCZ3ZU.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.sync-conflict-20260313-173553-6PCZ3ZU.js","sourceRoot":"","sources":["../../src/config/schema.sync-conflict-20260313-173553-6PCZ3ZU.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,252 @@
1
+ import { resolve } from 'node:path';
2
+ import { existsSync } from 'node:fs';
3
+ import { readFile } from 'node:fs/promises';
4
+ import { glob } from 'glob';
5
+ // Built-in scanners - no plugins needed for these
6
+ export const BUILTIN_SCANNERS = {
7
+ react: { description: 'React/JSX component scanning', detects: 'React components' },
8
+ nextjs: { description: 'Next.js App Router scanning', detects: 'Next.js server/client components, routes, CSS modules' },
9
+ vue: { description: 'Vue SFC scanning', detects: 'Vue components' },
10
+ svelte: { description: 'Svelte component scanning', detects: 'Svelte components' },
11
+ angular: { description: 'Angular component scanning', detects: 'Angular components' },
12
+ webcomponents: { description: 'Lit/Stencil scanning', detects: 'Web Components' },
13
+ tokens: { description: 'CSS/SCSS/JSON token scanning', detects: 'Design tokens' },
14
+ templates: { description: 'Template scanning (Blade, ERB, Twig)', detects: 'Server templates' },
15
+ tailwind: { description: 'Tailwind config & arbitrary value detection', detects: 'Tailwind CSS' },
16
+ };
17
+ // These require external configuration or APIs (future)
18
+ export const PLUGIN_INFO = {
19
+ figma: {
20
+ name: '@buoy-design/plugin-figma',
21
+ description: 'Connects to Figma to compare design tokens with your codebase.',
22
+ detects: 'Figma configuration',
23
+ examples: ['Token value drift between Figma and code', 'Missing component implementations'],
24
+ },
25
+ storybook: {
26
+ name: '@buoy-design/plugin-storybook',
27
+ description: 'Scans Storybook stories to verify component coverage.',
28
+ detects: 'Storybook configuration',
29
+ examples: ['Components without stories', 'Undocumented variants'],
30
+ },
31
+ };
32
+ // Framework detection patterns
33
+ // scanner = built-in (no install needed), plugin = optional enhancement
34
+ const FRAMEWORK_PATTERNS = [
35
+ // React ecosystem - built-in scanner
36
+ { name: 'react', scanner: 'react', packages: ['react', 'react-dom'] },
37
+ { name: 'next', scanner: 'nextjs', packages: ['next'] },
38
+ { name: 'remix', scanner: 'react', packages: ['@remix-run/react'] },
39
+ { name: 'gatsby', scanner: 'react', packages: ['gatsby'] },
40
+ // Vue ecosystem - built-in scanner
41
+ { name: 'vue', scanner: 'vue', packages: ['vue'] },
42
+ { name: 'nuxt', scanner: 'vue', packages: ['nuxt', 'nuxt3'] },
43
+ // Svelte ecosystem - built-in scanner
44
+ { name: 'svelte', scanner: 'svelte', packages: ['svelte'] },
45
+ { name: 'sveltekit', scanner: 'svelte', packages: ['@sveltejs/kit'] },
46
+ // Angular - built-in scanner
47
+ { name: 'angular', scanner: 'angular', packages: ['@angular/core'] },
48
+ // Web Components - built-in scanner
49
+ { name: 'lit', scanner: 'webcomponents', packages: ['lit', 'lit-element'] },
50
+ { name: 'stencil', scanner: 'webcomponents', packages: ['@stencil/core'] },
51
+ // Astro - built-in template scanner
52
+ { name: 'astro', scanner: 'astro', packages: ['astro'] },
53
+ // CSS/Tokens - built-in
54
+ { name: 'tailwind', scanner: 'tailwind', packages: ['tailwindcss'], files: ['tailwind.config.*'] },
55
+ // Design tools - require plugins
56
+ { name: 'figma', plugin: 'figma', files: ['.figmarc', 'figma.config.*'] },
57
+ { name: 'storybook', plugin: 'storybook', packages: ['@storybook/react', '@storybook/vue3', '@storybook/svelte'], files: ['.storybook/**'] },
58
+ // Design system libraries (detection only - no scanner)
59
+ { name: 'mui', packages: ['@mui/material', '@mui/core', '@material-ui/core'] },
60
+ { name: 'chakra', packages: ['@chakra-ui/react', '@chakra-ui/core'] },
61
+ { name: 'mantine', packages: ['@mantine/core'] },
62
+ { name: 'ant-design', packages: ['antd'] },
63
+ { name: 'headlessui', packages: ['@headlessui/react', '@headlessui/vue'] },
64
+ { name: 'fluentui', packages: ['@fluentui/react-components'] },
65
+ { name: 'nextui', packages: ['@nextui-org/react'] },
66
+ { name: 'primereact', packages: ['primereact'] },
67
+ { name: 'ariakit', packages: ['@ariakit/react'] },
68
+ { name: 'vuetify', packages: ['vuetify'] },
69
+ { name: 'element-plus', packages: ['element-plus'] },
70
+ { name: 'naive-ui', packages: ['naive-ui'] },
71
+ { name: 'bootstrap', packages: ['bootstrap', 'react-bootstrap'] },
72
+ // CSS-in-JS (acts as utility framework for styling)
73
+ { name: 'styled-components', packages: ['styled-components'] },
74
+ { name: 'emotion', packages: ['@emotion/react', '@emotion/styled'] },
75
+ { name: 'stitches', packages: ['@stitches/react'] },
76
+ ];
77
+ export async function detectFrameworks(projectRoot, monorepoInfo) {
78
+ const detected = [];
79
+ // Collect all dependency names from root and workspace packages
80
+ const allDeps = {};
81
+ // Read root package.json
82
+ const pkgPath = resolve(projectRoot, 'package.json');
83
+ if (existsSync(pkgPath)) {
84
+ try {
85
+ const pkgJson = JSON.parse(await readFile(pkgPath, 'utf-8'));
86
+ Object.assign(allDeps, pkgJson.dependencies, pkgJson.devDependencies);
87
+ }
88
+ catch {
89
+ // Invalid JSON, continue
90
+ }
91
+ }
92
+ // If monorepo, also check workspace package.json files
93
+ if (monorepoInfo && monorepoInfo.patterns.length > 0) {
94
+ for (const wsPattern of monorepoInfo.patterns) {
95
+ // Convert workspace pattern to package.json glob
96
+ // e.g., "apps/*" -> "apps/*/package.json"
97
+ // e.g., "packages/**/*" -> "packages/**/*/package.json"
98
+ const normalizedPattern = wsPattern.replace(/\/?$/, '');
99
+ const pkgPattern = normalizedPattern.endsWith('*')
100
+ ? `${normalizedPattern}/package.json`
101
+ : `${normalizedPattern}/*/package.json`;
102
+ try {
103
+ const matches = await glob(pkgPattern, { cwd: projectRoot, nodir: true });
104
+ for (const match of matches.slice(0, 20)) { // Limit to 20 packages
105
+ try {
106
+ const wsPkgPath = resolve(projectRoot, match);
107
+ const wsPkgJson = JSON.parse(await readFile(wsPkgPath, 'utf-8'));
108
+ Object.assign(allDeps, wsPkgJson.dependencies, wsPkgJson.devDependencies);
109
+ }
110
+ catch {
111
+ // Invalid JSON, skip this package
112
+ }
113
+ }
114
+ }
115
+ catch {
116
+ // Glob failed, continue
117
+ }
118
+ }
119
+ }
120
+ const depNames = Object.keys(allDeps);
121
+ for (const pattern of FRAMEWORK_PATTERNS) {
122
+ // Check package.json dependencies
123
+ if (pattern.packages) {
124
+ const matchedPkg = pattern.packages.find((pkg) => depNames.includes(pkg));
125
+ if (matchedPkg) {
126
+ detected.push({
127
+ name: pattern.name,
128
+ scanner: pattern.scanner,
129
+ plugin: pattern.plugin,
130
+ confidence: 'high',
131
+ evidence: `Found "${matchedPkg}" in package.json`,
132
+ });
133
+ continue;
134
+ }
135
+ }
136
+ // Check for config files
137
+ if (pattern.files) {
138
+ for (const filePattern of pattern.files) {
139
+ const matches = await glob(filePattern, { cwd: projectRoot, nodir: true });
140
+ if (matches.length > 0) {
141
+ detected.push({
142
+ name: pattern.name,
143
+ scanner: pattern.scanner,
144
+ plugin: pattern.plugin,
145
+ confidence: pattern.packages ? 'medium' : 'high',
146
+ evidence: `Found ${matches[0]}`,
147
+ matchedFiles: matches.slice(0, 5), // Keep up to 5 files for display
148
+ });
149
+ break;
150
+ }
151
+ }
152
+ }
153
+ }
154
+ // Special case: Radix UI uses many scoped packages (@radix-ui/react-*)
155
+ if (!detected.some(d => d.name === 'radix')) {
156
+ const hasRadix = depNames.some(dep => dep.startsWith('@radix-ui/react-'));
157
+ if (hasRadix) {
158
+ detected.push({
159
+ name: 'radix',
160
+ confidence: 'high',
161
+ evidence: 'Found @radix-ui/react-* packages',
162
+ });
163
+ }
164
+ }
165
+ // Special case: Tailwind v4 uses @import "tailwindcss" in CSS instead of package.json
166
+ if (!detected.some(d => d.name === 'tailwind')) {
167
+ const cssFiles = await glob('**/*.css', {
168
+ cwd: projectRoot,
169
+ nodir: true,
170
+ ignore: ['**/node_modules/**', '**/dist/**', '**/build/**', '**/.next/**'],
171
+ maxDepth: 4,
172
+ });
173
+ for (const file of cssFiles.slice(0, 20)) {
174
+ try {
175
+ const content = await readFile(resolve(projectRoot, file), 'utf-8');
176
+ if (content.includes('@import "tailwindcss"') || content.includes("@import 'tailwindcss'") || /@theme\s+(inline\s+)?{/.test(content)) {
177
+ detected.push({
178
+ name: 'tailwind',
179
+ scanner: 'tailwind',
180
+ confidence: 'high',
181
+ evidence: `Found Tailwind v4 in ${file}`,
182
+ matchedFiles: [file],
183
+ });
184
+ break;
185
+ }
186
+ }
187
+ catch {
188
+ // ignore
189
+ }
190
+ }
191
+ }
192
+ // Special case: shadcn/ui uses vendored components in components/ui/
193
+ if (!detected.some(d => d.name === 'shadcn')) {
194
+ const shadcnFiles = await glob('**/components/ui/button.tsx', {
195
+ cwd: projectRoot,
196
+ nodir: true,
197
+ ignore: ['**/node_modules/**', '**/dist/**', '**/build/**'],
198
+ maxDepth: 5,
199
+ });
200
+ if (shadcnFiles.length > 0) {
201
+ try {
202
+ const content = await readFile(resolve(projectRoot, shadcnFiles[0]), 'utf-8');
203
+ if (content.includes('@radix-ui') || content.includes('class-variance-authority') || content.includes('cva')) {
204
+ detected.push({
205
+ name: 'shadcn',
206
+ confidence: 'high',
207
+ evidence: `Found shadcn/ui components in ${shadcnFiles[0]}`,
208
+ matchedFiles: shadcnFiles.slice(0, 5),
209
+ });
210
+ }
211
+ }
212
+ catch {
213
+ // ignore
214
+ }
215
+ }
216
+ }
217
+ // Deduplicate by scanner or plugin name, keeping highest confidence
218
+ const byKey = new Map();
219
+ for (const d of detected) {
220
+ const key = d.scanner || d.plugin || d.name;
221
+ const existing = byKey.get(key);
222
+ if (!existing || confidenceRank(d.confidence) > confidenceRank(existing.confidence)) {
223
+ byKey.set(key, d);
224
+ }
225
+ }
226
+ return Array.from(byKey.values());
227
+ }
228
+ function confidenceRank(c) {
229
+ return c === 'high' ? 3 : c === 'medium' ? 2 : 1;
230
+ }
231
+ export function detectPackageManager(projectRoot = process.cwd()) {
232
+ if (existsSync(resolve(projectRoot, 'pnpm-lock.yaml'))) {
233
+ return 'pnpm';
234
+ }
235
+ if (existsSync(resolve(projectRoot, 'yarn.lock'))) {
236
+ return 'yarn';
237
+ }
238
+ return 'npm';
239
+ }
240
+ export function getPluginInstallCommand(plugins, projectRoot = process.cwd()) {
241
+ const fullNames = plugins.map((p) => `@buoy-design/plugin-${p}`);
242
+ const pm = detectPackageManager(projectRoot);
243
+ switch (pm) {
244
+ case 'pnpm':
245
+ return `pnpm add -D ${fullNames.join(' ')}`;
246
+ case 'yarn':
247
+ return `yarn add -D ${fullNames.join(' ')}`;
248
+ default:
249
+ return `npm install --save-dev ${fullNames.join(' ')}`;
250
+ }
251
+ }
252
+ //# sourceMappingURL=frameworks.js.map