@buoy-design/cli 0.1.13 → 0.1.14

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 (78) hide show
  1. package/LICENSE +21 -0
  2. package/dist/commands/begin.d.ts.map +1 -1
  3. package/dist/commands/begin.js +18 -0
  4. package/dist/commands/begin.js.map +1 -1
  5. package/dist/commands/check.d.ts +10 -0
  6. package/dist/commands/check.d.ts.map +1 -1
  7. package/dist/commands/check.js +75 -1
  8. package/dist/commands/check.js.map +1 -1
  9. package/dist/commands/ci.d.ts.map +1 -1
  10. package/dist/commands/ci.js +29 -3
  11. package/dist/commands/ci.js.map +1 -1
  12. package/dist/commands/ci.logic.d.ts +8 -2
  13. package/dist/commands/ci.logic.d.ts.map +1 -1
  14. package/dist/commands/ci.logic.js +17 -3
  15. package/dist/commands/ci.logic.js.map +1 -1
  16. package/dist/commands/context.d.ts +9 -0
  17. package/dist/commands/context.d.ts.map +1 -0
  18. package/dist/commands/context.js +217 -0
  19. package/dist/commands/context.js.map +1 -0
  20. package/dist/commands/fix.d.ts +8 -0
  21. package/dist/commands/fix.d.ts.map +1 -0
  22. package/dist/commands/fix.js +224 -0
  23. package/dist/commands/fix.js.map +1 -0
  24. package/dist/commands/index.d.ts +3 -0
  25. package/dist/commands/index.d.ts.map +1 -1
  26. package/dist/commands/index.js +3 -0
  27. package/dist/commands/index.js.map +1 -1
  28. package/dist/commands/skill.d.ts +9 -0
  29. package/dist/commands/skill.d.ts.map +1 -0
  30. package/dist/commands/skill.js +190 -0
  31. package/dist/commands/skill.js.map +1 -0
  32. package/dist/commands/tokens.d.ts.map +1 -1
  33. package/dist/commands/tokens.js +169 -2
  34. package/dist/commands/tokens.js.map +1 -1
  35. package/dist/fix/applier.d.ts +25 -0
  36. package/dist/fix/applier.d.ts.map +1 -0
  37. package/dist/fix/applier.js +211 -0
  38. package/dist/fix/applier.js.map +1 -0
  39. package/dist/fix/index.d.ts +10 -0
  40. package/dist/fix/index.d.ts.map +1 -0
  41. package/dist/fix/index.js +8 -0
  42. package/dist/fix/index.js.map +1 -0
  43. package/dist/fix/safety.d.ts +30 -0
  44. package/dist/fix/safety.d.ts.map +1 -0
  45. package/dist/fix/safety.js +168 -0
  46. package/dist/fix/safety.js.map +1 -0
  47. package/dist/index.d.ts.map +1 -1
  48. package/dist/index.js +59 -13
  49. package/dist/index.js.map +1 -1
  50. package/dist/output/fix-formatters.d.ts +36 -0
  51. package/dist/output/fix-formatters.d.ts.map +1 -0
  52. package/dist/output/fix-formatters.js +247 -0
  53. package/dist/output/fix-formatters.js.map +1 -0
  54. package/dist/output/index.d.ts +1 -0
  55. package/dist/output/index.d.ts.map +1 -1
  56. package/dist/output/index.js +1 -0
  57. package/dist/output/index.js.map +1 -1
  58. package/dist/output/reports.d.ts +154 -0
  59. package/dist/output/reports.d.ts.map +1 -0
  60. package/dist/output/reports.js +392 -0
  61. package/dist/output/reports.js.map +1 -0
  62. package/dist/services/context-generator.d.ts +43 -0
  63. package/dist/services/context-generator.d.ts.map +1 -0
  64. package/dist/services/context-generator.js +252 -0
  65. package/dist/services/context-generator.js.map +1 -0
  66. package/dist/services/skill-export.d.ts +96 -0
  67. package/dist/services/skill-export.d.ts.map +1 -0
  68. package/dist/services/skill-export.js +566 -0
  69. package/dist/services/skill-export.js.map +1 -0
  70. package/dist/wizard/ai-guardrails-generator.d.ts +20 -0
  71. package/dist/wizard/ai-guardrails-generator.d.ts.map +1 -0
  72. package/dist/wizard/ai-guardrails-generator.js +259 -0
  73. package/dist/wizard/ai-guardrails-generator.js.map +1 -0
  74. package/dist/wizard/index.d.ts +1 -0
  75. package/dist/wizard/index.d.ts.map +1 -1
  76. package/dist/wizard/index.js +1 -0
  77. package/dist/wizard/index.js.map +1 -1
  78. package/package.json +15 -15
