@buoy-design/cli 0.4.1 → 0.6.0

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 (61) hide show
  1. package/README.md +50 -21
  2. package/dist/cloud/config.d.ts +12 -0
  3. package/dist/cloud/config.d.ts.map +1 -1
  4. package/dist/cloud/config.js.map +1 -1
  5. package/dist/commands/ahoy.d.ts.map +1 -1
  6. package/dist/commands/ahoy.js +3 -1
  7. package/dist/commands/ahoy.js.map +1 -1
  8. package/dist/commands/check.d.ts.map +1 -1
  9. package/dist/commands/check.js +14 -0
  10. package/dist/commands/check.js.map +1 -1
  11. package/dist/commands/ignore.d.ts +7 -3
  12. package/dist/commands/ignore.d.ts.map +1 -1
  13. package/dist/commands/ignore.js +81 -78
  14. package/dist/commands/ignore.js.map +1 -1
  15. package/dist/commands/index.d.ts +1 -0
  16. package/dist/commands/index.d.ts.map +1 -1
  17. package/dist/commands/index.js +1 -0
  18. package/dist/commands/index.js.map +1 -1
  19. package/dist/commands/login.d.ts.map +1 -1
  20. package/dist/commands/login.js +136 -34
  21. package/dist/commands/login.js.map +1 -1
  22. package/dist/commands/rescue.d.ts +3 -0
  23. package/dist/commands/rescue.d.ts.map +1 -0
  24. package/dist/commands/rescue.js +147 -0
  25. package/dist/commands/rescue.js.map +1 -0
  26. package/dist/commands/telemetry.d.ts +9 -0
  27. package/dist/commands/telemetry.d.ts.map +1 -0
  28. package/dist/commands/telemetry.js +51 -0
  29. package/dist/commands/telemetry.js.map +1 -0
  30. package/dist/index.d.ts.map +1 -1
  31. package/dist/index.js +5 -1
  32. package/dist/index.js.map +1 -1
  33. package/dist/rescue/report.d.ts +9 -0
  34. package/dist/rescue/report.d.ts.map +1 -0
  35. package/dist/rescue/report.js +107 -0
  36. package/dist/rescue/report.js.map +1 -0
  37. package/dist/rescue/store.d.ts +9 -0
  38. package/dist/rescue/store.d.ts.map +1 -0
  39. package/dist/rescue/store.js +50 -0
  40. package/dist/rescue/store.js.map +1 -0
  41. package/dist/rescue/types.d.ts +76 -0
  42. package/dist/rescue/types.d.ts.map +1 -0
  43. package/dist/rescue/types.js +2 -0
  44. package/dist/rescue/types.js.map +1 -0
  45. package/dist/rescue/workflow.d.ts +37 -0
  46. package/dist/rescue/workflow.d.ts.map +1 -0
  47. package/dist/rescue/workflow.js +355 -0
  48. package/dist/rescue/workflow.js.map +1 -0
  49. package/dist/services/drift-analysis.d.ts +3 -1
  50. package/dist/services/drift-analysis.d.ts.map +1 -1
  51. package/dist/services/drift-analysis.js +179 -98
  52. package/dist/services/drift-analysis.js.map +1 -1
  53. package/dist/telemetry/index.d.ts +53 -0
  54. package/dist/telemetry/index.d.ts.map +1 -0
  55. package/dist/telemetry/index.js +117 -0
  56. package/dist/telemetry/index.js.map +1 -0
  57. package/dist/utils/upgrade-hints.d.ts +13 -2
  58. package/dist/utils/upgrade-hints.d.ts.map +1 -1
  59. package/dist/utils/upgrade-hints.js +45 -7
  60. package/dist/utils/upgrade-hints.js.map +1 -1
  61. package/package.json +3 -3
