@buoy-design/cli 0.1.0 → 0.1.1

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 (70) hide show
  1. package/LICENSE +21 -0
  2. package/dist/commands/baseline.d.ts +39 -0
  3. package/dist/commands/baseline.d.ts.map +1 -0
  4. package/dist/commands/baseline.js +298 -0
  5. package/dist/commands/baseline.js.map +1 -0
  6. package/dist/commands/bootstrap.js +1 -1
  7. package/dist/commands/bootstrap.js.map +1 -1
  8. package/dist/commands/ci.d.ts +2 -2
  9. package/dist/commands/ci.d.ts.map +1 -1
  10. package/dist/commands/ci.js +107 -129
  11. package/dist/commands/ci.js.map +1 -1
  12. package/dist/commands/drift.d.ts +1 -1
  13. package/dist/commands/drift.d.ts.map +1 -1
  14. package/dist/commands/drift.js +68 -95
  15. package/dist/commands/drift.js.map +1 -1
  16. package/dist/commands/index.d.ts +9 -8
  17. package/dist/commands/index.d.ts.map +1 -1
  18. package/dist/commands/index.js +9 -8
  19. package/dist/commands/index.js.map +1 -1
  20. package/dist/commands/init.d.ts.map +1 -1
  21. package/dist/commands/init.js +61 -86
  22. package/dist/commands/init.js.map +1 -1
  23. package/dist/commands/plugins.d.ts.map +1 -1
  24. package/dist/commands/plugins.js +32 -41
  25. package/dist/commands/plugins.js.map +1 -1
  26. package/dist/commands/scan.d.ts +1 -1
  27. package/dist/commands/scan.d.ts.map +1 -1
  28. package/dist/commands/scan.js +59 -211
  29. package/dist/commands/scan.js.map +1 -1
  30. package/dist/commands/status.d.ts +1 -1
  31. package/dist/commands/status.d.ts.map +1 -1
  32. package/dist/commands/status.js +79 -116
  33. package/dist/commands/status.js.map +1 -1
  34. package/dist/detect/frameworks.d.ts +6 -1
  35. package/dist/detect/frameworks.d.ts.map +1 -1
  36. package/dist/detect/frameworks.js +43 -69
  37. package/dist/detect/frameworks.js.map +1 -1
  38. package/dist/index.d.ts +3 -3
  39. package/dist/index.d.ts.map +1 -1
  40. package/dist/index.js +7 -6
  41. package/dist/index.js.map +1 -1
  42. package/dist/integrations/github-formatter.d.ts +3 -0
  43. package/dist/integrations/github-formatter.d.ts.map +1 -0
  44. package/dist/integrations/github-formatter.js +69 -0
  45. package/dist/integrations/github-formatter.js.map +1 -0
  46. package/dist/integrations/github.d.ts +20 -0
  47. package/dist/integrations/github.d.ts.map +1 -0
  48. package/dist/integrations/github.js +69 -0
  49. package/dist/integrations/github.js.map +1 -0
  50. package/dist/integrations/index.d.ts +4 -0
  51. package/dist/integrations/index.d.ts.map +1 -0
  52. package/dist/integrations/index.js +4 -0
  53. package/dist/integrations/index.js.map +1 -0
  54. package/dist/scan/orchestrator.d.ts +76 -0
  55. package/dist/scan/orchestrator.d.ts.map +1 -0
  56. package/dist/scan/orchestrator.js +247 -0
  57. package/dist/scan/orchestrator.js.map +1 -0
  58. package/package.json +26 -17
  59. package/dist/plugins/index.d.ts +0 -3
  60. package/dist/plugins/index.d.ts.map +0 -1
  61. package/dist/plugins/index.js +0 -3
  62. package/dist/plugins/index.js.map +0 -1
  63. package/dist/plugins/loader.d.ts +0 -11
  64. package/dist/plugins/loader.d.ts.map +0 -1
  65. package/dist/plugins/loader.js +0 -77
  66. package/dist/plugins/loader.js.map +0 -1
  67. package/dist/plugins/registry.d.ts +0 -15
  68. package/dist/plugins/registry.d.ts.map +0 -1
  69. package/dist/plugins/registry.js +0 -32
  70. package/dist/plugins/registry.js.map +0 -1