@@ -0,0 +1,211 @@
1
+ /**
2
+ * Fix Applier
3
+ *
4
+ * Applies fixes to source files by replacing hardcoded values with design tokens.
5
+ */
6
+ import { readFile, writeFile, copyFile } from 'node:fs/promises';
7
+ import { existsSync } from 'node:fs';
8
+ /**
9
+ * Apply multiple fixes to source files
10
+ */
11
+ export async function applyFixes(fixes, options = {}) {
12
+ const { dryRun = false, backup = false, minConfidence = 'high' } = options;
13
+ const results = [];
14
+ let applied = 0;
15
+ let skipped = 0;
16
+ let failed = 0;
17
+ // Group fixes by file for efficiency
18
+ const fixesByFile = groupFixesByFile(fixes);
19
+ for (const [file, fileFixes] of Object.entries(fixesByFile)) {
20
+ const fileResults = await applyFixesToFile(file, fileFixes, {
21
+ dryRun,
22
+ backup,
23
+ minConfidence,
24
+ });
25
+ for (const result of fileResults) {
26
+ results.push(result);
27
+ if (result.status === 'applied')
28
+ applied++;
29
+ else if (result.status === 'skipped')
30
+ skipped++;
31
+ else
32
+ failed++;
33
+ }
34
+ }
35
+ return { results, applied, skipped, failed };
36
+ }
37
+ /**
38
+ * Apply fixes to a single file
39
+ */
40
+ async function applyFixesToFile(file, fixes, options) {
41
+ const { dryRun, backup, minConfidence = 'high' } = options;
42
+ const results = [];
43
+ // Check file exists
44
+ if (!existsSync(file)) {
45
+ return fixes.map((fix) => ({
46
+ fixId: fix.id,
47
+ status: 'failed',
48
+ error: `File not found: ${file}`,
49
+ }));
50
+ }
51
+ try {
52
+ // Read file content
53
+ let content = await readFile(file, 'utf-8');
54
+ const lines = content.split('\n');
55
+ // Sort fixes by line number descending so we apply from bottom to top
56
+ // This prevents line number shifts from affecting subsequent fixes
57
+ const sortedFixes = [...fixes].sort((a, b) => {
58
+ if (b.line !== a.line)
59
+ return b.line - a.line;
60
+ return b.column - a.column;
61
+ });
62
+ // Track which fixes were actually applied
63
+ const appliedFixes = [];
64
+ for (const fix of sortedFixes) {
65
+ // Check confidence threshold
66
+ if (!meetsMinConfidence(fix.confidence, minConfidence)) {
67
+ results.push({
68
+ fixId: fix.id,
69
+ status: 'skipped',
70
+ error: `Confidence ${fix.confidence} below threshold ${minConfidence}`,
71
+ });
72
+ continue;
73
+ }
74
+ // Get the line (1-indexed to 0-indexed)
75
+ const lineIndex = fix.line - 1;
76
+ if (lineIndex < 0 || lineIndex >= lines.length) {
77
+ results.push({
78
+ fixId: fix.id,
79
+ status: 'failed',
80
+ error: `Line ${fix.line} out of range (file has ${lines.length} lines)`,
81
+ });
82
+ continue;
83
+ }
84
+ const line = lines[lineIndex];
85
+ // Find and replace the original value
86
+ const column = fix.column - 1;
87
+ const originalIndex = line.indexOf(fix.original, column);
88
+ if (originalIndex === -1) {
89
+ // Try finding anywhere in the line
90
+ const anyIndex = line.indexOf(fix.original);
91
+ if (anyIndex === -1) {
92
+ results.push({
93
+ fixId: fix.id,
94
+ status: 'failed',
95
+ error: `Original value "${fix.original}" not found on line ${fix.line}`,
96
+ });
97
+ continue;
98
+ }
99
+ // Found it elsewhere, use that position
100
+ lines[lineIndex] =
101
+ line.slice(0, anyIndex) +
102
+ fix.replacement +
103
+ line.slice(anyIndex + fix.original.length);
104
+ }
105
+ else {
106
+ // Replace at the expected position
107
+ lines[lineIndex] =
108
+ line.slice(0, originalIndex) +
109
+ fix.replacement +
110
+ line.slice(originalIndex + fix.original.length);
111
+ }
112
+ appliedFixes.push(fix);
113
+ results.push({
114
+ fixId: fix.id,
115
+ status: 'applied',
116
+ });
117
+ }
118
+ // If not dry run and we have fixes to apply, write the file
119
+ if (!dryRun && appliedFixes.length > 0) {
120
+ // Create backup if requested
121
+ if (backup) {
122
+ await copyFile(file, `${file}.bak`);
123
+ }
124
+ // Write the modified content
125
+ content = lines.join('\n');
126
+ await writeFile(file, content, 'utf-8');
127
+ }
128
+ }
129
+ catch (error) {
130
+ // If any error occurs, mark remaining fixes as failed
131
+ const appliedIds = new Set(results.map((r) => r.fixId));
132
+ for (const fix of fixes) {
133
+ if (!appliedIds.has(fix.id)) {
134
+ results.push({
135
+ fixId: fix.id,
136
+ status: 'failed',
137
+ error: error instanceof Error ? error.message : 'Unknown error',
138
+ });
139
+ }
140
+ }
141
+ }
142
+ return results;
143
+ }
144
+ /**
145
+ * Group fixes by file path
146
+ */
147
+ function groupFixesByFile(fixes) {
148
+ const groups = {};
149
+ for (const fix of fixes) {
150
+ if (!groups[fix.file]) {
151
+ groups[fix.file] = [];
152
+ }
153
+ groups[fix.file].push(fix);
154
+ }
155
+ return groups;
156
+ }
157
+ /**
158
+ * Check if confidence level meets minimum threshold
159
+ */
160
+ function meetsMinConfidence(level, minimum) {
161
+ const order = { low: 0, medium: 1, high: 2 };
162
+ return order[level] >= order[minimum];
163
+ }
164
+ /**
165
+ * Generate a diff preview for a fix
166
+ */
167
+ export function generateFixDiff(fix, _contextLines = 2) {
168
+ const lines = [];
169
+ lines.push(`--- ${fix.file}`);
170
+ lines.push(`+++ ${fix.file}`);
171
+ lines.push(`@@ -${fix.line},1 +${fix.line},1 @@`);
172
+ lines.push(`-${fix.original}`);
173
+ lines.push(`+${fix.replacement}`);
174
+ return lines.join('\n');
175
+ }
176
+ /**
177
+ * Generate a full diff preview by reading the actual file
178
+ */
179
+ export async function generateFullDiff(fix, contextLines = 3) {
180
+ const lines = [];
181
+ try {
182
+ const content = await readFile(fix.file, 'utf-8');
183
+ const fileLines = content.split('\n');
184
+ const lineIndex = fix.line - 1;
185
+ // Calculate context bounds
186
+ const startLine = Math.max(0, lineIndex - contextLines);
187
+ const endLine = Math.min(fileLines.length - 1, lineIndex + contextLines);
188
+ lines.push(`--- ${fix.file}`);
189
+ lines.push(`+++ ${fix.file}`);
190
+ lines.push(`@@ -${startLine + 1},${endLine - startLine + 1} +${startLine + 1},${endLine - startLine + 1} @@`);
191
+ // Add context lines before
192
+ for (let i = startLine; i < lineIndex; i++) {
193
+ lines.push(` ${fileLines[i]}`);
194
+ }
195
+ // Add the changed line
196
+ const originalLine = fileLines[lineIndex] || '';
197
+ const newLine = originalLine.replace(fix.original, fix.replacement);
198
+ lines.push(`-${originalLine}`);
199
+ lines.push(`+${newLine}`);
200
+ // Add context lines after
201
+ for (let i = lineIndex + 1; i <= endLine; i++) {
202
+ lines.push(` ${fileLines[i]}`);
203
+ }
204
+ }
205
+ catch {
206
+ // Fallback to simple diff
207
+ return generateFixDiff(fix, contextLines);
208
+ }
209
+ return lines.join('\n');
210
+ }
211
+ //# sourceMappingURL=applier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"applier.js","sourceRoot":"","sources":["../../src/fix/applier.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Fix module for CLI
3
+ *
4
+ * Provides fix application, safety checks, and diff generation.
5
+ */
6
+ export { applyFixes, generateFixDiff, generateFullDiff } from './applier.js';
7
+ export type { ApplyFixesResult } from './applier.js';
8
+ export { runSafetyChecks, validateFixTargets, isGitRepository, } from './safety.js';
9
+ export type { SafetyCheckResult } from './safety.js';
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/fix/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAC7E,YAAY,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAErD,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,eAAe,GAChB,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Fix module for CLI
3
+ *
4
+ * Provides fix application, safety checks, and diff generation.
5
+ */
6
+ export { applyFixes, generateFixDiff, generateFullDiff } from './applier.js';
7
+ export { runSafetyChecks, validateFixTargets, isGitRepository, } from './safety.js';
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/fix/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAG7E,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,eAAe,GAChB,MAAM,aAAa,CAAC"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Safety Checks for Fix Application
3
+ *
4
+ * Validates that it's safe to apply fixes to source files.
5
+ */
6
+ import type { Fix } from '@buoy-design/core';
7
+ export interface SafetyCheckResult {
8
+ safe: boolean;
9
+ warnings: string[];
10
+ errors: string[];
11
+ }
12
+ /**
13
+ * Run all safety checks before applying fixes
14
+ */
15
+ export declare function runSafetyChecks(fixes: Fix[], cwd?: string): SafetyCheckResult;
16
+ /**
17
+ * Validate fix targets are reasonable
18
+ */
19
+ export declare function validateFixTargets(fixes: Fix[]): {
20
+ valid: Fix[];
21
+ invalid: Array<{
22
+ fix: Fix;
23
+ reason: string;
24
+ }>;
25
+ };
26
+ /**
27
+ * Check if we're in a git repository
28
+ */
29
+ export declare function isGitRepository(cwd?: string): boolean;
30
+ //# sourceMappingURL=safety.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safety.d.ts","sourceRoot":"","sources":["../../src/fix/safety.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AAE7C,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAkBD;;GAEG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,GAAG,EAAE,EACZ,GAAG,GAAE,MAAsB,GAC1B,iBAAiB,CAsDnB;AA0DD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG;IAChD,KAAK,EAAE,GAAG,EAAE,CAAC;IACb,OAAO,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,GAAG,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC9C,CAoCA;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,GAAG,GAAE,MAAsB,GAAG,OAAO,CAUpE"}
@@ -0,0 +1,168 @@
1
+ /**
2
+ * Safety Checks for Fix Application
3
+ *
4
+ * Validates that it's safe to apply fixes to source files.
5
+ */
6
+ import { execSync } from 'node:child_process';
7
+ import { existsSync } from 'node:fs';
8
+ import { relative, resolve } from 'node:path';
9
+ /**
10
+ * Default paths to exclude from fixes
11
+ */
12
+ const DEFAULT_EXCLUDED_PATTERNS = [
13
+ 'node_modules/**',
14
+ 'dist/**',
15
+ 'build/**',
16
+ '.next/**',
17
+ '.nuxt/**',
18
+ 'coverage/**',
19
+ '*.min.js',
20
+ '*.min.css',
21
+ 'vendor/**',
22
+ '.git/**',
23
+ ];
24
+ /**
25
+ * Run all safety checks before applying fixes
26
+ */
27
+ export function runSafetyChecks(fixes, cwd = process.cwd()) {
28
+ const warnings = [];
29
+ const errors = [];
30
+ // Check git status
31
+ const gitStatus = checkGitStatus(cwd);
32
+ if (gitStatus.hasUncommittedChanges) {
33
+ warnings.push('You have uncommitted changes. Consider committing or stashing before applying fixes.');
34
+ }
35
+ if (gitStatus.error) {
36
+ warnings.push(`Could not check git status: ${gitStatus.error}`);
37
+ }
38
+ // Check for excluded paths
39
+ for (const fix of fixes) {
40
+ const relativePath = relative(cwd, resolve(cwd, fix.file));
41
+ if (isExcludedPath(relativePath)) {
42
+ errors.push(`Fix targets excluded path: ${fix.file}`);
43
+ }
44
+ }
45
+ // Check files exist
46
+ for (const fix of fixes) {
47
+ const fullPath = resolve(cwd, fix.file);
48
+ if (!existsSync(fullPath)) {
49
+ errors.push(`File not found: ${fix.file}`);
50
+ }
51
+ }
52
+ // Check for duplicate fixes on same location
53
+ const locationMap = new Map();
54
+ for (const fix of fixes) {
55
+ const key = `${fix.file}:${fix.line}:${fix.column}`;
56
+ if (!locationMap.has(key)) {
57
+ locationMap.set(key, []);
58
+ }
59
+ locationMap.get(key).push(fix);
60
+ }
61
+ for (const [location, locationFixes] of locationMap) {
62
+ if (locationFixes.length > 1) {
63
+ warnings.push(`Multiple fixes at ${location}: ${locationFixes.map((f) => f.id).join(', ')}`);
64
+ }
65
+ }
66
+ return {
67
+ safe: errors.length === 0,
68
+ warnings,
69
+ errors,
70
+ };
71
+ }
72
+ /**
73
+ * Check git status in the given directory
74
+ */
75
+ function checkGitStatus(cwd) {
76
+ try {
77
+ const status = execSync('git status --porcelain', {
78
+ cwd,
79
+ encoding: 'utf-8',
80
+ stdio: ['pipe', 'pipe', 'pipe'],
81
+ });
82
+ return {
83
+ hasUncommittedChanges: status.trim().length > 0,
84
+ };
85
+ }
86
+ catch (error) {
87
+ return {
88
+ hasUncommittedChanges: false,
89
+ error: error instanceof Error ? error.message : 'Unknown error',
90
+ };
91
+ }
92
+ }
93
+ /**
94
+ * Check if a path matches any excluded patterns
95
+ */
96
+ function isExcludedPath(path, excludePatterns = DEFAULT_EXCLUDED_PATTERNS) {
97
+ for (const pattern of excludePatterns) {
98
+ if (matchGlob(path, pattern)) {
99
+ return true;
100
+ }
101
+ }
102
+ return false;
103
+ }
104
+ /**
105
+ * Simple glob pattern matching
106
+ */
107
+ function matchGlob(path, pattern) {
108
+ // Convert glob pattern to regex
109
+ const regexStr = pattern
110
+ .replace(/[.+^${}()|[\]\\]/g, '\\$&')
111
+ .replace(/\*\*/g, '{{GLOBSTAR}}')
112
+ .replace(/\*/g, '[^/]*')
113
+ .replace(/{{GLOBSTAR}}/g, '.*');
114
+ // Match pattern at start, end, or with path separators
115
+ const regex = new RegExp(`^${regexStr}$|/${regexStr}$|^${regexStr}/`);
116
+ return regex.test(path);
117
+ }
118
+ /**
119
+ * Validate fix targets are reasonable
120
+ */
121
+ export function validateFixTargets(fixes) {
122
+ const valid = [];
123
+ const invalid = [];
124
+ for (const fix of fixes) {
125
+ // Check line/column are positive
126
+ if (fix.line < 1 || fix.column < 1) {
127
+ invalid.push({
128
+ fix,
129
+ reason: `Invalid location: line ${fix.line}, column ${fix.column}`,
130
+ });
131
+ continue;
132
+ }
133
+ // Check original and replacement are different
134
+ if (fix.original === fix.replacement) {
135
+ invalid.push({
136
+ fix,
137
+ reason: 'Original and replacement are identical',
138
+ });
139
+ continue;
140
+ }
141
+ // Check file path is reasonable
142
+ if (!fix.file || fix.file.includes('\0')) {
143
+ invalid.push({
144
+ fix,
145
+ reason: 'Invalid file path',
146
+ });
147
+ continue;
148
+ }
149
+ valid.push(fix);
150
+ }
151
+ return { valid, invalid };
152
+ }
153
+ /**
154
+ * Check if we're in a git repository
155
+ */
156
+ export function isGitRepository(cwd = process.cwd()) {
157
+ try {
158
+ execSync('git rev-parse --git-dir', {
159
+ cwd,
160
+ stdio: ['pipe', 'pipe', 'pipe'],
161
+ });
162
+ return true;
163
+ }
164
+ catch {
165
+ return false;
166
+ }
167
+ }
168
+ //# sourceMappingURL=safety.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safety.js","sourceRoot":"","sources":["../../src/fix/safety.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA8BpC,wBAAgB,SAAS,IAAI,OAAO,CAsCnC;AAGD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,YAAY,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAmCpC,wBAAgB,SAAS,IAAI,OAAO,CAyFnC;AAGD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,YAAY,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC"}
package/dist/index.js CHANGED
@@ -1,5 +1,7 @@
1
1
  import { Command } from "commander";
