@buoy-design/cli 0.3.30 → 0.3.31

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.
@@ -0,0 +1,493 @@
1
+ import { mkdtemp, mkdir, readFile, rm, stat, writeFile } from "node:fs/promises";
2
+ import { existsSync } from "node:fs";
3
+ import { tmpdir } from "node:os";
4
+ import { basename, extname, join, resolve } from "node:path";
5
+ import { createHash } from "node:crypto";
6
+ import { lookup } from "node:dns/promises";
7
+ import { isIP } from "node:net";
8
+ import { DriftAnalysisService, calculateDriftSummary } from "./drift-analysis.js";
9
+ export function looksLikePublicUrl(input) {
10
+ const s = input.trim();
11
+ if (!s)
12
+ return false;
13
+ if (/^https?:\/\//i.test(s))
14
+ return true;
15
+ if (/^[./~]/.test(s))
16
+ return false;
17
+ if (/^[A-Za-z]:[\\/]/.test(s))
18
+ return false;
19
+ if (s.includes("\\") && !s.includes("/"))
20
+ return false;
21
+ const slashIdx = s.indexOf("/");
22
+ const host = (slashIdx === -1 ? s : s.slice(0, slashIdx)).toLowerCase();
23
+ if (!host || !host.includes("."))
24
+ return false;
25
+ if (host.endsWith(".") || host.includes(".."))
26
+ return false;
27
+ if (!/^[a-z0-9.-]+(?::\d+)?$/i.test(host))
28
+ return false;
29
+ return true;
30
+ }
31
+ export function normalizePublicUrl(input) {
32
+ const trimmed = input.trim();
33
+ if (/^https?:\/\//i.test(trimmed))
34
+ return trimmed;
35
+ if (looksLikePublicUrl(trimmed))
36
+ return `https://${trimmed}`;
37
+ throw new Error(`Not a public URL: ${input}`);
38
+ }
39
+ export function classifyCheckInput(target, options) {
40
+ if (options.fixture)
41
+ return "remote-fixture";
42
+ if (options.url)
43
+ return "remote-url";
44
+ if (!target)
45
+ return "project";
46
+ if (looksLikePublicUrl(target))
47
+ return "remote-url";
48
+ return "local-file";
49
+ }
50
+ export async function runSingleSourceOrRemoteCheck(opts) {
51
+ const mode = classifyCheckInput(opts.target, { url: opts.url, fixture: opts.fixture });
52
+ if (mode === "project") {
53
+ throw new Error("runSingleSourceOrRemoteCheck called without a target");
54
+ }
55
+ const tempRoot = await mkdtemp(join(tmpdir(), "buoy-remote-check-"));
56
+ try {
57
+ const remoteOpts = {
58
+ allowPrivateNetwork: !!opts.allowPrivateNetwork,
59
+ timeoutMs: opts.timeoutMs ?? 10_000,
60
+ maxBytes: opts.maxBytes ?? 1_048_576,
61
+ cache: !!opts.cache,
62
+ };
63
+ const fixture = mode === "remote-fixture"
64
+ ? await loadFixtureManifest(opts.fixture, tempRoot, remoteOpts)
65
+ : null;
66
+ const sourceRef = fixture
67
+ ? (typeof fixture.source === "string" ? fixture.source : fixture.source.url)
68
+ : mode === "remote-url"
69
+ ? (opts.url ?? opts.target)
70
+ : opts.target;
71
+ const sourceAsset = await loadAsset(sourceRef, tempRoot, remoteOpts);
72
+ const sourceNameRef = sourceAsset.resolvedUrl || sourceRef;
73
+ const sourceExt = extname(inferFilename(sourceNameRef, sourceAsset.contentType)) || inferExtensionFromContent(sourceAsset.content) || ".txt";
74
+ const sourceRelPath = inferSourceRelativePath(sourceExt, fixture);
75
+ const sourceAbsPath = resolve(tempRoot, sourceRelPath);
76
+ await mkdir(dirnameSafe(sourceAbsPath), { recursive: true });
77
+ await writeFile(sourceAbsPath, sourceAsset.content);
78
+ const tokenRefs = fixture
79
+ ? normalizeFixtureTokenRefs(fixture.tokens)
80
+ : opts.tokens
81
+ ? [opts.tokens]
82
+ : [];
83
+ const tokenFiles = [];
84
+ for (let i = 0; i < tokenRefs.length; i++) {
85
+ const tokenRef = tokenRefs[i];
86
+ const tokenAsset = await loadAsset(typeof tokenRef === "string" ? tokenRef : tokenRef.url, tempRoot, remoteOpts);
87
+ const tokenFilename = (typeof tokenRef === "object" && tokenRef.path) || inferFilename(typeof tokenRef === "string" ? tokenRef : tokenRef.url, tokenAsset.contentType) || `tokens-${i}.json`;
88
+ const rel = sanitizeRelativePath(tokenFilename, `tokens/tokens-${i}${extname(tokenFilename) || ".json"}`);
89
+ const abs = resolve(tempRoot, rel);
90
+ await mkdir(dirnameSafe(abs), { recursive: true });
91
+ await writeFile(abs, tokenAsset.content);
92
+ tokenFiles.push(rel);
93
+ }
94
+ const inferred = inferSourceConfig(sourceRelPath, fixture);
95
+ if (!inferred) {
96
+ throw new Error(`Unsupported source type for drift check: ${sourceRelPath}`);
97
+ }
98
+ const hasContextAssets = tokenFiles.length > 0 || !!fixture?.config;
99
+ if (opts.strictRemote && !hasContextAssets) {
100
+ throw new Error("Strict remote mode requires tokens or fixture config context (use --tokens or --fixture)");
101
+ }
102
+ const baseConfig = buildRemoteConfig({
103
+ sourceRelPath,
104
+ tokenFiles,
105
+ inferred,
106
+ fixtureConfig: fixture?.config,
107
+ reducedConfidence: !hasContextAssets,
108
+ });
109
+ const service = new DriftAnalysisService(baseConfig, tempRoot);
110
+ const result = await service.analyze({
111
+ onProgress: opts.verbose ? (m) => console.error(m) : undefined,
112
+ includeIgnored: false,
113
+ });
114
+ return {
115
+ drifts: result.drifts,
116
+ summary: calculateDriftSummary(result.drifts),
117
+ sourceContext: {
118
+ mode: mode === "local-file" ? "local" : mode,
119
+ confidence: hasContextAssets ? "full" : "reduced",
120
+ reason: hasContextAssets
121
+ ? undefined
122
+ : "No tokens/config context supplied; results may miss semantic-token mappings and project-level drift signals",
123
+ source: sourceRef,
124
+ tokens: tokenRefs.map((t) => (typeof t === "string" ? t : t.url)),
125
+ },
126
+ };
127
+ }
128
+ finally {
129
+ await rm(tempRoot, { recursive: true, force: true });
130
+ }
131
+ }
132
+ async function loadFixtureManifest(fixtureRef, tempRoot, opts) {
133
+ const asset = await loadAsset(fixtureRef, tempRoot, opts);
134
+ const contentType = (asset.contentType || "").toLowerCase();
135
+ if (!contentType.includes("json") && !fixtureRef.endsWith(".json")) {
136
+ throw new Error(`Fixture must be JSON (got content-type "${asset.contentType || "unknown"}")`);
137
+ }
138
+ let parsed;
139
+ try {
140
+ parsed = JSON.parse(asset.content.toString("utf-8"));
141
+ }
142
+ catch (err) {
143
+ throw new Error(`Invalid fixture JSON: ${err instanceof Error ? err.message : String(err)}`);
144
+ }
145
+ if (!parsed || typeof parsed !== "object" || !("source" in parsed)) {
146
+ throw new Error("Invalid fixture manifest: missing required `source` field");
147
+ }
148
+ return parsed;
149
+ }
150
+ async function loadAsset(ref, tempRoot, opts) {
151
+ if (looksLikePublicUrl(ref) || /^https?:\/\//i.test(ref.trim())) {
152
+ return fetchRemoteAsset(normalizePublicUrl(ref), tempRoot, opts);
153
+ }
154
+ const fullPath = resolve(process.cwd(), ref);
155
+ try {
156
+ const [content, meta] = await Promise.all([readFile(fullPath), stat(fullPath)]);
157
+ if (!meta.isFile())
158
+ throw new Error("Not a file");
159
+ return { original: ref, content, contentType: contentTypeFromExt(extname(fullPath)) || "application/octet-stream", localPath: fullPath };
160
+ }
161
+ catch (err) {
162
+ throw new Error(`Failed to read local file "${ref}": ${err instanceof Error ? err.message : String(err)}`);
163
+ }
164
+ }
165
+ async function fetchRemoteAsset(url, tempRoot, opts) {
166
+ let currentUrl = url;
167
+ const cachePath = opts.cache ? getRemoteCachePath(tempRoot, url) : null;
168
+ if (cachePath && existsSync(cachePath)) {
169
+ const content = await readFile(cachePath);
170
+ let inferredType = "application/octet-stream";
171
+ try {
172
+ const parsed = new URL(url);
173
+ inferredType = contentTypeFromExt(extname(parsed.pathname)) || inferredType;
174
+ }
175
+ catch { }
176
+ return { original: url, resolvedUrl: url, content, contentType: inferredType };
177
+ }
178
+ let response = null;
179
+ let redirects = 0;
180
+ const maxRedirects = 5;
181
+ while (true) {
182
+ const parsed = new URL(currentUrl);
183
+ if (!["http:", "https:"].includes(parsed.protocol)) {
184
+ throw new Error(`Unsupported URL protocol: ${parsed.protocol}`);
185
+ }
186
+ await enforceNetworkGuards(parsed, opts.allowPrivateNetwork);
187
+ const controller = new AbortController();
188
+ const timeout = setTimeout(() => controller.abort(), opts.timeoutMs);
189
+ try {
190
+ response = await fetch(currentUrl, {
191
+ signal: controller.signal,
192
+ redirect: "manual",
193
+ headers: { "user-agent": "buoy-cli/remote-check" },
194
+ });
195
+ }
196
+ catch (err) {
197
+ if (err instanceof Error && err.name === "AbortError") {
198
+ throw new Error(`Remote fetch timed out after ${opts.timeoutMs}ms: ${currentUrl}`);
199
+ }
200
+ throw new Error(`Failed to fetch URL ${currentUrl}: ${err instanceof Error ? err.message : String(err)}`);
201
+ }
202
+ finally {
203
+ clearTimeout(timeout);
204
+ }
205
+ if (response.status >= 300 && response.status < 400) {
206
+ const location = response.headers.get("location");
207
+ if (!location) {
208
+ throw new Error(`Redirect response missing Location header (HTTP ${response.status}) for ${currentUrl}`);
209
+ }
210
+ redirects += 1;
211
+ if (redirects > maxRedirects) {
212
+ throw new Error(`Too many redirects (${maxRedirects}) while fetching ${url}`);
213
+ }
214
+ currentUrl = new URL(location, currentUrl).toString();
215
+ continue;
216
+ }
217
+ if (!response.ok) {
218
+ throw new Error(`Remote fetch failed with HTTP ${response.status} for ${currentUrl}`);
219
+ }
220
+ break;
221
+ }
222
+ const contentType = response.headers.get("content-type") || "";
223
+ const body = await readResponseBodyWithLimit(response, opts.maxBytes, currentUrl);
224
+ if (cachePath) {
225
+ await mkdir(dirnameSafe(cachePath), { recursive: true });
226
+ await writeFile(cachePath, body);
227
+ }
228
+ return { original: url, resolvedUrl: currentUrl, content: body, contentType };
229
+ }
230
+ async function readResponseBodyWithLimit(response, maxBytes, url) {
231
+ const chunks = [];
232
+ let total = 0;
233
+ const reader = response.body?.getReader();
234
+ if (!reader) {
235
+ const ab = await response.arrayBuffer();
236
+ const buf = Buffer.from(ab);
237
+ if (buf.length > maxBytes) {
238
+ throw new Error(`Remote response exceeded max size (${maxBytes} bytes): ${url}`);
239
+ }
240
+ return buf;
241
+ }
242
+ while (true) {
243
+ const { done, value } = await reader.read();
244
+ if (done)
245
+ break;
246
+ if (!value)
247
+ continue;
248
+ total += value.byteLength;
249
+ if (total > maxBytes) {
250
+ try {
251
+ await reader.cancel();
252
+ }
253
+ catch { }
254
+ throw new Error(`Remote response exceeded max size (${maxBytes} bytes): ${url}`);
255
+ }
256
+ chunks.push(value);
257
+ }
258
+ return Buffer.concat(chunks.map((c) => Buffer.from(c)));
259
+ }
260
+ async function enforceNetworkGuards(url, allowPrivateNetwork) {
261
+ const host = url.hostname.toLowerCase();
262
+ if (!allowPrivateNetwork) {
263
+ if (host === "localhost" || host.endsWith(".localhost")) {
264
+ throw new Error(`Blocked private/localhost URL: ${url.toString()} (use --allow-private-network to override)`);
265
+ }
266
+ if (host === "[::1]" || host === "::1") {
267
+ throw new Error(`Blocked private loopback URL: ${url.toString()} (use --allow-private-network to override)`);
268
+ }
269
+ }
270
+ const literalIp = isIP(host.replace(/^\[|\]$/g, ""));
271
+ if (literalIp && !allowPrivateNetwork && isPrivateIp(host)) {
272
+ throw new Error(`Blocked private IP URL: ${url.toString()} (use --allow-private-network to override)`);
273
+ }
274
+ if (!allowPrivateNetwork) {
275
+ try {
276
+ const resolved = await lookup(host, { all: true });
277
+ for (const addr of resolved) {
278
+ if (isPrivateIp(addr.address)) {
279
+ throw new Error(`Blocked URL resolving to private IP (${addr.address}): ${url.toString()} (use --allow-private-network to override)`);
280
+ }
281
+ }
282
+ }
283
+ catch (err) {
284
+ if (err instanceof Error && err.message.startsWith("Blocked URL resolving"))
285
+ throw err;
286
+ throw new Error(`Failed to resolve host ${host}: ${err instanceof Error ? err.message : String(err)}`);
287
+ }
288
+ }
289
+ }
290
+ function isPrivateIp(address) {
291
+ const a = address.replace(/^\[|\]$/g, "");
292
+ const version = isIP(a);
293
+ if (version === 4) {
294
+ const parts = a.split(".").map((n) => Number(n));
295
+ const p1 = parts[0] ?? -1;
296
+ const p2 = parts[1] ?? -1;
297
+ if (p1 === 10)
298
+ return true;
299
+ if (p1 === 127)
300
+ return true;
301
+ if (p1 === 169 && p2 === 254)
302
+ return true;
303
+ if (p1 === 192 && p2 === 168)
304
+ return true;
305
+ if (p1 === 172 && p2 >= 16 && p2 <= 31)
306
+ return true;
307
+ return false;
308
+ }
309
+ if (version === 6) {
310
+ const lower = a.toLowerCase();
311
+ return (lower === "::1" ||
312
+ lower.startsWith("fc") ||
313
+ lower.startsWith("fd") ||
314
+ lower.startsWith("fe80:"));
315
+ }
316
+ return false;
317
+ }
318
+ function getRemoteCachePath(tempRoot, url) {
319
+ const key = createHash("sha256").update(url).digest("hex");
320
+ return join(tempRoot, ".remote-cache", key);
321
+ }
322
+ function inferSourceRelativePath(ext, fixture) {
323
+ if (fixture?.framework === "astro" || ext === ".astro")
324
+ return `src/remote-fixture${ext}`;
325
+ if ([".tsx", ".jsx", ".ts", ".js"].includes(ext))
326
+ return `src/remote-fixture${ext}`;
327
+ if ([".vue", ".svelte"].includes(ext))
328
+ return `src/remote-fixture${ext}`;
329
+ if ([".html", ".mdx", ".md"].includes(ext))
330
+ return `templates/remote-fixture${ext}`;
331
+ return `src/remote-fixture${ext || ".txt"}`;
332
+ }
333
+ function inferSourceConfig(sourceRelPath, fixture) {
334
+ const ext = extname(sourceRelPath).toLowerCase();
335
+ const forced = fixture?.framework || fixture?.type;
336
+ if (forced === "astro" || ext === ".astro") {
337
+ return {
338
+ sourceConfig: {
339
+ templates: { enabled: true, include: [sourceRelPath], exclude: [], type: "astro" },
340
+ tailwind: { enabled: true, files: [sourceRelPath], exclude: [] },
341
+ },
342
+ };
343
+ }
344
+ if (ext === ".tsx" || ext === ".jsx") {
345
+ return {
346
+ sourceConfig: {
347
+ react: { enabled: true, include: [sourceRelPath], exclude: [] },
348
+ tailwind: { enabled: true, files: [sourceRelPath], exclude: [] },
349
+ },
350
+ };
351
+ }
352
+ if (ext === ".vue") {
353
+ return {
354
+ sourceConfig: {
355
+ vue: { enabled: true, include: [sourceRelPath], exclude: [] },
356
+ tailwind: { enabled: true, files: [sourceRelPath], exclude: [] },
357
+ },
358
+ };
359
+ }
360
+ if (ext === ".svelte") {
361
+ return {
362
+ sourceConfig: {
363
+ svelte: { enabled: true, include: [sourceRelPath], exclude: [] },
364
+ tailwind: { enabled: true, files: [sourceRelPath], exclude: [] },
365
+ },
366
+ };
367
+ }
368
+ if (ext === ".html" || ext === ".mdx" || ext === ".md") {
369
+ return {
370
+ sourceConfig: {
371
+ templates: { enabled: true, include: [sourceRelPath], exclude: [], type: ext === ".html" ? "html" : "markdown" },
372
+ },
373
+ };
374
+ }
375
+ return null;
376
+ }
377
+ function buildRemoteConfig(args) {
378
+ const base = {
379
+ project: { name: "remote-fixture-check" },
380
+ sources: {
381
+ ...args.inferred.sourceConfig,
382
+ tokens: args.tokenFiles.length > 0 ? { enabled: true, files: args.tokenFiles } : undefined,
383
+ },
384
+ drift: {
385
+ ignore: [],
386
+ promote: [],
387
+ enforce: [],
388
+ severity: {},
389
+ aggregation: { strategies: ["value", "suggestion", "path", "entity"], minGroupSize: 2, pathPatterns: [] },
390
+ types: {},
391
+ exclude: args.reducedConfidence
392
+ ? ["unused-component", "unused-token", "framework-sprawl"]
393
+ : undefined,
394
+ },
395
+ health: {},
396
+ claude: { enabled: false, model: "claude-sonnet-4-20250514" },
397
+ output: { format: "table", colors: true },
398
+ experimental: {},
399
+ };
400
+ if (!args.fixtureConfig)
401
+ return base;
402
+ return {
403
+ ...base,
404
+ ...args.fixtureConfig,
405
+ project: { ...base.project, ...(args.fixtureConfig.project || {}) },
406
+ sources: { ...base.sources, ...(args.fixtureConfig.sources || {}) },
407
+ drift: { ...base.drift, ...(args.fixtureConfig.drift || {}) },
408
+ health: { ...base.health, ...(args.fixtureConfig.health || {}) },
409
+ claude: { ...base.claude, ...(args.fixtureConfig.claude || {}) },
410
+ output: { ...base.output, ...(args.fixtureConfig.output || {}) },
411
+ experimental: { ...base.experimental, ...(args.fixtureConfig.experimental || {}) },
412
+ };
413
+ }
414
+ function inferFilename(ref, contentType) {
415
+ try {
416
+ const u = new URL(/^https?:\/\//i.test(ref) ? ref : `https://${ref}`);
417
+ const fromPath = basename(u.pathname);
418
+ if (fromPath) {
419
+ if (extname(fromPath))
420
+ return fromPath;
421
+ const inferredExt = extensionFromContentType(contentType);
422
+ if (inferredExt)
423
+ return `${fromPath}${inferredExt}`;
424
+ return fromPath;
425
+ }
426
+ }
427
+ catch {
428
+ // local path
429
+ }
430
+ const ext = extensionFromContentType(contentType) || ".txt";
431
+ return `remote${ext}`;
432
+ }
433
+ function contentTypeFromExt(ext) {
434
+ switch (ext.toLowerCase()) {
435
+ case ".astro": return "text/plain";
436
+ case ".tsx": return "text/typescript";
437
+ case ".ts": return "text/typescript";
438
+ case ".jsx": return "text/javascript";
439
+ case ".js": return "text/javascript";
440
+ case ".json": return "application/json";
441
+ case ".css": return "text/css";
442
+ case ".scss": return "text/x-scss";
443
+ case ".html": return "text/html";
444
+ default: return null;
445
+ }
446
+ }
447
+ function extensionFromContentType(contentType) {
448
+ const type = contentType.toLowerCase();
449
+ if (type.includes("application/json"))
450
+ return ".json";
451
+ if (type.includes("text/css"))
452
+ return ".css";
453
+ if (type.includes("text/html"))
454
+ return ".html";
455
+ if (type.includes("typescript"))
456
+ return ".ts";
457
+ if (type.includes("javascript"))
458
+ return ".js";
459
+ return null;
460
+ }
461
+ function inferExtensionFromContent(content) {
462
+ const text = content.toString("utf-8", 0, Math.min(content.length, 2048));
463
+ if (/^---\s*\n[\s\S]{0,800}\n---\s*\n/.test(text) || /\bclass(Name)?=/.test(text))
464
+ return ".astro";
465
+ if (/<template[\s>]/.test(text) && /<script/.test(text))
466
+ return ".vue";
467
+ if (/<svelte:/.test(text) || /\bon:click=/.test(text))
468
+ return ".svelte";
469
+ if (/<html|<body|<!doctype html/i.test(text))
470
+ return ".html";
471
+ if (/\bexport\s+default\b/.test(text) || /\bimport\s.+from\s+['"]/.test(text))
472
+ return ".ts";
473
+ return null;
474
+ }
475
+ function dirnameSafe(path) {
476
+ return path.slice(0, Math.max(path.lastIndexOf("/"), path.lastIndexOf("\\"))) || ".";
477
+ }
478
+ function sanitizeRelativePath(candidate, fallback) {
479
+ const normalized = candidate.replace(/\\/g, "/").replace(/^\/+/, "");
480
+ if (!normalized || normalized.includes(".."))
481
+ return fallback;
482
+ return normalized;
483
+ }
484
+ function normalizeFixtureTokenRefs(tokens) {
485
+ if (!tokens)
486
+ return [];
487
+ if (typeof tokens === "string")
488
+ return [tokens];
489
+ if (!Array.isArray(tokens))
490
+ return [];
491
+ return tokens.filter((t) => typeof t === "string" || (!!t && typeof t === "object" && typeof t.url === "string"));
492
+ }
493
+ //# sourceMappingURL=remote-check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remote-check.js","sourceRoot":"","sources":["../../src/services/remote-check.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@buoy-design/cli",
3
- "version": "0.3.30",
3
+ "version": "0.3.31",
4
4
  "description": "Catch design drift before it ships",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -46,8 +46,8 @@
46
46
  "yaml": "^2.8.2",
47
47
  "zod": "^3.24.1",
48
48
  "zod-validation-error": "^5.0.0",
49
- "@buoy-design/scanners": "0.3.30",
50
- "@buoy-design/core": "0.3.30"
49
+ "@buoy-design/core": "0.3.31",
50
+ "@buoy-design/scanners": "0.3.31"
51
51
  },
52
52
  "devDependencies": {
53
53
  "@types/node": "^22.10.2",