@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.
- package/LICENSE +21 -0
- package/dist/commands/begin.d.ts.map +1 -1
- package/dist/commands/begin.js +18 -0
- package/dist/commands/begin.js.map +1 -1
- package/dist/commands/check.d.ts +10 -0
- package/dist/commands/check.d.ts.map +1 -1
- package/dist/commands/check.js +75 -1
- package/dist/commands/check.js.map +1 -1
- package/dist/commands/ci.d.ts.map +1 -1
- package/dist/commands/ci.js +29 -3
- package/dist/commands/ci.js.map +1 -1
- package/dist/commands/ci.logic.d.ts +8 -2
- package/dist/commands/ci.logic.d.ts.map +1 -1
- package/dist/commands/ci.logic.js +17 -3
- package/dist/commands/ci.logic.js.map +1 -1
- package/dist/commands/context.d.ts +9 -0
- package/dist/commands/context.d.ts.map +1 -0
- package/dist/commands/context.js +217 -0
- package/dist/commands/context.js.map +1 -0
- package/dist/commands/fix.d.ts +8 -0
- package/dist/commands/fix.d.ts.map +1 -0
- package/dist/commands/fix.js +224 -0
- package/dist/commands/fix.js.map +1 -0
- package/dist/commands/index.d.ts +3 -0
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +3 -0
- package/dist/commands/index.js.map +1 -1
- package/dist/commands/skill.d.ts +9 -0
- package/dist/commands/skill.d.ts.map +1 -0
- package/dist/commands/skill.js +190 -0
- package/dist/commands/skill.js.map +1 -0
- package/dist/commands/tokens.d.ts.map +1 -1
- package/dist/commands/tokens.js +169 -2
- package/dist/commands/tokens.js.map +1 -1
- package/dist/fix/applier.d.ts +25 -0
- package/dist/fix/applier.d.ts.map +1 -0
- package/dist/fix/applier.js +211 -0
- package/dist/fix/applier.js.map +1 -0
- package/dist/fix/index.d.ts +10 -0
- package/dist/fix/index.d.ts.map +1 -0
- package/dist/fix/index.js +8 -0
- package/dist/fix/index.js.map +1 -0
- package/dist/fix/safety.d.ts +30 -0
- package/dist/fix/safety.d.ts.map +1 -0
- package/dist/fix/safety.js +168 -0
- package/dist/fix/safety.js.map +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +59 -13
- package/dist/index.js.map +1 -1
- package/dist/output/fix-formatters.d.ts +36 -0
- package/dist/output/fix-formatters.d.ts.map +1 -0
- package/dist/output/fix-formatters.js +247 -0
- package/dist/output/fix-formatters.js.map +1 -0
- package/dist/output/index.d.ts +1 -0
- package/dist/output/index.d.ts.map +1 -1
- package/dist/output/index.js +1 -0
- package/dist/output/index.js.map +1 -1
- package/dist/output/reports.d.ts +154 -0
- package/dist/output/reports.d.ts.map +1 -0
- package/dist/output/reports.js +392 -0
- package/dist/output/reports.js.map +1 -0
- package/dist/services/context-generator.d.ts +43 -0
- package/dist/services/context-generator.d.ts.map +1 -0
- package/dist/services/context-generator.js +252 -0
- package/dist/services/context-generator.js.map +1 -0
- package/dist/services/skill-export.d.ts +96 -0
- package/dist/services/skill-export.d.ts.map +1 -0
- package/dist/services/skill-export.js +566 -0
- package/dist/services/skill-export.js.map +1 -0
- package/dist/wizard/ai-guardrails-generator.d.ts +20 -0
- package/dist/wizard/ai-guardrails-generator.d.ts.map +1 -0
- package/dist/wizard/ai-guardrails-generator.js +259 -0
- package/dist/wizard/ai-guardrails-generator.js.map +1 -0
- package/dist/wizard/index.d.ts +1 -0
- package/dist/wizard/index.d.ts.map +1 -1
- package/dist/wizard/index.js +1 -0
- package/dist/wizard/index.js.map +1 -1
- 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":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAS9C;;GAEG;AACH,MAAM,yBAAyB,GAAG;IAChC,iBAAiB;IACjB,SAAS;IACT,UAAU;IACV,UAAU;IACV,UAAU;IACV,aAAa;IACb,UAAU;IACV,WAAW;IACX,WAAW;IACX,SAAS;CACV,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,eAAe,CAC7B,KAAY,EACZ,MAAc,OAAO,CAAC,GAAG,EAAE;IAE3B,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,mBAAmB;IACnB,MAAM,SAAS,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;IACtC,IAAI,SAAS,CAAC,qBAAqB,EAAE,CAAC;QACpC,QAAQ,CAAC,IAAI,CACX,sFAAsF,CACvF,CAAC;IACJ,CAAC;IACD,IAAI,SAAS,CAAC,KAAK,EAAE,CAAC;QACpB,QAAQ,CAAC,IAAI,CAAC,+BAA+B,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC;IAClE,CAAC;IAED,2BAA2B;IAC3B,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC;QACxB,MAAM,YAAY,GAAG,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;QAC3D,IAAI,cAAc,CAAC,YAAY,CAAC,EAAE,CAAC;YACjC,MAAM,CAAC,IAAI,CAAC,8BAA8B,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;IAED,oBAAoB;IACpB,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC;QACxB,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;QACxC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,MAAM,CAAC,IAAI,CAAC,mBAAmB,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;IAED,6CAA6C;IAC7C,MAAM,WAAW,GAAG,IAAI,GAAG,EAAiB,CAAC;IAC7C,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC;QACxB,MAAM,GAAG,GAAG,GAAG,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;QACpD,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1B,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAC3B,CAAC;QACD,WAAW,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAClC,CAAC;IAED,KAAK,MAAM,CAAC,QAAQ,EAAE,aAAa,CAAC,IAAI,WAAW,EAAE,CAAC;QACpD,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7B,QAAQ,CAAC,IAAI,CACX,qBAAqB,QAAQ,KAAK,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC9E,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO;QACL,IAAI,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC;QACzB,QAAQ;QACR,MAAM;KACP,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,cAAc,CAAC,GAAW;IAIjC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,QAAQ,CAAC,wBAAwB,EAAE;YAChD,GAAG;YACH,QAAQ,EAAE,OAAO;YACjB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;SAChC,CAAC,CAAC;QAEH,OAAO;YACL,qBAAqB,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;SAChD,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,qBAAqB,EAAE,KAAK;YAC5B,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;SAChE,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,cAAc,CACrB,IAAY,EACZ,kBAA4B,yBAAyB;IAErD,KAAK,MAAM,OAAO,IAAI,eAAe,EAAE,CAAC;QACtC,IAAI,SAAS,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,CAAC;YAC7B,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,SAAS,SAAS,CAAC,IAAY,EAAE,OAAe;IAC9C,gCAAgC;IAChC,MAAM,QAAQ,GAAG,OAAO;SACrB,OAAO,CAAC,mBAAmB,EAAE,MAAM,CAAC;SACpC,OAAO,CAAC,OAAO,EAAE,cAAc,CAAC;SAChC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC;SACvB,OAAO,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC;IAElC,uDAAuD;IACvD,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,IAAI,QAAQ,MAAM,QAAQ,MAAM,QAAQ,GAAG,CAAC,CAAC;IACtE,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAY;IAI7C,MAAM,KAAK,GAAU,EAAE,CAAC;IACxB,MAAM,OAAO,GAAwC,EAAE,CAAC;IAExD,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC;QACxB,iCAAiC;QACjC,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACnC,OAAO,CAAC,IAAI,CAAC;gBACX,GAAG;gBACH,MAAM,EAAE,0BAA0B,GAAG,CAAC,IAAI,YAAY,GAAG,CAAC,MAAM,EAAE;aACnE,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QAED,+CAA+C;QAC/C,IAAI,GAAG,CAAC,QAAQ,KAAK,GAAG,CAAC,WAAW,EAAE,CAAC;YACrC,OAAO,CAAC,IAAI,CAAC;gBACX,GAAG;gBACH,MAAM,EAAE,wCAAwC;aACjD,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QAED,gCAAgC;QAChC,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACzC,OAAO,CAAC,IAAI,CAAC;gBACX,GAAG;gBACH,MAAM,EAAE,mBAAmB;aAC5B,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;AAC5B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE;IACzD,IAAI,CAAC;QACH,QAAQ,CAAC,yBAAyB,EAAE;YAClC,GAAG;YACH,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;SAChC,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,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 {
|
|
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
|
-
|
|
12
|
-
|
|
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(
|
|
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(
|
|
29
|
-
// Cloud
|
|
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;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,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,EAClB,kBAAkB,EAClB,gBAAgB,EAChB,oBAAoB;AACpB,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;SAChB,aAAa,CAAC;QACb,eAAe,EAAE,KAAK;QACtB,cAAc,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE;KACpC,CAAC;SACD,WAAW,CAAC,OAAO,EAAE;;;;;;;;;;;;;;;CAezB,CAAC,CAAC;IAED,0BAA0B;IAC1B,MAAM,YAAY,GAAG,kBAAkB,EAAE,CAAC;IAC1C,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;IACjC,OAAO,CAAC,UAAU,CAAC,mBAAmB,EAAE,CAAC,CAAC;IAC1C,OAAO,CAAC,UAAU,CAAC,iBAAiB,EAAE,CAAC,CAAC;IACxC,OAAO,CAAC,UAAU,CAAC,iBAAiB,EAAE,CAAC,CAAC;IAExC,0BAA0B;IAC1B,OAAO,CAAC,UAAU,CAAC,kBAAkB,EAAE,CAAC,CAAC;IACzC,OAAO,CAAC,UAAU,CAAC,kBAAkB,EAAE,CAAC,CAAC;IACzC,OAAO,CAAC,UAAU,CAAC,eAAe,EAAE,CAAC,CAAC;IACtC,OAAO,CAAC,UAAU,CAAC,gBAAgB,EAAE,CAAC,CAAC;IACvC,OAAO,CAAC,UAAU,CAAC,qBAAqB,EAAE,CAAC,CAAC;IAE5C,yBAAyB;IACzB,OAAO,CAAC,UAAU,CAAC,kBAAkB,EAAE,CAAC,CAAC;IACzC,OAAO,CAAC,UAAU,CAAC,oBAAoB,EAAE,CAAC,CAAC;IAC3C,OAAO,CAAC,UAAU,CAAC,oBAAoB,EAAE,CAAC,CAAC;IAE3C,wBAAwB;IACxB,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,mBAAmB,EAAE,CAAC,CAAC;IAE1C,mBAAmB;IACnB,OAAO,CAAC,UAAU,CAAC,kBAAkB,EAAE,CAAC,CAAC;IACzC,OAAO,CAAC,UAAU,CAAC,kBAAkB,EAAE,CAAC,CAAC;IACzC,OAAO,CAAC,UAAU,CAAC,oBAAoB,EAAE,CAAC,CAAC;IAC3C,OAAO,CAAC,UAAU,CAAC,oBAAoB,EAAE,CAAC,CAAC;IAE3C,gBAAgB;IAChB,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,oBAAoB,EAAE,CAAC,CAAC;IAE3C,iBAAiB;IACjB,OAAO,CAAC,UAAU,CAAC,mBAAmB,EAAE,CAAC,CAAC;IAE1C,iDAAiD;IACjD,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE;QACxB,MAAM,YAAY,GAChB,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,iBAAiB,CAAC,CAAC;YAClD,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,gBAAgB,CAAC,CAAC;YACjD,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,kBAAkB,CAAC,CAAC,CAAC;QAEtD,IAAI,CAAC,YAAY,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACzC,mDAAmD;YACnD,OAAO,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC;YAC9D,MAAM,YAAY,CAAC,UAAU,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;QACtD,CAAC;aAAM,CAAC;YACN,+CAA+C;YAC/C,OAAO,CAAC,UAAU,EAAE,CAAC;QACvB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,mDAAmD;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC"}
|
|
@@ -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"}
|