2
- import { createDockCommand, createScanCommand, createDriftCommand, createStatusCommand, createTokensCommand, createAnchorCommand, createPluginsCommand, createCICommand, createCheckCommand, createBaselineCommand, createExplainCommand, createCompareCommand, createAuditCommand, createGraphCommand, createImportCommand, createHistoryCommand, createBeginCommand,
2
+ import { existsSync } from "fs";
3
+ import { join } from "path";
4
+ import { createDockCommand, createScanCommand, createDriftCommand, createStatusCommand, createTokensCommand, createAnchorCommand, createPluginsCommand, createCICommand, createCheckCommand, createBaselineCommand, createExplainCommand, createCompareCommand, createAuditCommand, createGraphCommand, createImportCommand, createHistoryCommand, createBeginCommand, createSkillCommand, createFixCommand, createContextCommand,
3
5
  // Cloud commands
4
6
  createLoginCommand, createLogoutCommand, createWhoamiCommand, createLinkCommand, createUnlinkCommand, createSyncCommand, createGitHubCommand, createBillingCommand, } from "./commands/index.js";
5
7
  export function createCli() {
@@ -7,34 +9,78 @@ export function createCli() {
7
9
  program
8
10
  .name("buoy")
9
11
  .description("Design drift detection for the AI era")
10
- .version("0.0.1");
11
- // Add commands
12
- program.addCommand(createDockCommand());
12
+ .version("0.0.1")
13
+ .configureHelp({
14
+ sortSubcommands: false,
15
+ subcommandTerm: (cmd) => cmd.name(),
16
+ })
17
+ .addHelpText('after', `
18
+ Command Groups:
19
+ Getting Started begin, status, scan, dock
20
+ Drift Detection check, drift, ci, fix, baseline
21
+ AI Integration skill, context, explain
22
+ Design Tokens tokens, anchor, compare, import
23
+ Analysis audit, graph, history, plugins
24
+ Cloud login, logout, whoami, link, unlink, sync, billing
25
+ GitHub github
26
+
27
+ Quick Start:
28
+ $ buoy # auto-launches wizard if no config
29
+ $ buoy status # see design system coverage
30
+ $ buoy scan # find tokens & components
31
+ $ buoy check # validate for drift
32
+ `);
33
+ // === Getting Started ===
34
+ const beginCommand = createBeginCommand();
35
+ program.addCommand(beginCommand);
36
+ program.addCommand(createStatusCommand());
13
37
  program.addCommand(createScanCommand());
38
+ program.addCommand(createDockCommand());
39
+ // === Drift Detection ===
40
+ program.addCommand(createCheckCommand());
14
41
  program.addCommand(createDriftCommand());
15
- program.addCommand(createStatusCommand());
16
- program.addCommand(createTokensCommand());
17
- program.addCommand(createAnchorCommand());
18
- program.addCommand(createPluginsCommand());
19
42
  program.addCommand(createCICommand());
20
- program.addCommand(createCheckCommand());
43
+ program.addCommand(createFixCommand());
21
44
  program.addCommand(createBaselineCommand());
45
+ // === AI Integration ===
46
+ program.addCommand(createSkillCommand());
47
+ program.addCommand(createContextCommand());
22
48
  program.addCommand(createExplainCommand());
49
+ // === Design Tokens ===
50
+ program.addCommand(createTokensCommand());
51
+ program.addCommand(createAnchorCommand());
23
52
  program.addCommand(createCompareCommand());
53
+ program.addCommand(createImportCommand());
54
+ // === Analysis ===
24
55
  program.addCommand(createAuditCommand());
25
56
  program.addCommand(createGraphCommand());
26
- program.addCommand(createImportCommand());
27
57
  program.addCommand(createHistoryCommand());
28
- program.addCommand(createBeginCommand());
29
- // Cloud commands
58
+ program.addCommand(createPluginsCommand());
59
+ // === Cloud ===
30
60
  program.addCommand(createLoginCommand());
31
61
  program.addCommand(createLogoutCommand());
32
62
  program.addCommand(createWhoamiCommand());
33
63
  program.addCommand(createLinkCommand());
34
64
  program.addCommand(createUnlinkCommand());
35
65
  program.addCommand(createSyncCommand());
36
- program.addCommand(createGitHubCommand());
37
66
  program.addCommand(createBillingCommand());
67
+ // === GitHub ===
68
+ program.addCommand(createGitHubCommand());
69
+ // Default action: run wizard if no config exists
70
+ program.action(async () => {
71
+ const configExists = existsSync(join(process.cwd(), 'buoy.config.mjs')) ||
72
+ existsSync(join(process.cwd(), 'buoy.config.js')) ||
73
+ existsSync(join(process.cwd(), 'buoy.config.json'));
74
+ if (!configExists && process.stdin.isTTY) {
75
+ // No config + interactive terminal - launch wizard
76
+ console.log('\nNo config found. Launching setup wizard...\n');
77
+ await beginCommand.parseAsync([], { from: 'user' });
78
+ }
79
+ else {
80
+ // Config exists or non-interactive - show help
81
+ program.outputHelp();
82
+ }
83
+ });
38
84
  return program;
39
85
  }
40
86
  // Re-export config utilities for user config files
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,EACnB,oBAAoB,EACpB,eAAe,EACf,kBAAkB,EAClB,qBAAqB,EACrB,oBAAoB,EACpB,oBAAoB,EACpB,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,kBAAkB;AAClB,iBAAiB;AACjB,kBAAkB,EAClB,mBAAmB,EACnB,mBAAmB,EACnB,iBAAiB,EACjB,mBAAmB,EACnB,iBAAiB,EACjB,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,qBAAqB,CAAC;AAE7B,MAAM,UAAU,SAAS;IACvB,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAE9B,OAAO;SACJ,IAAI,CAAC,MAAM,CAAC;SACZ,WAAW,CAAC,uCAAuC,CAAC;SACpD,OAAO,CAAC,OAAO,CAAC,CAAC;IAEpB,eAAe;IACf,OAAO,CAAC,UAAU,CAAC,iBAAiB,EAAE,CAAC,CAAC;IACxC,OAAO,CAAC,UAAU,CAAC,iBAAiB,EAAE,CAAC,CAAC;IACxC,OAAO,CAAC,UAAU,CAAC,kBAAkB,EAAE,CAAC,CAAC;IACzC,OAAO,CAAC,UAAU,CAAC,mBAAmB,EAAE,CAAC,CAAC;IAC1C,OAAO,CAAC,UAAU,CAAC,mBAAmB,EAAE,CAAC,CAAC;IAC1C,OAAO,CAAC,UAAU,CAAC,mBAAmB,EAAE,CAAC,CAAC;IAC1C,OAAO,CAAC,UAAU,CAAC,oBAAoB,EAAE,CAAC,CAAC;IAC3C,OAAO,CAAC,UAAU,CAAC,eAAe,EAAE,CAAC,CAAC;IACtC,OAAO,CAAC,UAAU,CAAC,kBAAkB,EAAE,CAAC,CAAC;IACzC,OAAO,CAAC,UAAU,CAAC,qBAAqB,EAAE,CAAC,CAAC;IAC5C,OAAO,CAAC,UAAU,CAAC,oBAAoB,EAAE,CAAC,CAAC;IAC3C,OAAO,CAAC,UAAU,CAAC,oBAAoB,EAAE,CAAC,CAAC;IAC3C,OAAO,CAAC,UAAU,CAAC,kBAAkB,EAAE,CAAC,CAAC;IACzC,OAAO,CAAC,UAAU,CAAC,kBAAkB,EAAE,CAAC,CAAC;IACzC,OAAO,CAAC,UAAU,CAAC,mBAAmB,EAAE,CAAC,CAAC;IAC1C,OAAO,CAAC,UAAU,CAAC,oBAAoB,EAAE,CAAC,CAAC;IAC3C,OAAO,CAAC,UAAU,CAAC,kBAAkB,EAAE,CAAC,CAAC;IAEzC,iBAAiB;IACjB,OAAO,CAAC,UAAU,CAAC,kBAAkB,EAAE,CAAC,CAAC;IACzC,OAAO,CAAC,UAAU,CAAC,mBAAmB,EAAE,CAAC,CAAC;IAC1C,OAAO,CAAC,UAAU,CAAC,mBAAmB,EAAE,CAAC,CAAC;IAC1C,OAAO,CAAC,UAAU,CAAC,iBAAiB,EAAE,CAAC,CAAC;IACxC,OAAO,CAAC,UAAU,CAAC,mBAAmB,EAAE,CAAC,CAAC;IAC1C,OAAO,CAAC,UAAU,CAAC,iBAAiB,EAAE,CAAC,CAAC;IACxC,OAAO,CAAC,UAAU,CAAC,mBAAmB,EAAE,CAAC,CAAC;IAC1C,OAAO,CAAC,UAAU,CAAC,oBAAoB,EAAE,CAAC,CAAC;IAE3C,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,mDAAmD;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Fix Formatters
3
+ *
4
+ * Format fix suggestions, diffs, and results for CLI output.
5
+ */
6
+ import type { Fix } from '@buoy-design/core';
7
+ import type { ApplyFixesResult } from '../fix/applier.js';
8
+ /**
9
+ * Format a preview of available fixes (default mode)
10
+ */
11
+ export declare function formatFixPreview(fixes: Fix[]): string;
12
+ /**
13
+ * Format detailed diff for dry-run mode
14
+ */
15
+ export declare function formatFixDiff(fixes: Fix[]): string;
16
+ /**
17
+ * Format a single fix line item
18
+ */
19
+ export declare function formatFixLine(fix: Fix): string;
20
+ /**
21
+ * Format results after applying fixes
22
+ */
23
+ export declare function formatFixResult(result: ApplyFixesResult): string;
24
+ /**
25
+ * Format safety check warnings and errors
26
+ */
27
+ export declare function formatSafetyCheck(result: {
28
+ safe: boolean;
29
+ warnings: string[];
30
+ errors: string[];
31
+ }): string;
32
+ /**
33
+ * Format JSON output for fixes
34
+ */
35
+ export declare function formatFixesJson(fixes: Fix[]): string;
36
+ //# sourceMappingURL=fix-formatters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fix-formatters.d.ts","sourceRoot":"","sources":["../../src/output/fix-formatters.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,GAAG,EAAmB,MAAM,mBAAmB,CAAC;AAC9D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AA6B1D;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,MAAM,CA0CrD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,MAAM,CAgDlD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,GAAG,GAAG,MAAM,CAO9C;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,CAyDhE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE;IACxC,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB,GAAG,MAAM,CAwBT;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,MAAM,CA0BpD"}