@buoy-design/cli 0.3.35 → 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.
- package/dist/commands/check.js.sync-conflict-20260313-114446-6PCZ3ZU.map +1 -0
- package/dist/commands/dock.js.sync-conflict-20260313-172700-6PCZ3ZU.map +1 -0
- package/dist/commands/show.d.ts.map +1 -1
- package/dist/commands/show.js +131 -12
- package/dist/commands/show.js.map +1 -1
- package/dist/config/loader.d.ts.sync-conflict-20260313-145931-6PCZ3ZU.map +1 -0
- package/dist/config/schema.sync-conflict-20260313-173553-6PCZ3ZU.d.ts +1812 -0
- package/dist/config/schema.sync-conflict-20260313-173553-6PCZ3ZU.d.ts.map +1 -0
- package/dist/config/schema.sync-conflict-20260313-173553-6PCZ3ZU.js +214 -0
- package/dist/config/schema.sync-conflict-20260313-173553-6PCZ3ZU.js.map +1 -0
- package/dist/detect/frameworks.sync-conflict-20260313-150557-6PCZ3ZU.js +252 -0
- package/dist/detect/monorepo-patterns.sync-conflict-20260311-182757-6PCZ3ZU.js +209 -0
- package/dist/hooks/index.sync-conflict-20260311-082258-6PCZ3ZU.js +616 -0
- package/dist/output/reporters.js.sync-conflict-20260313-164629-6PCZ3ZU.map +1 -0
- package/dist/services/drift-analysis.d.ts +2 -0
- package/dist/services/drift-analysis.d.ts.map +1 -1
- package/dist/services/drift-analysis.js +68 -1
- package/dist/services/drift-analysis.js.map +1 -1
- package/dist/services/drift-analysis.js.sync-conflict-20260313-152307-6PCZ3ZU.map +1 -0
- package/dist/services/remote-check.d.ts +4 -0
- package/dist/services/remote-check.d.ts.map +1 -1
- package/dist/services/remote-check.js +15 -1
- package/dist/services/remote-check.js.map +1 -1
- package/dist/services/skill-export.js.sync-conflict-20260313-155735-6PCZ3ZU.map +1 -0
- package/dist/services/skill-export.sync-conflict-20260313-161246-6PCZ3ZU.js +737 -0
- 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
|