@@ -0,0 +1,355 @@
1
+ import { createHash } from "node:crypto";
2
+ import { execFileSync, spawnSync } from "node:child_process";
3
+ import { existsSync, readFileSync } from "node:fs";
4
+ import { copyFile, mkdir, readFile } from "node:fs/promises";
5
+ import { dirname, isAbsolute, join, relative, resolve, sep } from "node:path";
6
+ import { generateFixes } from "@buoy-design/core";
7
+ import { loadConfig } from "../config/loader.js";
8
+ import { DriftAnalysisService, calculateDriftSummary, } from "../services/drift-analysis.js";
9
+ import { createIgnoreList, fingerprintDrift, getIgnorePath, loadIgnoreList, saveIgnoreList, } from "../commands/ignore.js";
10
+ import { applyFixes, validateFixTargets } from "../fix/index.js";
11
+ import { writeRescueReports } from "./report.js";
12
+ import { createRunId, loadRescueManifest, rescueRunDir, saveRescueManifest, } from "./store.js";
13
+ export async function resolveProject(cwd = process.cwd()) {
14
+ const loaded = await loadConfig(cwd);
15
+ const projectRoot = loaded.configPath
16
+ ? dirname(loaded.configPath)
17
+ : resolve(cwd);
18
+ return { ...loaded, projectRoot };
19
+ }
20
+ function gitValue(projectRoot, args) {
21
+ try {
22
+ return (execFileSync("git", args, {
23
+ cwd: projectRoot,
24
+ encoding: "utf8",
25
+ stdio: ["ignore", "pipe", "ignore"],
26
+ }).trim() || null);
27
+ }
28
+ catch {
29
+ return null;
30
+ }
31
+ }
32
+ function pathInside(projectRoot, file) {
33
+ const absolute = resolve(projectRoot, file);
34
+ const rel = relative(projectRoot, absolute);
35
+ return (rel !== "" &&
36
+ !rel.startsWith(`..${sep}`) &&
37
+ rel !== ".." &&
38
+ !isAbsolute(rel));
39
+ }
40
+ export function selectSafeFixes(fixes, drifts, projectRoot, acceptedFingerprints) {
41
+ const driftById = new Map(drifts.map((drift) => [drift.id, drift]));
42
+ const candidates = validateFixTargets(fixes).valid.filter((fix) => {
43
+ const drift = driftById.get(fix.driftSignalId);
44
+ return (!!drift &&
45
+ (fix.confidence === "exact" || fix.confidence === "high") &&
46
+ pathInside(projectRoot, fix.file) &&
47
+ !acceptedFingerprints.has(fingerprintDrift(drift)));
48
+ });
49
+ const counts = new Map();
50
+ for (const fix of candidates) {
51
+ const key = `${resolve(projectRoot, fix.file)}:${fix.line}:${fix.column}`;
52
+ counts.set(key, (counts.get(key) || 0) + 1);
53
+ }
54
+ return candidates.filter((fix) => {
55
+ const key = `${resolve(projectRoot, fix.file)}:${fix.line}:${fix.column}`;
56
+ return counts.get(key) === 1;
57
+ });
58
+ }
59
+ export function acceptedFingerprintsFor(drifts, ignoreList) {
60
+ const accepted = new Set(ignoreList?.fingerprints || []);
61
+ if (!ignoreList)
62
+ return accepted;
63
+ const acceptedIds = new Set(ignoreList.driftIds || []);
64
+ for (const drift of drifts) {
65
+ if (acceptedIds.has(drift.id))
66
+ accepted.add(fingerprintDrift(drift));
67
+ }
68
+ return accepted;
69
+ }
70
+ function findingFromDrift(drift, safeFixIds, acceptedFingerprints) {
71
+ const location = drift.source.location || "";
72
+ const match = location.match(/^(.*?)(?::(\d+))?(?::\d+)?$/);
73
+ const fingerprint = fingerprintDrift(drift);
74
+ return {
75
+ id: drift.id,
76
+ fingerprint,
77
+ type: drift.type,
78
+ severity: drift.severity,
79
+ file: match?.[1] || location || drift.source.entityName,
80
+ line: match?.[2] ? Number.parseInt(match[2], 10) : undefined,
81
+ entity: drift.source.entityName,
82
+ message: drift.message,
83
+ classification: acceptedFingerprints.has(fingerprint)
84
+ ? "accepted-legacy"
85
+ : safeFixIds.has(drift.id)
86
+ ? "safe-fix"
87
+ : "review-required",
88
+ };
89
+ }
90
+ export async function createRescuePlan(cwd = process.cwd(), onProgress) {
91
+ const { config, projectRoot } = await resolveProject(cwd);
92
+ const service = new DriftAnalysisService(config, projectRoot);
93
+ const analysis = await service.analyze({ includeIgnored: true, onProgress });
94
+ const existingBaseline = await loadIgnoreList(projectRoot);
95
+ const acceptedFingerprints = acceptedFingerprintsFor(analysis.drifts, existingBaseline);
96
+ const generated = generateFixes(analysis.drifts, analysis.tokens, {
97
+ minConfidence: "high",
98
+ });
99
+ const safeFixes = selectSafeFixes(generated, analysis.drifts, projectRoot, acceptedFingerprints);
100
+ const safeFixIds = new Set(safeFixes.map((fix) => fix.driftSignalId));
101
+ const now = new Date().toISOString();
102
+ const manifest = {
103
+ version: 1,
104
+ id: createRunId(),
105
+ projectRoot,
106
+ projectName: config.project.name,
107
+ createdAt: now,
108
+ updatedAt: now,
109
+ status: "planned",
110
+ source: {
111
+ branch: gitValue(projectRoot, ["branch", "--show-current"]),
112
+ head: gitValue(projectRoot, ["rev-parse", "HEAD"]),
113
+ },
114
+ before: {
115
+ summary: analysis.summary,
116
+ componentCount: analysis.components.length,
117
+ tokenCount: analysis.tokenCount,
118
+ },
119
+ findings: analysis.drifts.map((drift) => findingFromDrift(drift, safeFixIds, acceptedFingerprints)),
120
+ safeFixes,
121
+ appliedFixIds: [],
122
+ backups: [],
123
+ };
124
+ await saveRescueManifest(manifest);
125
+ await writeRescueReports(manifest);
126
+ return manifest;
127
+ }
128
+ function hash(content) {
129
+ return createHash("sha256").update(content).digest("hex");
130
+ }
131
+ function dirtyPaths(projectRoot) {
132
+ const output = gitValue(projectRoot, [
133
+ "status",
134
+ "--porcelain",
135
+ "--untracked-files=all",
136
+ ]);
137
+ if (!output)
138
+ return [];
139
+ return output
140
+ .split("\n")
141
+ .map((line) => line.slice(3).trim())
142
+ .filter((path) => path && !path.startsWith(".buoy/rescue/"));
143
+ }
144
+ async function backupFiles(manifest, fixes) {
145
+ const files = [...new Set(fixes.map((fix) => fix.file))];
146
+ const backups = [];
147
+ for (const file of files) {
148
+ const absolute = resolve(manifest.projectRoot, file);
149
+ const rel = relative(manifest.projectRoot, absolute);
150
+ const backupPath = join(rescueRunDir(manifest.projectRoot, manifest.id), "backups", rel);
151
+ await mkdir(dirname(backupPath), { recursive: true });
152
+ const content = await readFile(absolute);
153
+ await copyFile(absolute, backupPath);
154
+ backups.push({ file: rel, backupPath, beforeHash: hash(content) });
155
+ }
156
+ return backups;
157
+ }
158
+ export function detectVerificationCommands(projectRoot) {
159
+ const packagePath = join(projectRoot, "package.json");
160
+ if (!existsSync(packagePath))
161
+ return [];
162
+ const pkg = JSON.parse(readFileSync(packagePath, "utf8"));
163
+ const scripts = pkg.scripts || {};
164
+ const packageManager = pkg.packageManager?.split("@")[0] ||
165
+ (existsSync(join(projectRoot, "pnpm-lock.yaml"))
166
+ ? "pnpm"
167
+ : existsSync(join(projectRoot, "yarn.lock"))
168
+ ? "yarn"
169
+ : "npm");
170
+ const selected = [
171
+ scripts.typecheck ? "typecheck" : null,
172
+ scripts["test:ci"] ? "test:ci" : scripts.test ? "test" : null,
173
+ ].filter((value) => !!value);
174
+ return selected.map((script) => ({
175
+ label: script,
176
+ command: packageManager,
177
+ args: packageManager === "npm" ? ["run", script] : ["run", script],
178
+ }));
179
+ }
180
+ export function runVerification(projectRoot, specs = detectVerificationCommands(projectRoot), onProgress) {
181
+ const commands = [];
182
+ for (const spec of specs) {
183
+ onProgress?.(`Running ${spec.label}...`);
184
+ const result = spawnSync(spec.command, spec.args, {
185
+ cwd: projectRoot,
186
+ encoding: "utf8",
187
+ env: { ...process.env, CI: "1" },
188
+ maxBuffer: 10 * 1024 * 1024,
189
+ });
190
+ const combined = `${result.stdout || ""}\n${result.stderr || ""}`.trim();
191
+ commands.push({
192
+ ...spec,
193
+ exitCode: result.status,
194
+ passed: result.status === 0,
195
+ output: combined.slice(-8000),
196
+ });
197
+ if (result.status !== 0)
198
+ break;
199
+ }
200
+ return {
201
+ completedAt: new Date().toISOString(),
202
+ passed: commands.length > 0 && commands.every((command) => command.passed),
203
+ skipped: commands.length === 0,
204
+ commands,
205
+ };
206
+ }
207
+ export function statusAfterVerification(current, verification) {
208
+ if (verification.skipped)
209
+ return current;
210
+ return verification.passed ? "verified" : "verification_failed";
211
+ }
212
+ export async function restoreBackups(manifest, force) {
213
+ for (const backup of manifest.backups) {
214
+ const target = resolve(manifest.projectRoot, backup.file);
215
+ if (!pathInside(manifest.projectRoot, backup.file)) {
216
+ throw new Error(`Refusing to restore a path outside the project: ${backup.file}`);
217
+ }
218
+ if (existsSync(target) && backup.afterHash && !force) {
219
+ const currentHash = hash(await readFile(target));
220
+ if (currentHash !== backup.afterHash &&
221
+ currentHash !== backup.beforeHash) {
222
+ throw new Error(`${backup.file} changed after Rescue. Review it or rerun rollback with --force.`);
223
+ }
224
+ }
225
+ await copyFile(backup.backupPath, target);
226
+ }
227
+ }
228
+ async function analyzeAfter(manifest, onProgress) {
229
+ const { config } = await loadConfig(manifest.projectRoot);
230
+ const service = new DriftAnalysisService(config, manifest.projectRoot);
231
+ const analysis = await service.analyze({ includeIgnored: true, onProgress });
232
+ manifest.after = {
233
+ summary: calculateDriftSummary(analysis.drifts),
234
+ componentCount: analysis.components.length,
235
+ tokenCount: analysis.tokenCount,
236
+ };
237
+ }
238
+ export async function applyRescuePlan(cwd = process.cwd(), requestedRun, options = {}, onProgress) {
239
+ const { projectRoot } = await resolveProject(cwd);
240
+ const manifest = await loadRescueManifest(projectRoot, requestedRun);
241
+ if (manifest.status !== "planned") {
242
+ throw new Error(`Run ${manifest.id} is ${manifest.status}; only a planned run can be applied.`);
243
+ }
244
+ if (!manifest.source.head || !manifest.source.branch) {
245
+ throw new Error("Rescue apply requires a Git repository with a named branch.");
246
+ }
247
+ const currentHead = gitValue(projectRoot, ["rev-parse", "HEAD"]);
248
+ if (currentHead !== manifest.source.head) {
249
+ throw new Error("The repository changed after planning. Create a new Rescue plan.");
250
+ }
251
+ const dirty = dirtyPaths(projectRoot);
252
+ if (dirty.length > 0) {
253
+ throw new Error(`Commit or stash existing changes before Rescue apply: ${dirty.slice(0, 5).join(", ")}`);
254
+ }
255
+ const fixes = options.limit
256
+ ? manifest.safeFixes.slice(0, options.limit)
257
+ : manifest.safeFixes;
258
+ if (fixes.length === 0)
259
+ throw new Error("This plan has no high-confidence fixes to apply.");
260
+ manifest.rescueBranch = `buoy/${manifest.id}`;
261
+ execFileSync("git", ["switch", "-c", manifest.rescueBranch], {
262
+ cwd: projectRoot,
263
+ stdio: "ignore",
264
+ });
265
+ manifest.backups = await backupFiles(manifest, fixes);
266
+ await saveRescueManifest(manifest);
267
+ const absoluteFixes = fixes.map((fix) => ({
268
+ ...fix,
269
+ file: resolve(projectRoot, fix.file),
270
+ }));
271
+ const applied = await applyFixes(absoluteFixes, { minConfidence: "high" });
272
+ if (applied.failed > 0) {
273
+ await restoreBackups(manifest, true);
274
+ manifest.status = "rolled_back";
275
+ await saveRescueManifest(manifest);
276
+ await writeRescueReports(manifest);
277
+ throw new Error(`${applied.failed} fix(es) failed; all Rescue edits were rolled back.`);
278
+ }
279
+ manifest.appliedFixIds = applied.results
280
+ .filter((result) => result.status === "applied")
281
+ .map((result) => result.fixId);
282
+ for (const backup of manifest.backups) {
283
+ backup.afterHash = hash(await readFile(resolve(projectRoot, backup.file)));
284
+ }
285
+ manifest.status = "applied";
286
+ manifest.verification = runVerification(projectRoot, undefined, onProgress);
287
+ if (!manifest.verification.skipped && !manifest.verification.passed) {
288
+ await restoreBackups(manifest, true);
289
+ manifest.status = "verification_failed";
290
+ await saveRescueManifest(manifest);
291
+ await writeRescueReports(manifest);
292
+ throw new Error("Project verification failed; Rescue restored every modified file.");
293
+ }
294
+ if (manifest.verification.passed)
295
+ manifest.status = "verified";
296
+ await analyzeAfter(manifest, onProgress);
297
+ await saveRescueManifest(manifest);
298
+ await writeRescueReports(manifest);
299
+ return manifest;
300
+ }
301
+ export async function verifyRescueRun(cwd = process.cwd(), requestedRun, onProgress) {
302
+ const { projectRoot } = await resolveProject(cwd);
303
+ const manifest = await loadRescueManifest(projectRoot, requestedRun);
304
+ manifest.verification = runVerification(projectRoot, undefined, onProgress);
305
+ manifest.status = statusAfterVerification(manifest.status, manifest.verification);
306
+ await analyzeAfter(manifest, onProgress);
307
+ await saveRescueManifest(manifest);
308
+ await writeRescueReports(manifest);
309
+ return manifest;
310
+ }
311
+ export async function guardRescueRun(cwd = process.cwd(), requestedRun, reason, actor, onProgress) {
312
+ const { config, projectRoot } = await resolveProject(cwd);
313
+ const manifest = await loadRescueManifest(projectRoot, requestedRun);
314
+ const service = new DriftAnalysisService(config, projectRoot);
315
+ const analysis = await service.analyze({ includeIgnored: true, onProgress });
316
+ const baseline = createIgnoreList(analysis.drifts, reason, actor);
317
+ await saveIgnoreList(baseline, projectRoot);
318
+ manifest.baseline = {
319
+ reason,
320
+ actor,
321
+ count: baseline.summary.total,
322
+ path: getIgnorePath(projectRoot),
323
+ createdAt: new Date().toISOString(),
324
+ };
325
+ manifest.status = "guarded";
326
+ await saveRescueManifest(manifest);
327
+ await writeRescueReports(manifest);
328
+ return manifest;
329
+ }
330
+ export async function rollbackRescueRun(cwd = process.cwd(), requestedRun, force = false) {
331
+ const { projectRoot } = await resolveProject(cwd);
332
+ const manifest = await loadRescueManifest(projectRoot, requestedRun);
333
+ if (manifest.backups.length === 0)
334
+ throw new Error("This Rescue run has no applied files to roll back.");
335
+ await restoreBackups(manifest, force);
336
+ const currentBranch = gitValue(projectRoot, ["branch", "--show-current"]);
337
+ if (manifest.rescueBranch &&
338
+ currentBranch === manifest.rescueBranch &&
339
+ manifest.source.branch) {
340
+ execFileSync("git", ["switch", manifest.source.branch], {
341
+ cwd: projectRoot,
342
+ stdio: "ignore",
343
+ });
344
+ }
345
+ manifest.status = "rolled_back";
346
+ await saveRescueManifest(manifest);
347
+ await writeRescueReports(manifest);
348
+ return manifest;
349
+ }
350
+ export async function reportRescueRun(cwd = process.cwd(), requestedRun) {
351
+ const { projectRoot } = await resolveProject(cwd);
352
+ const manifest = await loadRescueManifest(projectRoot, requestedRun);
353
+ return { manifest, paths: await writeRescueReports(manifest) };
354
+ }
355
+ //# sourceMappingURL=workflow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow.js","sourceRoot":"","sources":["../../src/rescue/workflow.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAE9E,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EACL,oBAAoB,EACpB,qBAAqB,GACtB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,aAAa,EACb,cAAc,EACd,cAAc,GACf,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EACL,WAAW,EACX,kBAAkB,EAClB,YAAY,EACZ,kBAAkB,GACnB,MAAM,YAAY,CAAC;AAWpB,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE;IACtD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,CAAC;IACrC,MAAM,WAAW,GAAG,MAAM,CAAC,UAAU;QACnC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC;QAC5B,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACjB,OAAO,EAAE,GAAG,MAAM,EAAE,WAAW,EAAE,CAAC;AACpC,CAAC;AAED,SAAS,QAAQ,CAAC,WAAmB,EAAE,IAAc;IACnD,IAAI,CAAC;QACH,OAAO,CACL,YAAY,CAAC,KAAK,EAAE,IAAI,EAAE;YACxB,GAAG,EAAE,WAAW;YAChB,QAAQ,EAAE,MAAM;YAChB,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC;SACpC,CAAC,CAAC,IAAI,EAAE,IAAI,IAAI,CAClB,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,WAAmB,EAAE,IAAY;IACnD,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;IAC5C,MAAM,GAAG,GAAG,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;IAC5C,OAAO,CACL,GAAG,KAAK,EAAE;QACV,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,GAAG,EAAE,CAAC;QAC3B,GAAG,KAAK,IAAI;QACZ,CAAC,UAAU,CAAC,GAAG,CAAC,CACjB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,KAAY,EACZ,MAAqB,EACrB,WAAmB,EACnB,oBAAiC;IAEjC,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IACpE,MAAM,UAAU,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE;QAChE,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QAC/C,OAAO,CACL,CAAC,CAAC,KAAK;YACP,CAAC,GAAG,CAAC,UAAU,KAAK,OAAO,IAAI,GAAG,CAAC,UAAU,KAAK,MAAM,CAAC;YACzD,UAAU,CAAC,WAAW,EAAE,GAAG,CAAC,IAAI,CAAC;YACjC,CAAC,oBAAoB,CAAC,GAAG,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,CACnD,CAAC;IACJ,CAAC,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IACzC,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC7B,MAAM,GAAG,GAAG,GAAG,OAAO,CAAC,WAAW,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;QAC1E,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9C,CAAC;IACD,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE;QAC/B,MAAM,GAAG,GAAG,GAAG,OAAO,CAAC,WAAW,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;QAC1E,OAAO,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,uBAAuB,CACrC,MAAqB,EACrB,UAAsD;IAEtD,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,UAAU,EAAE,YAAY,IAAI,EAAE,CAAC,CAAC;IACzD,IAAI,CAAC,UAAU;QAAE,OAAO,QAAQ,CAAC;IAEjC,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;IACvD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAAE,QAAQ,CAAC,GAAG,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC;IACvE,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,gBAAgB,CACvB,KAAkB,EAClB,UAAuB,EACvB,oBAAiC;IAEjC,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC;IAC7C,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;IAC5D,MAAM,WAAW,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;IAC5C,OAAO;QACL,EAAE,EAAE,KAAK,CAAC,EAAE;QACZ,WAAW;QACX,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,QAAQ,IAAI,KAAK,CAAC,MAAM,CAAC,UAAU;QACvD,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS;QAC5D,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,UAAU;QAC/B,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,cAAc,EAAE,oBAAoB,CAAC,GAAG,CAAC,WAAW,CAAC;YACnD,CAAC,CAAC,iBAAiB;YACnB,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;gBACxB,CAAC,CAAC,UAAU;gBACZ,CAAC,CAAC,iBAAiB;KACxB,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,EACnB,UAAqB;IAErB,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,cAAc,CAAC,GAAG,CAAC,CAAC;IAC1D,MAAM,OAAO,GAAG,IAAI,oBAAoB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAC9D,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,EAAE,cAAc,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;IAC7E,MAAM,gBAAgB,GAAG,MAAM,cAAc,CAAC,WAAW,CAAC,CAAC;IAC3D,MAAM,oBAAoB,GAAG,uBAAuB,CAClD,QAAQ,CAAC,MAAM,EACf,gBAAgB,CACjB,CAAC;IACF,MAAM,SAAS,GAAG,aAAa,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE;QAChE,aAAa,EAAE,MAAM;KACtB,CAAC,CAAC;IACH,MAAM,SAAS,GAAG,eAAe,CAC/B,SAAS,EACT,QAAQ,CAAC,MAAM,EACf,WAAW,EACX,oBAAoB,CACrB,CAAC;IACF,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC;IACtE,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACrC,MAAM,QAAQ,GAAmB;QAC/B,OAAO,EAAE,CAAC;QACV,EAAE,EAAE,WAAW,EAAE;QACjB,WAAW;QACX,WAAW,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI;QAChC,SAAS,EAAE,GAAG;QACd,SAAS,EAAE,GAAG;QACd,MAAM,EAAE,SAAS;QACjB,MAAM,EAAE;YACN,MAAM,EAAE,QAAQ,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC;YAC3D,IAAI,EAAE,QAAQ,CAAC,WAAW,EAAE,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;SACnD;QACD,MAAM,EAAE;YACN,OAAO,EAAE,QAAQ,CAAC,OAAO;YACzB,cAAc,EAAE,QAAQ,CAAC,UAAU,CAAC,MAAM;YAC1C,UAAU,EAAE,QAAQ,CAAC,UAAU;SAChC;QACD,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACtC,gBAAgB,CAAC,KAAK,EAAE,UAAU,EAAE,oBAAoB,CAAC,CAC1D;QACD,SAAS;QACT,aAAa,EAAE,EAAE;QACjB,OAAO,EAAE,EAAE;KACZ,CAAC;IACF,MAAM,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IACnC,MAAM,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IACnC,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,IAAI,CAAC,OAAwB;IACpC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC5D,CAAC;AAED,SAAS,UAAU,CAAC,WAAmB;IACrC,MAAM,MAAM,GAAG,QAAQ,CAAC,WAAW,EAAE;QACnC,QAAQ;QACR,aAAa;QACb,uBAAuB;KACxB,CAAC,CAAC;IACH,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC;IACvB,OAAO,MAAM;SACV,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SACnC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC,CAAC;AACjE,CAAC;AAED,KAAK,UAAU,WAAW,CACxB,QAAwB,EACxB,KAAY;IAEZ,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACzD,MAAM,OAAO,GAAmB,EAAE,CAAC;IACnC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QACrD,MAAM,GAAG,GAAG,QAAQ,CAAC,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;QACrD,MAAM,UAAU,GAAG,IAAI,CACrB,YAAY,CAAC,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC,EAAE,CAAC,EAC/C,SAAS,EACT,GAAG,CACJ,CAAC;QACF,MAAM,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACtD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACzC,MAAM,QAAQ,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QACrC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,UAAU,EAAE,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACrE,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAQD,MAAM,UAAU,0BAA0B,CACxC,WAAmB;IAEnB,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;IACtD,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC;QAAE,OAAO,EAAE,CAAC;IACxC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC,CAGvD,CAAC;IACF,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC;IAClC,MAAM,cAAc,GAClB,GAAG,CAAC,cAAc,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACjC,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC;YAC9C,CAAC,CAAC,MAAM;YACR,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;gBAC1C,CAAC,CAAC,MAAM;gBACR,CAAC,CAAC,KAAK,CAAC,CAAC;IACf,MAAM,QAAQ,GAAG;QACf,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI;QACtC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI;KAC9D,CAAC,MAAM,CAAC,CAAC,KAAK,EAAmB,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAC9C,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAC/B,KAAK,EAAE,MAAM;QACb,OAAO,EAAE,cAAc;QACvB,IAAI,EAAE,cAAc,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC;KACnE,CAAC,CAAC,CAAC;AACN,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,WAAmB,EACnB,KAAK,GAAG,0BAA0B,CAAC,WAAW,CAAC,EAC/C,UAAqB;IAErB,MAAM,QAAQ,GAAgC,EAAE,CAAC;IACjD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,UAAU,EAAE,CAAC,WAAW,IAAI,CAAC,KAAK,KAAK,CAAC,CAAC;QACzC,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE;YAChD,GAAG,EAAE,WAAW;YAChB,QAAQ,EAAE,MAAM;YAChB,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE;YAChC,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI;SAC5B,CAAC,CAAC;QACH,MAAM,QAAQ,GAAG,GAAG,MAAM,CAAC,MAAM,IAAI,EAAE,KAAK,MAAM,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC;QACzE,QAAQ,CAAC,IAAI,CAAC;YACZ,GAAG,IAAI;YACP,QAAQ,EAAE,MAAM,CAAC,MAAM;YACvB,MAAM,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC;YAC3B,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC;SAC9B,CAAC,CAAC;QACH,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,MAAM;IACjC,CAAC;IACD,OAAO;QACL,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACrC,MAAM,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC;QAC1E,OAAO,EAAE,QAAQ,CAAC,MAAM,KAAK,CAAC;QAC9B,QAAQ;KACT,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,uBAAuB,CACrC,OAAiC,EACjC,YAAgC;IAEhC,IAAI,YAAY,CAAC,OAAO;QAAE,OAAO,OAAO,CAAC;IACzC,OAAO,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,qBAAqB,CAAC;AAClE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,QAAwB,EACxB,KAAc;IAEd,KAAK,MAAM,MAAM,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;QACtC,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;QAC1D,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;YACnD,MAAM,IAAI,KAAK,CACb,mDAAmD,MAAM,CAAC,IAAI,EAAE,CACjE,CAAC;QACJ,CAAC;QACD,IAAI,UAAU,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,SAAS,IAAI,CAAC,KAAK,EAAE,CAAC;YACrD,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;YACjD,IACE,WAAW,KAAK,MAAM,CAAC,SAAS;gBAChC,WAAW,KAAK,MAAM,CAAC,UAAU,EACjC,CAAC;gBACD,MAAM,IAAI,KAAK,CACb,GAAG,MAAM,CAAC,IAAI,kEAAkE,CACjF,CAAC;YACJ,CAAC;QACH,CAAC;QACD,MAAM,QAAQ,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IAC5C,CAAC;AACH,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,QAAwB,EAAE,UAAqB;IACzE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IAC1D,MAAM,OAAO,GAAG,IAAI,oBAAoB,CAAC,MAAM,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAC;IACvE,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,EAAE,cAAc,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;IAC7E,QAAQ,CAAC,KAAK,GAAG;QACf,OAAO,EAAE,qBAAqB,CAAC,QAAQ,CAAC,MAAM,CAAC;QAC/C,cAAc,EAAE,QAAQ,CAAC,UAAU,CAAC,MAAM;QAC1C,UAAU,EAAE,QAAQ,CAAC,UAAU;KAChC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,EACnB,YAAqB,EACrB,UAA8B,EAAE,EAChC,UAAqB;IAErB,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,cAAc,CAAC,GAAG,CAAC,CAAC;IAClD,MAAM,QAAQ,GAAG,MAAM,kBAAkB,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;IACrE,IAAI,QAAQ,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CACb,OAAO,QAAQ,CAAC,EAAE,OAAO,QAAQ,CAAC,MAAM,sCAAsC,CAC/E,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QACrD,MAAM,IAAI,KAAK,CACb,6DAA6D,CAC9D,CAAC;IACJ,CAAC;IACD,MAAM,WAAW,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC;IACjE,IAAI,WAAW,KAAK,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QACzC,MAAM,IAAI,KAAK,CACb,kEAAkE,CACnE,CAAC;IACJ,CAAC;IACD,MAAM,KAAK,GAAG,UAAU,CAAC,WAAW,CAAC,CAAC;IACtC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CACb,yDAAyD,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACxF,CAAC;IACJ,CAAC;IACD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK;QACzB,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC;QAC5C,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC;IACvB,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;IAEtE,QAAQ,CAAC,YAAY,GAAG,QAAQ,QAAQ,CAAC,EAAE,EAAE,CAAC;IAC9C,YAAY,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,QAAQ,CAAC,YAAY,CAAC,EAAE;QAC3D,GAAG,EAAE,WAAW;QAChB,KAAK,EAAE,QAAQ;KAChB,CAAC,CAAC;IACH,QAAQ,CAAC,OAAO,GAAG,MAAM,WAAW,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IACtD,MAAM,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IAEnC,MAAM,aAAa,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACxC,GAAG,GAAG;QACN,IAAI,EAAE,OAAO,CAAC,WAAW,EAAE,GAAG,CAAC,IAAI,CAAC;KACrC,CAAC,CAAC,CAAC;IACJ,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,aAAa,EAAE,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC,CAAC;IAC3E,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,cAAc,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QACrC,QAAQ,CAAC,MAAM,GAAG,aAAa,CAAC;QAChC,MAAM,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QACnC,MAAM,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QACnC,MAAM,IAAI,KAAK,CACb,GAAG,OAAO,CAAC,MAAM,qDAAqD,CACvE,CAAC;IACJ,CAAC;IACD,QAAQ,CAAC,aAAa,GAAG,OAAO,CAAC,OAAO;SACrC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,KAAK,SAAS,CAAC;SAC/C,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACjC,KAAK,MAAM,MAAM,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;QACtC,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,MAAM,QAAQ,CAAC,OAAO,CAAC,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC7E,CAAC;IACD,QAAQ,CAAC,MAAM,GAAG,SAAS,CAAC;IAC5B,QAAQ,CAAC,YAAY,GAAG,eAAe,CAAC,WAAW,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;IAC5E,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,OAAO,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;QACpE,MAAM,cAAc,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QACrC,QAAQ,CAAC,MAAM,GAAG,qBAAqB,CAAC;QACxC,MAAM,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QACnC,MAAM,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QACnC,MAAM,IAAI,KAAK,CACb,mEAAmE,CACpE,CAAC;IACJ,CAAC;IACD,IAAI,QAAQ,CAAC,YAAY,CAAC,MAAM;QAAE,QAAQ,CAAC,MAAM,GAAG,UAAU,CAAC;IAC/D,MAAM,YAAY,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IACzC,MAAM,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IACnC,MAAM,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IACnC,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,EACnB,YAAqB,EACrB,UAAqB;IAErB,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,cAAc,CAAC,GAAG,CAAC,CAAC;IAClD,MAAM,QAAQ,GAAG,MAAM,kBAAkB,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;IACrE,QAAQ,CAAC,YAAY,GAAG,eAAe,CAAC,WAAW,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;IAC5E,QAAQ,CAAC,MAAM,GAAG,uBAAuB,CACvC,QAAQ,CAAC,MAAM,EACf,QAAQ,CAAC,YAAY,CACtB,CAAC;IACF,MAAM,YAAY,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IACzC,MAAM,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IACnC,MAAM,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IACnC,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,EACnB,YAAgC,EAChC,MAAc,EACd,KAAc,EACd,UAAqB;IAErB,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,cAAc,CAAC,GAAG,CAAC,CAAC;IAC1D,MAAM,QAAQ,GAAG,MAAM,kBAAkB,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;IACrE,MAAM,OAAO,GAAG,IAAI,oBAAoB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAC9D,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,EAAE,cAAc,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;IAC7E,MAAM,QAAQ,GAAG,gBAAgB,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;IAClE,MAAM,cAAc,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IAC5C,QAAQ,CAAC,QAAQ,GAAG;QAClB,MAAM;QACN,KAAK;QACL,KAAK,EAAE,QAAQ,CAAC,OAAO,CAAC,KAAK;QAC7B,IAAI,EAAE,aAAa,CAAC,WAAW,CAAC;QAChC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC;IACF,QAAQ,CAAC,MAAM,GAAG,SAAS,CAAC;IAC5B,MAAM,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IACnC,MAAM,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IACnC,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,EACnB,YAAqB,EACrB,KAAK,GAAG,KAAK;IAEb,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,cAAc,CAAC,GAAG,CAAC,CAAC;IAClD,MAAM,QAAQ,GAAG,MAAM,kBAAkB,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;IACrE,IAAI,QAAQ,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;IACxE,MAAM,cAAc,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IACtC,MAAM,aAAa,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC,CAAC;IAC1E,IACE,QAAQ,CAAC,YAAY;QACrB,aAAa,KAAK,QAAQ,CAAC,YAAY;QACvC,QAAQ,CAAC,MAAM,CAAC,MAAM,EACtB,CAAC;QACD,YAAY,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE;YACtD,GAAG,EAAE,WAAW;YAChB,KAAK,EAAE,QAAQ;SAChB,CAAC,CAAC;IACL,CAAC;IACD,QAAQ,CAAC,MAAM,GAAG,aAAa,CAAC;IAChC,MAAM,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IACnC,MAAM,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IACnC,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,EACnB,YAAqB;IAErB,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,cAAc,CAAC,GAAG,CAAC,CAAC;IAClD,MAAM,QAAQ,GAAG,MAAM,kBAAkB,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;IACrE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC,QAAQ,CAAC,EAAE,CAAC;AACjE,CAAC"}
@@ -7,7 +7,7 @@
7
7
  * 3. Applying ignore rules from config
8
8
  * 4. Filtering against ignore list
9
9
  */
10
- import type { DriftSignal, Severity, Component } from "@buoy-design/core";
10
+ import type { DriftSignal, Severity, Component, DesignToken } from "@buoy-design/core";
11
11
  import type { BuoyConfig } from "../config/schema.js";
12
12
  import { ScanCache } from "@buoy-design/scanners";
13
13
  export interface DriftAnalysisOptions {
@@ -35,6 +35,8 @@ export interface DriftAnalysisResult {
35
35
  components: Component[];
36
36
  /** Number of tokens found during scan */
37
37
  tokenCount: number;
38
+ /** Tokens found during the scan, used by safe-fix workflows. */
39
+ tokens: DesignToken[];
38
40
  /** Number of drifts filtered out by ignore list */
39
41
  ignoredCount: number;
40
42
  /** 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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"}