@@ -1,8 +1,9 @@
1
1
  // apps/cli/src/commands/ci.ts
2
- import { Command } from 'commander';
3
- import { loadConfig, getConfigPath } from '../config/loader.js';
4
- import { loadDiscoveredPlugins, registry } from '../plugins/index.js';
5
- import { setJsonMode } from '../output/reporters.js';
2
+ import { Command } from "commander";
3
+ import { loadConfig, getConfigPath } from "../config/loader.js";
4
+ import { setJsonMode } from "../output/reporters.js";
5
+ import { ScanOrchestrator } from "../scan/orchestrator.js";
6
+ import { GitHubClient, parseRepoString, formatPRComment, } from "../integrations/index.js";
6
7
  const SEVERITY_ORDER = {
7
8
  info: 0,
8
9
  warning: 1,
@@ -13,8 +14,8 @@ function validateGitHubOptions(options) {
13
14
  const repo = options.githubRepo || process.env.GITHUB_REPOSITORY;
14
15
  const prInput = options.githubPr || process.env.GITHUB_PR_NUMBER;
15
16
  // Validate token: must be non-empty if provided
16
- if (token !== undefined && token.trim() === '') {
17
- throw new Error('Invalid GitHub token: must be non-empty if provided.');
17
+ if (token !== undefined && token.trim() === "") {
18
+ throw new Error("Invalid GitHub token: must be non-empty if provided.");
18
19
  }
19
20
  // Validate repo format: must be "owner/repo" with non-empty parts
20
21
  if (repo !== undefined) {
@@ -22,8 +23,8 @@ function validateGitHubOptions(options) {
22
23
  if (!repoPattern.test(repo)) {
23
24
  throw new Error(`Invalid GitHub repo format: '${repo}'. Must be in 'owner/repo' format (e.g., 'facebook/react').`);
24
25
  }
25
- const [owner, repoName] = repo.split('/');
26
- if (!owner || owner.trim() === '' || !repoName || repoName.trim() === '') {
26
+ const [owner, repoName] = repo.split("/");
27
+ if (!owner || owner.trim() === "" || !repoName || repoName.trim() === "") {
27
28
  throw new Error(`Invalid GitHub repo format: '${repo}'. Both owner and repo parts must be non-empty.`);
28
29
  }
29
30
  }
@@ -31,7 +32,10 @@ function validateGitHubOptions(options) {
31
32
  let pr;
32
33
  if (prInput !== undefined) {
33
34
  const parsed = parseInt(prInput, 10);
34
- if (isNaN(parsed) || parsed <= 0 || !Number.isInteger(parsed) || String(parsed) !== prInput.trim()) {
35
+ if (isNaN(parsed) ||
36
+ parsed <= 0 ||
37
+ !Number.isInteger(parsed) ||
38
+ String(parsed) !== prInput.trim()) {
35
39
  throw new Error(`Invalid PR number: '${prInput}'. Must be a positive integer.`);
36
40
  }
37
41
  pr = parsed;
@@ -43,18 +47,19 @@ function validateGitHubOptions(options) {
43
47
  };
44
48
  }
45
49
  export function createCICommand() {
46
- const cmd = new Command('ci')
47
- .description('Run drift detection for CI environments')
48
- .option('--fail-on <severity>', 'Exit 1 if drift at this severity or higher: critical, warning, info, none', 'critical')
49
- .option('--format <format>', 'Output format: json, summary', 'json')
50
- .option('--quiet', 'Suppress non-essential output')
51
- .option('--top <n>', 'Number of top issues to include', '10')
52
- .option('--github-token <token>', 'GitHub token for PR comments (or use GITHUB_TOKEN env)')
53
- .option('--github-repo <repo>', 'GitHub repo in owner/repo format (or use GITHUB_REPOSITORY env)')
54
- .option('--github-pr <number>', 'PR number to comment on (or use GITHUB_PR_NUMBER env)')
50
+ const cmd = new Command("ci")
51
+ .description("Run drift detection for CI environments")
52
+ .option("--fail-on <severity>", "Exit 1 if drift at this severity or higher: critical, warning, info, none", "critical")
53
+ .option("--format <format>", "Output format: json, summary", "json")
54
+ .option("--quiet", "Suppress non-essential output")
55
+ .option("--top <n>", "Number of top issues to include", "10")
56
+ .option("--include-baseline", "Include baselined drifts (by default only new issues shown)")
57
+ .option("--github-token <token>", "GitHub token for PR comments (or use GITHUB_TOKEN env)")
58
+ .option("--github-repo <repo>", "GitHub repo in owner/repo format (or use GITHUB_REPOSITORY env)")
59
+ .option("--github-pr <number>", "PR number to comment on (or use GITHUB_PR_NUMBER env)")
55
60
  .action(async (options) => {
56
61
  // Set JSON mode to ensure any reporter output goes to stderr
57
- if (options.format === 'json') {
62
+ if (options.format === "json") {
58
63
  setJsonMode(true);
59
64
  }
60
65
  const log = options.quiet ? () => { } : console.error.bind(console);
@@ -64,7 +69,7 @@ export function createCICommand() {
64
69
  // Check for config
65
70
  if (!getConfigPath()) {
66
71
  const output = {
67
- version: '0.0.1',
72
+ version: "0.0.1",
68
73
  timestamp: new Date().toISOString(),
69
74
  summary: { total: 0, critical: 0, warning: 0, info: 0 },
70
75
  topIssues: [],
@@ -73,61 +78,16 @@ export function createCICommand() {
73
78
  console.log(JSON.stringify(output, null, 2));
74
79
  return;
75
80
  }
76
- log('Loading configuration...');
81
+ log("Loading configuration...");
77
82
  const { config } = await loadConfig();
78
- log('Loading plugins...');
79
- await loadDiscoveredPlugins({ projectRoot: process.cwd() });
80
- log('Scanning for drift...');
81
- // Import analysis modules
82
- const { ReactComponentScanner } = await import('@buoy-design/scanners/git');
83
- const { SemanticDiffEngine } = await import('@buoy-design/core/analysis');
84
- // Scan components
85
- const components = [];
86
- // Determine which sources to scan from config
87
- const sourcesToScan = [];
88
- if (config.sources.react?.enabled)
89
- sourcesToScan.push('react');
90
- if (config.sources.vue?.enabled)
91
- sourcesToScan.push('vue');
92
- if (config.sources.svelte?.enabled)
93
- sourcesToScan.push('svelte');
94
- if (config.sources.angular?.enabled)
95
- sourcesToScan.push('angular');
96
- // Scan each source
97
- for (const source of sourcesToScan) {
98
- const plugin = registry.getByDetection(source);
99
- if (plugin && plugin.scan) {
100
- // Use plugin
101
- const sourceConfig = config.sources[source];
102
- const result = await plugin.scan({
103
- projectRoot: process.cwd(),
104
- config: sourceConfig || {},
105
- include: sourceConfig?.include,
106
- exclude: sourceConfig?.exclude,
107
- });
108
- components.push(...result.components);
109
- if (result.errors && result.errors.length > 0) {
110
- for (const err of result.errors) {
111
- log(`[${source}] ${err.file || ''}: ${err.message}`);
112
- }
113
- }
114
- }
115
- else {
116
- // Fall back to bundled scanner
117
- if (source === 'react' && config.sources.react) {
118
- const scanner = new ReactComponentScanner({
119
- projectRoot: process.cwd(),
120
- include: config.sources.react.include,
121
- exclude: config.sources.react.exclude,
122
- designSystemPackage: config.sources.react.designSystemPackage,
123
- });
124
- const result = await scanner.scan();
125
- components.push(...result.items);
126
- }
127
- // Add other framework fallbacks as needed
128
- }
129
- }
83
+ log("Scanning for drift...");
84
+ // Scan components using orchestrator
85
+ const orchestrator = new ScanOrchestrator(config);
86
+ const { components } = await orchestrator.scanComponents({
87
+ onProgress: (msg) => log(msg),
88
+ });
130
89
  // Run semantic diff
90
+ const { SemanticDiffEngine } = await import("@buoy-design/core/analysis");
131
91
  const engine = new SemanticDiffEngine();
132
92
  const diffResult = engine.analyzeComponents(components, {
133
93
  checkDeprecated: true,
@@ -137,63 +97,76 @@ export function createCICommand() {
137
97
  let drifts = diffResult.drifts;
138
98
  // Apply ignore rules
139
99
  for (const ignoreRule of config.drift.ignore) {
140
- drifts = drifts.filter(d => {
100
+ drifts = drifts.filter((d) => {
141
101
  if (d.type !== ignoreRule.type)
142
102
  return true;
143
103
  if (!ignoreRule.pattern)
144
104
  return false;
145
- const regex = new RegExp(ignoreRule.pattern);
146
- return !regex.test(d.source.entityName);
105
+ try {
106
+ const regex = new RegExp(ignoreRule.pattern);
107
+ return !regex.test(d.source.entityName);
108
+ }
109
+ catch {
110
+ log(`Warning: Invalid regex pattern "${ignoreRule.pattern}" in ignore rule, skipping`);
111
+ return true; // Don't filter out drift if regex is invalid
112
+ }
147
113
  });
148
114
  }
115
+ // Apply baseline filtering unless --include-baseline is set
116
+ let baselinedCount = 0;
117
+ if (!options.includeBaseline) {
118
+ const { loadBaseline, filterBaseline } = await import("./baseline.js");
119
+ const baseline = await loadBaseline();
120
+ const filtered = filterBaseline(drifts, baseline);
121
+ drifts = filtered.newDrifts;
122
+ baselinedCount = filtered.baselinedCount;
123
+ if (baselinedCount > 0) {
124
+ log(`Filtered out ${baselinedCount} baselined drift signals.`);
125
+ }
126
+ }
149
127
  // Build output
150
128
  const output = buildCIOutput(drifts, options);
151
129
  // Post to GitHub if configured (using pre-validated values)
152
130
  if (github.token && github.repo && github.pr) {
153
131
  try {
154
- const githubPlugin = registry.get('@buoy-design/plugin-github');
155
- if (githubPlugin && githubPlugin.report) {
156
- log('Posting to GitHub PR...');
157
- const driftResult = {
158
- signals: drifts.map(d => ({
159
- type: d.type,
160
- severity: d.severity,
161
- message: d.message,
162
- component: d.source.entityName,
163
- file: d.source.location?.split(':')[0],
164
- line: d.source.location?.includes(':')
165
- ? parseInt(d.source.location.split(':')[1] || '0', 10)
166
- : undefined,
167
- suggestion: d.details.suggestions?.[0],
168
- })),
169
- summary: {
170
- total: drifts.length,
171
- critical: drifts.filter(d => d.severity === 'critical').length,
172
- warning: drifts.filter(d => d.severity === 'warning').length,
173
- info: drifts.filter(d => d.severity === 'info').length,
174
- },
175
- };
176
- await githubPlugin.report(driftResult, {
177
- ci: true,
178
- format: 'markdown',
179
- github: {
180
- token: github.token,
181
- repo: github.repo,
182
- pr: github.pr,
183
- },
184
- });
185
- log('Posted PR comment');
186
- }
187
- else {
188
- log('GitHub plugin not installed, skipping PR comment');
189
- }
132
+ log("Posting to GitHub PR...");
133
+ const { owner, repo: repoName } = parseRepoString(github.repo);
134
+ const client = new GitHubClient({
135
+ token: github.token,
136
+ owner,
137
+ repo: repoName,
138
+ prNumber: github.pr,
139
+ });
140
+ const driftResult = {
141
+ signals: drifts.map((d) => ({
142
+ type: d.type,
143
+ severity: d.severity,
144
+ message: d.message,
145
+ component: d.source.entityName,
146
+ file: d.source.location?.split(":")[0],
147
+ line: d.source.location?.includes(":")
148
+ ? parseInt(d.source.location.split(":")[1] || "0", 10)
149
+ : undefined,
150
+ suggestion: d.details.suggestions?.[0],
151
+ })),
152
+ summary: {
153
+ total: drifts.length,
154
+ critical: drifts.filter((d) => d.severity === "critical")
155
+ .length,
156
+ warning: drifts.filter((d) => d.severity === "warning").length,
157
+ info: drifts.filter((d) => d.severity === "info").length,
158
+ },
159
+ };
160
+ const comment = formatPRComment(driftResult);
161
+ await client.createOrUpdateComment(comment);
162
+ log("Posted PR comment");
190
163
  }
191
164
  catch (err) {
192
165
  const msg = err instanceof Error ? err.message : String(err);
193
166
  log(`Failed to post GitHub comment: ${msg}`);
194
167
  }
195
168
  }
196
- if (options.format === 'json') {
169
+ if (options.format === "json") {
197
170
  console.log(JSON.stringify(output, null, 2));
198
171
  }
199
172
  else {
@@ -212,15 +185,15 @@ export function createCICommand() {
212
185
  function buildCIOutput(drifts, options) {
213
186
  const summary = {
214
187
  total: drifts.length,
215
- critical: drifts.filter(d => d.severity === 'critical').length,
216
- warning: drifts.filter(d => d.severity === 'warning').length,
217
- info: drifts.filter(d => d.severity === 'info').length,
188
+ critical: drifts.filter((d) => d.severity === "critical").length,
189
+ warning: drifts.filter((d) => d.severity === "warning").length,
190
+ info: drifts.filter((d) => d.severity === "info").length,
218
191
  };
219
192
  // Sort by severity (critical first)
220
193
  const sorted = [...drifts].sort((a, b) => SEVERITY_ORDER[b.severity] - SEVERITY_ORDER[a.severity]);
221
194
  const topN = parseInt(options.top, 10) || 10;
222
- const topIssues = sorted.slice(0, topN).map(d => {
223
- const locationParts = d.source.location?.split(':');
195
+ const topIssues = sorted.slice(0, topN).map((d) => {
196
+ const locationParts = d.source.location?.split(":");
224
197
  return {
225
198
  type: d.type,
226
199
  severity: d.severity,
@@ -234,13 +207,13 @@ function buildCIOutput(drifts, options) {
234
207
  // Determine exit code
235
208
  let exitCode = 0;
236
209
  const failOn = options.failOn;
237
- if (failOn !== 'none') {
210
+ if (failOn !== "none") {
238
211
  const threshold = SEVERITY_ORDER[failOn] ?? SEVERITY_ORDER.critical;
239
- const hasFailure = drifts.some(d => SEVERITY_ORDER[d.severity] >= threshold);
212
+ const hasFailure = drifts.some((d) => SEVERITY_ORDER[d.severity] >= threshold);
240
213
  exitCode = hasFailure ? 1 : 0;
241
214
  }
242
215
  return {
243
- version: '0.0.1',
216
+ version: "0.0.1",
244
217
  timestamp: new Date().toISOString(),
245
218
  summary,
246
219
  topIssues,
@@ -248,21 +221,26 @@ function buildCIOutput(drifts, options) {
248
221
  };
249
222
  }
250
223
  function printSummary(output) {
251
- const icon = output.exitCode === 0 ? '✓' : '✗';
252
- const status = output.exitCode === 0 ? 'PASS' : 'FAIL';
224
+ const icon = output.exitCode === 0 ? "+" : "x";
225
+ const status = output.exitCode === 0 ? "PASS" : "FAIL";
253
226
  console.log(`${icon} Buoy Drift Check: ${status}`);
254
- console.log('');
227
+ console.log("");
255
228
  console.log(` Total: ${output.summary.total}`);
256
229
  console.log(` Critical: ${output.summary.critical}`);
257
230
  console.log(` Warning: ${output.summary.warning}`);
258
231
  console.log(` Info: ${output.summary.info}`);
259
232
  if (output.topIssues.length > 0) {
260
- console.log('');
261
- console.log('Top issues:');
233
+ console.log("");
234
+ console.log("Top issues:");
262
235
  for (const issue of output.topIssues.slice(0, 5)) {
263
- const sev = issue.severity === 'critical' ? '!' :
264
- issue.severity === 'warning' ? '~' : 'i';
265
- const loc = issue.file ? ` (${issue.file}${issue.line ? `:${issue.line}` : ''})` : '';
236
+ const sev = issue.severity === "critical"
237
+ ? "!"
238
+ : issue.severity === "warning"
239
+ ? "~"
240
+ : "i";
241
+ const loc = issue.file
242
+ ? ` (${issue.file}${issue.line ? `:${issue.line}` : ""})`
243
+ : "";
266
244
  console.log(` [${sev}] ${issue.component}: ${issue.message}${loc}`);
267
245
  }
268
246
  if (output.topIssues.length > 5) {
@@ -1 +1 @@
1
- {"version":3,"file":"ci.js","sourceRoot":"","sources":["../../src/commands/ci.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ci.js","sourceRoot":"","sources":["../../src/commands/ci.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,3 @@
1
- import { Command } from 'commander';
1
+ import { Command } from "commander";
2
2
  export declare function createDriftCommand(): Command;
3
3
  //# sourceMappingURL=drift.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"drift.d.ts","sourceRoot":"","sources":["../../src/commands/drift.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAqBpC,wBAAgB,kBAAkB,IAAI,OAAO,CAuL5C"}
1
+ {"version":3,"file":"drift.d.ts","sourceRoot":"","sources":["../../src/commands/drift.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAsBpC,wBAAgB,kBAAkB,IAAI,OAAO,CAuK5C"}
@@ -1,47 +1,40 @@
1
- import { Command } from 'commander';
2
- import { loadConfig } from '../config/loader.js';
3
- import { spinner, success, error, info, warning, header, keyValue, newline, setJsonMode, } from '../output/reporters.js';
4
- import { formatDriftTable, formatDriftList, formatJson, formatMarkdown, } from '../output/formatters.js';
1
+ import { Command } from "commander";
2
+ import { loadConfig } from "../config/loader.js";
3
+ import { spinner, success, error, info, warning, header, keyValue, newline, setJsonMode, } from "../output/reporters.js";
4
+ import { formatDriftTable, formatDriftList, formatJson, formatMarkdown, } from "../output/formatters.js";
5
+ import { ScanOrchestrator } from "../scan/orchestrator.js";
5
6
  export function createDriftCommand() {
6
- const cmd = new Command('drift')
7
- .description('Detect and manage design system drift');
7
+ const cmd = new Command("drift").description("Detect and manage design system drift");
8
8
  // drift check
9
9
  cmd
10
- .command('check')
11
- .description('Check for drift in the current project')
12
- .option('-s, --severity <level>', 'Filter by minimum severity (info, warning, critical)')
13
- .option('-t, --type <type>', 'Filter by drift type')
14
- .option('--json', 'Output as JSON')
15
- .option('--markdown', 'Output as Markdown')
16
- .option('--compact', 'Compact table output (less detail)')
17
- .option('-v, --verbose', 'Verbose output')
10
+ .command("check")
11
+ .description("Check for drift in the current project")
12
+ .option("-s, --severity <level>", "Filter by minimum severity (info, warning, critical)")
13
+ .option("-t, --type <type>", "Filter by drift type")
14
+ .option("--json", "Output as JSON")
15
+ .option("--markdown", "Output as Markdown")
16
+ .option("--compact", "Compact table output (less detail)")
17
+ .option("-v, --verbose", "Verbose output")
18
+ .option("--include-baseline", "Include baselined drifts (show all)")
18
19
  .action(async (options) => {
19
20
  // Set JSON mode before creating spinner to redirect spinner to stderr
20
21
  if (options.json) {
21
22
  setJsonMode(true);
22
23
  }
23
- const spin = spinner('Loading configuration...');
24
+ const spin = spinner("Loading configuration...");
24
25
  try {
25
26
  const { config } = await loadConfig();
26
- spin.text = 'Scanning for drift...';
27
- // Import required modules
28
- const { ReactComponentScanner } = await import('@buoy-design/scanners/git');
29
- const { SemanticDiffEngine } = await import('@buoy-design/core/analysis');
30
- // First, scan components
31
- const sourceComponents = [];
32
- if (config.sources.react?.enabled) {
33
- spin.text = 'Scanning React components...';
34
- const scanner = new ReactComponentScanner({
35
- projectRoot: process.cwd(),
36
- include: config.sources.react.include,
37
- exclude: config.sources.react.exclude,
38
- designSystemPackage: config.sources.react.designSystemPackage,
39
- });
40
- const result = await scanner.scan();
41
- sourceComponents.push(...result.items);
42
- }
43
- spin.text = 'Analyzing drift...';
27
+ spin.text = "Scanning for drift...";
28
+ // Scan components using orchestrator
29
+ const orchestrator = new ScanOrchestrator(config);
30
+ const { components: sourceComponents } = await orchestrator.scanComponents({
31
+ onProgress: (msg) => {
32
+ spin.text = msg;
33
+ },
34
+ });
35
+ spin.text = "Analyzing drift...";
44
36
  // Run semantic diff engine
37
+ const { SemanticDiffEngine } = await import("@buoy-design/core/analysis");
45
38
  const engine = new SemanticDiffEngine();
46
39
  const diffResult = engine.analyzeComponents(sourceComponents, {
47
40
  checkDeprecated: true,
@@ -57,39 +50,61 @@ export function createDriftCommand() {
57
50
  critical: 2,
58
51
  };
59
52
  const minSeverity = severityOrder[options.severity] || 0;
60
- drifts = drifts.filter(d => severityOrder[d.severity] >= minSeverity);
53
+ drifts = drifts.filter((d) => severityOrder[d.severity] >= minSeverity);
61
54
  }
62
55
  if (options.type) {
63
- drifts = drifts.filter(d => d.type === options.type);
56
+ drifts = drifts.filter((d) => d.type === options.type);
64
57
  }
65
58
  // Apply ignore rules from config
66
59
  for (const ignoreRule of config.drift.ignore) {
67
- drifts = drifts.filter(d => {
60
+ drifts = drifts.filter((d) => {
68
61
  if (d.type !== ignoreRule.type)
69
62
  return true;
70
63
  if (!ignoreRule.pattern)
71
64
  return false;
72
- const regex = new RegExp(ignoreRule.pattern);
73
- return !regex.test(d.source.entityName);
65
+ try {
66
+ const regex = new RegExp(ignoreRule.pattern);
67
+ return !regex.test(d.source.entityName);
68
+ }
69
+ catch {
70
+ warning(`Invalid regex pattern "${ignoreRule.pattern}" in ignore rule, skipping`);
71
+ return true; // Don't filter out drift if regex is invalid
72
+ }
74
73
  });
75
74
  }
75
+ // Apply baseline filtering unless --include-baseline is set
76
+ let baselinedCount = 0;
77
+ if (!options.includeBaseline) {
78
+ const { loadBaseline, filterBaseline } = await import("./baseline.js");
79
+ const baseline = await loadBaseline();
80
+ const filtered = filterBaseline(drifts, baseline);
81
+ drifts = filtered.newDrifts;
82
+ baselinedCount = filtered.baselinedCount;
83
+ }
76
84
  spin.stop();
77
85
  // Output results
78
86
  if (options.json) {
79
- console.log(formatJson({ drifts, summary: getSummary(drifts) }));
87
+ console.log(formatJson({
88
+ drifts,
89
+ summary: getSummary(drifts),
90
+ baselinedCount,
91
+ }));
80
92
  return;
81
93
  }
82
94
  if (options.markdown) {
83
95
  console.log(formatMarkdown(drifts));
84
96
  return;
85
97
  }
86
- header('Drift Analysis');
98
+ header("Drift Analysis");
87
99
  newline();
88
100
  const summary = getSummary(drifts);
89
- keyValue('Components scanned', String(sourceComponents.length));
90
- keyValue('Critical', String(summary.critical));
91
- keyValue('Warning', String(summary.warning));
92
- keyValue('Info', String(summary.info));
101
+ keyValue("Components scanned", String(sourceComponents.length));
102
+ keyValue("Critical", String(summary.critical));
103
+ keyValue("Warning", String(summary.warning));
104
+ keyValue("Info", String(summary.info));
105
+ if (baselinedCount > 0) {
106
+ keyValue("Baselined (hidden)", String(baselinedCount));
107
+ }
93
108
  newline();
94
109
  // Use compact table or detailed list
95
110
  if (options.compact) {
@@ -103,7 +118,7 @@ export function createDriftCommand() {
103
118
  warning(`${summary.critical} critical issues require attention.`);
104
119
  }
105
120
  else if (drifts.length === 0) {
106
- success('No drift detected. Your design system is aligned!');
121
+ success("No drift detected. Your design system is aligned!");
107
122
  }
108
123
  else {
109
124
  info(`Found ${drifts.length} drift signals. Run with --compact for summary view.`);
@@ -119,60 +134,18 @@ export function createDriftCommand() {
119
134
  process.exit(1);
120
135
  }
121
136
  });
122
- // drift explain
123
- // TODO: Implement AI-powered drift explanation with git forensics
124
- //
125
- // Implementation steps:
126
- // 1. Load the drift signal by ID from scan results or cache
127
- // 2. Fetch git context for the affected file/line:
128
- // - git blame -L <line>,<line> <file> → who changed it, when, commit hash
129
- // - git log -1 --format="%s%n%n%b" <hash> → commit message
130
- // - git show <hash>^:<file> → previous version of the code
131
- // - git log -p -L <line>,<line>:<file> → full history of this line
132
- // 3. Try to find associated PR (GitHub API or parse commit message for #123)
133
- // 4. Build context object matching GitContext schema in @buoy-design/core
134
- // 5. Send to Claude API with structured prompt:
135
- // - Drift type and severity
136
- // - Current vs expected code
137
- // - Git blame info (who, when, why)
138
- // - Previous code before drift
139
- // - Ask for: root cause, impact, fix, prevention
140
- // 6. Display formatted explanation with actionable next steps
141
- //
142
- // See: packages/core/src/models/drift.ts → GitContextSchema
143
- cmd
144
- .command('explain <driftId>')
145
- .description('Get detailed explanation for a drift signal (uses AI + git history)')
146
- .action(async (driftId) => {
147
- info('Claude integration not yet implemented.');
148
- info(`To explain drift: ${driftId}`);
149
- info('Enable Claude in buoy.config.ts and ensure ANTHROPIC_API_KEY is set.');
150
- info('');
151
- info('When implemented, this will:');
152
- info(' • Analyze git blame to find who introduced the drift');
153
- info(' • Check commit history for context on why');
154
- info(' • Use Claude to explain impact and suggest fixes');
155
- });
156
- // drift resolve
157
- cmd
158
- .command('resolve <driftId>')
159
- .description('Mark a drift signal as resolved')
160
- .option('-r, --resolution <type>', 'Resolution type (ignored, fixed, documented)', 'fixed')
161
- .option('-m, --message <message>', 'Resolution message')
162
- .action(async (driftId, options) => {
163
- info(`Marking drift ${driftId} as ${options.resolution}`);
164
- if (options.message) {
165
- info(`Reason: ${options.message}`);
166
- }
167
- success('Drift resolved (note: persistence not yet implemented)');
168
- });
137
+ // NOTE: `drift explain` and `drift resolve` commands are planned but not yet implemented.
138
+ // They will be added once the following are complete:
139
+ // - drift explain: Requires Claude API integration and git forensics
140
+ // - drift resolve: Requires persistence layer for tracking resolutions
141
+ // See: docs/ROADMAP.md for implementation timeline
169
142
  return cmd;
170
143
  }
171
144
  function getSummary(drifts) {
172
145
  return {
173
- critical: drifts.filter(d => d.severity === 'critical').length,
174
- warning: drifts.filter(d => d.severity === 'warning').length,
175
- info: drifts.filter(d => d.severity === 'info').length,
146
+ critical: drifts.filter((d) => d.severity === "critical").length,
147
+ warning: drifts.filter((d) => d.severity === "warning").length,
148
+ info: drifts.filter((d) => d.severity === "info").length,
176
149
  };
177
150
  }
178
151
  //# sourceMappingURL=drift.js.map