@buoy-design/cli 0.3.35 → 0.3.37
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commands/check.js.sync-conflict-20260313-114446-6PCZ3ZU.map +1 -0
- package/dist/commands/dock.js.sync-conflict-20260313-172700-6PCZ3ZU.map +1 -0
- package/dist/commands/show.d.ts.map +1 -1
- package/dist/commands/show.js +131 -12
- package/dist/commands/show.js.map +1 -1
- package/dist/config/loader.d.ts.sync-conflict-20260313-145931-6PCZ3ZU.map +1 -0
- package/dist/config/schema.sync-conflict-20260313-173553-6PCZ3ZU.d.ts +1812 -0
- package/dist/config/schema.sync-conflict-20260313-173553-6PCZ3ZU.d.ts.map +1 -0
- package/dist/config/schema.sync-conflict-20260313-173553-6PCZ3ZU.js +214 -0
- package/dist/config/schema.sync-conflict-20260313-173553-6PCZ3ZU.js.map +1 -0
- package/dist/detect/frameworks.sync-conflict-20260313-150557-6PCZ3ZU.js +252 -0
- package/dist/detect/monorepo-patterns.sync-conflict-20260311-182757-6PCZ3ZU.js +209 -0
- package/dist/hooks/index.sync-conflict-20260311-082258-6PCZ3ZU.js +616 -0
- package/dist/output/reporters.js.sync-conflict-20260313-164629-6PCZ3ZU.map +1 -0
- package/dist/services/drift-analysis.d.ts +2 -0
- package/dist/services/drift-analysis.d.ts.map +1 -1
- package/dist/services/drift-analysis.js +68 -1
- package/dist/services/drift-analysis.js.map +1 -1
- package/dist/services/drift-analysis.js.sync-conflict-20260313-152307-6PCZ3ZU.map +1 -0
- package/dist/services/remote-check.d.ts +4 -0
- package/dist/services/remote-check.d.ts.map +1 -1
- package/dist/services/remote-check.js +15 -1
- package/dist/services/remote-check.js.map +1 -1
- package/dist/services/skill-export.js.sync-conflict-20260313-155735-6PCZ3ZU.map +1 -0
- package/dist/services/skill-export.sync-conflict-20260313-161246-6PCZ3ZU.js +737 -0
- package/package.json +3 -3
|
@@ -0,0 +1,616 @@
|
|
|
1
|
+
// apps/cli/src/hooks/index.ts
|
|
2
|
+
import { existsSync, mkdirSync, writeFileSync, chmodSync, readFileSync, } from "fs";
|
|
3
|
+
import { resolve } from "path";
|
|
4
|
+
/**
|
|
5
|
+
* Pre-commit hook script content
|
|
6
|
+
*/
|
|
7
|
+
const PRE_COMMIT_HOOK = `#!/bin/sh
|
|
8
|
+
# Buoy pre-commit hook
|
|
9
|
+
# Auto-generated by 'buoy dock --hooks'
|
|
10
|
+
# See: https://buoy.dev/docs/pre-commit
|
|
11
|
+
|
|
12
|
+
# Run buoy drift check on staged files
|
|
13
|
+
buoy drift check --staged --fail-on critical
|
|
14
|
+
|
|
15
|
+
# If buoy drift check fails, prevent the commit
|
|
16
|
+
if [ $? -ne 0 ]; then
|
|
17
|
+
echo ""
|
|
18
|
+
echo "Commit blocked by buoy. Fix drift issues or use --no-verify to bypass."
|
|
19
|
+
exit 1
|
|
20
|
+
fi
|
|
21
|
+
`;
|
|
22
|
+
/**
|
|
23
|
+
* Husky pre-commit hook content (for .husky/pre-commit)
|
|
24
|
+
*/
|
|
25
|
+
const HUSKY_PRE_COMMIT_HOOK = `#!/usr/bin/env sh
|
|
26
|
+
. "$(dirname -- "$0")/_/husky.sh"
|
|
27
|
+
|
|
28
|
+
# Run buoy drift check on staged files
|
|
29
|
+
npx buoy drift check --staged --fail-on critical
|
|
30
|
+
`;
|
|
31
|
+
/**
|
|
32
|
+
* lint-staged configuration for package.json
|
|
33
|
+
*/
|
|
34
|
+
export const LINT_STAGED_CONFIG = {
|
|
35
|
+
"*.{tsx,jsx,ts,js,vue,svelte}": ["buoy drift check --staged --fail-on critical"],
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* Pre-commit config YAML content
|
|
39
|
+
*/
|
|
40
|
+
const PRE_COMMIT_CONFIG_YAML = `# .pre-commit-config.yaml
|
|
41
|
+
# See: https://pre-commit.com/
|
|
42
|
+
|
|
43
|
+
repos:
|
|
44
|
+
- repo: local
|
|
45
|
+
hooks:
|
|
46
|
+
- id: buoy
|
|
47
|
+
name: buoy show drift
|
|
48
|
+
entry: buoy drift check --staged --fail-on critical
|
|
49
|
+
language: system
|
|
50
|
+
types: [file]
|
|
51
|
+
files: \\.(tsx|jsx|ts|js|vue|svelte)$
|
|
52
|
+
`;
|
|
53
|
+
/**
|
|
54
|
+
* Detect which hook system is in use
|
|
55
|
+
*/
|
|
56
|
+
export function detectHookSystem(projectRoot) {
|
|
57
|
+
// Check for Husky
|
|
58
|
+
if (existsSync(resolve(projectRoot, ".husky"))) {
|
|
59
|
+
return "husky";
|
|
60
|
+
}
|
|
61
|
+
// Check for pre-commit
|
|
62
|
+
if (existsSync(resolve(projectRoot, ".pre-commit-config.yaml"))) {
|
|
63
|
+
return "pre-commit";
|
|
64
|
+
}
|
|
65
|
+
// Check for lint-staged in package.json
|
|
66
|
+
const pkgPath = resolve(projectRoot, "package.json");
|
|
67
|
+
if (existsSync(pkgPath)) {
|
|
68
|
+
try {
|
|
69
|
+
const pkg = JSON.parse(readFileSync(pkgPath, "utf-8"));
|
|
70
|
+
if (pkg["lint-staged"]) {
|
|
71
|
+
return "lint-staged";
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
// Ignore parse errors
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
// Check for .git directory (can use raw git hooks)
|
|
79
|
+
if (existsSync(resolve(projectRoot, ".git"))) {
|
|
80
|
+
return "git";
|
|
81
|
+
}
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Setup pre-commit hooks for the project
|
|
86
|
+
*/
|
|
87
|
+
export function setupHooks(projectRoot) {
|
|
88
|
+
const hookSystem = detectHookSystem(projectRoot);
|
|
89
|
+
if (!hookSystem) {
|
|
90
|
+
return {
|
|
91
|
+
success: false,
|
|
92
|
+
hookSystem: null,
|
|
93
|
+
message: "No git repository found. Run 'git init' first.",
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
switch (hookSystem) {
|
|
97
|
+
case "husky":
|
|
98
|
+
return setupHuskyHook(projectRoot);
|
|
99
|
+
case "pre-commit":
|
|
100
|
+
return setupPreCommitConfig(projectRoot);
|
|
101
|
+
case "lint-staged":
|
|
102
|
+
return setupLintStaged(projectRoot);
|
|
103
|
+
case "git":
|
|
104
|
+
return setupGitHook(projectRoot);
|
|
105
|
+
default:
|
|
106
|
+
return {
|
|
107
|
+
success: false,
|
|
108
|
+
hookSystem,
|
|
109
|
+
message: `Unsupported hook system: ${hookSystem}`,
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Setup raw git pre-commit hook
|
|
115
|
+
*/
|
|
116
|
+
function setupGitHook(projectRoot) {
|
|
117
|
+
const hooksDir = resolve(projectRoot, ".git", "hooks");
|
|
118
|
+
const hookPath = resolve(hooksDir, "pre-commit");
|
|
119
|
+
// Ensure hooks directory exists
|
|
120
|
+
if (!existsSync(hooksDir)) {
|
|
121
|
+
mkdirSync(hooksDir, { recursive: true });
|
|
122
|
+
}
|
|
123
|
+
// Check if hook already exists
|
|
124
|
+
if (existsSync(hookPath)) {
|
|
125
|
+
const existing = readFileSync(hookPath, "utf-8");
|
|
126
|
+
if (existing.includes("buoy drift check") || existing.includes("buoy check")) {
|
|
127
|
+
return {
|
|
128
|
+
success: true,
|
|
129
|
+
hookSystem: "git",
|
|
130
|
+
message: "Buoy hook already configured in .git/hooks/pre-commit",
|
|
131
|
+
filePath: hookPath,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
// Append to existing hook
|
|
135
|
+
const updated = existing +
|
|
136
|
+
"\n\n# Added by buoy dock --hooks\n" +
|
|
137
|
+
PRE_COMMIT_HOOK.split("\n").slice(4).join("\n");
|
|
138
|
+
writeFileSync(hookPath, updated);
|
|
139
|
+
return {
|
|
140
|
+
success: true,
|
|
141
|
+
hookSystem: "git",
|
|
142
|
+
message: "Added buoy drift check to existing .git/hooks/pre-commit",
|
|
143
|
+
filePath: hookPath,
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
// Write new hook
|
|
147
|
+
writeFileSync(hookPath, PRE_COMMIT_HOOK);
|
|
148
|
+
chmodSync(hookPath, 0o755);
|
|
149
|
+
return {
|
|
150
|
+
success: true,
|
|
151
|
+
hookSystem: "git",
|
|
152
|
+
message: "Created .git/hooks/pre-commit",
|
|
153
|
+
filePath: hookPath,
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Setup Husky pre-commit hook
|
|
158
|
+
*/
|
|
159
|
+
function setupHuskyHook(projectRoot) {
|
|
160
|
+
const huskyDir = resolve(projectRoot, ".husky");
|
|
161
|
+
const hookPath = resolve(huskyDir, "pre-commit");
|
|
162
|
+
// Check if hook already exists
|
|
163
|
+
if (existsSync(hookPath)) {
|
|
164
|
+
const existing = readFileSync(hookPath, "utf-8");
|
|
165
|
+
if (existing.includes("buoy drift check") || existing.includes("buoy check")) {
|
|
166
|
+
return {
|
|
167
|
+
success: true,
|
|
168
|
+
hookSystem: "husky",
|
|
169
|
+
message: "Buoy hook already configured in .husky/pre-commit",
|
|
170
|
+
filePath: hookPath,
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
// Append buoy drift check to existing hook
|
|
174
|
+
const updated = existing.trimEnd() +
|
|
175
|
+
"\n\n# Added by buoy dock --hooks\nnpx buoy drift check --staged --fail-on critical\n";
|
|
176
|
+
writeFileSync(hookPath, updated);
|
|
177
|
+
return {
|
|
178
|
+
success: true,
|
|
179
|
+
hookSystem: "husky",
|
|
180
|
+
message: "Added buoy drift check to existing .husky/pre-commit",
|
|
181
|
+
filePath: hookPath,
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
// Create new Husky hook
|
|
185
|
+
writeFileSync(hookPath, HUSKY_PRE_COMMIT_HOOK);
|
|
186
|
+
chmodSync(hookPath, 0o755);
|
|
187
|
+
return {
|
|
188
|
+
success: true,
|
|
189
|
+
hookSystem: "husky",
|
|
190
|
+
message: "Created .husky/pre-commit",
|
|
191
|
+
filePath: hookPath,
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Setup pre-commit framework config
|
|
196
|
+
*/
|
|
197
|
+
function setupPreCommitConfig(projectRoot) {
|
|
198
|
+
const configPath = resolve(projectRoot, ".pre-commit-config.yaml");
|
|
199
|
+
if (existsSync(configPath)) {
|
|
200
|
+
const existing = readFileSync(configPath, "utf-8");
|
|
201
|
+
if (existing.includes("buoy")) {
|
|
202
|
+
return {
|
|
203
|
+
success: true,
|
|
204
|
+
hookSystem: "pre-commit",
|
|
205
|
+
message: "Buoy hook already configured in .pre-commit-config.yaml",
|
|
206
|
+
filePath: configPath,
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
// Need to append to existing config - provide instructions
|
|
210
|
+
return {
|
|
211
|
+
success: false,
|
|
212
|
+
hookSystem: "pre-commit",
|
|
213
|
+
message: `Add buoy hook to your .pre-commit-config.yaml:\n\n - repo: local\n hooks:\n - id: buoy\n name: buoy show drift\n entry: buoy drift check --staged --fail-on critical\n language: system\n types: [file]\n files: \\.(tsx|jsx|ts|js|vue|svelte)$`,
|
|
214
|
+
filePath: configPath,
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
// Create new pre-commit config
|
|
218
|
+
writeFileSync(configPath, PRE_COMMIT_CONFIG_YAML);
|
|
219
|
+
return {
|
|
220
|
+
success: true,
|
|
221
|
+
hookSystem: "pre-commit",
|
|
222
|
+
message: "Created .pre-commit-config.yaml",
|
|
223
|
+
filePath: configPath,
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Setup lint-staged configuration
|
|
228
|
+
*/
|
|
229
|
+
function setupLintStaged(projectRoot) {
|
|
230
|
+
const pkgPath = resolve(projectRoot, "package.json");
|
|
231
|
+
try {
|
|
232
|
+
const pkg = JSON.parse(readFileSync(pkgPath, "utf-8"));
|
|
233
|
+
const lintStaged = pkg["lint-staged"] || {};
|
|
234
|
+
// Check if buoy is already configured
|
|
235
|
+
const hasbuoy = Object.values(lintStaged).some((commands) => Array.isArray(commands) &&
|
|
236
|
+
commands.some((cmd) => cmd.includes("buoy")));
|
|
237
|
+
if (hasbuoy) {
|
|
238
|
+
return {
|
|
239
|
+
success: true,
|
|
240
|
+
hookSystem: "lint-staged",
|
|
241
|
+
message: "Buoy already configured in lint-staged",
|
|
242
|
+
filePath: pkgPath,
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
// Provide instructions for lint-staged
|
|
246
|
+
return {
|
|
247
|
+
success: false,
|
|
248
|
+
hookSystem: "lint-staged",
|
|
249
|
+
message: `Add buoy to your lint-staged config in package.json:\n\n"lint-staged": {\n "*.{tsx,jsx,ts,js,vue,svelte}": ["buoy drift check --staged --fail-on critical"]\n}`,
|
|
250
|
+
filePath: pkgPath,
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
catch {
|
|
254
|
+
return {
|
|
255
|
+
success: false,
|
|
256
|
+
hookSystem: "lint-staged",
|
|
257
|
+
message: "Failed to read package.json",
|
|
258
|
+
filePath: pkgPath,
|
|
259
|
+
};
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Generate a standalone pre-commit hook script for .buoy/hooks/
|
|
264
|
+
*/
|
|
265
|
+
export function generateStandaloneHook(projectRoot) {
|
|
266
|
+
const buoyDir = resolve(projectRoot, ".buoy");
|
|
267
|
+
const hooksDir = resolve(buoyDir, "hooks");
|
|
268
|
+
const hookPath = resolve(hooksDir, "pre-commit");
|
|
269
|
+
// Create directories
|
|
270
|
+
if (!existsSync(hooksDir)) {
|
|
271
|
+
mkdirSync(hooksDir, { recursive: true });
|
|
272
|
+
}
|
|
273
|
+
// Write hook script
|
|
274
|
+
writeFileSync(hookPath, PRE_COMMIT_HOOK);
|
|
275
|
+
chmodSync(hookPath, 0o755);
|
|
276
|
+
return {
|
|
277
|
+
success: true,
|
|
278
|
+
hookSystem: "git",
|
|
279
|
+
message: "Created .buoy/hooks/pre-commit",
|
|
280
|
+
filePath: hookPath,
|
|
281
|
+
};
|
|
282
|
+
}
|
|
283
|
+
/**
|
|
284
|
+
* Generate Claude Code hooks configuration for design system awareness
|
|
285
|
+
* - SessionStart: Injects condensed design system context
|
|
286
|
+
* - PostToolUse: Self-validating drift check on file modifications
|
|
287
|
+
*
|
|
288
|
+
* Uses cross-platform Node.js command instead of `cat` for Windows compatibility
|
|
289
|
+
*
|
|
290
|
+
* @see https://code.claude.com/docs/en/hooks
|
|
291
|
+
*/
|
|
292
|
+
export function generateClaudeHooksConfig() {
|
|
293
|
+
// Cross-platform command that works on Windows, macOS, and Linux
|
|
294
|
+
const crossPlatformRead = `node -e "const fs=require('fs');const p='.claude/buoy-context.md';fs.existsSync(p)?console.log(fs.readFileSync(p,'utf8')):console.log('🛟 Design system active. Run buoy dock agents to set up context.')"`;
|
|
295
|
+
// Self-validating hook: runs buoy drift check and returns structured feedback
|
|
296
|
+
// Uses the validation script which:
|
|
297
|
+
// 1. Parses stdin JSON to get the modified file path
|
|
298
|
+
// 2. Runs buoy drift check and filters to issues in that file
|
|
299
|
+
// 3. Returns JSON with additionalContext for Claude to self-correct
|
|
300
|
+
const selfValidateCommand = `node "$CLAUDE_PROJECT_DIR/.claude/hooks/buoy-validate.js"`;
|
|
301
|
+
return {
|
|
302
|
+
hooks: {
|
|
303
|
+
SessionStart: [
|
|
304
|
+
{
|
|
305
|
+
hooks: [
|
|
306
|
+
{
|
|
307
|
+
type: "command",
|
|
308
|
+
command: crossPlatformRead,
|
|
309
|
+
},
|
|
310
|
+
],
|
|
311
|
+
},
|
|
312
|
+
],
|
|
313
|
+
PostToolUse: [
|
|
314
|
+
{
|
|
315
|
+
matcher: "Edit",
|
|
316
|
+
hooks: [
|
|
317
|
+
{
|
|
318
|
+
type: "command",
|
|
319
|
+
command: selfValidateCommand,
|
|
320
|
+
},
|
|
321
|
+
],
|
|
322
|
+
},
|
|
323
|
+
{
|
|
324
|
+
matcher: "Write",
|
|
325
|
+
hooks: [
|
|
326
|
+
{
|
|
327
|
+
type: "command",
|
|
328
|
+
command: selfValidateCommand,
|
|
329
|
+
},
|
|
330
|
+
],
|
|
331
|
+
},
|
|
332
|
+
],
|
|
333
|
+
},
|
|
334
|
+
};
|
|
335
|
+
}
|
|
336
|
+
/**
|
|
337
|
+
* Get the self-validating hook script content
|
|
338
|
+
* This script:
|
|
339
|
+
* 1. Parses stdin JSON to get the modified file path
|
|
340
|
+
* 2. Runs buoy drift check and filters to issues in that file
|
|
341
|
+
* 3. Returns JSON with additionalContext for Claude to self-correct
|
|
342
|
+
*/
|
|
343
|
+
function getValidationScript() {
|
|
344
|
+
return `#!/usr/bin/env node
|
|
345
|
+
/**
|
|
346
|
+
* Buoy PostToolUse Hook - Self-Validating Agent
|
|
347
|
+
*
|
|
348
|
+
* Runs after Edit/Write tool completes to check for design drift.
|
|
349
|
+
* Returns structured feedback that Claude can use to self-correct.
|
|
350
|
+
*
|
|
351
|
+
* @see https://code.claude.com/docs/en/hooks
|
|
352
|
+
*/
|
|
353
|
+
|
|
354
|
+
import { spawnSync } from 'child_process';
|
|
355
|
+
import { readFileSync, unlinkSync } from 'fs';
|
|
356
|
+
import path from 'path';
|
|
357
|
+
import { tmpdir } from 'os';
|
|
358
|
+
|
|
359
|
+
// Read hook input from stdin
|
|
360
|
+
let inputData = '';
|
|
361
|
+
process.stdin.setEncoding('utf8');
|
|
362
|
+
|
|
363
|
+
process.stdin.on('data', (chunk) => {
|
|
364
|
+
inputData += chunk;
|
|
365
|
+
});
|
|
366
|
+
|
|
367
|
+
process.stdin.on('end', () => {
|
|
368
|
+
try {
|
|
369
|
+
const input = JSON.parse(inputData);
|
|
370
|
+
const result = validateFile(input);
|
|
371
|
+
|
|
372
|
+
if (result) {
|
|
373
|
+
console.log(JSON.stringify(result));
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
// Always exit 0 - we want to provide feedback, not block
|
|
377
|
+
process.exit(0);
|
|
378
|
+
} catch (err) {
|
|
379
|
+
// Silent failure - don't interrupt Claude's work
|
|
380
|
+
process.exit(0);
|
|
381
|
+
}
|
|
382
|
+
});
|
|
383
|
+
|
|
384
|
+
/**
|
|
385
|
+
* Check if a file is a UI component file we should validate
|
|
386
|
+
*/
|
|
387
|
+
function isUIFile(filePath) {
|
|
388
|
+
if (!filePath) return false;
|
|
389
|
+
|
|
390
|
+
const uiExtensions = [
|
|
391
|
+
'.tsx', '.jsx', '.vue', '.svelte',
|
|
392
|
+
'.component.ts', '.component.html'
|
|
393
|
+
];
|
|
394
|
+
|
|
395
|
+
const excludePatterns = [
|
|
396
|
+
/\\.test\\./,
|
|
397
|
+
/\\.spec\\./,
|
|
398
|
+
/\\.stories\\./,
|
|
399
|
+
/node_modules/,
|
|
400
|
+
/\\.d\\.ts$/,
|
|
401
|
+
/\\.config\\./
|
|
402
|
+
];
|
|
403
|
+
|
|
404
|
+
const isUIExt = uiExtensions.some(e => filePath.endsWith(e));
|
|
405
|
+
const isExcluded = excludePatterns.some(p => p.test(filePath));
|
|
406
|
+
|
|
407
|
+
return isUIExt && !isExcluded;
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
/**
|
|
411
|
+
* Validate a file for design drift
|
|
412
|
+
*/
|
|
413
|
+
function validateFile(input) {
|
|
414
|
+
const toolInput = input.tool_input || {};
|
|
415
|
+
const filePath = toolInput.file_path;
|
|
416
|
+
|
|
417
|
+
// Only validate UI files
|
|
418
|
+
if (!isUIFile(filePath)) {
|
|
419
|
+
return null;
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
try {
|
|
423
|
+
// Run buoy drift check with JSON format via temp file to avoid Node.js pipe buffer limits
|
|
424
|
+
const tempFile = path.join(tmpdir(), \\\`buoy-check-\\\${process.pid}.json\\\`);
|
|
425
|
+
const result = spawnSync('sh', ['-c', \\\`npx buoy drift check --format json > "\\\${tempFile}" 2>/dev/null\\\`], {
|
|
426
|
+
cwd: input.cwd || process.cwd(),
|
|
427
|
+
timeout: 30000,
|
|
428
|
+
shell: false
|
|
429
|
+
});
|
|
430
|
+
|
|
431
|
+
if (result.error) {
|
|
432
|
+
return null;
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
let output;
|
|
436
|
+
try {
|
|
437
|
+
output = readFileSync(tempFile, 'utf8');
|
|
438
|
+
unlinkSync(tempFile);
|
|
439
|
+
} catch (e) {
|
|
440
|
+
return null;
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
const checkResult = JSON.parse(output);
|
|
444
|
+
|
|
445
|
+
// Filter to only issues in the modified file
|
|
446
|
+
const fileIssues = (checkResult.issues || checkResult.drifts || []).filter(
|
|
447
|
+
issue => {
|
|
448
|
+
// Extract path from source.location (format: "path/to/file.tsx:123")
|
|
449
|
+
const location = issue.source?.location || '';
|
|
450
|
+
const issuePath = location.split(':')[0] || issue.file || issue.source?.path;
|
|
451
|
+
return issuePath === filePath || filePath.endsWith(issuePath) || issuePath?.endsWith(path.basename(filePath));
|
|
452
|
+
}
|
|
453
|
+
);
|
|
454
|
+
|
|
455
|
+
if (fileIssues.length === 0) {
|
|
456
|
+
return null; // No issues, no feedback needed
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
// Format feedback for Claude
|
|
460
|
+
const feedback = formatFeedback(filePath, fileIssues);
|
|
461
|
+
|
|
462
|
+
return {
|
|
463
|
+
hookSpecificOutput: {
|
|
464
|
+
hookEventName: "PostToolUse",
|
|
465
|
+
additionalContext: feedback
|
|
466
|
+
}
|
|
467
|
+
};
|
|
468
|
+
|
|
469
|
+
} catch (err) {
|
|
470
|
+
// buoy drift check failed or not installed - silent failure
|
|
471
|
+
return null;
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
/**
|
|
476
|
+
* Format drift issues as actionable feedback for Claude
|
|
477
|
+
*/
|
|
478
|
+
function formatFeedback(filePath, issues) {
|
|
479
|
+
const lines = [
|
|
480
|
+
'⚠️ Design drift detected in ' + path.basename(filePath) + ':',
|
|
481
|
+
''
|
|
482
|
+
];
|
|
483
|
+
|
|
484
|
+
for (const issue of issues.slice(0, 5)) { // Limit to 5 issues
|
|
485
|
+
const type = issue.type || issue.driftType || 'drift';
|
|
486
|
+
const msg = issue.message || issue.description || 'Design system violation';
|
|
487
|
+
lines.push('• ' + type + ': ' + msg);
|
|
488
|
+
|
|
489
|
+
if (issue.suggestion || issue.fix) {
|
|
490
|
+
lines.push(' Fix: ' + (issue.suggestion || issue.fix));
|
|
491
|
+
}
|
|
492
|
+
lines.push('');
|
|
493
|
+
}
|
|
494
|
+
|
|
495
|
+
if (issues.length > 5) {
|
|
496
|
+
lines.push('... and ' + (issues.length - 5) + ' more issues');
|
|
497
|
+
lines.push('');
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
lines.push('Run \\\`buoy show drift\\\` for full details.');
|
|
501
|
+
|
|
502
|
+
return lines.join('\\n');
|
|
503
|
+
}
|
|
504
|
+
`;
|
|
505
|
+
}
|
|
506
|
+
/**
|
|
507
|
+
* Validate that a parsed JSON object has valid Claude settings structure
|
|
508
|
+
*/
|
|
509
|
+
function isValidClaudeSettings(obj) {
|
|
510
|
+
if (typeof obj !== 'object' || obj === null || Array.isArray(obj)) {
|
|
511
|
+
return false;
|
|
512
|
+
}
|
|
513
|
+
const settings = obj;
|
|
514
|
+
// If hooks exists, it must be an object
|
|
515
|
+
if ('hooks' in settings && (typeof settings.hooks !== 'object' || settings.hooks === null || Array.isArray(settings.hooks))) {
|
|
516
|
+
return false;
|
|
517
|
+
}
|
|
518
|
+
return true;
|
|
519
|
+
}
|
|
520
|
+
/**
|
|
521
|
+
* Setup Claude Code hooks for the project
|
|
522
|
+
*/
|
|
523
|
+
export function setupClaudeHooks(projectRoot) {
|
|
524
|
+
const claudeDir = resolve(projectRoot, ".claude");
|
|
525
|
+
const hooksDir = resolve(claudeDir, "hooks");
|
|
526
|
+
const settingsPath = resolve(claudeDir, "settings.local.json");
|
|
527
|
+
// Ensure .claude/hooks directory exists
|
|
528
|
+
if (!existsSync(hooksDir)) {
|
|
529
|
+
mkdirSync(hooksDir, { recursive: true });
|
|
530
|
+
}
|
|
531
|
+
// Install the validation script
|
|
532
|
+
const validateScriptPath = resolve(hooksDir, "buoy-validate.js");
|
|
533
|
+
if (!existsSync(validateScriptPath)) {
|
|
534
|
+
const scriptContent = getValidationScript();
|
|
535
|
+
writeFileSync(validateScriptPath, scriptContent);
|
|
536
|
+
chmodSync(validateScriptPath, 0o755);
|
|
537
|
+
}
|
|
538
|
+
// Check if .claude directory exists
|
|
539
|
+
if (!existsSync(claudeDir)) {
|
|
540
|
+
mkdirSync(claudeDir, { recursive: true });
|
|
541
|
+
}
|
|
542
|
+
// Check if settings.local.json already exists
|
|
543
|
+
if (existsSync(settingsPath)) {
|
|
544
|
+
try {
|
|
545
|
+
const parsed = JSON.parse(readFileSync(settingsPath, "utf-8"));
|
|
546
|
+
// Validate structure before merging
|
|
547
|
+
if (!isValidClaudeSettings(parsed)) {
|
|
548
|
+
return {
|
|
549
|
+
success: false,
|
|
550
|
+
message: "Invalid structure in .claude/settings.local.json - expected object with optional hooks property",
|
|
551
|
+
filePath: settingsPath,
|
|
552
|
+
created: false,
|
|
553
|
+
};
|
|
554
|
+
}
|
|
555
|
+
const existing = parsed;
|
|
556
|
+
// Check if hooks are already configured
|
|
557
|
+
const hooks = existing.hooks;
|
|
558
|
+
const hasbuoyHook = hooks?.SessionStart?.some((h) => {
|
|
559
|
+
const hook = h;
|
|
560
|
+
return hook.hooks?.some((hk) => hk.command?.includes("buoy") || hk.command?.includes("Design system"));
|
|
561
|
+
}) ||
|
|
562
|
+
hooks?.PostToolUse?.some((h) => {
|
|
563
|
+
const hook = h;
|
|
564
|
+
return hook.hooks?.some((hk) => hk.command?.includes("buoy"));
|
|
565
|
+
});
|
|
566
|
+
if (hasbuoyHook) {
|
|
567
|
+
return {
|
|
568
|
+
success: true,
|
|
569
|
+
message: "Buoy hooks already configured in .claude/settings.local.json",
|
|
570
|
+
filePath: settingsPath,
|
|
571
|
+
created: false,
|
|
572
|
+
};
|
|
573
|
+
}
|
|
574
|
+
// Merge with existing config
|
|
575
|
+
const buoyConfig = generateClaudeHooksConfig();
|
|
576
|
+
existing.hooks = existing.hooks || {};
|
|
577
|
+
const existingHooks = existing.hooks;
|
|
578
|
+
existingHooks.SessionStart = [
|
|
579
|
+
...(existingHooks.SessionStart || []),
|
|
580
|
+
...buoyConfig.hooks.SessionStart,
|
|
581
|
+
];
|
|
582
|
+
existingHooks.PostToolUse = [
|
|
583
|
+
...(existingHooks.PostToolUse || []),
|
|
584
|
+
...buoyConfig.hooks.PostToolUse,
|
|
585
|
+
];
|
|
586
|
+
writeFileSync(settingsPath, JSON.stringify(existing, null, 2) + "\n");
|
|
587
|
+
return {
|
|
588
|
+
success: true,
|
|
589
|
+
message: "Added Buoy hooks to existing .claude/settings.local.json",
|
|
590
|
+
filePath: settingsPath,
|
|
591
|
+
created: false,
|
|
592
|
+
};
|
|
593
|
+
}
|
|
594
|
+
catch (err) {
|
|
595
|
+
const message = err instanceof SyntaxError
|
|
596
|
+
? "Invalid JSON in .claude/settings.local.json"
|
|
597
|
+
: "Failed to read .claude/settings.local.json";
|
|
598
|
+
return {
|
|
599
|
+
success: false,
|
|
600
|
+
message,
|
|
601
|
+
filePath: settingsPath,
|
|
602
|
+
created: false,
|
|
603
|
+
};
|
|
604
|
+
}
|
|
605
|
+
}
|
|
606
|
+
// Create new settings file
|
|
607
|
+
const config = generateClaudeHooksConfig();
|
|
608
|
+
writeFileSync(settingsPath, JSON.stringify(config, null, 2) + "\n");
|
|
609
|
+
return {
|
|
610
|
+
success: true,
|
|
611
|
+
message: "Created .claude/settings.local.json with Buoy hooks",
|
|
612
|
+
filePath: settingsPath,
|
|
613
|
+
created: true,
|
|
614
|
+
};
|
|
615
|
+
}
|
|
616
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reporters.js","sourceRoot":"","sources":["../../src/output/reporters.ts"],"names":[],"mappings":"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"}
|
|
@@ -33,6 +33,8 @@ export interface DriftAnalysisResult {
|
|
|
33
33
|
drifts: DriftSignal[];
|
|
34
34
|
/** Components that were scanned */
|
|
35
35
|
components: Component[];
|
|
36
|
+
/** Number of tokens found during scan */
|
|
37
|
+
tokenCount: number;
|
|
36
38
|
/** Number of drifts filtered out by ignore list */
|
|
37
39
|
ignoredCount: number;
|
|
38
40
|
/** Summary counts by severity */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"drift-analysis.d.ts","sourceRoot":"","sources":["../../src/services/drift-analysis.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"drift-analysis.d.ts","sourceRoot":"","sources":["../../src/services/drift-analysis.ts"],"names":[],"mappings":"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"}
|