@idia-ui/cli 0.2.1 → 0.2.3

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/README.md ADDED
@@ -0,0 +1,34 @@
1
+ # @idia-ui/cli
2
+
3
+ Doctor and add-on management for idia consumer apps (`idia-ui` binary).
4
+
5
+ ## Monorepo usage
6
+
7
+ From the repo root, pass an **absolute** `--cwd` when invoking via `pnpm --filter`:
8
+
9
+ ```bash
10
+ pnpm --filter @idia-ui/cli build
11
+ pnpm --filter @idia-ui/cli exec idia-ui doctor --cwd C:\path\to\apps\consumer-sandbox
12
+ pnpm --filter @idia-ui/cli exec idia-ui add storybook --cwd C:\path\to\apps\consumer-sandbox
13
+ ```
14
+
15
+ `pnpm exec` runs from the package directory by default; `--cwd` must point at the consumer app root (where `package.json` and `.idia/manifest.json` live), not the monorepo root.
16
+
17
+ ## Commands
18
+
19
+ | Command | Purpose |
20
+ |---------|---------|
21
+ | `idia-ui doctor` | Health checks (peers, manifest, navigation, optional `--full` for Storybook/brain) |
22
+ | `idia-ui add storybook` | Install Storybook docs pack + preset |
23
+ | `idia-ui add brain` | Install brain AI pack (Tier 1G experimental) |
24
+ | `idia-ui sync <storybook\|brain\|all>` | Align pack versions and manifest pins |
25
+
26
+ ## Flags
27
+
28
+ | Flag | Behavior |
29
+ |------|----------|
30
+ | `--cwd <path>` | App root (default: `process.cwd()`) |
31
+ | `--full` | Include Storybook (S*) and brain (B*) checks |
32
+ | `--strict` | Treat warnings as failures (exit 1) |
33
+ | `--fix` | Limited safe repairs (manifest regenerate) |
34
+ | `--json` | Machine-readable output |
package/dist/cli.js CHANGED
@@ -30,14 +30,14 @@ var import_node_path10 = require("path");
30
30
  // src/commands/storybook/add.ts
31
31
  var import_node_fs5 = require("fs");
32
32
  var import_node_path5 = require("path");
33
- var import_node_child_process = require("child_process");
34
33
 
35
34
  // src/commands/storybook/constants.ts
36
35
  var STORYBOOK_DOCS_VERSION = "0.2.0";
37
- var STORYBOOK_PRESET_VERSION = "0.2.1";
36
+ var STORYBOOK_PRESET_VERSION = "0.2.2";
38
37
  var STORYBOOK_CLI_VERSION = "8.4.7";
39
38
  var STORYBOOK_DEV_DEPS = [
40
39
  "storybook@^8.4.7",
40
+ "@storybook/react@^8.4.7",
41
41
  "@storybook/react-vite@^8.4.7",
42
42
  "@storybook/addon-docs@^8.4.7",
43
43
  "@storybook/addon-a11y@^8.4.7",
@@ -250,10 +250,67 @@ function grepSrcForPattern(cwd, pattern) {
250
250
  return false;
251
251
  }
252
252
 
253
+ // src/utils/exec.ts
254
+ var import_node_child_process = require("child_process");
255
+ function pmExitCode(result) {
256
+ if (result.error) return 1;
257
+ return result.status ?? 0;
258
+ }
259
+ function spawnPm(pm, args, cwd) {
260
+ const isWin = process.platform === "win32";
261
+ return (0, import_node_child_process.spawnSync)(pm, args, {
262
+ cwd,
263
+ stdio: "inherit",
264
+ shell: isWin,
265
+ windowsHide: isWin
266
+ });
267
+ }
268
+ function runPmInstall(cwd, pm) {
269
+ const result = spawnPm(pm, installArgs(pm), cwd);
270
+ if (pmExitCode(result) !== 0) {
271
+ throw new Error(`${pm} install failed (exit ${pmExitCode(result)})`);
272
+ }
273
+ }
274
+ function runPmAddDev(cwd, pm, packageSpec) {
275
+ const result = spawnPm(pm, addDevArgs(pm, packageSpec), cwd);
276
+ if (pmExitCode(result) !== 0) {
277
+ throw new Error(`${pm} add failed for ${packageSpec} (exit ${pmExitCode(result)})`);
278
+ }
279
+ }
280
+ function runPmAddDevDeps(cwd, pm, packages) {
281
+ const result = spawnPm(pm, addDevArgsMulti(pm, packages), cwd);
282
+ if (pmExitCode(result) !== 0) {
283
+ throw new Error(`${pm} add failed (exit ${pmExitCode(result)})`);
284
+ }
285
+ }
286
+ function installArgs(pm) {
287
+ switch (pm) {
288
+ case "pnpm":
289
+ return ["install"];
290
+ case "yarn":
291
+ return ["install"];
292
+ default:
293
+ return ["install"];
294
+ }
295
+ }
296
+ function addDevArgs(pm, packageSpec) {
297
+ return addDevArgsMulti(pm, [packageSpec]);
298
+ }
299
+ function addDevArgsMulti(pm, packages) {
300
+ switch (pm) {
301
+ case "pnpm":
302
+ return ["add", "-D", ...packages];
303
+ case "yarn":
304
+ return ["add", "-D", ...packages];
305
+ default:
306
+ return ["install", "-D", ...packages];
307
+ }
308
+ }
309
+
253
310
  // src/utils/manifest.ts
254
311
  var import_node_fs4 = require("fs");
255
312
  var import_node_path4 = require("path");
256
- var CLI_VERSION = "0.2.1";
313
+ var CLI_VERSION = "0.2.3";
257
314
  function readManifest(cwd) {
258
315
  try {
259
316
  const raw = (0, import_node_fs4.readFileSync)((0, import_node_path4.join)(cwd, ".idia", "manifest.json"), "utf8");
@@ -307,8 +364,11 @@ function parseDepSpec(spec) {
307
364
  return { name: spec.slice(0, at), range: spec.slice(at + 1) };
308
365
  }
309
366
  function resolveDepVersion(name, range) {
310
- if (name.startsWith("@idia-ui/storybook")) {
311
- return "workspace:*";
367
+ if (name.startsWith("@idia-ui/storybook-docs")) {
368
+ return `^${STORYBOOK_DOCS_VERSION}`;
369
+ }
370
+ if (name.startsWith("@idia-ui/storybook-preset-react-native-web")) {
371
+ return `^${STORYBOOK_PRESET_VERSION}`;
312
372
  }
313
373
  return `^${range.replace(/^\^/, "")}`;
314
374
  }
@@ -326,16 +386,8 @@ function addDevDependencies(cwd) {
326
386
  (0, import_node_fs5.writeFileSync)((0, import_node_path5.join)(cwd, "package.json"), `${JSON.stringify(pkg, null, 2)}
327
387
  `, "utf8");
328
388
  }
329
- function runPmInstall(cwd, pm) {
330
- const args = pm === "pnpm" ? ["add", "-D", ...STORYBOOK_DEV_DEPS] : pm === "yarn" ? ["add", "-D", ...STORYBOOK_DEV_DEPS] : ["install", "-D", ...STORYBOOK_DEV_DEPS];
331
- const result = (0, import_node_child_process.spawnSync)(pm, args, {
332
- cwd,
333
- stdio: "inherit",
334
- shell: process.platform === "win32"
335
- });
336
- if (result.status !== 0) {
337
- throw new Error(`${pm} install failed with exit code ${result.status ?? "unknown"}`);
338
- }
389
+ function runPmInstall2(cwd, pm) {
390
+ runPmAddDevDeps(cwd, pm, STORYBOOK_DEV_DEPS);
339
391
  }
340
392
  function resolveCoreVersion(cwd, pkg) {
341
393
  const installed = readInstalledVersion(cwd, "@idia-ui/core");
@@ -399,7 +451,7 @@ function runAddStorybook(options) {
399
451
  addDevDependencies(cwd);
400
452
  if (!skipInstall) {
401
453
  console.log(`Installing Storybook devDependencies via ${pm}\u2026`);
402
- runPmInstall(cwd, pm);
454
+ runPmInstall2(cwd, pm);
403
455
  } else {
404
456
  warnings.push("Skipped package manager install (--skip-install)");
405
457
  }
@@ -551,45 +603,6 @@ function readInstalledPackManifest(cwd, packageName, manifestFile = "pack-manife
551
603
  }
552
604
  }
553
605
 
554
- // src/utils/exec.ts
555
- var import_node_child_process2 = require("child_process");
556
- function runPmInstall2(cwd, pm) {
557
- const result = spawnCommand(pm, installArgs(pm), cwd);
558
- if (result.status !== 0) {
559
- throw new Error(`${pm} install failed (exit ${result.status ?? 1})`);
560
- }
561
- }
562
- function runPmAddDev(cwd, pm, packageSpec) {
563
- const result = spawnCommand(pm, addDevArgs(pm, packageSpec), cwd);
564
- if (result.status !== 0) {
565
- throw new Error(`${pm} add failed for ${packageSpec} (exit ${result.status ?? 1})`);
566
- }
567
- }
568
- function installArgs(pm) {
569
- switch (pm) {
570
- case "pnpm":
571
- return ["install"];
572
- case "yarn":
573
- return ["install"];
574
- default:
575
- return ["install"];
576
- }
577
- }
578
- function addDevArgs(pm, packageSpec) {
579
- switch (pm) {
580
- case "pnpm":
581
- return ["add", "-D", packageSpec];
582
- case "yarn":
583
- return ["add", "-D", packageSpec];
584
- default:
585
- return ["install", "-D", packageSpec];
586
- }
587
- }
588
- function spawnCommand(pm, args, cwd) {
589
- const command = pm === "npm" ? "npm" : pm;
590
- return (0, import_node_child_process2.spawnSync)(command, args, { cwd, stdio: "inherit", shell: process.platform === "win32" });
591
- }
592
-
593
606
  // src/brain/install.ts
594
607
  function copyDirRecursive(src, dest, force) {
595
608
  (0, import_node_fs8.mkdirSync)(dest, { recursive: true });
@@ -612,7 +625,7 @@ function ensureBrainPackDependency(cwd, pm, skipInstall) {
612
625
  const existing = pkg.devDependencies?.[BRAIN_PACK_NAME];
613
626
  if (existing === spec || existing === BRAIN_PACK_VERSION) {
614
627
  if (!skipInstall && !(0, import_node_fs8.existsSync)((0, import_node_path8.join)(cwd, "node_modules", BRAIN_PACK_NAME))) {
615
- runPmInstall2(cwd, pm);
628
+ runPmInstall(cwd, pm);
616
629
  }
617
630
  return;
618
631
  }
@@ -985,7 +998,7 @@ function runBrainChecks(cwd) {
985
998
  results.push({
986
999
  id: "B4",
987
1000
  status: "warn",
988
- message: "brain pack and storybook-docs sourceHash skew",
1001
+ message: "brain pack and storybook-docs sourceHash skew (expected when packs were published separately at the same minor \u2014 run idia-ui sync all to align)",
989
1002
  fixHint: "idia-ui sync all"
990
1003
  });
991
1004
  }
@@ -1430,7 +1443,6 @@ function formatJsonReport(report) {
1430
1443
  }
1431
1444
 
1432
1445
  // src/commands/storybook/sync.ts
1433
- var import_node_child_process3 = require("child_process");
1434
1446
  function isStorybookInstalled2(cwd) {
1435
1447
  return fileExists(cwd, ".storybook/main.ts");
1436
1448
  }
@@ -1439,15 +1451,7 @@ function runPmUpdate(cwd, pm) {
1439
1451
  `@idia-ui/storybook-docs@${STORYBOOK_DOCS_VERSION}`,
1440
1452
  `@idia-ui/storybook-preset-react-native-web@${STORYBOOK_PRESET_VERSION}`
1441
1453
  ];
1442
- const args = pm === "pnpm" ? ["add", "-D", ...packages] : pm === "yarn" ? ["add", "-D", ...packages] : ["install", "-D", ...packages];
1443
- const result = (0, import_node_child_process3.spawnSync)(pm, args, {
1444
- cwd,
1445
- stdio: "inherit",
1446
- shell: process.platform === "win32"
1447
- });
1448
- if (result.status !== 0) {
1449
- throw new Error(`${pm} update failed with exit code ${result.status ?? "unknown"}`);
1450
- }
1454
+ runPmAddDevDeps(cwd, pm, packages);
1451
1455
  }
1452
1456
  function runSyncStorybook(options) {
1453
1457
  const { cwd, skipInstall = false } = options;
@@ -1578,6 +1582,7 @@ addCmd.command("storybook").description("Install Storybook docs pack").option("-
1578
1582
  skipInstall: Boolean(opts.skipInstall),
1579
1583
  pm: parsePm(opts.pm)
1580
1584
  });
1585
+ process.exit(0);
1581
1586
  }
1582
1587
  );
1583
1588
  addCmd.command("brain").description("Install brain AI pack (Phase 4 \u2014 experimental)").option("--repair", "Re-apply rules, AGENTS block, and .idia/brain/ from pack").option("--force", "Overwrite conflicts (document risk)").option("--pm <manager>", "Override package manager (pnpm|npm|yarn)").option("--cwd <path>", "App root directory", process.cwd()).action((opts) => {
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli.ts","../src/commands/storybook/add.ts","../src/commands/storybook/constants.ts","../src/commands/storybook/templates.ts","../src/utils/pm.ts","../src/utils/package-json.ts","../src/utils/fs.ts","../src/utils/manifest.ts","../src/brain/install.ts","../src/brain/agents-patch.ts","../src/brain/constants.ts","../src/brain/pack.ts","../src/utils/exec.ts","../src/commands/add.ts","../src/checks/packs.ts","../src/checks/manifest.ts","../src/checks/navigation.ts","../src/checks/peers.ts","../src/checks/runtime.ts","../src/checks/index.ts","../src/commands/doctor.ts","../src/commands/storybook/sync.ts","../src/commands/sync.ts"],"sourcesContent":["import { Command } from 'commander';\r\nimport { resolve } from 'node:path';\r\n\r\nimport { runAddBrain, runAddStorybook, runAddUnknown } from './commands/add.js';\r\nimport {\r\n formatHumanReport,\r\n formatJsonReport,\r\n runDoctor,\r\n} from './commands/doctor.js';\r\nimport { runSync } from './commands/sync.js';\r\nimport { CLI_VERSION } from './utils/manifest.js';\r\n\r\nconst program = new Command();\r\n\r\nprogram\r\n .name('idia-ui')\r\n .description('idia-ui CLI — doctor and add-on management for consumer apps')\r\n .version(CLI_VERSION);\r\n\r\nprogram\r\n .command('doctor')\r\n .description('Run health checks on an idia consumer app')\r\n .option('--cwd <path>', 'App root directory', process.cwd())\r\n .option('--full', 'Include Storybook (S*) and brain (B*) checks')\r\n .option('--fix', 'Limited safe repairs (manifest regenerate)')\r\n .option('--strict', 'Treat warnings as failures')\r\n .option('--json', 'Machine-readable JSON output')\r\n .action((opts: { cwd: string; full?: boolean; fix?: boolean; strict?: boolean; json?: boolean }) => {\r\n const cwd = resolve(opts.cwd);\r\n const report = runDoctor({\r\n cwd,\r\n full: Boolean(opts.full),\r\n fix: Boolean(opts.fix),\r\n strict: Boolean(opts.strict),\r\n json: Boolean(opts.json),\r\n });\r\n\r\n if (opts.json) {\r\n console.log(formatJsonReport(report));\r\n } else {\r\n console.log(formatHumanReport(report, Boolean(opts.full)));\r\n }\r\n\r\n process.exit(report.exitCode);\r\n });\r\n\r\nconst addCmd = program.command('add').description('Install idia add-on packs');\r\n\r\naddCmd\r\n .command('storybook')\r\n .description('Install Storybook docs pack')\r\n .option('--repair', 'Refresh CLI-owned Storybook files')\r\n .option('--force', 'Overwrite conflicts (document risk)')\r\n .option('--skip-install', 'Skip package manager install')\r\n .option('--pm <manager>', 'Override package manager (pnpm|npm|yarn)')\r\n .option('--cwd <path>', 'App root directory', process.cwd())\r\n .action(\r\n (opts: {\r\n repair?: boolean;\r\n force?: boolean;\r\n skipInstall?: boolean;\r\n pm?: string;\r\n cwd: string;\r\n }) => {\r\n runAddStorybook({\r\n cwd: resolve(opts.cwd),\r\n repair: Boolean(opts.repair),\r\n force: Boolean(opts.force),\r\n skipInstall: Boolean(opts.skipInstall),\r\n pm: parsePm(opts.pm),\r\n });\r\n },\r\n );\r\n\r\naddCmd\r\n .command('brain')\r\n .description('Install brain AI pack (Phase 4 — experimental)')\r\n .option('--repair', 'Re-apply rules, AGENTS block, and .idia/brain/ from pack')\r\n .option('--force', 'Overwrite conflicts (document risk)')\r\n .option('--pm <manager>', 'Override package manager (pnpm|npm|yarn)')\r\n .option('--cwd <path>', 'App root directory', process.cwd())\r\n .action((opts: { repair?: boolean; force?: boolean; pm?: string; cwd: string }) => {\r\n runAddBrain({\r\n cwd: resolve(opts.cwd),\r\n repair: Boolean(opts.repair),\r\n force: Boolean(opts.force),\r\n pm: parsePm(opts.pm),\r\n });\r\n });\r\n\r\naddCmd\r\n .argument('[target]', 'add-on target')\r\n .action((target: string | undefined) => {\r\n if (!target) {\r\n console.error('Usage: idia-ui add <storybook|brain>');\r\n process.exit(1);\r\n }\r\n runAddUnknown(target);\r\n });\r\n\r\nconst syncCmd = program\r\n .command('sync')\r\n .description('Sync installed pack versions and manifest');\r\n\r\nsyncCmd\r\n .argument('<target>', 'storybook | brain | all')\r\n .option('--force', 'Overwrite pack-owned files')\r\n .option('--pm <manager>', 'Override package manager (pnpm|npm|yarn)')\r\n .option('--cwd <path>', 'App root directory', process.cwd())\r\n .action((target: string, opts: { force?: boolean; pm?: string; cwd: string }) => {\r\n runSync(target, {\r\n cwd: resolve(opts.cwd),\r\n force: Boolean(opts.force),\r\n pm: parsePm(opts.pm),\r\n });\r\n });\r\n\r\nprogram.parse();\r\n\r\nfunction parsePm(value: string | undefined): 'pnpm' | 'npm' | 'yarn' | undefined {\r\n if (!value) return undefined;\r\n const normalized = value.toLowerCase();\r\n if (normalized === 'pnpm' || normalized === 'npm' || normalized === 'yarn') {\r\n return normalized;\r\n }\r\n console.error(`Invalid --pm value \"${value}\". Use pnpm, npm, or yarn.`);\r\n process.exit(1);\r\n}\r\n","import { mkdirSync, writeFileSync } from 'node:fs'\r\nimport { dirname, join } from 'node:path'\r\nimport { spawnSync } from 'node:child_process'\r\n\r\nimport {\r\n STORYBOOK_CLI_VERSION,\r\n STORYBOOK_DEV_DEPS,\r\n STORYBOOK_DOCS_VERSION,\r\n STORYBOOK_OWNED_FILES,\r\n STORYBOOK_PRESET_VERSION,\r\n} from './constants.js'\r\nimport { buttonStoriesTsx, storybookMainTs, storybookPreviewTsx } from './templates.js'\r\nimport type { PackageManager } from '../../utils/pm.js'\r\nimport { detectPackageManager } from '../../utils/pm.js'\r\nimport { readInstalledVersion, readPackageJson } from '../../utils/package-json.js'\r\nimport { fileExists, readTextFile } from '../../utils/fs.js'\r\nimport {\r\n CLI_VERSION,\r\n readManifest,\r\n writeManifest,\r\n} from '../../utils/manifest.js'\r\nimport type { IdiaManifest } from '../../types.js'\r\n\r\nexport type AddStorybookOptions = {\r\n cwd: string\r\n repair?: boolean\r\n force?: boolean\r\n pm?: PackageManager\r\n skipInstall?: boolean\r\n}\r\n\r\nexport type AddStorybookResult = {\r\n installed: boolean\r\n alreadyInstalled: boolean\r\n filesWritten: string[]\r\n warnings: string[]\r\n}\r\n\r\nfunction writeOwnedFile(cwd: string, relativePath: string, content: string, force: boolean): boolean {\r\n const fullPath = join(cwd, relativePath)\r\n if (fileExists(cwd, relativePath) && !force) {\r\n const existing = readTextFile(cwd, relativePath)\r\n if (existing === content) return false\r\n throw new Error(\r\n `Conflict: ${relativePath} exists with different content. Use --repair or --force.`,\r\n )\r\n }\r\n mkdirSync(dirname(fullPath), { recursive: true })\r\n writeFileSync(fullPath, content, 'utf8')\r\n return true\r\n}\r\n\r\nfunction parseDepSpec(spec: string): { name: string; range: string } {\r\n if (spec.startsWith('@')) {\r\n const at = spec.indexOf('@', 1)\r\n return { name: spec.slice(0, at), range: spec.slice(at + 1) }\r\n }\r\n const at = spec.indexOf('@')\r\n return { name: spec.slice(0, at), range: spec.slice(at + 1) }\r\n}\r\n\r\nfunction resolveDepVersion(name: string, range: string): string {\r\n if (name.startsWith('@idia-ui/storybook')) {\r\n return 'workspace:*'\r\n }\r\n return `^${range.replace(/^\\^/, '')}`\r\n}\r\n\r\nfunction addDevDependencies(cwd: string): void {\r\n const pkg = readPackageJson(cwd)\r\n if (!pkg) throw new Error('package.json not found')\r\n\r\n pkg.devDependencies ??= {}\r\n for (const spec of STORYBOOK_DEV_DEPS) {\r\n const { name, range } = parseDepSpec(spec)\r\n pkg.devDependencies[name] = resolveDepVersion(name, range)\r\n }\r\n\r\n pkg.scripts ??= {}\r\n pkg.scripts.storybook = 'storybook dev -p 6006'\r\n pkg.scripts['build-storybook'] = 'storybook build'\r\n\r\n writeFileSync(join(cwd, 'package.json'), `${JSON.stringify(pkg, null, 2)}\\n`, 'utf8')\r\n}\r\n\r\nfunction runPmInstall(cwd: string, pm: PackageManager): void {\r\n const args =\r\n pm === 'pnpm'\r\n ? ['add', '-D', ...STORYBOOK_DEV_DEPS]\r\n : pm === 'yarn'\r\n ? ['add', '-D', ...STORYBOOK_DEV_DEPS]\r\n : ['install', '-D', ...STORYBOOK_DEV_DEPS]\r\n\r\n const result = spawnSync(pm, args, {\r\n cwd,\r\n stdio: 'inherit',\r\n shell: process.platform === 'win32',\r\n })\r\n if (result.status !== 0) {\r\n throw new Error(`${pm} install failed with exit code ${result.status ?? 'unknown'}`)\r\n }\r\n}\r\n\r\nfunction resolveCoreVersion(cwd: string, pkg: NonNullable<ReturnType<typeof readPackageJson>>): string {\r\n const installed = readInstalledVersion(cwd, '@idia-ui/core')\r\n if (installed) return installed\r\n\r\n const declared = pkg.dependencies?.['@idia-ui/core'] ?? ''\r\n if (declared && !declared.startsWith('workspace')) {\r\n return declared.replace(/^[\\^~]/, '')\r\n }\r\n\r\n return '0.2.0'\r\n}\r\n\r\nfunction updateStorybookManifest(cwd: string, manifest: IdiaManifest, coreVersion: string): void {\r\n manifest.idiaCli = CLI_VERSION\r\n manifest.core = coreVersion\r\n manifest.features ??= {}\r\n manifest.features.storybook = {\r\n installed: new Date().toISOString(),\r\n storybookDocs: STORYBOOK_DOCS_VERSION,\r\n storybook: STORYBOOK_CLI_VERSION,\r\n preset: STORYBOOK_PRESET_VERSION,\r\n }\r\n writeManifest(cwd, manifest)\r\n}\r\n\r\nfunction isStorybookInstalled(cwd: string): boolean {\r\n return (\r\n fileExists(cwd, '.storybook/main.ts') &&\r\n Boolean(readPackageJson(cwd)?.devDependencies?.['@idia-ui/storybook-docs'])\r\n )\r\n}\r\n\r\nexport function runAddStorybook(options: AddStorybookOptions): AddStorybookResult {\r\n const { cwd, repair = false, force = false, skipInstall = false } = options\r\n const pm = options.pm ?? detectPackageManager(cwd)\r\n const warnings: string[] = []\r\n const filesWritten: string[] = []\r\n\r\n const pkg = readPackageJson(cwd)\r\n if (!pkg) {\r\n console.error('package.json not found — run from your app root')\r\n process.exit(1)\r\n }\r\n\r\n let manifest = readManifest(cwd)\r\n const coreVersion = resolveCoreVersion(cwd, pkg)\r\n if (!manifest) {\r\n manifest = { idiaCli: CLI_VERSION, core: coreVersion }\r\n warnings.push('Created .idia/manifest.json stub')\r\n } else {\r\n manifest.core = coreVersion\r\n }\r\n\r\n const alreadyInstalled = isStorybookInstalled(cwd)\r\n if (alreadyInstalled && !repair && !force) {\r\n console.log('Storybook already installed — idempotent skip (use --repair to refresh CLI-owned files)')\r\n updateStorybookManifest(cwd, manifest, coreVersion)\r\n return { installed: true, alreadyInstalled: true, filesWritten, warnings }\r\n }\r\n\r\n const ownedContent: Record<(typeof STORYBOOK_OWNED_FILES)[number], string> = {\r\n '.storybook/main.ts': storybookMainTs(),\r\n '.storybook/preview.tsx': storybookPreviewTsx(),\r\n 'src/stories/Button.stories.tsx': buttonStoriesTsx(),\r\n }\r\n\r\n for (const relativePath of STORYBOOK_OWNED_FILES) {\r\n if (repair || force || !fileExists(cwd, relativePath)) {\r\n const wrote = writeOwnedFile(cwd, relativePath, ownedContent[relativePath], force || repair)\r\n if (wrote) filesWritten.push(relativePath)\r\n }\r\n }\r\n\r\n addDevDependencies(cwd)\r\n\r\n if (!skipInstall) {\r\n console.log(`Installing Storybook devDependencies via ${pm}…`)\r\n runPmInstall(cwd, pm)\r\n } else {\r\n warnings.push('Skipped package manager install (--skip-install)')\r\n }\r\n\r\n updateStorybookManifest(cwd, manifest, coreVersion)\r\n\r\n console.log('\\n✓ Storybook add-on installed')\r\n console.log(` @idia-ui/storybook-docs@${STORYBOOK_DOCS_VERSION}`)\r\n console.log(` @idia-ui/storybook-preset-react-native-web@${STORYBOOK_PRESET_VERSION}`)\r\n console.log(' Run: pnpm storybook (or npm run storybook)')\r\n\r\n return { installed: true, alreadyInstalled, filesWritten, warnings }\r\n}\r\n","/** Version lockstep with @idia-ui/core minor (0.2.x). */\r\nexport const STORYBOOK_DOCS_VERSION = '0.2.0'\r\nexport const STORYBOOK_PRESET_VERSION = '0.2.1'\r\nexport const STORYBOOK_CLI_VERSION = '8.4.7'\r\n\r\nexport const STORYBOOK_DEV_DEPS = [\r\n 'storybook@^8.4.7',\r\n '@storybook/react-vite@^8.4.7',\r\n '@storybook/addon-docs@^8.4.7',\r\n '@storybook/addon-a11y@^8.4.7',\r\n '@storybook/addon-links@^8.4.7',\r\n `@idia-ui/storybook-docs@${STORYBOOK_DOCS_VERSION}`,\r\n `@idia-ui/storybook-preset-react-native-web@${STORYBOOK_PRESET_VERSION}`,\r\n 'vite@^5.4.0',\r\n] as const\r\n\r\nexport const STORYBOOK_OWNED_FILES = [\r\n '.storybook/main.ts',\r\n '.storybook/preview.tsx',\r\n 'src/stories/Button.stories.tsx',\r\n] as const\r\n","export function storybookMainTs(): string {\r\n return `import type { StorybookConfig } from '@storybook/react-vite';\r\nimport { idiaStorybookMain } from '@idia-ui/storybook-preset-react-native-web';\r\n\r\nconst config: StorybookConfig = idiaStorybookMain({\r\n stories: ['../src/stories/**/*.stories.@(ts|tsx)'],\r\n staticDirs: ['../public'],\r\n});\r\n\r\nexport default config;\r\n`\r\n}\r\n\r\nexport function storybookPreviewTsx(): string {\r\n return `import React from 'react';\r\nimport type { Preview } from '@storybook/react';\r\nimport { AppProviders } from '../src/providers/AppProviders';\r\nimport '../global.css';\r\n\r\nconst preview: Preview = {\r\n decorators: [\r\n (Story) => (\r\n <AppProviders>\r\n <Story />\r\n </AppProviders>\r\n ),\r\n ],\r\n parameters: {\r\n layout: 'centered',\r\n controls: { expanded: true },\r\n },\r\n};\r\n\r\nexport default preview;\r\n`\r\n}\r\n\r\nexport function buttonStoriesTsx(): string {\r\n return `import type { Meta, StoryObj } from '@storybook/react';\r\nimport { Button } from '@idia-ui/core';\r\nimport { BrainDocSections } from '@idia-ui/storybook-docs';\r\n\r\nconst meta = {\r\n title: 'Components/Button',\r\n component: Button,\r\n tags: ['autodocs'],\r\n parameters: {\r\n docs: {\r\n page: () => (\r\n <>\r\n <BrainDocSections\r\n componentId=\"button\"\r\n sectionIds={['intent', 'usage', 'variants', 'accessibility']}\r\n />\r\n </>\r\n ),\r\n },\r\n },\r\n args: {\r\n label: 'Button',\r\n variant: 'primary',\r\n },\r\n} satisfies Meta<typeof Button>;\r\n\r\nexport default meta;\r\n\r\ntype Story = StoryObj<typeof meta>;\r\n\r\nexport const Playground: Story = {};\r\n`\r\n}\r\n","import { existsSync } from 'node:fs';\r\nimport { dirname, join } from 'node:path';\r\n\r\nexport type PackageManager = 'pnpm' | 'npm' | 'yarn';\r\n\r\nfunction findLockfileDir(start: string): string {\r\n let dir = start;\r\n while (true) {\r\n if (existsSync(join(dir, 'pnpm-lock.yaml'))) return dir;\r\n if (existsSync(join(dir, 'yarn.lock'))) return dir;\r\n if (existsSync(join(dir, 'package-lock.json'))) return dir;\r\n const parent = dirname(dir);\r\n if (parent === dir) return start;\r\n dir = parent;\r\n }\r\n}\r\n\r\nexport function detectPackageManager(cwd: string): PackageManager {\r\n const root = findLockfileDir(cwd);\r\n if (existsSync(join(root, 'pnpm-lock.yaml'))) return 'pnpm';\r\n if (existsSync(join(root, 'yarn.lock'))) return 'yarn';\r\n return 'npm';\r\n}\r\n\r\nexport function pmAddCommand(pm: PackageManager, packages: string[]): string {\r\n const list = packages.join(' ');\r\n switch (pm) {\r\n case 'pnpm':\r\n return `pnpm add ${list}`;\r\n case 'yarn':\r\n return `yarn add ${list}`;\r\n default:\r\n return `npm install ${list}`;\r\n }\r\n}\r\n\r\nexport function pmUpdateCommand(pm: PackageManager, packages: string[]): string {\r\n const list = packages.join(' ');\r\n switch (pm) {\r\n case 'pnpm':\r\n return `pnpm update ${list}`;\r\n case 'yarn':\r\n return `yarn upgrade ${list}`;\r\n default:\r\n return `npm update ${list}`;\r\n }\r\n}\r\n","import { readFileSync } from 'node:fs';\r\nimport { join } from 'node:path';\r\n\r\nimport type { PackageJson } from '../types.js';\r\n\r\nexport function readPackageJson(cwd: string): PackageJson | null {\r\n try {\r\n const raw = readFileSync(join(cwd, 'package.json'), 'utf8');\r\n return JSON.parse(raw) as PackageJson;\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nexport function getDepVersion(\r\n pkg: PackageJson,\r\n name: string,\r\n): string | undefined {\r\n return pkg.dependencies?.[name] ?? pkg.devDependencies?.[name];\r\n}\r\n\r\nexport function readInstalledVersion(cwd: string, name: string): string | null {\r\n try {\r\n const pkgPath = join(cwd, 'node_modules', name, 'package.json');\r\n const raw = readFileSync(pkgPath, 'utf8');\r\n const parsed = JSON.parse(raw) as { version?: string };\r\n return parsed.version ?? null;\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nexport function readPeerRange(\r\n cwd: string,\r\n packageName: string,\r\n peerName: string,\r\n): string | null {\r\n try {\r\n const pkgPath = join(cwd, 'node_modules', packageName, 'package.json');\r\n const raw = readFileSync(pkgPath, 'utf8');\r\n const parsed = JSON.parse(raw) as {\r\n peerDependencies?: Record<string, string>;\r\n };\r\n return parsed.peerDependencies?.[peerName] ?? null;\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nexport function listIdiaPackages(pkg: PackageJson): string[] {\r\n const names = new Set<string>();\r\n for (const deps of [pkg.dependencies, pkg.devDependencies]) {\r\n if (!deps) continue;\r\n for (const name of Object.keys(deps)) {\r\n if (name.startsWith('@idia-ui/')) names.add(name);\r\n }\r\n }\r\n return [...names].sort();\r\n}\r\n","import { existsSync, readFileSync, readdirSync, statSync } from 'node:fs';\r\nimport { join } from 'node:path';\r\n\r\nimport semver from 'semver';\r\n\r\nexport function satisfiesRange(version: string, range: string): boolean {\r\n const cleaned = version.replace(/^[\\^~>=<]*/, '').split(' ')[0] ?? version;\r\n if (range === 'workspace:*' || range.startsWith('file:')) return true;\r\n const coerced = semver.coerce(cleaned);\r\n if (!coerced) return false;\r\n return semver.satisfies(coerced, range, { includePrerelease: true });\r\n}\r\n\r\nexport function getMinor(version: string): string | null {\r\n const coerced = semver.coerce(version);\r\n if (!coerced) return null;\r\n return `${coerced.major}.${coerced.minor}`;\r\n}\r\n\r\nexport function readTextFile(cwd: string, relativePath: string): string | null {\r\n try {\r\n return readFileSync(join(cwd, relativePath), 'utf8');\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nexport function fileExists(cwd: string, relativePath: string): boolean {\r\n try {\r\n return existsSync(join(cwd, relativePath));\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\nexport function grepSrcForPattern(cwd: string, pattern: RegExp): boolean {\r\n const filesToScan = [\r\n 'App.tsx',\r\n 'src/providers/AppProviders.tsx',\r\n ];\r\n\r\n for (const file of filesToScan) {\r\n const content = readTextFile(cwd, file);\r\n if (content && pattern.test(content)) return true;\r\n }\r\n\r\n const srcRoot = join(cwd, 'src');\r\n try {\r\n const walk = (dir: string): boolean => {\r\n for (const entry of readdirSync(dir)) {\r\n const full = join(dir, entry);\r\n const stat = statSync(full);\r\n if (stat.isDirectory()) {\r\n if (walk(full)) return true;\r\n } else if (/\\.(tsx?|jsx?)$/.test(entry)) {\r\n const content = readFileSync(full, 'utf8');\r\n if (pattern.test(content)) return true;\r\n }\r\n }\r\n return false;\r\n };\r\n if (existsSync(srcRoot)) return walk(srcRoot);\r\n } catch {\r\n // ignore walk errors\r\n }\r\n\r\n return false;\r\n}\r\n","import { readFileSync, writeFileSync, mkdirSync } from 'node:fs';\r\nimport { dirname, join } from 'node:path';\r\n\r\nimport type { IdiaManifest } from '../types.js';\r\nimport { fileExists } from './fs.js';\r\n\r\nconst CLI_VERSION = '0.2.1';\r\n\r\nexport function readManifest(cwd: string): IdiaManifest | null {\r\n try {\r\n const raw = readFileSync(join(cwd, '.idia', 'manifest.json'), 'utf8');\r\n return JSON.parse(raw) as IdiaManifest;\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nexport function writeManifest(cwd: string, manifest: IdiaManifest): void {\r\n const manifestPath = join(cwd, '.idia', 'manifest.json');\r\n mkdirSync(dirname(manifestPath), { recursive: true });\r\n writeFileSync(manifestPath, `${JSON.stringify(manifest, null, 2)}\\n`, 'utf8');\r\n}\r\n\r\nexport function regenerateManifest(\r\n cwd: string,\r\n coreVersion: string,\r\n): { created: boolean; path: string } {\r\n const manifestPath = join(cwd, '.idia', 'manifest.json');\r\n const manifest: IdiaManifest = {\r\n idiaCli: CLI_VERSION,\r\n core: coreVersion,\r\n };\r\n writeManifest(cwd, manifest);\r\n return { created: true, path: manifestPath };\r\n}\r\n\r\nexport function manifestExists(cwd: string): boolean {\r\n return fileExists(cwd, '.idia/manifest.json');\r\n}\r\n\r\nexport function validateManifestShape(manifest: IdiaManifest): boolean {\r\n return (\r\n typeof manifest.idiaCli === 'string' &&\r\n typeof manifest.core === 'string' &&\r\n /^\\d+\\.\\d+\\.\\d+/.test(manifest.idiaCli) &&\r\n /^\\d+\\.\\d+\\.\\d+/.test(manifest.core)\r\n );\r\n}\r\n\r\nexport { CLI_VERSION };\r\n","import { cpSync, existsSync, mkdirSync, readdirSync, statSync } from 'node:fs';\r\nimport { join } from 'node:path';\r\n\r\nimport { patchRootAgentsMd } from './agents-patch.js';\r\nimport {\r\n BRAIN_PACK_NAME,\r\n BRAIN_PACK_VERSION,\r\n BRAIN_TIER_DISCLAIMER,\r\n} from './constants.js';\r\nimport {\r\n brainPackSpecForApp,\r\n readBrainPackManifest,\r\n resolveBrainPackRoot,\r\n} from './pack.js';\r\nimport { runPmAddDev, runPmInstall } from '../utils/exec.js';\r\nimport { fileExists } from '../utils/fs.js';\r\nimport { readInstalledVersion, readPackageJson } from '../utils/package-json.js';\r\nimport { detectPackageManager } from '../utils/pm.js';\r\nimport { readManifest, writeManifest, CLI_VERSION } from '../utils/manifest.js';\r\nimport type { IdiaManifest } from '../types.js';\r\n\r\nexport type BrainInstallOptions = {\r\n cwd: string;\r\n repair?: boolean;\r\n force?: boolean;\r\n pm?: 'pnpm' | 'npm' | 'yarn';\r\n skipInstall?: boolean;\r\n};\r\n\r\nexport type BrainInstallResult = {\r\n alreadyInstalled: boolean;\r\n packRoot: string;\r\n sourceHash: string;\r\n agentsPatch: ReturnType<typeof patchRootAgentsMd>;\r\n};\r\n\r\nfunction copyDirRecursive(src: string, dest: string, force: boolean): void {\r\n mkdirSync(dest, { recursive: true });\r\n for (const entry of readdirSync(src)) {\r\n const srcPath = join(src, entry);\r\n const destPath = join(dest, entry);\r\n const stat = statSync(srcPath);\r\n if (stat.isDirectory()) {\r\n copyDirRecursive(srcPath, destPath, force);\r\n } else {\r\n if (!force && existsSync(destPath)) continue;\r\n cpSync(srcPath, destPath);\r\n }\r\n }\r\n}\r\n\r\nfunction ensureBrainPackDependency(\r\n cwd: string,\r\n pm: 'pnpm' | 'npm' | 'yarn',\r\n skipInstall: boolean,\r\n): void {\r\n const pkg = readPackageJson(cwd);\r\n if (!pkg) throw new Error('package.json not found');\r\n\r\n const spec = brainPackSpecForApp(cwd);\r\n const existing = pkg.devDependencies?.[BRAIN_PACK_NAME];\r\n if (existing === spec || existing === BRAIN_PACK_VERSION) {\r\n if (!skipInstall && !existsSync(join(cwd, 'node_modules', BRAIN_PACK_NAME))) {\r\n runPmInstall(cwd, pm);\r\n }\r\n return;\r\n }\r\n\r\n if (!skipInstall) {\r\n runPmAddDev(cwd, pm, `${BRAIN_PACK_NAME}@${spec}`);\r\n }\r\n}\r\n\r\nfunction isBrainInstalled(cwd: string, manifest: IdiaManifest | null): boolean {\r\n const hasAgents = fileExists(cwd, '.idia/brain/AGENTS.md');\r\n const hasFeature = Boolean(manifest?.features?.brain?.brainPack);\r\n return hasAgents && hasFeature;\r\n}\r\n\r\nexport function installBrainPack(options: BrainInstallOptions): BrainInstallResult {\r\n const { cwd, repair = false, force = false, skipInstall = false } = options;\r\n const pm = options.pm ?? detectPackageManager(cwd);\r\n const manifest = readManifest(cwd);\r\n\r\n if (isBrainInstalled(cwd, manifest) && !repair && !force) {\r\n const packRoot = resolveBrainPackRoot(cwd);\r\n if (packRoot) {\r\n const packManifest = readBrainPackManifest(packRoot);\r\n return {\r\n alreadyInstalled: true,\r\n packRoot,\r\n sourceHash: packManifest?.sourceHash ?? '',\r\n agentsPatch: { status: 'merged' },\r\n };\r\n }\r\n }\r\n\r\n ensureBrainPackDependency(cwd, pm, skipInstall);\r\n\r\n const packRoot = resolveBrainPackRoot(cwd);\r\n if (!packRoot) {\r\n throw new Error(\r\n `${BRAIN_PACK_NAME} not found. Run ${pm} add -D ${BRAIN_PACK_NAME} and retry.`,\r\n );\r\n }\r\n\r\n const packManifest = readBrainPackManifest(packRoot);\r\n if (!packManifest?.sourceHash) {\r\n throw new Error(`${BRAIN_PACK_NAME} pack-manifest.json missing or invalid.`);\r\n }\r\n\r\n const brainSrc = join(packRoot, 'brain');\r\n const rulesSrc = join(packRoot, 'cursor-rules');\r\n const brainDest = join(cwd, '.idia', 'brain');\r\n const rulesDest = join(cwd, '.cursor', 'rules');\r\n\r\n copyDirRecursive(brainSrc, brainDest, force || repair);\r\n mkdirSync(rulesDest, { recursive: true });\r\n copyDirRecursive(rulesSrc, rulesDest, force || repair);\r\n\r\n const agentsPatch = patchRootAgentsMd(cwd, { repair, force });\r\n\r\n const coreVersion =\r\n readInstalledVersion(cwd, '@idia-ui/core') ??\r\n manifest?.core ??\r\n packManifest.core;\r\n\r\n const nextManifest: IdiaManifest = {\r\n idiaCli: manifest?.idiaCli ?? CLI_VERSION,\r\n core: coreVersion,\r\n features: {\r\n ...manifest?.features,\r\n brain: {\r\n installed: new Date().toISOString(),\r\n brainPack: packManifest.brainPack,\r\n sourceHash: packManifest.sourceHash,\r\n },\r\n },\r\n };\r\n writeManifest(cwd, nextManifest);\r\n\r\n return {\r\n alreadyInstalled: false,\r\n packRoot,\r\n sourceHash: packManifest.sourceHash,\r\n agentsPatch,\r\n };\r\n}\r\n\r\nexport function printBrainInstallSummary(result: BrainInstallResult): void {\r\n if (result.alreadyInstalled) {\r\n console.log('✓ brain pack already installed');\r\n console.log(` .idia/brain/AGENTS.md`);\r\n console.log(` sourceHash: ${result.sourceHash || '(unknown)'}`);\r\n console.log('');\r\n console.log(BRAIN_TIER_DISCLAIMER);\r\n return;\r\n }\r\n\r\n console.log('✓ brain pack installed to .idia/brain/');\r\n console.log('✓ cursor rules copied to .cursor/rules/idia-ui-*.mdc');\r\n\r\n switch (result.agentsPatch.status) {\r\n case 'created':\r\n console.log('✓ AGENTS.md created with idia-ui brain block');\r\n break;\r\n case 'merged':\r\n console.log('✓ AGENTS.md updated with idia-ui brain block');\r\n break;\r\n case 'replaced':\r\n console.log('✓ AGENTS.md brain block repaired');\r\n break;\r\n case 'conflict':\r\n console.warn(\r\n `⚠ AGENTS.md conflict — wrote suggested patch: ${result.agentsPatch.patchPath}`,\r\n );\r\n console.warn(' Run idia-ui add brain --repair --force to overwrite.');\r\n break;\r\n }\r\n\r\n console.log(` sourceHash: ${result.sourceHash}`);\r\n console.log('');\r\n console.log(BRAIN_TIER_DISCLAIMER);\r\n}\r\n","import { mkdirSync, writeFileSync } from 'node:fs';\r\nimport { dirname, join } from 'node:path';\r\n\r\nimport {\r\n AGENTS_BEGIN,\r\n AGENTS_BRAIN_BLOCK,\r\n AGENTS_END,\r\n} from './constants.js';\r\nimport { readTextFile } from '../utils/fs.js';\r\n\r\nexport type AgentsPatchResult =\r\n | { status: 'created' | 'merged' | 'replaced' }\r\n | { status: 'conflict'; patchPath: string };\r\n\r\nexport function patchRootAgentsMd(\r\n cwd: string,\r\n options: { repair?: boolean; force?: boolean },\r\n): AgentsPatchResult {\r\n const agentsPath = join(cwd, 'AGENTS.md');\r\n const existing = readTextFile(cwd, 'AGENTS.md');\r\n\r\n if (existing === null) {\r\n writeFileSync(agentsPath, `${AGENTS_BRAIN_BLOCK}\\n`, 'utf8');\r\n return { status: 'created' };\r\n }\r\n\r\n const hasBegin = existing.includes(AGENTS_BEGIN);\r\n const hasEnd = existing.includes(AGENTS_END);\r\n\r\n if (hasBegin && hasEnd) {\r\n if (!options.repair && !options.force) {\r\n return { status: 'merged' };\r\n }\r\n const updated = existing.replace(\r\n new RegExp(`${escapeRegExp(AGENTS_BEGIN)}[\\\\s\\\\S]*?${escapeRegExp(AGENTS_END)}`),\r\n AGENTS_BRAIN_BLOCK,\r\n );\r\n if (updated === existing && !options.force) {\r\n return { status: 'merged' };\r\n }\r\n writeFileSync(agentsPath, updated, 'utf8');\r\n return { status: 'replaced' };\r\n }\r\n\r\n if (hasBegin !== hasEnd) {\r\n if (options.force) {\r\n const withoutPartial = existing\r\n .replace(new RegExp(`${escapeRegExp(AGENTS_BEGIN)}[\\\\s\\\\S]*`), '')\r\n .replace(AGENTS_END, '');\r\n writeFileSync(\r\n agentsPath,\r\n `${withoutPartial.trimEnd()}\\n\\n${AGENTS_BRAIN_BLOCK}\\n`,\r\n 'utf8',\r\n );\r\n return { status: 'replaced' };\r\n }\r\n return writeConflictPatch(cwd, existing);\r\n }\r\n\r\n writeFileSync(agentsPath, `${existing.trimEnd()}\\n\\n${AGENTS_BRAIN_BLOCK}\\n`, 'utf8');\r\n return { status: 'merged' };\r\n}\r\n\r\nfunction writeConflictPatch(cwd: string, existing: string): AgentsPatchResult {\r\n const patchDir = join(cwd, '.idia', 'patches');\r\n mkdirSync(patchDir, { recursive: true });\r\n const patchPath = join(patchDir, 'AGENTS.md.patch');\r\n const patchBody = [\r\n '# AGENTS.md brain block patch (idia-ui add brain)',\r\n '# Apply manually or run: idia-ui add brain --repair --force',\r\n '',\r\n AGENTS_BRAIN_BLOCK,\r\n '',\r\n '# --- existing AGENTS.md preserved below ---',\r\n '',\r\n existing,\r\n ].join('\\n');\r\n writeFileSync(patchPath, patchBody, 'utf8');\r\n return { status: 'conflict', patchPath };\r\n}\r\n\r\nfunction escapeRegExp(value: string): string {\r\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\r\n}\r\n","export const BRAIN_PACK_NAME = '@idia-ui/brain-pack';\r\nexport const BRAIN_PACK_VERSION = '0.2.0';\r\n\r\nexport const BRAIN_TIER_DISCLAIMER =\r\n '@idia-ui/brain-pack is a generated AI retrieval pack for idia-ui usage guidance. It does not imply Tier 1 passive external-agent graduation, GA readiness, or full-catalog efficacy.';\r\n\r\nexport const BRAIN_DOCTOR_DISCLAIMER =\r\n 'brain pack is experimental retrieval guidance; it does not imply Tier 1P graduation';\r\n\r\nexport const AGENTS_BEGIN = '<!-- idia-ui brain:begin -->';\r\nexport const AGENTS_END = '<!-- idia-ui brain:end -->';\r\n\r\nexport const AGENTS_BRAIN_BLOCK = `${AGENTS_BEGIN}\r\n## idia-ui design-system brain\r\n\r\nFor idia-ui component usage, design-system documentation, Storybook docs, UI generation, or AI-guided UI work, read:\r\n\r\n\\`.idia/brain/AGENTS.md\\`\r\n\r\nbefore using idia-ui components.\r\n\r\nThis installed brain pack is read-only generated guidance. Do not edit files under \\`.idia/brain/\\` directly.\r\n${AGENTS_END}`;\r\n","import { existsSync, readFileSync } from 'node:fs';\r\nimport { createRequire } from 'node:module';\r\nimport { dirname, join } from 'node:path';\r\n\r\nimport { BRAIN_PACK_NAME } from './constants.js';\r\n\r\nexport type BrainPackManifest = {\r\n brainPack: string;\r\n core: string;\r\n sourceHash: string;\r\n coverage?: Record<string, unknown>;\r\n tierClaims?: Record<string, string>;\r\n};\r\n\r\nexport function resolveBrainPackRoot(cwd: string): string | null {\r\n const local = join(cwd, 'node_modules', BRAIN_PACK_NAME);\r\n if (existsSync(join(local, 'pack-manifest.json'))) return local;\r\n\r\n try {\r\n const require = createRequire(join(cwd, 'package.json'));\r\n const pkgJson = require.resolve(`${BRAIN_PACK_NAME}/package.json`);\r\n return dirname(pkgJson);\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nexport function readBrainPackManifest(packRoot: string): BrainPackManifest | null {\r\n try {\r\n const raw = readFileSync(join(packRoot, 'pack-manifest.json'), 'utf8');\r\n return JSON.parse(raw) as BrainPackManifest;\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nexport function brainPackSpecForApp(cwd: string): string {\r\n try {\r\n const pkgPath = join(cwd, 'package.json');\r\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf8')) as {\r\n dependencies?: Record<string, string>;\r\n devDependencies?: Record<string, string>;\r\n };\r\n const deps = { ...pkg.dependencies, ...pkg.devDependencies };\r\n const usesWorkspace = Object.values(deps).some((v) => v === 'workspace:*');\r\n if (usesWorkspace) return 'workspace:*';\r\n } catch {\r\n // fall through\r\n }\r\n return '^0.2.0';\r\n}\r\n\r\nexport function readInstalledPackManifest(\r\n cwd: string,\r\n packageName: string,\r\n manifestFile = 'pack-manifest.json',\r\n): { sourceHash?: string } | null {\r\n try {\r\n const raw = readFileSync(\r\n join(cwd, 'node_modules', packageName, manifestFile),\r\n 'utf8',\r\n );\r\n return JSON.parse(raw) as { sourceHash?: string };\r\n } catch {\r\n return null;\r\n }\r\n}\r\n","import { spawnSync } from 'node:child_process';\r\n\r\nimport type { PackageManager } from './pm.js';\r\n\r\nexport function runPmInstall(cwd: string, pm: PackageManager): void {\r\n const result = spawnCommand(pm, installArgs(pm), cwd);\r\n if (result.status !== 0) {\r\n throw new Error(`${pm} install failed (exit ${result.status ?? 1})`);\r\n }\r\n}\r\n\r\nexport function runPmAddDev(\r\n cwd: string,\r\n pm: PackageManager,\r\n packageSpec: string,\r\n): void {\r\n const result = spawnCommand(pm, addDevArgs(pm, packageSpec), cwd);\r\n if (result.status !== 0) {\r\n throw new Error(`${pm} add failed for ${packageSpec} (exit ${result.status ?? 1})`);\r\n }\r\n}\r\n\r\nfunction installArgs(pm: PackageManager): string[] {\r\n switch (pm) {\r\n case 'pnpm':\r\n return ['install'];\r\n case 'yarn':\r\n return ['install'];\r\n default:\r\n return ['install'];\r\n }\r\n}\r\n\r\nfunction addDevArgs(pm: PackageManager, packageSpec: string): string[] {\r\n switch (pm) {\r\n case 'pnpm':\r\n return ['add', '-D', packageSpec];\r\n case 'yarn':\r\n return ['add', '-D', packageSpec];\r\n default:\r\n return ['install', '-D', packageSpec];\r\n }\r\n}\r\n\r\nfunction spawnCommand(\r\n pm: PackageManager,\r\n args: string[],\r\n cwd: string,\r\n): ReturnType<typeof spawnSync> {\r\n const command = pm === 'npm' ? 'npm' : pm;\r\n return spawnSync(command, args, { cwd, stdio: 'inherit', shell: process.platform === 'win32' });\r\n}\r\n","export { runAddStorybook } from './storybook/add.js';\r\nexport type { AddStorybookOptions } from './storybook/add.js';\r\n\r\nimport { installBrainPack, printBrainInstallSummary } from '../brain/install.js';\r\nimport { BRAIN_TIER_DISCLAIMER } from '../brain/constants.js';\r\n\r\nexport type AddBrainOptions = {\r\n cwd: string;\r\n repair?: boolean;\r\n force?: boolean;\r\n pm?: 'pnpm' | 'npm' | 'yarn';\r\n};\r\n\r\nexport function runAddBrain(options: AddBrainOptions): void {\r\n try {\r\n const result = installBrainPack({\r\n cwd: options.cwd,\r\n repair: options.repair,\r\n force: options.force,\r\n pm: options.pm,\r\n });\r\n printBrainInstallSummary(result);\r\n\r\n if (result.agentsPatch.status === 'conflict') {\r\n process.exit(1);\r\n }\r\n } catch (error) {\r\n console.error(error instanceof Error ? error.message : String(error));\r\n console.error(BRAIN_TIER_DISCLAIMER);\r\n process.exit(1);\r\n }\r\n}\r\n\r\nexport function runAddUnknown(target: string): never {\r\n console.error(`Unknown add target: ${target}`);\r\n console.error('Available: storybook, brain');\r\n process.exit(1);\r\n}\r\n","import { readFileSync, readdirSync } from 'node:fs';\r\nimport { join } from 'node:path';\r\n\r\nimport type { CheckResult } from '../types.js';\r\nimport { BRAIN_DOCTOR_DISCLAIMER } from '../brain/constants.js';\r\nimport {\r\n readBrainPackManifest,\r\n readInstalledPackManifest,\r\n resolveBrainPackRoot,\r\n} from '../brain/pack.js';\r\nimport { fileExists, getMinor, readTextFile } from '../utils/fs.js';\r\nimport { readInstalledVersion } from '../utils/package-json.js';\r\nimport { readManifest } from '../utils/manifest.js';\r\n\r\nfunction readCoverageManifest(cwd: string): {\r\n components?: Record<string, { coverage?: string }>;\r\n} | null {\r\n try {\r\n const raw = readFileSync(\r\n join(cwd, 'node_modules/@idia-ui/storybook-docs/fragments/coverage-manifest.json'),\r\n 'utf8',\r\n );\r\n return JSON.parse(raw) as { components?: Record<string, { coverage?: string }> };\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nfunction listStoryComponentIds(cwd: string): string[] {\r\n const storiesDir = join(cwd, 'src/stories');\r\n const ids = new Set<string>();\r\n\r\n try {\r\n for (const file of readdirSync(storiesDir)) {\r\n const match = file.match(/^([A-Za-z]+)\\.stories\\.(tsx?|jsx?)$/);\r\n if (match) {\r\n ids.add(match[1].toLowerCase());\r\n }\r\n }\r\n } catch {\r\n return [];\r\n }\r\n\r\n return [...ids].sort();\r\n}\r\n\r\nexport function runStorybookChecks(cwd: string): CheckResult[] {\r\n const hasPreview = fileExists(cwd, '.storybook/preview.tsx');\r\n const storybookDocs = fileExists(\r\n cwd,\r\n 'node_modules/@idia-ui/storybook-docs/package.json',\r\n );\r\n\r\n if (!hasPreview && !storybookDocs) {\r\n return [\r\n {\r\n id: 'S1',\r\n status: 'info',\r\n message: 'Storybook not installed — skipping S* checks',\r\n },\r\n {\r\n id: 'S2',\r\n status: 'skip',\r\n message: '@idia-ui/storybook-docs not installed',\r\n },\r\n {\r\n id: 'S3',\r\n status: 'skip',\r\n message: 'storybook fragment manifest not available',\r\n },\r\n ];\r\n }\r\n\r\n const results: CheckResult[] = [];\r\n\r\n const preview = readTextFile(cwd, '.storybook/preview.tsx');\r\n const importsTamagui =\r\n preview !== null &&\r\n (/tamagui\\.config/.test(preview) || /AppProviders/.test(preview));\r\n\r\n if (importsTamagui) {\r\n results.push({\r\n id: 'S1',\r\n status: 'pass',\r\n message: '.storybook/preview.tsx wires AppProviders (shared token parity)',\r\n });\r\n } else {\r\n results.push({\r\n id: 'S1',\r\n status: 'fail',\r\n message: '.storybook/preview.tsx missing AppProviders / tamagui.config wiring',\r\n fixHint: 'idia-ui add storybook --repair',\r\n });\r\n }\r\n\r\n const docsVersion = readInstalledVersion(cwd, '@idia-ui/storybook-docs');\r\n const coreVersion = readInstalledVersion(cwd, '@idia-ui/core');\r\n const docsMinor = docsVersion ? getMinor(docsVersion) : null;\r\n const coreMinor = coreVersion ? getMinor(coreVersion) : null;\r\n\r\n if (!storybookDocs) {\r\n results.push({\r\n id: 'S2',\r\n status: 'warn',\r\n message: '@idia-ui/storybook-docs not installed',\r\n fixHint: 'idia-ui add storybook',\r\n });\r\n } else if (docsMinor && coreMinor && docsMinor === coreMinor) {\r\n results.push({\r\n id: 'S2',\r\n status: 'pass',\r\n message: `@idia-ui/storybook-docs@${docsVersion} matches @idia-ui/core@${coreVersion} minor`,\r\n });\r\n } else {\r\n results.push({\r\n id: 'S2',\r\n status: 'warn',\r\n message: `storybook-docs minor (${docsMinor ?? 'unknown'}) ≠ core minor (${coreMinor ?? 'unknown'})`,\r\n fixHint: 'idia-ui sync storybook',\r\n });\r\n }\r\n\r\n const coverage = readCoverageManifest(cwd);\r\n const coveredIds = coverage?.components ? Object.keys(coverage.components) : [];\r\n const storyIds = listStoryComponentIds(cwd);\r\n const uncovered = storyIds.filter((id) => !coveredIds.includes(id));\r\n\r\n if (!coverage) {\r\n results.push({\r\n id: 'S3',\r\n status: 'warn',\r\n message: 'coverage manifest not readable',\r\n fixHint: 'idia-ui sync storybook',\r\n });\r\n } else if (uncovered.length === 0) {\r\n results.push({\r\n id: 'S3',\r\n status: 'pass',\r\n message:\r\n coveredIds.length > 0\r\n ? `fragment manifest covers ${coveredIds.length} Wave 1 components; story files aligned`\r\n : 'fragment manifest present; no src/stories/ files to cross-ref',\r\n });\r\n if (coveredIds.length > 0 && coveredIds.length < 10) {\r\n results.push({\r\n id: 'S3-info',\r\n status: 'info',\r\n message: `storybook-docs pack has doc fragments for ${coveredIds.length} components. Other components render without brain prose.`,\r\n });\r\n }\r\n } else {\r\n results.push({\r\n id: 'S3',\r\n status: 'warn',\r\n message: `stories without fragments: ${uncovered.join(', ')}`,\r\n fixHint: 'upgrade @idia-ui/storybook-docs or remove uncovered stories',\r\n });\r\n }\r\n\r\n const manifest = readManifest(cwd);\r\n if (storybookDocs && !manifest?.features?.storybook) {\r\n results.push({\r\n id: 'S-manifest',\r\n status: 'warn',\r\n message: 'manifest features.storybook missing',\r\n fixHint: 'idia-ui sync storybook',\r\n });\r\n }\r\n\r\n return results;\r\n}\r\n\r\nfunction readStorybookDocsSourceHash(cwd: string): string | null {\r\n return (\r\n readInstalledPackManifest(\r\n cwd,\r\n '@idia-ui/storybook-docs',\r\n 'fragments/coverage-manifest.json',\r\n )?.sourceHash ??\r\n readInstalledPackManifest(cwd, '@idia-ui/storybook-docs', 'coverage-manifest.json')\r\n ?.sourceHash ??\r\n readInstalledPackManifest(cwd, '@idia-ui/storybook-docs')?.sourceHash ??\r\n null\r\n );\r\n}\r\n\r\nfunction readPackSourceHash(cwd: string, packageName: string): string | null {\r\n if (packageName === '@idia-ui/storybook-docs') {\r\n return readStorybookDocsSourceHash(cwd);\r\n }\r\n return readInstalledPackManifest(cwd, packageName)?.sourceHash ?? null;\r\n}\r\n\r\nexport function runBrainChecks(cwd: string): CheckResult[] {\r\n const brainPackInstalled = fileExists(\r\n cwd,\r\n 'node_modules/@idia-ui/brain-pack/package.json',\r\n );\r\n const brainAgents = fileExists(cwd, '.idia/brain/AGENTS.md');\r\n const rootAgents = readTextFile(cwd, 'AGENTS.md');\r\n const hasBrainBlock =\r\n rootAgents !== null &&\r\n /idia-ui brain:begin/.test(rootAgents) &&\r\n /idia-ui brain:end/.test(rootAgents);\r\n\r\n if (!brainPackInstalled && !brainAgents) {\r\n return [\r\n {\r\n id: 'B1',\r\n status: 'warn',\r\n message: 'brain pack not installed',\r\n fixHint: 'Run idia-ui add brain',\r\n },\r\n {\r\n id: 'B2',\r\n status: 'skip',\r\n message: 'AGENTS.md brain block not present',\r\n },\r\n {\r\n id: 'B3',\r\n status: 'skip',\r\n message: 'brain sourceHash coupling not checked',\r\n },\r\n {\r\n id: 'B4',\r\n status: 'skip',\r\n message: 'brain/storybook hash coupling not checked',\r\n },\r\n ];\r\n }\r\n\r\n const results: CheckResult[] = [];\r\n const manifest = readManifest(cwd);\r\n const manifestHash = manifest?.features?.brain?.sourceHash as string | undefined;\r\n const packRoot = resolveBrainPackRoot(cwd);\r\n const packManifest = packRoot ? readBrainPackManifest(packRoot) : null;\r\n const packHash = packManifest?.sourceHash;\r\n\r\n results.push({\r\n id: 'B1',\r\n status: brainAgents ? 'pass' : 'warn',\r\n message: brainAgents\r\n ? '✓ brain pack installed'\r\n : '.idia/brain/AGENTS.md missing',\r\n fixHint: brainAgents ? undefined : 'idia-ui add brain',\r\n });\r\n\r\n results.push({\r\n id: 'B2',\r\n status: hasBrainBlock ? 'pass' : 'warn',\r\n message: hasBrainBlock\r\n ? 'root AGENTS.md contains idia-ui brain block'\r\n : 'root AGENTS.md missing idia-ui brain:begin/end block',\r\n fixHint: hasBrainBlock ? undefined : 'idia-ui add brain --repair',\r\n });\r\n\r\n if (manifestHash && packHash && manifestHash === packHash) {\r\n results.push({\r\n id: 'B3',\r\n status: 'pass',\r\n message: 'manifest sourceHash matches installed brain pack',\r\n });\r\n } else if (manifestHash && packHash) {\r\n results.push({\r\n id: 'B3',\r\n status: 'warn',\r\n message: 'manifest sourceHash drifted from brain pack pin',\r\n fixHint: 'idia-ui sync brain',\r\n });\r\n } else {\r\n results.push({\r\n id: 'B3',\r\n status: 'warn',\r\n message: 'manifest sourceHash missing or brain pack not resolved',\r\n fixHint: 'idia-ui sync brain',\r\n });\r\n }\r\n\r\n const storybookHash = readStorybookDocsSourceHash(cwd);\r\n const storybookDocsInstalled = fileExists(\r\n cwd,\r\n 'node_modules/@idia-ui/storybook-docs/package.json',\r\n );\r\n if (!storybookDocsInstalled) {\r\n results.push({\r\n id: 'B4',\r\n status: 'skip',\r\n message: 'storybook-docs not installed — B4 hash coupling skipped',\r\n });\r\n } else if (!storybookHash) {\r\n results.push({\r\n id: 'B4',\r\n status: 'warn',\r\n message: 'storybook-docs installed but coverage-manifest sourceHash not readable',\r\n fixHint: 'idia-ui sync storybook',\r\n });\r\n } else if (packHash && storybookHash === packHash) {\r\n results.push({\r\n id: 'B4',\r\n status: 'pass',\r\n message: 'brain pack and storybook-docs share sourceHash (same generate run)',\r\n });\r\n } else {\r\n results.push({\r\n id: 'B4',\r\n status: 'warn',\r\n message: 'brain pack and storybook-docs sourceHash skew',\r\n fixHint: 'idia-ui sync all',\r\n });\r\n }\r\n\r\n results.push({\r\n id: 'B-tier',\r\n status: 'info',\r\n message: `⚠ ${BRAIN_DOCTOR_DISCLAIMER}`,\r\n });\r\n\r\n return results;\r\n}\r\n\r\nexport function runCustomCheck(cwd: string): CheckResult[] {\r\n const hasStories = fileExists(cwd, 'src/stories');\r\n if (!hasStories) {\r\n return [\r\n {\r\n id: 'C1',\r\n status: 'skip',\r\n message: 'no src/stories/ directory (Storybook not configured)',\r\n },\r\n ];\r\n }\r\n\r\n return [\r\n {\r\n id: 'C1',\r\n status: 'info',\r\n message: 'wrapper/story coverage check not implemented (stub)',\r\n fixHint: 'Add stories for components in src/components/',\r\n },\r\n ];\r\n}\r\n","import type { CheckResult } from '../types.js';\r\nimport {\r\n manifestExists,\r\n readManifest,\r\n regenerateManifest,\r\n validateManifestShape,\r\n} from '../utils/manifest.js';\r\nimport { readInstalledVersion, readPackageJson } from '../utils/package-json.js';\r\n\r\nexport function runManifestCheck(\r\n cwd: string,\r\n fix: boolean,\r\n): { results: CheckResult[]; fixed: boolean } {\r\n const results: CheckResult[] = [];\r\n let fixed = false;\r\n\r\n if (!manifestExists(cwd)) {\r\n if (fix) {\r\n const pkg = readPackageJson(cwd);\r\n const coreVersion =\r\n readInstalledVersion(cwd, '@idia-ui/core') ??\r\n pkg?.dependencies?.['@idia-ui/core']?.replace(/^[\\^~]/, '') ??\r\n '0.2.0';\r\n regenerateManifest(cwd, coreVersion);\r\n fixed = true;\r\n results.push({\r\n id: 'M1',\r\n status: 'pass',\r\n message: '.idia/manifest.json regenerated',\r\n fixHint: 'Created manifest with idiaCli + core versions',\r\n });\r\n return { results, fixed };\r\n }\r\n\r\n results.push({\r\n id: 'M1',\r\n status: 'warn',\r\n message: '.idia/manifest.json missing',\r\n fixHint: 'Run idia-ui doctor --fix or idia-ui sync all after first add-on',\r\n });\r\n return { results, fixed };\r\n }\r\n\r\n const manifest = readManifest(cwd);\r\n if (!manifest || !validateManifestShape(manifest)) {\r\n results.push({\r\n id: 'M1',\r\n status: 'fail',\r\n message: '.idia/manifest.json invalid or unparseable',\r\n fixHint: 'Run idia-ui doctor --fix to regenerate',\r\n });\r\n return { results, fixed };\r\n }\r\n\r\n results.push({\r\n id: 'M1',\r\n status: 'pass',\r\n message: `.idia/manifest.json valid (core ${manifest.core}, cli ${manifest.idiaCli})`,\r\n });\r\n\r\n return { results, fixed };\r\n}\r\n","import type { CheckResult } from '../types.js';\r\nimport { grepSrcForPattern, readTextFile } from '../utils/fs.js';\r\n\r\nexport function runNavigationChecks(cwd: string): CheckResult[] {\r\n const results: CheckResult[] = [];\r\n const providers =\r\n readTextFile(cwd, 'src/providers/AppProviders.tsx') ??\r\n readTextFile(cwd, 'src/providers/AppProviders.ts');\r\n\r\n // N1\r\n if (providers && /NavigationContainer/.test(providers)) {\r\n results.push({\r\n id: 'N1',\r\n status: 'pass',\r\n message: 'NavigationContainer in provider tree',\r\n });\r\n } else {\r\n results.push({\r\n id: 'N1',\r\n status: 'fail',\r\n message: 'NavigationContainer not found in AppProviders',\r\n fixHint: 'Wrap navigation in NavigationContainer per templates/consumer-app',\r\n });\r\n }\r\n\r\n // N2 — NavigationProvider if idia Link/navigate used\r\n const usesIdiaNav =\r\n grepSrcForPattern(cwd, /\\bLink\\b.*@idia-ui\\/core/) ||\r\n grepSrcForPattern(cwd, /NavigationProvider/) ||\r\n grepSrcForPattern(cwd, /useIdiaNavigation|navigateTo/);\r\n\r\n if (usesIdiaNav) {\r\n const hasNavProvider = providers\r\n ? /NavigationProvider/.test(providers)\r\n : grepSrcForPattern(cwd, /NavigationProvider/);\r\n if (!hasNavProvider) {\r\n results.push({\r\n id: 'N2',\r\n status: 'warn',\r\n message: 'idia Link/navigation helpers used but NavigationProvider missing',\r\n fixHint: 'Wrap navigation ref with NavigationProvider from @idia-ui/core',\r\n });\r\n } else {\r\n results.push({\r\n id: 'N2',\r\n status: 'pass',\r\n message: 'NavigationProvider present',\r\n });\r\n }\r\n } else {\r\n results.push({\r\n id: 'N2',\r\n status: 'pass',\r\n message: 'idia Link/navigation helpers not used (NavigationProvider optional)',\r\n });\r\n }\r\n\r\n return results;\r\n}\r\n","import type { CheckResult } from '../types.js';\r\nimport {\r\n getDepVersion,\r\n readInstalledVersion,\r\n readPeerRange,\r\n readPackageJson,\r\n} from '../utils/package-json.js';\r\nimport { satisfiesRange } from '../utils/fs.js';\r\nimport { detectPackageManager, pmAddCommand } from '../utils/pm.js';\r\n\r\nconst P2_PACKAGES = [\r\n 'react-native-reanimated',\r\n 'react-native-gesture-handler',\r\n 'react-native-screens',\r\n 'react-native-safe-area-context',\r\n] as const;\r\n\r\nconst BARREL_REQUIRED_PEERS = ['zustand', '@tanstack/react-table'] as const;\r\n\r\nconst BARREL_OPTIONAL_PEERS = [\r\n 'react-image-crop',\r\n '@fullcalendar/core',\r\n '@fullcalendar/daygrid',\r\n '@fullcalendar/timegrid',\r\n '@fullcalendar/interaction',\r\n '@fullcalendar/multimonth',\r\n '@fullcalendar/list',\r\n '@fullcalendar/react',\r\n] as const;\r\n\r\nexport function runPeerChecks(cwd: string): CheckResult[] {\r\n const pkg = readPackageJson(cwd);\r\n if (!pkg) {\r\n return [\r\n {\r\n id: 'P0',\r\n status: 'fail',\r\n message: 'package.json not found or unreadable',\r\n fixHint: 'Run idia-ui doctor from your app root',\r\n },\r\n ];\r\n }\r\n\r\n const pm = detectPackageManager(cwd);\r\n const results: CheckResult[] = [];\r\n\r\n // P1 — tamagui peer range\r\n const tamaguiVersion =\r\n readInstalledVersion(cwd, 'tamagui') ??\r\n getDepVersion(pkg, 'tamagui')?.replace(/^[\\^~]/, '') ??\r\n null;\r\n const coreRange =\r\n readPeerRange(cwd, '@idia-ui/core', 'tamagui') ??\r\n readPeerRange(cwd, '@idia-ui/theme', 'tamagui') ??\r\n '^1.70.0';\r\n\r\n if (!tamaguiVersion) {\r\n results.push({\r\n id: 'P1',\r\n status: 'fail',\r\n message: 'tamagui not installed',\r\n fixHint: pmAddCommand(pm, ['tamagui@^1.144.0']),\r\n });\r\n } else if (!satisfiesRange(tamaguiVersion, coreRange)) {\r\n results.push({\r\n id: 'P1',\r\n status: 'fail',\r\n message: `tamagui ${tamaguiVersion} outside peer range ${coreRange}`,\r\n fixHint: pmAddCommand(pm, [`tamagui@${coreRange}`]),\r\n });\r\n } else {\r\n results.push({\r\n id: 'P1',\r\n status: 'pass',\r\n message: `tamagui ${tamaguiVersion} in peer range`,\r\n });\r\n }\r\n\r\n // P2 — navigation/gesture peers\r\n const missingP2 = P2_PACKAGES.filter((name) => {\r\n const installed = readInstalledVersion(cwd, name);\r\n const declared = getDepVersion(pkg, name);\r\n return !installed && !declared;\r\n });\r\n\r\n if (missingP2.length > 0) {\r\n results.push({\r\n id: 'P2',\r\n status: 'fail',\r\n message: `missing navigation/gesture peers: ${missingP2.join(', ')}`,\r\n fixHint: pmAddCommand(pm, [...missingP2]),\r\n });\r\n } else {\r\n results.push({\r\n id: 'P2',\r\n status: 'pass',\r\n message:\r\n 'gesture-handler, reanimated, screens, safe-area-context present',\r\n });\r\n }\r\n\r\n // P3 — @idia-ui/* alignment + barrel peers\r\n const idiaPkgs = Object.keys({\r\n ...pkg.dependencies,\r\n ...pkg.devDependencies,\r\n }).filter((n) => n.startsWith('@idia-ui/'));\r\n\r\n const idiaVersions = idiaPkgs\r\n .map((name) => {\r\n const v =\r\n readInstalledVersion(cwd, name) ??\r\n getDepVersion(pkg, name)?.replace(/^[\\^~]/, '');\r\n return v ? { name, version: v } : null;\r\n })\r\n .filter((x): x is { name: string; version: string } => x !== null);\r\n\r\n const minors = new Set(\r\n idiaVersions\r\n .map((p) => {\r\n const parts = p.version.split('.');\r\n return parts.length >= 2 ? `${parts[0]}.${parts[1]}` : null;\r\n })\r\n .filter((m): m is string => m !== null && !m.includes('workspace')),\r\n );\r\n\r\n if (idiaVersions.length === 0) {\r\n results.push({\r\n id: 'P3',\r\n status: 'fail',\r\n message: 'no @idia-ui/* packages in dependencies',\r\n fixHint: pmAddCommand(pm, ['@idia-ui/core@latest', '@idia-ui/theme@latest']),\r\n });\r\n } else if (minors.size > 1) {\r\n results.push({\r\n id: 'P3',\r\n status: 'fail',\r\n message: `@idia-ui/* minor versions misaligned: ${[...minors].join(', ')}`,\r\n fixHint: `${pm === 'pnpm' ? 'pnpm' : pm} update @idia-ui/*`,\r\n });\r\n } else {\r\n results.push({\r\n id: 'P3',\r\n status: 'pass',\r\n message: `@idia-ui/* versions aligned (${idiaVersions.map((p) => `${p.name}@${p.version}`).join(', ')})`,\r\n });\r\n }\r\n\r\n for (const peer of BARREL_REQUIRED_PEERS) {\r\n const installed = readInstalledVersion(cwd, peer);\r\n const declared = getDepVersion(pkg, peer);\r\n if (!installed && !declared) {\r\n results.push({\r\n id: 'P3',\r\n status: 'fail',\r\n message: `barrel peer ${peer} not installed (required for @idia-ui/core Table graph)`,\r\n fixHint: `${pmAddCommand(pm, [peer])} — see docs/generated/peer-dep-matrix.md`,\r\n });\r\n }\r\n }\r\n\r\n for (const peer of BARREL_OPTIONAL_PEERS) {\r\n const installed = readInstalledVersion(cwd, peer);\r\n const declared = getDepVersion(pkg, peer);\r\n if (!installed && !declared) {\r\n results.push({\r\n id: 'P3',\r\n status: 'warn',\r\n message: `optional peer ${peer} not installed (barrel may require it)`,\r\n fixHint: `Install per peer-dep-matrix.md: ${pmAddCommand(pm, [peer])}`,\r\n });\r\n }\r\n }\r\n\r\n return results;\r\n}\r\n","import type { CheckResult } from '../types.js';\r\nimport { fileExists, grepSrcForPattern, readTextFile } from '../utils/fs.js';\r\n\r\nconst OVERLAY_IMPORT =\r\n /from\\s+['\"]@idia-ui\\/core['\"][\\s\\S]*?(Modal|Toast|Dialog|ConfirmationModal)/;\r\n\r\nexport function runRuntimeChecks(cwd: string): CheckResult[] {\r\n const results: CheckResult[] = [];\r\n\r\n // R1\r\n if (fileExists(cwd, 'tamagui.config.ts')) {\r\n results.push({\r\n id: 'R1',\r\n status: 'pass',\r\n message: 'tamagui.config.ts found',\r\n });\r\n } else {\r\n results.push({\r\n id: 'R1',\r\n status: 'fail',\r\n message: 'tamagui.config.ts missing at app root',\r\n fixHint: 'Restore from templates/consumer-app or re-scaffold',\r\n });\r\n }\r\n\r\n // R2\r\n const providers =\r\n readTextFile(cwd, 'src/providers/AppProviders.tsx') ??\r\n readTextFile(cwd, 'src/providers/AppProviders.ts');\r\n\r\n if (!providers) {\r\n results.push({\r\n id: 'R2',\r\n status: 'fail',\r\n message: 'AppProviders not found',\r\n fixHint: 'Add src/providers/AppProviders.tsx per templates/consumer-app',\r\n });\r\n } else {\r\n const hasTamagui = /TamaguiProvider/.test(providers);\r\n const hasTheme = /ThemeProvider/.test(providers) && /@idia-ui\\/theme/.test(providers);\r\n if (hasTamagui && hasTheme) {\r\n results.push({\r\n id: 'R2',\r\n status: 'pass',\r\n message: 'AppProviders: TamaguiProvider + ThemeProvider',\r\n });\r\n } else {\r\n results.push({\r\n id: 'R2',\r\n status: 'fail',\r\n message: 'AppProviders missing TamaguiProvider and/or ThemeProvider (@idia-ui/theme)',\r\n fixHint: 'Compare src/providers/AppProviders.tsx with templates/consumer-app',\r\n });\r\n }\r\n }\r\n\r\n // R3 — overlay providers\r\n const usesOverlays =\r\n grepSrcForPattern(cwd, OVERLAY_IMPORT) ||\r\n grepSrcForPattern(cwd, /\\b(Modal|Toast|Dialog)\\b.*@idia-ui\\/core/);\r\n\r\n if (usesOverlays) {\r\n const hasModal = providers ? /ModalProvider/.test(providers) : false;\r\n const hasToast = providers ? /ToastProvider/.test(providers) : false;\r\n if (!hasModal || !hasToast) {\r\n results.push({\r\n id: 'R3',\r\n status: 'warn',\r\n message: 'overlay components imported but ModalProvider/ToastProvider missing',\r\n fixHint: 'Add ModalProvider and ToastProvider to AppProviders per template',\r\n });\r\n } else {\r\n results.push({\r\n id: 'R3',\r\n status: 'pass',\r\n message: 'overlay providers present',\r\n });\r\n }\r\n } else {\r\n results.push({\r\n id: 'R3',\r\n status: 'pass',\r\n message: 'no overlay imports detected (Modal/Toast providers optional)',\r\n });\r\n }\r\n\r\n // R4 — font gate\r\n const fontGate =\r\n (providers && /waitForWebFonts/.test(providers)) ||\r\n grepSrcForPattern(cwd, /expo-font/) ||\r\n grepSrcForPattern(cwd, /useFonts/);\r\n\r\n if (fontGate) {\r\n results.push({\r\n id: 'R4',\r\n status: 'pass',\r\n message: 'web font gate configured (waitForWebFonts or expo-font)',\r\n });\r\n } else {\r\n results.push({\r\n id: 'R4',\r\n status: 'warn',\r\n message: 'no waitForWebFonts or expo-font pattern detected',\r\n fixHint: 'Copy font loading pattern from templates/consumer-app AppProviders',\r\n });\r\n }\r\n\r\n return results;\r\n}\r\n","import { runBrainChecks, runCustomCheck, runStorybookChecks } from './packs.js';\r\nimport { runManifestCheck } from './manifest.js';\r\nimport { runNavigationChecks } from './navigation.js';\r\nimport { runPeerChecks } from './peers.js';\r\nimport { runRuntimeChecks } from './runtime.js';\r\nimport type { CheckResult, DoctorOptions } from '../types.js';\r\n\r\nexport function runAllChecks(options: DoctorOptions): CheckResult[] {\r\n const { cwd, full, fix } = options;\r\n const checks: CheckResult[] = [];\r\n\r\n checks.push(...runPeerChecks(cwd));\r\n checks.push(...runRuntimeChecks(cwd));\r\n checks.push(...runNavigationChecks(cwd));\r\n\r\n const { results: manifestResults } = runManifestCheck(cwd, fix);\r\n checks.push(...manifestResults);\r\n\r\n if (full) {\r\n checks.push(...runStorybookChecks(cwd));\r\n checks.push(...runBrainChecks(cwd));\r\n checks.push(...runCustomCheck(cwd));\r\n }\r\n\r\n return checks;\r\n}\r\n\r\nexport function summarizeChecks(\r\n checks: CheckResult[],\r\n strict: boolean,\r\n): { passed: number; warnings: number; failures: number; skipped: number; exitCode: number } {\r\n let passed = 0;\r\n let warnings = 0;\r\n let failures = 0;\r\n let skipped = 0;\r\n\r\n for (const check of checks) {\r\n switch (check.status) {\r\n case 'pass':\r\n passed++;\r\n break;\r\n case 'warn':\r\n warnings++;\r\n break;\r\n case 'fail':\r\n failures++;\r\n break;\r\n case 'skip':\r\n case 'info':\r\n skipped++;\r\n break;\r\n }\r\n }\r\n\r\n let exitCode = 0;\r\n if (failures > 0) exitCode = 1;\r\n else if (strict && warnings > 0) exitCode = 1;\r\n\r\n return { passed, warnings, failures, skipped, exitCode };\r\n}\r\n","import { runAllChecks, summarizeChecks } from '../checks/index.js';\r\nimport type { DoctorOptions, DoctorReport } from '../types.js';\r\n\r\nconst STATUS_ICON: Record<string, string> = {\r\n pass: '✓',\r\n warn: '⚠',\r\n fail: '✗',\r\n info: 'ℹ',\r\n skip: '○',\r\n};\r\n\r\nexport function runDoctor(options: DoctorOptions): DoctorReport {\r\n const checks = runAllChecks(options);\r\n const summary = summarizeChecks(checks, options.strict);\r\n\r\n return {\r\n checks,\r\n summary: {\r\n passed: summary.passed,\r\n warnings: summary.warnings,\r\n failures: summary.failures,\r\n skipped: summary.skipped,\r\n },\r\n exitCode: summary.exitCode,\r\n };\r\n}\r\n\r\nexport function formatHumanReport(report: DoctorReport, full: boolean): string {\r\n const lines: string[] = ['idia-ui doctor', ''];\r\n\r\n for (const check of report.checks) {\r\n const icon = STATUS_ICON[check.status] ?? '·';\r\n lines.push(`${icon} ${check.id} ${check.message}`);\r\n if (check.fixHint && (check.status === 'fail' || check.status === 'warn')) {\r\n lines.push(` → ${check.fixHint}`);\r\n }\r\n }\r\n\r\n lines.push('');\r\n const { passed, warnings, failures } = report.summary;\r\n const mode = full ? 'full' : 'quick';\r\n lines.push(\r\n `${passed} passed, ${warnings} warnings, ${failures} failures (${mode} scan) — exit ${report.exitCode}`,\r\n );\r\n\r\n return lines.join('\\n');\r\n}\r\n\r\nexport function formatJsonReport(report: DoctorReport): string {\r\n return JSON.stringify(\r\n {\r\n checks: report.checks.map((c) => ({\r\n id: c.id,\r\n status: c.status,\r\n message: c.message,\r\n ...(c.fixHint ? { fixHint: c.fixHint } : {}),\r\n })),\r\n summary: report.summary,\r\n exitCode: report.exitCode,\r\n },\r\n null,\r\n 2,\r\n );\r\n}\r\n","import { spawnSync } from 'node:child_process'\r\n\r\nimport {\r\n STORYBOOK_CLI_VERSION,\r\n STORYBOOK_DOCS_VERSION,\r\n STORYBOOK_PRESET_VERSION,\r\n} from './constants.js'\r\nimport type { PackageManager } from '../../utils/pm.js'\r\nimport { detectPackageManager } from '../../utils/pm.js'\r\nimport { readInstalledVersion, readPackageJson } from '../../utils/package-json.js'\r\nimport { fileExists } from '../../utils/fs.js'\r\nimport { CLI_VERSION, readManifest, writeManifest } from '../../utils/manifest.js'\r\n\r\nexport type SyncStorybookOptions = {\r\n cwd: string\r\n pm?: PackageManager\r\n skipInstall?: boolean\r\n}\r\n\r\nexport type SyncStorybookResult = {\r\n synced: boolean\r\n message: string\r\n}\r\n\r\nfunction isStorybookInstalled(cwd: string): boolean {\r\n return fileExists(cwd, '.storybook/main.ts')\r\n}\r\n\r\nfunction runPmUpdate(cwd: string, pm: PackageManager): void {\r\n const packages = [\r\n `@idia-ui/storybook-docs@${STORYBOOK_DOCS_VERSION}`,\r\n `@idia-ui/storybook-preset-react-native-web@${STORYBOOK_PRESET_VERSION}`,\r\n ]\r\n\r\n const args =\r\n pm === 'pnpm'\r\n ? ['add', '-D', ...packages]\r\n : pm === 'yarn'\r\n ? ['add', '-D', ...packages]\r\n : ['install', '-D', ...packages]\r\n\r\n const result = spawnSync(pm, args, {\r\n cwd,\r\n stdio: 'inherit',\r\n shell: process.platform === 'win32',\r\n })\r\n if (result.status !== 0) {\r\n throw new Error(`${pm} update failed with exit code ${result.status ?? 'unknown'}`)\r\n }\r\n}\r\n\r\nexport function runSyncStorybook(options: SyncStorybookOptions): SyncStorybookResult {\r\n const { cwd, skipInstall = false } = options\r\n const pm = options.pm ?? detectPackageManager(cwd)\r\n\r\n if (!isStorybookInstalled(cwd)) {\r\n console.error('Storybook not installed — run idia-ui add storybook first')\r\n process.exit(1)\r\n }\r\n\r\n const manifest = readManifest(cwd)\r\n if (!manifest) {\r\n console.error('.idia/manifest.json missing — run idia-ui doctor --fix')\r\n process.exit(1)\r\n }\r\n\r\n const corePkg = readPackageJson(cwd)\r\n const coreVersion =\r\n readInstalledVersion(cwd, '@idia-ui/core') ??\r\n corePkg?.dependencies?.['@idia-ui/core']?.replace(/^[\\^~]/, '') ??\r\n manifest.core\r\n\r\n if (!skipInstall) {\r\n console.log(`Syncing storybook packs via ${pm}…`)\r\n runPmUpdate(cwd, pm)\r\n }\r\n\r\n manifest.idiaCli = CLI_VERSION\r\n manifest.core = coreVersion\r\n manifest.features ??= {}\r\n manifest.features.storybook = {\r\n installed: (manifest.features.storybook as { installed?: string } | undefined)?.installed ??\r\n new Date().toISOString(),\r\n storybookDocs: STORYBOOK_DOCS_VERSION,\r\n storybook: STORYBOOK_CLI_VERSION,\r\n preset: STORYBOOK_PRESET_VERSION,\r\n }\r\n writeManifest(cwd, manifest)\r\n\r\n console.log(`✓ Synced @idia-ui/storybook-docs@${STORYBOOK_DOCS_VERSION}`)\r\n console.log(`✓ Synced @idia-ui/storybook-preset-react-native-web@${STORYBOOK_PRESET_VERSION}`)\r\n\r\n return {\r\n synced: true,\r\n message: `storybook-docs@${STORYBOOK_DOCS_VERSION} aligned with core@${coreVersion}`,\r\n }\r\n}\r\n\r\n","import { installBrainPack, printBrainInstallSummary } from '../brain/install.js';\r\nimport { BRAIN_DOCTOR_DISCLAIMER, BRAIN_TIER_DISCLAIMER } from '../brain/constants.js';\r\nimport { runSyncStorybook as syncStorybookPack } from './storybook/sync.js';\r\nimport { fileExists } from '../utils/fs.js';\r\nimport { readManifest } from '../utils/manifest.js';\r\n\r\nexport type SyncOptions = {\r\n cwd: string;\r\n repair?: boolean;\r\n force?: boolean;\r\n pm?: 'pnpm' | 'npm' | 'yarn';\r\n};\r\n\r\nexport function runSyncBrain(options: SyncOptions): void {\r\n try {\r\n const result = installBrainPack({\r\n cwd: options.cwd,\r\n repair: true,\r\n force: options.force,\r\n pm: options.pm,\r\n });\r\n console.log('✓ brain pack synced');\r\n printBrainInstallSummary(result);\r\n } catch (error) {\r\n console.error(error instanceof Error ? error.message : String(error));\r\n console.error(BRAIN_TIER_DISCLAIMER);\r\n process.exit(1);\r\n }\r\n}\r\n\r\nexport function runSyncStorybook(options: SyncOptions): void {\r\n syncStorybookPack({\r\n cwd: options.cwd,\r\n pm: options.pm,\r\n });\r\n}\r\n\r\nexport function runSyncAll(options: SyncOptions): void {\r\n const { cwd } = options;\r\n const manifest = readManifest(cwd);\r\n const hasStorybook =\r\n fileExists(cwd, '.storybook/main.ts') || Boolean(manifest?.features?.storybook);\r\n const hasBrain = Boolean(manifest?.features?.brain?.brainPack);\r\n\r\n if (!hasStorybook && !hasBrain) {\r\n console.error('No storybook or brain features installed — run idia-ui add storybook or add brain first');\r\n process.exit(1);\r\n }\r\n\r\n if (hasStorybook) {\r\n syncStorybookPack({ cwd, pm: options.pm });\r\n } else {\r\n console.log('○ storybook not installed — skipping storybook sync');\r\n }\r\n\r\n if (hasBrain) {\r\n runSyncBrain(options);\r\n } else {\r\n console.log('○ brain not installed — skipping brain sync');\r\n console.error(BRAIN_DOCTOR_DISCLAIMER);\r\n }\r\n\r\n console.log('');\r\n console.log('✓ sync all complete');\r\n}\r\n\r\nexport function runSync(target: string, options: SyncOptions): void {\r\n switch (target) {\r\n case 'brain':\r\n runSyncBrain(options);\r\n break;\r\n case 'storybook':\r\n runSyncStorybook(options);\r\n break;\r\n case 'all':\r\n runSyncAll(options);\r\n break;\r\n default:\r\n console.error(`Unknown sync target: ${target}`);\r\n console.error('Available: storybook | brain | all');\r\n process.exit(1);\r\n }\r\n}\r\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,uBAAwB;AACxB,IAAAA,qBAAwB;;;ACDxB,IAAAC,kBAAyC;AACzC,IAAAC,oBAA8B;AAC9B,gCAA0B;;;ACDnB,IAAM,yBAAyB;AAC/B,IAAM,2BAA2B;AACjC,IAAM,wBAAwB;AAE9B,IAAM,qBAAqB;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,2BAA2B,sBAAsB;AAAA,EACjD,8CAA8C,wBAAwB;AAAA,EACtE;AACF;AAEO,IAAM,wBAAwB;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AACF;;;ACpBO,SAAS,kBAA0B;AACxC,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAUT;AAEO,SAAS,sBAA8B;AAC5C,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAqBT;AAEO,SAAS,mBAA2B;AACzC,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgCT;;;ACtEA,qBAA2B;AAC3B,uBAA8B;AAI9B,SAAS,gBAAgB,OAAuB;AAC9C,MAAI,MAAM;AACV,SAAO,MAAM;AACX,YAAI,+BAAW,uBAAK,KAAK,gBAAgB,CAAC,EAAG,QAAO;AACpD,YAAI,+BAAW,uBAAK,KAAK,WAAW,CAAC,EAAG,QAAO;AAC/C,YAAI,+BAAW,uBAAK,KAAK,mBAAmB,CAAC,EAAG,QAAO;AACvD,UAAM,aAAS,0BAAQ,GAAG;AAC1B,QAAI,WAAW,IAAK,QAAO;AAC3B,UAAM;AAAA,EACR;AACF;AAEO,SAAS,qBAAqB,KAA6B;AAChE,QAAM,OAAO,gBAAgB,GAAG;AAChC,UAAI,+BAAW,uBAAK,MAAM,gBAAgB,CAAC,EAAG,QAAO;AACrD,UAAI,+BAAW,uBAAK,MAAM,WAAW,CAAC,EAAG,QAAO;AAChD,SAAO;AACT;AAEO,SAAS,aAAa,IAAoB,UAA4B;AAC3E,QAAM,OAAO,SAAS,KAAK,GAAG;AAC9B,UAAQ,IAAI;AAAA,IACV,KAAK;AACH,aAAO,YAAY,IAAI;AAAA,IACzB,KAAK;AACH,aAAO,YAAY,IAAI;AAAA,IACzB;AACE,aAAO,eAAe,IAAI;AAAA,EAC9B;AACF;;;AClCA,IAAAC,kBAA6B;AAC7B,IAAAC,oBAAqB;AAId,SAAS,gBAAgB,KAAiC;AAC/D,MAAI;AACF,UAAM,UAAM,kCAAa,wBAAK,KAAK,cAAc,GAAG,MAAM;AAC1D,WAAO,KAAK,MAAM,GAAG;AAAA,EACvB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,cACd,KACA,MACoB;AACpB,SAAO,IAAI,eAAe,IAAI,KAAK,IAAI,kBAAkB,IAAI;AAC/D;AAEO,SAAS,qBAAqB,KAAa,MAA6B;AAC7E,MAAI;AACF,UAAM,cAAU,wBAAK,KAAK,gBAAgB,MAAM,cAAc;AAC9D,UAAM,UAAM,8BAAa,SAAS,MAAM;AACxC,UAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,WAAO,OAAO,WAAW;AAAA,EAC3B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,cACd,KACA,aACA,UACe;AACf,MAAI;AACF,UAAM,cAAU,wBAAK,KAAK,gBAAgB,aAAa,cAAc;AACrE,UAAM,UAAM,8BAAa,SAAS,MAAM;AACxC,UAAM,SAAS,KAAK,MAAM,GAAG;AAG7B,WAAO,OAAO,mBAAmB,QAAQ,KAAK;AAAA,EAChD,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;AC/CA,IAAAC,kBAAgE;AAChE,IAAAC,oBAAqB;AAErB,oBAAmB;AAEZ,SAAS,eAAe,SAAiB,OAAwB;AACtE,QAAM,UAAU,QAAQ,QAAQ,cAAc,EAAE,EAAE,MAAM,GAAG,EAAE,CAAC,KAAK;AACnE,MAAI,UAAU,iBAAiB,MAAM,WAAW,OAAO,EAAG,QAAO;AACjE,QAAM,UAAU,cAAAC,QAAO,OAAO,OAAO;AACrC,MAAI,CAAC,QAAS,QAAO;AACrB,SAAO,cAAAA,QAAO,UAAU,SAAS,OAAO,EAAE,mBAAmB,KAAK,CAAC;AACrE;AAEO,SAAS,SAAS,SAAgC;AACvD,QAAM,UAAU,cAAAA,QAAO,OAAO,OAAO;AACrC,MAAI,CAAC,QAAS,QAAO;AACrB,SAAO,GAAG,QAAQ,KAAK,IAAI,QAAQ,KAAK;AAC1C;AAEO,SAAS,aAAa,KAAa,cAAqC;AAC7E,MAAI;AACF,eAAO,kCAAa,wBAAK,KAAK,YAAY,GAAG,MAAM;AAAA,EACrD,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,WAAW,KAAa,cAA+B;AACrE,MAAI;AACF,eAAO,gCAAW,wBAAK,KAAK,YAAY,CAAC;AAAA,EAC3C,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,kBAAkB,KAAa,SAA0B;AACvE,QAAM,cAAc;AAAA,IAClB;AAAA,IACA;AAAA,EACF;AAEA,aAAW,QAAQ,aAAa;AAC9B,UAAM,UAAU,aAAa,KAAK,IAAI;AACtC,QAAI,WAAW,QAAQ,KAAK,OAAO,EAAG,QAAO;AAAA,EAC/C;AAEA,QAAM,cAAU,wBAAK,KAAK,KAAK;AAC/B,MAAI;AACF,UAAM,OAAO,CAAC,QAAyB;AACrC,iBAAW,aAAS,6BAAY,GAAG,GAAG;AACpC,cAAM,WAAO,wBAAK,KAAK,KAAK;AAC5B,cAAM,WAAO,0BAAS,IAAI;AAC1B,YAAI,KAAK,YAAY,GAAG;AACtB,cAAI,KAAK,IAAI,EAAG,QAAO;AAAA,QACzB,WAAW,iBAAiB,KAAK,KAAK,GAAG;AACvC,gBAAM,cAAU,8BAAa,MAAM,MAAM;AACzC,cAAI,QAAQ,KAAK,OAAO,EAAG,QAAO;AAAA,QACpC;AAAA,MACF;AACA,aAAO;AAAA,IACT;AACA,YAAI,4BAAW,OAAO,EAAG,QAAO,KAAK,OAAO;AAAA,EAC9C,QAAQ;AAAA,EAER;AAEA,SAAO;AACT;;;ACnEA,IAAAC,kBAAuD;AACvD,IAAAC,oBAA8B;AAK9B,IAAM,cAAc;AAEb,SAAS,aAAa,KAAkC;AAC7D,MAAI;AACF,UAAM,UAAM,kCAAa,wBAAK,KAAK,SAAS,eAAe,GAAG,MAAM;AACpE,WAAO,KAAK,MAAM,GAAG;AAAA,EACvB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,cAAc,KAAa,UAA8B;AACvE,QAAM,mBAAe,wBAAK,KAAK,SAAS,eAAe;AACvD,qCAAU,2BAAQ,YAAY,GAAG,EAAE,WAAW,KAAK,CAAC;AACpD,qCAAc,cAAc,GAAG,KAAK,UAAU,UAAU,MAAM,CAAC,CAAC;AAAA,GAAM,MAAM;AAC9E;AAEO,SAAS,mBACd,KACA,aACoC;AACpC,QAAM,mBAAe,wBAAK,KAAK,SAAS,eAAe;AACvD,QAAM,WAAyB;AAAA,IAC7B,SAAS;AAAA,IACT,MAAM;AAAA,EACR;AACA,gBAAc,KAAK,QAAQ;AAC3B,SAAO,EAAE,SAAS,MAAM,MAAM,aAAa;AAC7C;AAEO,SAAS,eAAe,KAAsB;AACnD,SAAO,WAAW,KAAK,qBAAqB;AAC9C;AAEO,SAAS,sBAAsB,UAAiC;AACrE,SACE,OAAO,SAAS,YAAY,YAC5B,OAAO,SAAS,SAAS,YACzB,iBAAiB,KAAK,SAAS,OAAO,KACtC,iBAAiB,KAAK,SAAS,IAAI;AAEvC;;;ANTA,SAAS,eAAe,KAAa,cAAsB,SAAiB,OAAyB;AACnG,QAAM,eAAW,wBAAK,KAAK,YAAY;AACvC,MAAI,WAAW,KAAK,YAAY,KAAK,CAAC,OAAO;AAC3C,UAAM,WAAW,aAAa,KAAK,YAAY;AAC/C,QAAI,aAAa,QAAS,QAAO;AACjC,UAAM,IAAI;AAAA,MACR,aAAa,YAAY;AAAA,IAC3B;AAAA,EACF;AACA,qCAAU,2BAAQ,QAAQ,GAAG,EAAE,WAAW,KAAK,CAAC;AAChD,qCAAc,UAAU,SAAS,MAAM;AACvC,SAAO;AACT;AAEA,SAAS,aAAa,MAA+C;AACnE,MAAI,KAAK,WAAW,GAAG,GAAG;AACxB,UAAMC,MAAK,KAAK,QAAQ,KAAK,CAAC;AAC9B,WAAO,EAAE,MAAM,KAAK,MAAM,GAAGA,GAAE,GAAG,OAAO,KAAK,MAAMA,MAAK,CAAC,EAAE;AAAA,EAC9D;AACA,QAAM,KAAK,KAAK,QAAQ,GAAG;AAC3B,SAAO,EAAE,MAAM,KAAK,MAAM,GAAG,EAAE,GAAG,OAAO,KAAK,MAAM,KAAK,CAAC,EAAE;AAC9D;AAEA,SAAS,kBAAkB,MAAc,OAAuB;AAC9D,MAAI,KAAK,WAAW,oBAAoB,GAAG;AACzC,WAAO;AAAA,EACT;AACA,SAAO,IAAI,MAAM,QAAQ,OAAO,EAAE,CAAC;AACrC;AAEA,SAAS,mBAAmB,KAAmB;AAC7C,QAAM,MAAM,gBAAgB,GAAG;AAC/B,MAAI,CAAC,IAAK,OAAM,IAAI,MAAM,wBAAwB;AAElD,MAAI,oBAAoB,CAAC;AACzB,aAAW,QAAQ,oBAAoB;AACrC,UAAM,EAAE,MAAM,MAAM,IAAI,aAAa,IAAI;AACzC,QAAI,gBAAgB,IAAI,IAAI,kBAAkB,MAAM,KAAK;AAAA,EAC3D;AAEA,MAAI,YAAY,CAAC;AACjB,MAAI,QAAQ,YAAY;AACxB,MAAI,QAAQ,iBAAiB,IAAI;AAEjC,yCAAc,wBAAK,KAAK,cAAc,GAAG,GAAG,KAAK,UAAU,KAAK,MAAM,CAAC,CAAC;AAAA,GAAM,MAAM;AACtF;AAEA,SAAS,aAAa,KAAa,IAA0B;AAC3D,QAAM,OACJ,OAAO,SACH,CAAC,OAAO,MAAM,GAAG,kBAAkB,IACnC,OAAO,SACL,CAAC,OAAO,MAAM,GAAG,kBAAkB,IACnC,CAAC,WAAW,MAAM,GAAG,kBAAkB;AAE/C,QAAM,aAAS,qCAAU,IAAI,MAAM;AAAA,IACjC;AAAA,IACA,OAAO;AAAA,IACP,OAAO,QAAQ,aAAa;AAAA,EAC9B,CAAC;AACD,MAAI,OAAO,WAAW,GAAG;AACvB,UAAM,IAAI,MAAM,GAAG,EAAE,kCAAkC,OAAO,UAAU,SAAS,EAAE;AAAA,EACrF;AACF;AAEA,SAAS,mBAAmB,KAAa,KAA8D;AACrG,QAAM,YAAY,qBAAqB,KAAK,eAAe;AAC3D,MAAI,UAAW,QAAO;AAEtB,QAAM,WAAW,IAAI,eAAe,eAAe,KAAK;AACxD,MAAI,YAAY,CAAC,SAAS,WAAW,WAAW,GAAG;AACjD,WAAO,SAAS,QAAQ,UAAU,EAAE;AAAA,EACtC;AAEA,SAAO;AACT;AAEA,SAAS,wBAAwB,KAAa,UAAwB,aAA2B;AAC/F,WAAS,UAAU;AACnB,WAAS,OAAO;AAChB,WAAS,aAAa,CAAC;AACvB,WAAS,SAAS,YAAY;AAAA,IAC5B,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IAClC,eAAe;AAAA,IACf,WAAW;AAAA,IACX,QAAQ;AAAA,EACV;AACA,gBAAc,KAAK,QAAQ;AAC7B;AAEA,SAAS,qBAAqB,KAAsB;AAClD,SACE,WAAW,KAAK,oBAAoB,KACpC,QAAQ,gBAAgB,GAAG,GAAG,kBAAkB,yBAAyB,CAAC;AAE9E;AAEO,SAAS,gBAAgB,SAAkD;AAChF,QAAM,EAAE,KAAK,SAAS,OAAO,QAAQ,OAAO,cAAc,MAAM,IAAI;AACpE,QAAM,KAAK,QAAQ,MAAM,qBAAqB,GAAG;AACjD,QAAM,WAAqB,CAAC;AAC5B,QAAM,eAAyB,CAAC;AAEhC,QAAM,MAAM,gBAAgB,GAAG;AAC/B,MAAI,CAAC,KAAK;AACR,YAAQ,MAAM,sDAAiD;AAC/D,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI,WAAW,aAAa,GAAG;AAC/B,QAAM,cAAc,mBAAmB,KAAK,GAAG;AAC/C,MAAI,CAAC,UAAU;AACb,eAAW,EAAE,SAAS,aAAa,MAAM,YAAY;AACrD,aAAS,KAAK,kCAAkC;AAAA,EAClD,OAAO;AACL,aAAS,OAAO;AAAA,EAClB;AAEA,QAAM,mBAAmB,qBAAqB,GAAG;AACjD,MAAI,oBAAoB,CAAC,UAAU,CAAC,OAAO;AACzC,YAAQ,IAAI,8FAAyF;AACrG,4BAAwB,KAAK,UAAU,WAAW;AAClD,WAAO,EAAE,WAAW,MAAM,kBAAkB,MAAM,cAAc,SAAS;AAAA,EAC3E;AAEA,QAAM,eAAuE;AAAA,IAC3E,sBAAsB,gBAAgB;AAAA,IACtC,0BAA0B,oBAAoB;AAAA,IAC9C,kCAAkC,iBAAiB;AAAA,EACrD;AAEA,aAAW,gBAAgB,uBAAuB;AAChD,QAAI,UAAU,SAAS,CAAC,WAAW,KAAK,YAAY,GAAG;AACrD,YAAM,QAAQ,eAAe,KAAK,cAAc,aAAa,YAAY,GAAG,SAAS,MAAM;AAC3F,UAAI,MAAO,cAAa,KAAK,YAAY;AAAA,IAC3C;AAAA,EACF;AAEA,qBAAmB,GAAG;AAEtB,MAAI,CAAC,aAAa;AAChB,YAAQ,IAAI,4CAA4C,EAAE,QAAG;AAC7D,iBAAa,KAAK,EAAE;AAAA,EACtB,OAAO;AACL,aAAS,KAAK,kDAAkD;AAAA,EAClE;AAEA,0BAAwB,KAAK,UAAU,WAAW;AAElD,UAAQ,IAAI,qCAAgC;AAC5C,UAAQ,IAAI,6BAA6B,sBAAsB,EAAE;AACjE,UAAQ,IAAI,gDAAgD,wBAAwB,EAAE;AACtF,UAAQ,IAAI,8CAA8C;AAE1D,SAAO,EAAE,WAAW,MAAM,kBAAkB,cAAc,SAAS;AACrE;;;AOjMA,IAAAC,kBAAqE;AACrE,IAAAC,oBAAqB;;;ACDrB,IAAAC,kBAAyC;AACzC,IAAAC,oBAA8B;;;ACDvB,IAAM,kBAAkB;AACxB,IAAM,qBAAqB;AAE3B,IAAM,wBACX;AAEK,IAAM,0BACX;AAEK,IAAM,eAAe;AACrB,IAAM,aAAa;AAEnB,IAAM,qBAAqB,GAAG,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAU/C,UAAU;;;ADRL,SAAS,kBACd,KACA,SACmB;AACnB,QAAM,iBAAa,wBAAK,KAAK,WAAW;AACxC,QAAM,WAAW,aAAa,KAAK,WAAW;AAE9C,MAAI,aAAa,MAAM;AACrB,uCAAc,YAAY,GAAG,kBAAkB;AAAA,GAAM,MAAM;AAC3D,WAAO,EAAE,QAAQ,UAAU;AAAA,EAC7B;AAEA,QAAM,WAAW,SAAS,SAAS,YAAY;AAC/C,QAAM,SAAS,SAAS,SAAS,UAAU;AAE3C,MAAI,YAAY,QAAQ;AACtB,QAAI,CAAC,QAAQ,UAAU,CAAC,QAAQ,OAAO;AACrC,aAAO,EAAE,QAAQ,SAAS;AAAA,IAC5B;AACA,UAAM,UAAU,SAAS;AAAA,MACvB,IAAI,OAAO,GAAG,aAAa,YAAY,CAAC,aAAa,aAAa,UAAU,CAAC,EAAE;AAAA,MAC/E;AAAA,IACF;AACA,QAAI,YAAY,YAAY,CAAC,QAAQ,OAAO;AAC1C,aAAO,EAAE,QAAQ,SAAS;AAAA,IAC5B;AACA,uCAAc,YAAY,SAAS,MAAM;AACzC,WAAO,EAAE,QAAQ,WAAW;AAAA,EAC9B;AAEA,MAAI,aAAa,QAAQ;AACvB,QAAI,QAAQ,OAAO;AACjB,YAAM,iBAAiB,SACpB,QAAQ,IAAI,OAAO,GAAG,aAAa,YAAY,CAAC,WAAW,GAAG,EAAE,EAChE,QAAQ,YAAY,EAAE;AACzB;AAAA,QACE;AAAA,QACA,GAAG,eAAe,QAAQ,CAAC;AAAA;AAAA,EAAO,kBAAkB;AAAA;AAAA,QACpD;AAAA,MACF;AACA,aAAO,EAAE,QAAQ,WAAW;AAAA,IAC9B;AACA,WAAO,mBAAmB,KAAK,QAAQ;AAAA,EACzC;AAEA,qCAAc,YAAY,GAAG,SAAS,QAAQ,CAAC;AAAA;AAAA,EAAO,kBAAkB;AAAA,GAAM,MAAM;AACpF,SAAO,EAAE,QAAQ,SAAS;AAC5B;AAEA,SAAS,mBAAmB,KAAa,UAAqC;AAC5E,QAAM,eAAW,wBAAK,KAAK,SAAS,SAAS;AAC7C,iCAAU,UAAU,EAAE,WAAW,KAAK,CAAC;AACvC,QAAM,gBAAY,wBAAK,UAAU,iBAAiB;AAClD,QAAM,YAAY;AAAA,IAChB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AACX,qCAAc,WAAW,WAAW,MAAM;AAC1C,SAAO,EAAE,QAAQ,YAAY,UAAU;AACzC;AAEA,SAAS,aAAa,OAAuB;AAC3C,SAAO,MAAM,QAAQ,uBAAuB,MAAM;AACpD;;;AEnFA,IAAAC,kBAAyC;AACzC,yBAA8B;AAC9B,IAAAC,oBAA8B;AAYvB,SAAS,qBAAqB,KAA4B;AAC/D,QAAM,YAAQ,wBAAK,KAAK,gBAAgB,eAAe;AACvD,UAAI,gCAAW,wBAAK,OAAO,oBAAoB,CAAC,EAAG,QAAO;AAE1D,MAAI;AACF,UAAMC,eAAU,sCAAc,wBAAK,KAAK,cAAc,CAAC;AACvD,UAAM,UAAUA,SAAQ,QAAQ,GAAG,eAAe,eAAe;AACjE,eAAO,2BAAQ,OAAO;AAAA,EACxB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,sBAAsB,UAA4C;AAChF,MAAI;AACF,UAAM,UAAM,kCAAa,wBAAK,UAAU,oBAAoB,GAAG,MAAM;AACrE,WAAO,KAAK,MAAM,GAAG;AAAA,EACvB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,oBAAoB,KAAqB;AACvD,MAAI;AACF,UAAM,cAAU,wBAAK,KAAK,cAAc;AACxC,UAAM,MAAM,KAAK,UAAM,8BAAa,SAAS,MAAM,CAAC;AAIpD,UAAM,OAAO,EAAE,GAAG,IAAI,cAAc,GAAG,IAAI,gBAAgB;AAC3D,UAAM,gBAAgB,OAAO,OAAO,IAAI,EAAE,KAAK,CAAC,MAAM,MAAM,aAAa;AACzE,QAAI,cAAe,QAAO;AAAA,EAC5B,QAAQ;AAAA,EAER;AACA,SAAO;AACT;AAEO,SAAS,0BACd,KACA,aACA,eAAe,sBACiB;AAChC,MAAI;AACF,UAAM,UAAM;AAAA,UACV,wBAAK,KAAK,gBAAgB,aAAa,YAAY;AAAA,MACnD;AAAA,IACF;AACA,WAAO,KAAK,MAAM,GAAG;AAAA,EACvB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;AClEA,IAAAC,6BAA0B;AAInB,SAASC,cAAa,KAAa,IAA0B;AAClE,QAAM,SAAS,aAAa,IAAI,YAAY,EAAE,GAAG,GAAG;AACpD,MAAI,OAAO,WAAW,GAAG;AACvB,UAAM,IAAI,MAAM,GAAG,EAAE,yBAAyB,OAAO,UAAU,CAAC,GAAG;AAAA,EACrE;AACF;AAEO,SAAS,YACd,KACA,IACA,aACM;AACN,QAAM,SAAS,aAAa,IAAI,WAAW,IAAI,WAAW,GAAG,GAAG;AAChE,MAAI,OAAO,WAAW,GAAG;AACvB,UAAM,IAAI,MAAM,GAAG,EAAE,mBAAmB,WAAW,UAAU,OAAO,UAAU,CAAC,GAAG;AAAA,EACpF;AACF;AAEA,SAAS,YAAY,IAA8B;AACjD,UAAQ,IAAI;AAAA,IACV,KAAK;AACH,aAAO,CAAC,SAAS;AAAA,IACnB,KAAK;AACH,aAAO,CAAC,SAAS;AAAA,IACnB;AACE,aAAO,CAAC,SAAS;AAAA,EACrB;AACF;AAEA,SAAS,WAAW,IAAoB,aAA+B;AACrE,UAAQ,IAAI;AAAA,IACV,KAAK;AACH,aAAO,CAAC,OAAO,MAAM,WAAW;AAAA,IAClC,KAAK;AACH,aAAO,CAAC,OAAO,MAAM,WAAW;AAAA,IAClC;AACE,aAAO,CAAC,WAAW,MAAM,WAAW;AAAA,EACxC;AACF;AAEA,SAAS,aACP,IACA,MACA,KAC8B;AAC9B,QAAM,UAAU,OAAO,QAAQ,QAAQ;AACvC,aAAO,sCAAU,SAAS,MAAM,EAAE,KAAK,OAAO,WAAW,OAAO,QAAQ,aAAa,QAAQ,CAAC;AAChG;;;AJfA,SAAS,iBAAiB,KAAa,MAAc,OAAsB;AACzE,iCAAU,MAAM,EAAE,WAAW,KAAK,CAAC;AACnC,aAAW,aAAS,6BAAY,GAAG,GAAG;AACpC,UAAM,cAAU,wBAAK,KAAK,KAAK;AAC/B,UAAM,eAAW,wBAAK,MAAM,KAAK;AACjC,UAAM,WAAO,0BAAS,OAAO;AAC7B,QAAI,KAAK,YAAY,GAAG;AACtB,uBAAiB,SAAS,UAAU,KAAK;AAAA,IAC3C,OAAO;AACL,UAAI,CAAC,aAAS,4BAAW,QAAQ,EAAG;AACpC,kCAAO,SAAS,QAAQ;AAAA,IAC1B;AAAA,EACF;AACF;AAEA,SAAS,0BACP,KACA,IACA,aACM;AACN,QAAM,MAAM,gBAAgB,GAAG;AAC/B,MAAI,CAAC,IAAK,OAAM,IAAI,MAAM,wBAAwB;AAElD,QAAM,OAAO,oBAAoB,GAAG;AACpC,QAAM,WAAW,IAAI,kBAAkB,eAAe;AACtD,MAAI,aAAa,QAAQ,aAAa,oBAAoB;AACxD,QAAI,CAAC,eAAe,KAAC,gCAAW,wBAAK,KAAK,gBAAgB,eAAe,CAAC,GAAG;AAC3E,MAAAC,cAAa,KAAK,EAAE;AAAA,IACtB;AACA;AAAA,EACF;AAEA,MAAI,CAAC,aAAa;AAChB,gBAAY,KAAK,IAAI,GAAG,eAAe,IAAI,IAAI,EAAE;AAAA,EACnD;AACF;AAEA,SAAS,iBAAiB,KAAa,UAAwC;AAC7E,QAAM,YAAY,WAAW,KAAK,uBAAuB;AACzD,QAAM,aAAa,QAAQ,UAAU,UAAU,OAAO,SAAS;AAC/D,SAAO,aAAa;AACtB;AAEO,SAAS,iBAAiB,SAAkD;AACjF,QAAM,EAAE,KAAK,SAAS,OAAO,QAAQ,OAAO,cAAc,MAAM,IAAI;AACpE,QAAM,KAAK,QAAQ,MAAM,qBAAqB,GAAG;AACjD,QAAM,WAAW,aAAa,GAAG;AAEjC,MAAI,iBAAiB,KAAK,QAAQ,KAAK,CAAC,UAAU,CAAC,OAAO;AACxD,UAAMC,YAAW,qBAAqB,GAAG;AACzC,QAAIA,WAAU;AACZ,YAAMC,gBAAe,sBAAsBD,SAAQ;AACnD,aAAO;AAAA,QACL,kBAAkB;AAAA,QAClB,UAAAA;AAAA,QACA,YAAYC,eAAc,cAAc;AAAA,QACxC,aAAa,EAAE,QAAQ,SAAS;AAAA,MAClC;AAAA,IACF;AAAA,EACF;AAEA,4BAA0B,KAAK,IAAI,WAAW;AAE9C,QAAM,WAAW,qBAAqB,GAAG;AACzC,MAAI,CAAC,UAAU;AACb,UAAM,IAAI;AAAA,MACR,GAAG,eAAe,mBAAmB,EAAE,WAAW,eAAe;AAAA,IACnE;AAAA,EACF;AAEA,QAAM,eAAe,sBAAsB,QAAQ;AACnD,MAAI,CAAC,cAAc,YAAY;AAC7B,UAAM,IAAI,MAAM,GAAG,eAAe,yCAAyC;AAAA,EAC7E;AAEA,QAAM,eAAW,wBAAK,UAAU,OAAO;AACvC,QAAM,eAAW,wBAAK,UAAU,cAAc;AAC9C,QAAM,gBAAY,wBAAK,KAAK,SAAS,OAAO;AAC5C,QAAM,gBAAY,wBAAK,KAAK,WAAW,OAAO;AAE9C,mBAAiB,UAAU,WAAW,SAAS,MAAM;AACrD,iCAAU,WAAW,EAAE,WAAW,KAAK,CAAC;AACxC,mBAAiB,UAAU,WAAW,SAAS,MAAM;AAErD,QAAM,cAAc,kBAAkB,KAAK,EAAE,QAAQ,MAAM,CAAC;AAE5D,QAAM,cACJ,qBAAqB,KAAK,eAAe,KACzC,UAAU,QACV,aAAa;AAEf,QAAM,eAA6B;AAAA,IACjC,SAAS,UAAU,WAAW;AAAA,IAC9B,MAAM;AAAA,IACN,UAAU;AAAA,MACR,GAAG,UAAU;AAAA,MACb,OAAO;AAAA,QACL,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,QAClC,WAAW,aAAa;AAAA,QACxB,YAAY,aAAa;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AACA,gBAAc,KAAK,YAAY;AAE/B,SAAO;AAAA,IACL,kBAAkB;AAAA,IAClB;AAAA,IACA,YAAY,aAAa;AAAA,IACzB;AAAA,EACF;AACF;AAEO,SAAS,yBAAyB,QAAkC;AACzE,MAAI,OAAO,kBAAkB;AAC3B,YAAQ,IAAI,qCAAgC;AAC5C,YAAQ,IAAI,yBAAyB;AACrC,YAAQ,IAAI,iBAAiB,OAAO,cAAc,WAAW,EAAE;AAC/D,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,qBAAqB;AACjC;AAAA,EACF;AAEA,UAAQ,IAAI,6CAAwC;AACpD,UAAQ,IAAI,2DAAsD;AAElE,UAAQ,OAAO,YAAY,QAAQ;AAAA,IACjC,KAAK;AACH,cAAQ,IAAI,mDAA8C;AAC1D;AAAA,IACF,KAAK;AACH,cAAQ,IAAI,mDAA8C;AAC1D;AAAA,IACF,KAAK;AACH,cAAQ,IAAI,uCAAkC;AAC9C;AAAA,IACF,KAAK;AACH,cAAQ;AAAA,QACN,2DAAiD,OAAO,YAAY,SAAS;AAAA,MAC/E;AACA,cAAQ,KAAK,wDAAwD;AACrE;AAAA,EACJ;AAEA,UAAQ,IAAI,iBAAiB,OAAO,UAAU,EAAE;AAChD,UAAQ,IAAI,EAAE;AACd,UAAQ,IAAI,qBAAqB;AACnC;;;AK1KO,SAAS,YAAY,SAAgC;AAC1D,MAAI;AACF,UAAM,SAAS,iBAAiB;AAAA,MAC9B,KAAK,QAAQ;AAAA,MACb,QAAQ,QAAQ;AAAA,MAChB,OAAO,QAAQ;AAAA,MACf,IAAI,QAAQ;AAAA,IACd,CAAC;AACD,6BAAyB,MAAM;AAE/B,QAAI,OAAO,YAAY,WAAW,YAAY;AAC5C,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,SAAS,OAAO;AACd,YAAQ,MAAM,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AACpE,YAAQ,MAAM,qBAAqB;AACnC,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAEO,SAAS,cAAc,QAAuB;AACnD,UAAQ,MAAM,uBAAuB,MAAM,EAAE;AAC7C,UAAQ,MAAM,6BAA6B;AAC3C,UAAQ,KAAK,CAAC;AAChB;;;ACrCA,IAAAC,kBAA0C;AAC1C,IAAAC,oBAAqB;AAarB,SAAS,qBAAqB,KAErB;AACP,MAAI;AACF,UAAM,UAAM;AAAA,UACV,wBAAK,KAAK,uEAAuE;AAAA,MACjF;AAAA,IACF;AACA,WAAO,KAAK,MAAM,GAAG;AAAA,EACvB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,sBAAsB,KAAuB;AACpD,QAAM,iBAAa,wBAAK,KAAK,aAAa;AAC1C,QAAM,MAAM,oBAAI,IAAY;AAE5B,MAAI;AACF,eAAW,YAAQ,6BAAY,UAAU,GAAG;AAC1C,YAAM,QAAQ,KAAK,MAAM,qCAAqC;AAC9D,UAAI,OAAO;AACT,YAAI,IAAI,MAAM,CAAC,EAAE,YAAY,CAAC;AAAA,MAChC;AAAA,IACF;AAAA,EACF,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AAEA,SAAO,CAAC,GAAG,GAAG,EAAE,KAAK;AACvB;AAEO,SAAS,mBAAmB,KAA4B;AAC7D,QAAM,aAAa,WAAW,KAAK,wBAAwB;AAC3D,QAAM,gBAAgB;AAAA,IACpB;AAAA,IACA;AAAA,EACF;AAEA,MAAI,CAAC,cAAc,CAAC,eAAe;AACjC,WAAO;AAAA,MACL;AAAA,QACE,IAAI;AAAA,QACJ,QAAQ;AAAA,QACR,SAAS;AAAA,MACX;AAAA,MACA;AAAA,QACE,IAAI;AAAA,QACJ,QAAQ;AAAA,QACR,SAAS;AAAA,MACX;AAAA,MACA;AAAA,QACE,IAAI;AAAA,QACJ,QAAQ;AAAA,QACR,SAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAEA,QAAM,UAAyB,CAAC;AAEhC,QAAM,UAAU,aAAa,KAAK,wBAAwB;AAC1D,QAAM,iBACJ,YAAY,SACX,kBAAkB,KAAK,OAAO,KAAK,eAAe,KAAK,OAAO;AAEjE,MAAI,gBAAgB;AAClB,YAAQ,KAAK;AAAA,MACX,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,SAAS;AAAA,IACX,CAAC;AAAA,EACH,OAAO;AACL,YAAQ,KAAK;AAAA,MACX,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAEA,QAAM,cAAc,qBAAqB,KAAK,yBAAyB;AACvE,QAAM,cAAc,qBAAqB,KAAK,eAAe;AAC7D,QAAM,YAAY,cAAc,SAAS,WAAW,IAAI;AACxD,QAAM,YAAY,cAAc,SAAS,WAAW,IAAI;AAExD,MAAI,CAAC,eAAe;AAClB,YAAQ,KAAK;AAAA,MACX,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,SAAS;AAAA,IACX,CAAC;AAAA,EACH,WAAW,aAAa,aAAa,cAAc,WAAW;AAC5D,YAAQ,KAAK;AAAA,MACX,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,SAAS,2BAA2B,WAAW,0BAA0B,WAAW;AAAA,IACtF,CAAC;AAAA,EACH,OAAO;AACL,YAAQ,KAAK;AAAA,MACX,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,SAAS,yBAAyB,aAAa,SAAS,wBAAmB,aAAa,SAAS;AAAA,MACjG,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAEA,QAAM,WAAW,qBAAqB,GAAG;AACzC,QAAM,aAAa,UAAU,aAAa,OAAO,KAAK,SAAS,UAAU,IAAI,CAAC;AAC9E,QAAM,WAAW,sBAAsB,GAAG;AAC1C,QAAM,YAAY,SAAS,OAAO,CAAC,OAAO,CAAC,WAAW,SAAS,EAAE,CAAC;AAElE,MAAI,CAAC,UAAU;AACb,YAAQ,KAAK;AAAA,MACX,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,SAAS;AAAA,IACX,CAAC;AAAA,EACH,WAAW,UAAU,WAAW,GAAG;AACjC,YAAQ,KAAK;AAAA,MACX,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,SACE,WAAW,SAAS,IAChB,4BAA4B,WAAW,MAAM,4CAC7C;AAAA,IACR,CAAC;AACD,QAAI,WAAW,SAAS,KAAK,WAAW,SAAS,IAAI;AACnD,cAAQ,KAAK;AAAA,QACX,IAAI;AAAA,QACJ,QAAQ;AAAA,QACR,SAAS,6CAA6C,WAAW,MAAM;AAAA,MACzE,CAAC;AAAA,IACH;AAAA,EACF,OAAO;AACL,YAAQ,KAAK;AAAA,MACX,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,SAAS,8BAA8B,UAAU,KAAK,IAAI,CAAC;AAAA,MAC3D,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAEA,QAAM,WAAW,aAAa,GAAG;AACjC,MAAI,iBAAiB,CAAC,UAAU,UAAU,WAAW;AACnD,YAAQ,KAAK;AAAA,MACX,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAEA,SAAS,4BAA4B,KAA4B;AAC/D,SACE;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAAG,cACH,0BAA0B,KAAK,2BAA2B,wBAAwB,GAC9E,cACJ,0BAA0B,KAAK,yBAAyB,GAAG,cAC3D;AAEJ;AASO,SAAS,eAAe,KAA4B;AACzD,QAAM,qBAAqB;AAAA,IACzB;AAAA,IACA;AAAA,EACF;AACA,QAAM,cAAc,WAAW,KAAK,uBAAuB;AAC3D,QAAM,aAAa,aAAa,KAAK,WAAW;AAChD,QAAM,gBACJ,eAAe,QACf,sBAAsB,KAAK,UAAU,KACrC,oBAAoB,KAAK,UAAU;AAErC,MAAI,CAAC,sBAAsB,CAAC,aAAa;AACvC,WAAO;AAAA,MACL;AAAA,QACE,IAAI;AAAA,QACJ,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,SAAS;AAAA,MACX;AAAA,MACA;AAAA,QACE,IAAI;AAAA,QACJ,QAAQ;AAAA,QACR,SAAS;AAAA,MACX;AAAA,MACA;AAAA,QACE,IAAI;AAAA,QACJ,QAAQ;AAAA,QACR,SAAS;AAAA,MACX;AAAA,MACA;AAAA,QACE,IAAI;AAAA,QACJ,QAAQ;AAAA,QACR,SAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAEA,QAAM,UAAyB,CAAC;AAChC,QAAM,WAAW,aAAa,GAAG;AACjC,QAAM,eAAe,UAAU,UAAU,OAAO;AAChD,QAAM,WAAW,qBAAqB,GAAG;AACzC,QAAM,eAAe,WAAW,sBAAsB,QAAQ,IAAI;AAClE,QAAM,WAAW,cAAc;AAE/B,UAAQ,KAAK;AAAA,IACX,IAAI;AAAA,IACJ,QAAQ,cAAc,SAAS;AAAA,IAC/B,SAAS,cACL,gCACA;AAAA,IACJ,SAAS,cAAc,SAAY;AAAA,EACrC,CAAC;AAED,UAAQ,KAAK;AAAA,IACX,IAAI;AAAA,IACJ,QAAQ,gBAAgB,SAAS;AAAA,IACjC,SAAS,gBACL,gDACA;AAAA,IACJ,SAAS,gBAAgB,SAAY;AAAA,EACvC,CAAC;AAED,MAAI,gBAAgB,YAAY,iBAAiB,UAAU;AACzD,YAAQ,KAAK;AAAA,MACX,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,SAAS;AAAA,IACX,CAAC;AAAA,EACH,WAAW,gBAAgB,UAAU;AACnC,YAAQ,KAAK;AAAA,MACX,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,SAAS;AAAA,IACX,CAAC;AAAA,EACH,OAAO;AACL,YAAQ,KAAK;AAAA,MACX,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAEA,QAAM,gBAAgB,4BAA4B,GAAG;AACrD,QAAM,yBAAyB;AAAA,IAC7B;AAAA,IACA;AAAA,EACF;AACA,MAAI,CAAC,wBAAwB;AAC3B,YAAQ,KAAK;AAAA,MACX,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,SAAS;AAAA,IACX,CAAC;AAAA,EACH,WAAW,CAAC,eAAe;AACzB,YAAQ,KAAK;AAAA,MACX,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,SAAS;AAAA,IACX,CAAC;AAAA,EACH,WAAW,YAAY,kBAAkB,UAAU;AACjD,YAAQ,KAAK;AAAA,MACX,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,SAAS;AAAA,IACX,CAAC;AAAA,EACH,OAAO;AACL,YAAQ,KAAK;AAAA,MACX,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAEA,UAAQ,KAAK;AAAA,IACX,IAAI;AAAA,IACJ,QAAQ;AAAA,IACR,SAAS,UAAK,uBAAuB;AAAA,EACvC,CAAC;AAED,SAAO;AACT;AAEO,SAAS,eAAe,KAA4B;AACzD,QAAM,aAAa,WAAW,KAAK,aAAa;AAChD,MAAI,CAAC,YAAY;AACf,WAAO;AAAA,MACL;AAAA,QACE,IAAI;AAAA,QACJ,QAAQ;AAAA,QACR,SAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,MACE,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,SAAS;AAAA,IACX;AAAA,EACF;AACF;;;AC3UO,SAAS,iBACd,KACA,KAC4C;AAC5C,QAAM,UAAyB,CAAC;AAChC,MAAI,QAAQ;AAEZ,MAAI,CAAC,eAAe,GAAG,GAAG;AACxB,QAAI,KAAK;AACP,YAAM,MAAM,gBAAgB,GAAG;AAC/B,YAAM,cACJ,qBAAqB,KAAK,eAAe,KACzC,KAAK,eAAe,eAAe,GAAG,QAAQ,UAAU,EAAE,KAC1D;AACF,yBAAmB,KAAK,WAAW;AACnC,cAAQ;AACR,cAAQ,KAAK;AAAA,QACX,IAAI;AAAA,QACJ,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,SAAS;AAAA,MACX,CAAC;AACD,aAAO,EAAE,SAAS,MAAM;AAAA,IAC1B;AAEA,YAAQ,KAAK;AAAA,MACX,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,SAAS;AAAA,IACX,CAAC;AACD,WAAO,EAAE,SAAS,MAAM;AAAA,EAC1B;AAEA,QAAM,WAAW,aAAa,GAAG;AACjC,MAAI,CAAC,YAAY,CAAC,sBAAsB,QAAQ,GAAG;AACjD,YAAQ,KAAK;AAAA,MACX,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,SAAS;AAAA,IACX,CAAC;AACD,WAAO,EAAE,SAAS,MAAM;AAAA,EAC1B;AAEA,UAAQ,KAAK;AAAA,IACX,IAAI;AAAA,IACJ,QAAQ;AAAA,IACR,SAAS,mCAAmC,SAAS,IAAI,SAAS,SAAS,OAAO;AAAA,EACpF,CAAC;AAED,SAAO,EAAE,SAAS,MAAM;AAC1B;;;AC1DO,SAAS,oBAAoB,KAA4B;AAC9D,QAAM,UAAyB,CAAC;AAChC,QAAM,YACJ,aAAa,KAAK,gCAAgC,KAClD,aAAa,KAAK,+BAA+B;AAGnD,MAAI,aAAa,sBAAsB,KAAK,SAAS,GAAG;AACtD,YAAQ,KAAK;AAAA,MACX,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,SAAS;AAAA,IACX,CAAC;AAAA,EACH,OAAO;AACL,YAAQ,KAAK;AAAA,MACX,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAGA,QAAM,cACJ,kBAAkB,KAAK,0BAA0B,KACjD,kBAAkB,KAAK,oBAAoB,KAC3C,kBAAkB,KAAK,8BAA8B;AAEvD,MAAI,aAAa;AACf,UAAM,iBAAiB,YACnB,qBAAqB,KAAK,SAAS,IACnC,kBAAkB,KAAK,oBAAoB;AAC/C,QAAI,CAAC,gBAAgB;AACnB,cAAQ,KAAK;AAAA,QACX,IAAI;AAAA,QACJ,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,SAAS;AAAA,MACX,CAAC;AAAA,IACH,OAAO;AACL,cAAQ,KAAK;AAAA,QACX,IAAI;AAAA,QACJ,QAAQ;AAAA,QACR,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAAA,EACF,OAAO;AACL,YAAQ,KAAK;AAAA,MACX,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAEA,SAAO;AACT;;;AChDA,IAAM,cAAc;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,wBAAwB,CAAC,WAAW,uBAAuB;AAEjE,IAAM,wBAAwB;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,SAAS,cAAc,KAA4B;AACxD,QAAM,MAAM,gBAAgB,GAAG;AAC/B,MAAI,CAAC,KAAK;AACR,WAAO;AAAA,MACL;AAAA,QACE,IAAI;AAAA,QACJ,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,SAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAEA,QAAM,KAAK,qBAAqB,GAAG;AACnC,QAAM,UAAyB,CAAC;AAGhC,QAAM,iBACJ,qBAAqB,KAAK,SAAS,KACnC,cAAc,KAAK,SAAS,GAAG,QAAQ,UAAU,EAAE,KACnD;AACF,QAAM,YACJ,cAAc,KAAK,iBAAiB,SAAS,KAC7C,cAAc,KAAK,kBAAkB,SAAS,KAC9C;AAEF,MAAI,CAAC,gBAAgB;AACnB,YAAQ,KAAK;AAAA,MACX,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,SAAS,aAAa,IAAI,CAAC,kBAAkB,CAAC;AAAA,IAChD,CAAC;AAAA,EACH,WAAW,CAAC,eAAe,gBAAgB,SAAS,GAAG;AACrD,YAAQ,KAAK;AAAA,MACX,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,SAAS,WAAW,cAAc,uBAAuB,SAAS;AAAA,MAClE,SAAS,aAAa,IAAI,CAAC,WAAW,SAAS,EAAE,CAAC;AAAA,IACpD,CAAC;AAAA,EACH,OAAO;AACL,YAAQ,KAAK;AAAA,MACX,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,SAAS,WAAW,cAAc;AAAA,IACpC,CAAC;AAAA,EACH;AAGA,QAAM,YAAY,YAAY,OAAO,CAAC,SAAS;AAC7C,UAAM,YAAY,qBAAqB,KAAK,IAAI;AAChD,UAAM,WAAW,cAAc,KAAK,IAAI;AACxC,WAAO,CAAC,aAAa,CAAC;AAAA,EACxB,CAAC;AAED,MAAI,UAAU,SAAS,GAAG;AACxB,YAAQ,KAAK;AAAA,MACX,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,SAAS,qCAAqC,UAAU,KAAK,IAAI,CAAC;AAAA,MAClE,SAAS,aAAa,IAAI,CAAC,GAAG,SAAS,CAAC;AAAA,IAC1C,CAAC;AAAA,EACH,OAAO;AACL,YAAQ,KAAK;AAAA,MACX,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,SACE;AAAA,IACJ,CAAC;AAAA,EACH;AAGA,QAAM,WAAW,OAAO,KAAK;AAAA,IAC3B,GAAG,IAAI;AAAA,IACP,GAAG,IAAI;AAAA,EACT,CAAC,EAAE,OAAO,CAAC,MAAM,EAAE,WAAW,WAAW,CAAC;AAE1C,QAAM,eAAe,SAClB,IAAI,CAAC,SAAS;AACb,UAAM,IACJ,qBAAqB,KAAK,IAAI,KAC9B,cAAc,KAAK,IAAI,GAAG,QAAQ,UAAU,EAAE;AAChD,WAAO,IAAI,EAAE,MAAM,SAAS,EAAE,IAAI;AAAA,EACpC,CAAC,EACA,OAAO,CAAC,MAA8C,MAAM,IAAI;AAEnE,QAAM,SAAS,IAAI;AAAA,IACjB,aACG,IAAI,CAAC,MAAM;AACV,YAAM,QAAQ,EAAE,QAAQ,MAAM,GAAG;AACjC,aAAO,MAAM,UAAU,IAAI,GAAG,MAAM,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,KAAK;AAAA,IACzD,CAAC,EACA,OAAO,CAAC,MAAmB,MAAM,QAAQ,CAAC,EAAE,SAAS,WAAW,CAAC;AAAA,EACtE;AAEA,MAAI,aAAa,WAAW,GAAG;AAC7B,YAAQ,KAAK;AAAA,MACX,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,SAAS,aAAa,IAAI,CAAC,wBAAwB,uBAAuB,CAAC;AAAA,IAC7E,CAAC;AAAA,EACH,WAAW,OAAO,OAAO,GAAG;AAC1B,YAAQ,KAAK;AAAA,MACX,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,SAAS,yCAAyC,CAAC,GAAG,MAAM,EAAE,KAAK,IAAI,CAAC;AAAA,MACxE,SAAS,GAAG,OAAO,SAAS,SAAS,EAAE;AAAA,IACzC,CAAC;AAAA,EACH,OAAO;AACL,YAAQ,KAAK;AAAA,MACX,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,SAAS,gCAAgC,aAAa,IAAI,CAAC,MAAM,GAAG,EAAE,IAAI,IAAI,EAAE,OAAO,EAAE,EAAE,KAAK,IAAI,CAAC;AAAA,IACvG,CAAC;AAAA,EACH;AAEA,aAAW,QAAQ,uBAAuB;AACxC,UAAM,YAAY,qBAAqB,KAAK,IAAI;AAChD,UAAM,WAAW,cAAc,KAAK,IAAI;AACxC,QAAI,CAAC,aAAa,CAAC,UAAU;AAC3B,cAAQ,KAAK;AAAA,QACX,IAAI;AAAA,QACJ,QAAQ;AAAA,QACR,SAAS,eAAe,IAAI;AAAA,QAC5B,SAAS,GAAG,aAAa,IAAI,CAAC,IAAI,CAAC,CAAC;AAAA,MACtC,CAAC;AAAA,IACH;AAAA,EACF;AAEA,aAAW,QAAQ,uBAAuB;AACxC,UAAM,YAAY,qBAAqB,KAAK,IAAI;AAChD,UAAM,WAAW,cAAc,KAAK,IAAI;AACxC,QAAI,CAAC,aAAa,CAAC,UAAU;AAC3B,cAAQ,KAAK;AAAA,QACX,IAAI;AAAA,QACJ,QAAQ;AAAA,QACR,SAAS,iBAAiB,IAAI;AAAA,QAC9B,SAAS,mCAAmC,aAAa,IAAI,CAAC,IAAI,CAAC,CAAC;AAAA,MACtE,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AACT;;;AC3KA,IAAM,iBACJ;AAEK,SAAS,iBAAiB,KAA4B;AAC3D,QAAM,UAAyB,CAAC;AAGhC,MAAI,WAAW,KAAK,mBAAmB,GAAG;AACxC,YAAQ,KAAK;AAAA,MACX,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,SAAS;AAAA,IACX,CAAC;AAAA,EACH,OAAO;AACL,YAAQ,KAAK;AAAA,MACX,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAGA,QAAM,YACJ,aAAa,KAAK,gCAAgC,KAClD,aAAa,KAAK,+BAA+B;AAEnD,MAAI,CAAC,WAAW;AACd,YAAQ,KAAK;AAAA,MACX,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,SAAS;AAAA,IACX,CAAC;AAAA,EACH,OAAO;AACL,UAAM,aAAa,kBAAkB,KAAK,SAAS;AACnD,UAAM,WAAW,gBAAgB,KAAK,SAAS,KAAK,kBAAkB,KAAK,SAAS;AACpF,QAAI,cAAc,UAAU;AAC1B,cAAQ,KAAK;AAAA,QACX,IAAI;AAAA,QACJ,QAAQ;AAAA,QACR,SAAS;AAAA,MACX,CAAC;AAAA,IACH,OAAO;AACL,cAAQ,KAAK;AAAA,QACX,IAAI;AAAA,QACJ,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAAA,EACF;AAGA,QAAM,eACJ,kBAAkB,KAAK,cAAc,KACrC,kBAAkB,KAAK,0CAA0C;AAEnE,MAAI,cAAc;AAChB,UAAM,WAAW,YAAY,gBAAgB,KAAK,SAAS,IAAI;AAC/D,UAAM,WAAW,YAAY,gBAAgB,KAAK,SAAS,IAAI;AAC/D,QAAI,CAAC,YAAY,CAAC,UAAU;AAC1B,cAAQ,KAAK;AAAA,QACX,IAAI;AAAA,QACJ,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,SAAS;AAAA,MACX,CAAC;AAAA,IACH,OAAO;AACL,cAAQ,KAAK;AAAA,QACX,IAAI;AAAA,QACJ,QAAQ;AAAA,QACR,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAAA,EACF,OAAO;AACL,YAAQ,KAAK;AAAA,MACX,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAGA,QAAM,WACH,aAAa,kBAAkB,KAAK,SAAS,KAC9C,kBAAkB,KAAK,WAAW,KAClC,kBAAkB,KAAK,UAAU;AAEnC,MAAI,UAAU;AACZ,YAAQ,KAAK;AAAA,MACX,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,SAAS;AAAA,IACX,CAAC;AAAA,EACH,OAAO;AACL,YAAQ,KAAK;AAAA,MACX,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAEA,SAAO;AACT;;;ACrGO,SAAS,aAAa,SAAuC;AAClE,QAAM,EAAE,KAAK,MAAM,IAAI,IAAI;AAC3B,QAAM,SAAwB,CAAC;AAE/B,SAAO,KAAK,GAAG,cAAc,GAAG,CAAC;AACjC,SAAO,KAAK,GAAG,iBAAiB,GAAG,CAAC;AACpC,SAAO,KAAK,GAAG,oBAAoB,GAAG,CAAC;AAEvC,QAAM,EAAE,SAAS,gBAAgB,IAAI,iBAAiB,KAAK,GAAG;AAC9D,SAAO,KAAK,GAAG,eAAe;AAE9B,MAAI,MAAM;AACR,WAAO,KAAK,GAAG,mBAAmB,GAAG,CAAC;AACtC,WAAO,KAAK,GAAG,eAAe,GAAG,CAAC;AAClC,WAAO,KAAK,GAAG,eAAe,GAAG,CAAC;AAAA,EACpC;AAEA,SAAO;AACT;AAEO,SAAS,gBACd,QACA,QAC2F;AAC3F,MAAI,SAAS;AACb,MAAI,WAAW;AACf,MAAI,WAAW;AACf,MAAI,UAAU;AAEd,aAAW,SAAS,QAAQ;AAC1B,YAAQ,MAAM,QAAQ;AAAA,MACpB,KAAK;AACH;AACA;AAAA,MACF,KAAK;AACH;AACA;AAAA,MACF,KAAK;AACH;AACA;AAAA,MACF,KAAK;AAAA,MACL,KAAK;AACH;AACA;AAAA,IACJ;AAAA,EACF;AAEA,MAAI,WAAW;AACf,MAAI,WAAW,EAAG,YAAW;AAAA,WACpB,UAAU,WAAW,EAAG,YAAW;AAE5C,SAAO,EAAE,QAAQ,UAAU,UAAU,SAAS,SAAS;AACzD;;;ACxDA,IAAM,cAAsC;AAAA,EAC1C,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AACR;AAEO,SAAS,UAAU,SAAsC;AAC9D,QAAM,SAAS,aAAa,OAAO;AACnC,QAAM,UAAU,gBAAgB,QAAQ,QAAQ,MAAM;AAEtD,SAAO;AAAA,IACL;AAAA,IACA,SAAS;AAAA,MACP,QAAQ,QAAQ;AAAA,MAChB,UAAU,QAAQ;AAAA,MAClB,UAAU,QAAQ;AAAA,MAClB,SAAS,QAAQ;AAAA,IACnB;AAAA,IACA,UAAU,QAAQ;AAAA,EACpB;AACF;AAEO,SAAS,kBAAkB,QAAsB,MAAuB;AAC7E,QAAM,QAAkB,CAAC,kBAAkB,EAAE;AAE7C,aAAW,SAAS,OAAO,QAAQ;AACjC,UAAM,OAAO,YAAY,MAAM,MAAM,KAAK;AAC1C,UAAM,KAAK,GAAG,IAAI,IAAI,MAAM,EAAE,KAAK,MAAM,OAAO,EAAE;AAClD,QAAI,MAAM,YAAY,MAAM,WAAW,UAAU,MAAM,WAAW,SAAS;AACzE,YAAM,KAAK,cAAS,MAAM,OAAO,EAAE;AAAA,IACrC;AAAA,EACF;AAEA,QAAM,KAAK,EAAE;AACb,QAAM,EAAE,QAAQ,UAAU,SAAS,IAAI,OAAO;AAC9C,QAAM,OAAO,OAAO,SAAS;AAC7B,QAAM;AAAA,IACJ,GAAG,MAAM,YAAY,QAAQ,cAAc,QAAQ,cAAc,IAAI,sBAAiB,OAAO,QAAQ;AAAA,EACvG;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;AAEO,SAAS,iBAAiB,QAA8B;AAC7D,SAAO,KAAK;AAAA,IACV;AAAA,MACE,QAAQ,OAAO,OAAO,IAAI,CAAC,OAAO;AAAA,QAChC,IAAI,EAAE;AAAA,QACN,QAAQ,EAAE;AAAA,QACV,SAAS,EAAE;AAAA,QACX,GAAI,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,IAAI,CAAC;AAAA,MAC5C,EAAE;AAAA,MACF,SAAS,OAAO;AAAA,MAChB,UAAU,OAAO;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AC/DA,IAAAC,6BAA0B;AAwB1B,SAASC,sBAAqB,KAAsB;AAClD,SAAO,WAAW,KAAK,oBAAoB;AAC7C;AAEA,SAAS,YAAY,KAAa,IAA0B;AAC1D,QAAM,WAAW;AAAA,IACf,2BAA2B,sBAAsB;AAAA,IACjD,8CAA8C,wBAAwB;AAAA,EACxE;AAEA,QAAM,OACJ,OAAO,SACH,CAAC,OAAO,MAAM,GAAG,QAAQ,IACzB,OAAO,SACL,CAAC,OAAO,MAAM,GAAG,QAAQ,IACzB,CAAC,WAAW,MAAM,GAAG,QAAQ;AAErC,QAAM,aAAS,sCAAU,IAAI,MAAM;AAAA,IACjC;AAAA,IACA,OAAO;AAAA,IACP,OAAO,QAAQ,aAAa;AAAA,EAC9B,CAAC;AACD,MAAI,OAAO,WAAW,GAAG;AACvB,UAAM,IAAI,MAAM,GAAG,EAAE,iCAAiC,OAAO,UAAU,SAAS,EAAE;AAAA,EACpF;AACF;AAEO,SAAS,iBAAiB,SAAoD;AACnF,QAAM,EAAE,KAAK,cAAc,MAAM,IAAI;AACrC,QAAM,KAAK,QAAQ,MAAM,qBAAqB,GAAG;AAEjD,MAAI,CAACA,sBAAqB,GAAG,GAAG;AAC9B,YAAQ,MAAM,gEAA2D;AACzE,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,WAAW,aAAa,GAAG;AACjC,MAAI,CAAC,UAAU;AACb,YAAQ,MAAM,6DAAwD;AACtE,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,UAAU,gBAAgB,GAAG;AACnC,QAAM,cACJ,qBAAqB,KAAK,eAAe,KACzC,SAAS,eAAe,eAAe,GAAG,QAAQ,UAAU,EAAE,KAC9D,SAAS;AAEX,MAAI,CAAC,aAAa;AAChB,YAAQ,IAAI,+BAA+B,EAAE,QAAG;AAChD,gBAAY,KAAK,EAAE;AAAA,EACrB;AAEA,WAAS,UAAU;AACnB,WAAS,OAAO;AAChB,WAAS,aAAa,CAAC;AACvB,WAAS,SAAS,YAAY;AAAA,IAC5B,WAAY,SAAS,SAAS,WAAkD,cAC9E,oBAAI,KAAK,GAAE,YAAY;AAAA,IACzB,eAAe;AAAA,IACf,WAAW;AAAA,IACX,QAAQ;AAAA,EACV;AACA,gBAAc,KAAK,QAAQ;AAE3B,UAAQ,IAAI,yCAAoC,sBAAsB,EAAE;AACxE,UAAQ,IAAI,4DAAuD,wBAAwB,EAAE;AAE7F,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,SAAS,kBAAkB,sBAAsB,sBAAsB,WAAW;AAAA,EACpF;AACF;;;ACnFO,SAAS,aAAa,SAA4B;AACvD,MAAI;AACF,UAAM,SAAS,iBAAiB;AAAA,MAC9B,KAAK,QAAQ;AAAA,MACb,QAAQ;AAAA,MACR,OAAO,QAAQ;AAAA,MACf,IAAI,QAAQ;AAAA,IACd,CAAC;AACD,YAAQ,IAAI,0BAAqB;AACjC,6BAAyB,MAAM;AAAA,EACjC,SAAS,OAAO;AACd,YAAQ,MAAM,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AACpE,YAAQ,MAAM,qBAAqB;AACnC,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAEO,SAASC,kBAAiB,SAA4B;AAC3D,mBAAkB;AAAA,IAChB,KAAK,QAAQ;AAAA,IACb,IAAI,QAAQ;AAAA,EACd,CAAC;AACH;AAEO,SAAS,WAAW,SAA4B;AACrD,QAAM,EAAE,IAAI,IAAI;AAChB,QAAM,WAAW,aAAa,GAAG;AACjC,QAAM,eACJ,WAAW,KAAK,oBAAoB,KAAK,QAAQ,UAAU,UAAU,SAAS;AAChF,QAAM,WAAW,QAAQ,UAAU,UAAU,OAAO,SAAS;AAE7D,MAAI,CAAC,gBAAgB,CAAC,UAAU;AAC9B,YAAQ,MAAM,8FAAyF;AACvG,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI,cAAc;AAChB,qBAAkB,EAAE,KAAK,IAAI,QAAQ,GAAG,CAAC;AAAA,EAC3C,OAAO;AACL,YAAQ,IAAI,+DAAqD;AAAA,EACnE;AAEA,MAAI,UAAU;AACZ,iBAAa,OAAO;AAAA,EACtB,OAAO;AACL,YAAQ,IAAI,uDAA6C;AACzD,YAAQ,MAAM,uBAAuB;AAAA,EACvC;AAEA,UAAQ,IAAI,EAAE;AACd,UAAQ,IAAI,0BAAqB;AACnC;AAEO,SAAS,QAAQ,QAAgB,SAA4B;AAClE,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,mBAAa,OAAO;AACpB;AAAA,IACF,KAAK;AACH,MAAAA,kBAAiB,OAAO;AACxB;AAAA,IACF,KAAK;AACH,iBAAW,OAAO;AAClB;AAAA,IACF;AACE,cAAQ,MAAM,wBAAwB,MAAM,EAAE;AAC9C,cAAQ,MAAM,oCAAoC;AAClD,cAAQ,KAAK,CAAC;AAAA,EAClB;AACF;;;AtBtEA,IAAM,UAAU,IAAI,yBAAQ;AAE5B,QACG,KAAK,SAAS,EACd,YAAY,mEAA8D,EAC1E,QAAQ,WAAW;AAEtB,QACG,QAAQ,QAAQ,EAChB,YAAY,2CAA2C,EACvD,OAAO,gBAAgB,sBAAsB,QAAQ,IAAI,CAAC,EAC1D,OAAO,UAAU,8CAA8C,EAC/D,OAAO,SAAS,4CAA4C,EAC5D,OAAO,YAAY,4BAA4B,EAC/C,OAAO,UAAU,8BAA8B,EAC/C,OAAO,CAAC,SAA2F;AAClG,QAAM,UAAM,4BAAQ,KAAK,GAAG;AAC5B,QAAM,SAAS,UAAU;AAAA,IACvB;AAAA,IACA,MAAM,QAAQ,KAAK,IAAI;AAAA,IACvB,KAAK,QAAQ,KAAK,GAAG;AAAA,IACrB,QAAQ,QAAQ,KAAK,MAAM;AAAA,IAC3B,MAAM,QAAQ,KAAK,IAAI;AAAA,EACzB,CAAC;AAED,MAAI,KAAK,MAAM;AACb,YAAQ,IAAI,iBAAiB,MAAM,CAAC;AAAA,EACtC,OAAO;AACL,YAAQ,IAAI,kBAAkB,QAAQ,QAAQ,KAAK,IAAI,CAAC,CAAC;AAAA,EAC3D;AAEA,UAAQ,KAAK,OAAO,QAAQ;AAC9B,CAAC;AAEH,IAAM,SAAS,QAAQ,QAAQ,KAAK,EAAE,YAAY,2BAA2B;AAE7E,OACG,QAAQ,WAAW,EACnB,YAAY,6BAA6B,EACzC,OAAO,YAAY,mCAAmC,EACtD,OAAO,WAAW,qCAAqC,EACvD,OAAO,kBAAkB,8BAA8B,EACvD,OAAO,kBAAkB,0CAA0C,EACnE,OAAO,gBAAgB,sBAAsB,QAAQ,IAAI,CAAC,EAC1D;AAAA,EACC,CAAC,SAMK;AACJ,oBAAgB;AAAA,MACd,SAAK,4BAAQ,KAAK,GAAG;AAAA,MACrB,QAAQ,QAAQ,KAAK,MAAM;AAAA,MAC3B,OAAO,QAAQ,KAAK,KAAK;AAAA,MACzB,aAAa,QAAQ,KAAK,WAAW;AAAA,MACrC,IAAI,QAAQ,KAAK,EAAE;AAAA,IACrB,CAAC;AAAA,EACH;AACF;AAEF,OACG,QAAQ,OAAO,EACf,YAAY,qDAAgD,EAC5D,OAAO,YAAY,0DAA0D,EAC7E,OAAO,WAAW,qCAAqC,EACvD,OAAO,kBAAkB,0CAA0C,EACnE,OAAO,gBAAgB,sBAAsB,QAAQ,IAAI,CAAC,EAC1D,OAAO,CAAC,SAA0E;AACjF,cAAY;AAAA,IACV,SAAK,4BAAQ,KAAK,GAAG;AAAA,IACrB,QAAQ,QAAQ,KAAK,MAAM;AAAA,IAC3B,OAAO,QAAQ,KAAK,KAAK;AAAA,IACzB,IAAI,QAAQ,KAAK,EAAE;AAAA,EACrB,CAAC;AACH,CAAC;AAEH,OACG,SAAS,YAAY,eAAe,EACpC,OAAO,CAAC,WAA+B;AACtC,MAAI,CAAC,QAAQ;AACX,YAAQ,MAAM,sCAAsC;AACpD,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,gBAAc,MAAM;AACtB,CAAC;AAEH,IAAM,UAAU,QACb,QAAQ,MAAM,EACd,YAAY,2CAA2C;AAE1D,QACG,SAAS,YAAY,yBAAyB,EAC9C,OAAO,WAAW,4BAA4B,EAC9C,OAAO,kBAAkB,0CAA0C,EACnE,OAAO,gBAAgB,sBAAsB,QAAQ,IAAI,CAAC,EAC1D,OAAO,CAAC,QAAgB,SAAwD;AAC/E,UAAQ,QAAQ;AAAA,IACd,SAAK,4BAAQ,KAAK,GAAG;AAAA,IACrB,OAAO,QAAQ,KAAK,KAAK;AAAA,IACzB,IAAI,QAAQ,KAAK,EAAE;AAAA,EACrB,CAAC;AACH,CAAC;AAEH,QAAQ,MAAM;AAEd,SAAS,QAAQ,OAAgE;AAC/E,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,aAAa,MAAM,YAAY;AACrC,MAAI,eAAe,UAAU,eAAe,SAAS,eAAe,QAAQ;AAC1E,WAAO;AAAA,EACT;AACA,UAAQ,MAAM,uBAAuB,KAAK,4BAA4B;AACtE,UAAQ,KAAK,CAAC;AAChB;","names":["import_node_path","import_node_fs","import_node_path","import_node_fs","import_node_path","import_node_fs","import_node_path","semver","import_node_fs","import_node_path","at","import_node_fs","import_node_path","import_node_fs","import_node_path","import_node_fs","import_node_path","require","import_node_child_process","runPmInstall","runPmInstall","packRoot","packManifest","import_node_fs","import_node_path","import_node_child_process","isStorybookInstalled","runSyncStorybook"]}
1
+ {"version":3,"sources":["../src/cli.ts","../src/commands/storybook/add.ts","../src/commands/storybook/constants.ts","../src/commands/storybook/templates.ts","../src/utils/pm.ts","../src/utils/package-json.ts","../src/utils/fs.ts","../src/utils/exec.ts","../src/utils/manifest.ts","../src/brain/install.ts","../src/brain/agents-patch.ts","../src/brain/constants.ts","../src/brain/pack.ts","../src/commands/add.ts","../src/checks/packs.ts","../src/checks/manifest.ts","../src/checks/navigation.ts","../src/checks/peers.ts","../src/checks/runtime.ts","../src/checks/index.ts","../src/commands/doctor.ts","../src/commands/storybook/sync.ts","../src/commands/sync.ts"],"sourcesContent":["import { Command } from 'commander';\r\nimport { resolve } from 'node:path';\r\n\r\nimport { runAddBrain, runAddStorybook, runAddUnknown } from './commands/add.js';\r\nimport {\r\n formatHumanReport,\r\n formatJsonReport,\r\n runDoctor,\r\n} from './commands/doctor.js';\r\nimport { runSync } from './commands/sync.js';\r\nimport { CLI_VERSION } from './utils/manifest.js';\r\n\r\nconst program = new Command();\r\n\r\nprogram\r\n .name('idia-ui')\r\n .description('idia-ui CLI — doctor and add-on management for consumer apps')\r\n .version(CLI_VERSION);\r\n\r\nprogram\r\n .command('doctor')\r\n .description('Run health checks on an idia consumer app')\r\n .option('--cwd <path>', 'App root directory', process.cwd())\r\n .option('--full', 'Include Storybook (S*) and brain (B*) checks')\r\n .option('--fix', 'Limited safe repairs (manifest regenerate)')\r\n .option('--strict', 'Treat warnings as failures')\r\n .option('--json', 'Machine-readable JSON output')\r\n .action((opts: { cwd: string; full?: boolean; fix?: boolean; strict?: boolean; json?: boolean }) => {\r\n const cwd = resolve(opts.cwd);\r\n const report = runDoctor({\r\n cwd,\r\n full: Boolean(opts.full),\r\n fix: Boolean(opts.fix),\r\n strict: Boolean(opts.strict),\r\n json: Boolean(opts.json),\r\n });\r\n\r\n if (opts.json) {\r\n console.log(formatJsonReport(report));\r\n } else {\r\n console.log(formatHumanReport(report, Boolean(opts.full)));\r\n }\r\n\r\n process.exit(report.exitCode);\r\n });\r\n\r\nconst addCmd = program.command('add').description('Install idia add-on packs');\r\n\r\naddCmd\r\n .command('storybook')\r\n .description('Install Storybook docs pack')\r\n .option('--repair', 'Refresh CLI-owned Storybook files')\r\n .option('--force', 'Overwrite conflicts (document risk)')\r\n .option('--skip-install', 'Skip package manager install')\r\n .option('--pm <manager>', 'Override package manager (pnpm|npm|yarn)')\r\n .option('--cwd <path>', 'App root directory', process.cwd())\r\n .action(\r\n (opts: {\r\n repair?: boolean;\r\n force?: boolean;\r\n skipInstall?: boolean;\r\n pm?: string;\r\n cwd: string;\r\n }) => {\r\n runAddStorybook({\r\n cwd: resolve(opts.cwd),\r\n repair: Boolean(opts.repair),\r\n force: Boolean(opts.force),\r\n skipInstall: Boolean(opts.skipInstall),\r\n pm: parsePm(opts.pm),\r\n });\r\n process.exit(0);\r\n },\r\n );\r\n\r\naddCmd\r\n .command('brain')\r\n .description('Install brain AI pack (Phase 4 — experimental)')\r\n .option('--repair', 'Re-apply rules, AGENTS block, and .idia/brain/ from pack')\r\n .option('--force', 'Overwrite conflicts (document risk)')\r\n .option('--pm <manager>', 'Override package manager (pnpm|npm|yarn)')\r\n .option('--cwd <path>', 'App root directory', process.cwd())\r\n .action((opts: { repair?: boolean; force?: boolean; pm?: string; cwd: string }) => {\r\n runAddBrain({\r\n cwd: resolve(opts.cwd),\r\n repair: Boolean(opts.repair),\r\n force: Boolean(opts.force),\r\n pm: parsePm(opts.pm),\r\n });\r\n });\r\n\r\naddCmd\r\n .argument('[target]', 'add-on target')\r\n .action((target: string | undefined) => {\r\n if (!target) {\r\n console.error('Usage: idia-ui add <storybook|brain>');\r\n process.exit(1);\r\n }\r\n runAddUnknown(target);\r\n });\r\n\r\nconst syncCmd = program\r\n .command('sync')\r\n .description('Sync installed pack versions and manifest');\r\n\r\nsyncCmd\r\n .argument('<target>', 'storybook | brain | all')\r\n .option('--force', 'Overwrite pack-owned files')\r\n .option('--pm <manager>', 'Override package manager (pnpm|npm|yarn)')\r\n .option('--cwd <path>', 'App root directory', process.cwd())\r\n .action((target: string, opts: { force?: boolean; pm?: string; cwd: string }) => {\r\n runSync(target, {\r\n cwd: resolve(opts.cwd),\r\n force: Boolean(opts.force),\r\n pm: parsePm(opts.pm),\r\n });\r\n });\r\n\r\nprogram.parse();\r\n\r\nfunction parsePm(value: string | undefined): 'pnpm' | 'npm' | 'yarn' | undefined {\r\n if (!value) return undefined;\r\n const normalized = value.toLowerCase();\r\n if (normalized === 'pnpm' || normalized === 'npm' || normalized === 'yarn') {\r\n return normalized;\r\n }\r\n console.error(`Invalid --pm value \"${value}\". Use pnpm, npm, or yarn.`);\r\n process.exit(1);\r\n}\r\n","import { mkdirSync, writeFileSync } from 'node:fs'\r\nimport { dirname, join } from 'node:path'\r\n\r\nimport {\r\n STORYBOOK_CLI_VERSION,\r\n STORYBOOK_DEV_DEPS,\r\n STORYBOOK_DOCS_VERSION,\r\n STORYBOOK_OWNED_FILES,\r\n STORYBOOK_PRESET_VERSION,\r\n} from './constants.js'\r\nimport { buttonStoriesTsx, storybookMainTs, storybookPreviewTsx } from './templates.js'\r\nimport type { PackageManager } from '../../utils/pm.js'\r\nimport { detectPackageManager } from '../../utils/pm.js'\r\nimport { readInstalledVersion, readPackageJson } from '../../utils/package-json.js'\r\nimport { fileExists, readTextFile } from '../../utils/fs.js'\r\nimport { runPmAddDevDeps } from '../../utils/exec.js'\r\nimport {\r\n CLI_VERSION,\r\n readManifest,\r\n writeManifest,\r\n} from '../../utils/manifest.js'\r\nimport type { IdiaManifest } from '../../types.js'\r\n\r\nexport type AddStorybookOptions = {\r\n cwd: string\r\n repair?: boolean\r\n force?: boolean\r\n pm?: PackageManager\r\n skipInstall?: boolean\r\n}\r\n\r\nexport type AddStorybookResult = {\r\n installed: boolean\r\n alreadyInstalled: boolean\r\n filesWritten: string[]\r\n warnings: string[]\r\n}\r\n\r\nfunction writeOwnedFile(cwd: string, relativePath: string, content: string, force: boolean): boolean {\r\n const fullPath = join(cwd, relativePath)\r\n if (fileExists(cwd, relativePath) && !force) {\r\n const existing = readTextFile(cwd, relativePath)\r\n if (existing === content) return false\r\n throw new Error(\r\n `Conflict: ${relativePath} exists with different content. Use --repair or --force.`,\r\n )\r\n }\r\n mkdirSync(dirname(fullPath), { recursive: true })\r\n writeFileSync(fullPath, content, 'utf8')\r\n return true\r\n}\r\n\r\nfunction parseDepSpec(spec: string): { name: string; range: string } {\r\n if (spec.startsWith('@')) {\r\n const at = spec.indexOf('@', 1)\r\n return { name: spec.slice(0, at), range: spec.slice(at + 1) }\r\n }\r\n const at = spec.indexOf('@')\r\n return { name: spec.slice(0, at), range: spec.slice(at + 1) }\r\n}\r\n\r\nfunction resolveDepVersion(name: string, range: string): string {\r\n if (name.startsWith('@idia-ui/storybook-docs')) {\r\n return `^${STORYBOOK_DOCS_VERSION}`\r\n }\r\n if (name.startsWith('@idia-ui/storybook-preset-react-native-web')) {\r\n return `^${STORYBOOK_PRESET_VERSION}`\r\n }\r\n return `^${range.replace(/^\\^/, '')}`\r\n}\r\n\r\nfunction addDevDependencies(cwd: string): void {\r\n const pkg = readPackageJson(cwd)\r\n if (!pkg) throw new Error('package.json not found')\r\n\r\n pkg.devDependencies ??= {}\r\n for (const spec of STORYBOOK_DEV_DEPS) {\r\n const { name, range } = parseDepSpec(spec)\r\n pkg.devDependencies[name] = resolveDepVersion(name, range)\r\n }\r\n\r\n pkg.scripts ??= {}\r\n pkg.scripts.storybook = 'storybook dev -p 6006'\r\n pkg.scripts['build-storybook'] = 'storybook build'\r\n\r\n writeFileSync(join(cwd, 'package.json'), `${JSON.stringify(pkg, null, 2)}\\n`, 'utf8')\r\n}\r\n\r\nfunction runPmInstall(cwd: string, pm: PackageManager): void {\r\n runPmAddDevDeps(cwd, pm, STORYBOOK_DEV_DEPS)\r\n}\r\n\r\nfunction resolveCoreVersion(cwd: string, pkg: NonNullable<ReturnType<typeof readPackageJson>>): string {\r\n const installed = readInstalledVersion(cwd, '@idia-ui/core')\r\n if (installed) return installed\r\n\r\n const declared = pkg.dependencies?.['@idia-ui/core'] ?? ''\r\n if (declared && !declared.startsWith('workspace')) {\r\n return declared.replace(/^[\\^~]/, '')\r\n }\r\n\r\n return '0.2.0'\r\n}\r\n\r\nfunction updateStorybookManifest(cwd: string, manifest: IdiaManifest, coreVersion: string): void {\r\n manifest.idiaCli = CLI_VERSION\r\n manifest.core = coreVersion\r\n manifest.features ??= {}\r\n manifest.features.storybook = {\r\n installed: new Date().toISOString(),\r\n storybookDocs: STORYBOOK_DOCS_VERSION,\r\n storybook: STORYBOOK_CLI_VERSION,\r\n preset: STORYBOOK_PRESET_VERSION,\r\n }\r\n writeManifest(cwd, manifest)\r\n}\r\n\r\nfunction isStorybookInstalled(cwd: string): boolean {\r\n return (\r\n fileExists(cwd, '.storybook/main.ts') &&\r\n Boolean(readPackageJson(cwd)?.devDependencies?.['@idia-ui/storybook-docs'])\r\n )\r\n}\r\n\r\nexport function runAddStorybook(options: AddStorybookOptions): AddStorybookResult {\r\n const { cwd, repair = false, force = false, skipInstall = false } = options\r\n const pm = options.pm ?? detectPackageManager(cwd)\r\n const warnings: string[] = []\r\n const filesWritten: string[] = []\r\n\r\n const pkg = readPackageJson(cwd)\r\n if (!pkg) {\r\n console.error('package.json not found — run from your app root')\r\n process.exit(1)\r\n }\r\n\r\n let manifest = readManifest(cwd)\r\n const coreVersion = resolveCoreVersion(cwd, pkg)\r\n if (!manifest) {\r\n manifest = { idiaCli: CLI_VERSION, core: coreVersion }\r\n warnings.push('Created .idia/manifest.json stub')\r\n } else {\r\n manifest.core = coreVersion\r\n }\r\n\r\n const alreadyInstalled = isStorybookInstalled(cwd)\r\n if (alreadyInstalled && !repair && !force) {\r\n console.log('Storybook already installed — idempotent skip (use --repair to refresh CLI-owned files)')\r\n updateStorybookManifest(cwd, manifest, coreVersion)\r\n return { installed: true, alreadyInstalled: true, filesWritten, warnings }\r\n }\r\n\r\n const ownedContent: Record<(typeof STORYBOOK_OWNED_FILES)[number], string> = {\r\n '.storybook/main.ts': storybookMainTs(),\r\n '.storybook/preview.tsx': storybookPreviewTsx(),\r\n 'src/stories/Button.stories.tsx': buttonStoriesTsx(),\r\n }\r\n\r\n for (const relativePath of STORYBOOK_OWNED_FILES) {\r\n if (repair || force || !fileExists(cwd, relativePath)) {\r\n const wrote = writeOwnedFile(cwd, relativePath, ownedContent[relativePath], force || repair)\r\n if (wrote) filesWritten.push(relativePath)\r\n }\r\n }\r\n\r\n addDevDependencies(cwd)\r\n\r\n if (!skipInstall) {\r\n console.log(`Installing Storybook devDependencies via ${pm}…`)\r\n runPmInstall(cwd, pm)\r\n } else {\r\n warnings.push('Skipped package manager install (--skip-install)')\r\n }\r\n\r\n updateStorybookManifest(cwd, manifest, coreVersion)\r\n\r\n console.log('\\n✓ Storybook add-on installed')\r\n console.log(` @idia-ui/storybook-docs@${STORYBOOK_DOCS_VERSION}`)\r\n console.log(` @idia-ui/storybook-preset-react-native-web@${STORYBOOK_PRESET_VERSION}`)\r\n console.log(' Run: pnpm storybook (or npm run storybook)')\r\n\r\n return { installed: true, alreadyInstalled, filesWritten, warnings }\r\n}\r\n","/** Version lockstep with @idia-ui/core minor (0.2.x). */\r\nexport const STORYBOOK_DOCS_VERSION = '0.2.0'\r\nexport const STORYBOOK_PRESET_VERSION = '0.2.2'\r\nexport const STORYBOOK_CLI_VERSION = '8.4.7'\r\n\r\nexport const STORYBOOK_DEV_DEPS = [\r\n 'storybook@^8.4.7',\r\n '@storybook/react@^8.4.7',\r\n '@storybook/react-vite@^8.4.7',\r\n '@storybook/addon-docs@^8.4.7',\r\n '@storybook/addon-a11y@^8.4.7',\r\n '@storybook/addon-links@^8.4.7',\r\n `@idia-ui/storybook-docs@${STORYBOOK_DOCS_VERSION}`,\r\n `@idia-ui/storybook-preset-react-native-web@${STORYBOOK_PRESET_VERSION}`,\r\n 'vite@^5.4.0',\r\n] as const\r\n\r\nexport const STORYBOOK_OWNED_FILES = [\r\n '.storybook/main.ts',\r\n '.storybook/preview.tsx',\r\n 'src/stories/Button.stories.tsx',\r\n] as const\r\n","export function storybookMainTs(): string {\r\n return `import type { StorybookConfig } from '@storybook/react-vite';\r\nimport { idiaStorybookMain } from '@idia-ui/storybook-preset-react-native-web';\r\n\r\nconst config: StorybookConfig = idiaStorybookMain({\r\n stories: ['../src/stories/**/*.stories.@(ts|tsx)'],\r\n staticDirs: ['../public'],\r\n});\r\n\r\nexport default config;\r\n`\r\n}\r\n\r\nexport function storybookPreviewTsx(): string {\r\n return `import React from 'react';\r\nimport type { Preview } from '@storybook/react';\r\nimport { AppProviders } from '../src/providers/AppProviders';\r\nimport '../global.css';\r\n\r\nconst preview: Preview = {\r\n decorators: [\r\n (Story) => (\r\n <AppProviders>\r\n <Story />\r\n </AppProviders>\r\n ),\r\n ],\r\n parameters: {\r\n layout: 'centered',\r\n controls: { expanded: true },\r\n },\r\n};\r\n\r\nexport default preview;\r\n`\r\n}\r\n\r\nexport function buttonStoriesTsx(): string {\r\n return `import type { Meta, StoryObj } from '@storybook/react';\r\nimport { Button } from '@idia-ui/core';\r\nimport { BrainDocSections } from '@idia-ui/storybook-docs';\r\n\r\nconst meta = {\r\n title: 'Components/Button',\r\n component: Button,\r\n tags: ['autodocs'],\r\n parameters: {\r\n docs: {\r\n page: () => (\r\n <>\r\n <BrainDocSections\r\n componentId=\"button\"\r\n sectionIds={['intent', 'usage', 'variants', 'accessibility']}\r\n />\r\n </>\r\n ),\r\n },\r\n },\r\n args: {\r\n label: 'Button',\r\n variant: 'primary',\r\n },\r\n} satisfies Meta<typeof Button>;\r\n\r\nexport default meta;\r\n\r\ntype Story = StoryObj<typeof meta>;\r\n\r\nexport const Playground: Story = {};\r\n`\r\n}\r\n","import { existsSync } from 'node:fs';\r\nimport { dirname, join } from 'node:path';\r\n\r\nexport type PackageManager = 'pnpm' | 'npm' | 'yarn';\r\n\r\nfunction findLockfileDir(start: string): string {\r\n let dir = start;\r\n while (true) {\r\n if (existsSync(join(dir, 'pnpm-lock.yaml'))) return dir;\r\n if (existsSync(join(dir, 'yarn.lock'))) return dir;\r\n if (existsSync(join(dir, 'package-lock.json'))) return dir;\r\n const parent = dirname(dir);\r\n if (parent === dir) return start;\r\n dir = parent;\r\n }\r\n}\r\n\r\nexport function detectPackageManager(cwd: string): PackageManager {\r\n const root = findLockfileDir(cwd);\r\n if (existsSync(join(root, 'pnpm-lock.yaml'))) return 'pnpm';\r\n if (existsSync(join(root, 'yarn.lock'))) return 'yarn';\r\n return 'npm';\r\n}\r\n\r\nexport function pmAddCommand(pm: PackageManager, packages: string[]): string {\r\n const list = packages.join(' ');\r\n switch (pm) {\r\n case 'pnpm':\r\n return `pnpm add ${list}`;\r\n case 'yarn':\r\n return `yarn add ${list}`;\r\n default:\r\n return `npm install ${list}`;\r\n }\r\n}\r\n\r\nexport function pmUpdateCommand(pm: PackageManager, packages: string[]): string {\r\n const list = packages.join(' ');\r\n switch (pm) {\r\n case 'pnpm':\r\n return `pnpm update ${list}`;\r\n case 'yarn':\r\n return `yarn upgrade ${list}`;\r\n default:\r\n return `npm update ${list}`;\r\n }\r\n}\r\n","import { readFileSync } from 'node:fs';\r\nimport { join } from 'node:path';\r\n\r\nimport type { PackageJson } from '../types.js';\r\n\r\nexport function readPackageJson(cwd: string): PackageJson | null {\r\n try {\r\n const raw = readFileSync(join(cwd, 'package.json'), 'utf8');\r\n return JSON.parse(raw) as PackageJson;\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nexport function getDepVersion(\r\n pkg: PackageJson,\r\n name: string,\r\n): string | undefined {\r\n return pkg.dependencies?.[name] ?? pkg.devDependencies?.[name];\r\n}\r\n\r\nexport function readInstalledVersion(cwd: string, name: string): string | null {\r\n try {\r\n const pkgPath = join(cwd, 'node_modules', name, 'package.json');\r\n const raw = readFileSync(pkgPath, 'utf8');\r\n const parsed = JSON.parse(raw) as { version?: string };\r\n return parsed.version ?? null;\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nexport function readPeerRange(\r\n cwd: string,\r\n packageName: string,\r\n peerName: string,\r\n): string | null {\r\n try {\r\n const pkgPath = join(cwd, 'node_modules', packageName, 'package.json');\r\n const raw = readFileSync(pkgPath, 'utf8');\r\n const parsed = JSON.parse(raw) as {\r\n peerDependencies?: Record<string, string>;\r\n };\r\n return parsed.peerDependencies?.[peerName] ?? null;\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nexport function listIdiaPackages(pkg: PackageJson): string[] {\r\n const names = new Set<string>();\r\n for (const deps of [pkg.dependencies, pkg.devDependencies]) {\r\n if (!deps) continue;\r\n for (const name of Object.keys(deps)) {\r\n if (name.startsWith('@idia-ui/')) names.add(name);\r\n }\r\n }\r\n return [...names].sort();\r\n}\r\n","import { existsSync, readFileSync, readdirSync, statSync } from 'node:fs';\r\nimport { join } from 'node:path';\r\n\r\nimport semver from 'semver';\r\n\r\nexport function satisfiesRange(version: string, range: string): boolean {\r\n const cleaned = version.replace(/^[\\^~>=<]*/, '').split(' ')[0] ?? version;\r\n if (range === 'workspace:*' || range.startsWith('file:')) return true;\r\n const coerced = semver.coerce(cleaned);\r\n if (!coerced) return false;\r\n return semver.satisfies(coerced, range, { includePrerelease: true });\r\n}\r\n\r\nexport function getMinor(version: string): string | null {\r\n const coerced = semver.coerce(version);\r\n if (!coerced) return null;\r\n return `${coerced.major}.${coerced.minor}`;\r\n}\r\n\r\nexport function readTextFile(cwd: string, relativePath: string): string | null {\r\n try {\r\n return readFileSync(join(cwd, relativePath), 'utf8');\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nexport function fileExists(cwd: string, relativePath: string): boolean {\r\n try {\r\n return existsSync(join(cwd, relativePath));\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\nexport function grepSrcForPattern(cwd: string, pattern: RegExp): boolean {\r\n const filesToScan = [\r\n 'App.tsx',\r\n 'src/providers/AppProviders.tsx',\r\n ];\r\n\r\n for (const file of filesToScan) {\r\n const content = readTextFile(cwd, file);\r\n if (content && pattern.test(content)) return true;\r\n }\r\n\r\n const srcRoot = join(cwd, 'src');\r\n try {\r\n const walk = (dir: string): boolean => {\r\n for (const entry of readdirSync(dir)) {\r\n const full = join(dir, entry);\r\n const stat = statSync(full);\r\n if (stat.isDirectory()) {\r\n if (walk(full)) return true;\r\n } else if (/\\.(tsx?|jsx?)$/.test(entry)) {\r\n const content = readFileSync(full, 'utf8');\r\n if (pattern.test(content)) return true;\r\n }\r\n }\r\n return false;\r\n };\r\n if (existsSync(srcRoot)) return walk(srcRoot);\r\n } catch {\r\n // ignore walk errors\r\n }\r\n\r\n return false;\r\n}\r\n","import { spawnSync } from 'node:child_process';\r\n\r\nimport type { PackageManager } from './pm.js';\r\n\r\n/** Windows: shell:true so pnpm/npm resolve correctly; normalize null status when no spawn error. */\r\nfunction pmExitCode(result: ReturnType<typeof spawnSync>): number {\r\n if (result.error) return 1;\r\n return result.status ?? 0;\r\n}\r\n\r\nexport function spawnPm(\r\n pm: PackageManager,\r\n args: string[],\r\n cwd: string,\r\n): ReturnType<typeof spawnSync> {\r\n const isWin = process.platform === 'win32';\r\n return spawnSync(pm, args, {\r\n cwd,\r\n stdio: 'inherit',\r\n shell: isWin,\r\n windowsHide: isWin,\r\n });\r\n}\r\n\r\nexport function runPmInstall(cwd: string, pm: PackageManager): void {\r\n const result = spawnPm(pm, installArgs(pm), cwd);\r\n if (pmExitCode(result) !== 0) {\r\n throw new Error(`${pm} install failed (exit ${pmExitCode(result)})`);\r\n }\r\n}\r\n\r\nexport function runPmAddDev(\r\n cwd: string,\r\n pm: PackageManager,\r\n packageSpec: string,\r\n): void {\r\n const result = spawnPm(pm, addDevArgs(pm, packageSpec), cwd);\r\n if (pmExitCode(result) !== 0) {\r\n throw new Error(`${pm} add failed for ${packageSpec} (exit ${pmExitCode(result)})`);\r\n }\r\n}\r\n\r\nexport function runPmAddDevDeps(\r\n cwd: string,\r\n pm: PackageManager,\r\n packages: readonly string[],\r\n): void {\r\n const result = spawnPm(pm, addDevArgsMulti(pm, packages), cwd);\r\n if (pmExitCode(result) !== 0) {\r\n throw new Error(`${pm} add failed (exit ${pmExitCode(result)})`);\r\n }\r\n}\r\n\r\nfunction installArgs(pm: PackageManager): string[] {\r\n switch (pm) {\r\n case 'pnpm':\r\n return ['install'];\r\n case 'yarn':\r\n return ['install'];\r\n default:\r\n return ['install'];\r\n }\r\n}\r\n\r\nfunction addDevArgs(pm: PackageManager, packageSpec: string): string[] {\r\n return addDevArgsMulti(pm, [packageSpec]);\r\n}\r\n\r\nfunction addDevArgsMulti(pm: PackageManager, packages: readonly string[]): string[] {\r\n switch (pm) {\r\n case 'pnpm':\r\n return ['add', '-D', ...packages];\r\n case 'yarn':\r\n return ['add', '-D', ...packages];\r\n default:\r\n return ['install', '-D', ...packages];\r\n }\r\n}\r\n","import { readFileSync, writeFileSync, mkdirSync } from 'node:fs';\r\nimport { dirname, join } from 'node:path';\r\n\r\nimport type { IdiaManifest } from '../types.js';\r\nimport { fileExists } from './fs.js';\r\n\r\nconst CLI_VERSION = '0.2.3';\r\n\r\nexport function readManifest(cwd: string): IdiaManifest | null {\r\n try {\r\n const raw = readFileSync(join(cwd, '.idia', 'manifest.json'), 'utf8');\r\n return JSON.parse(raw) as IdiaManifest;\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nexport function writeManifest(cwd: string, manifest: IdiaManifest): void {\r\n const manifestPath = join(cwd, '.idia', 'manifest.json');\r\n mkdirSync(dirname(manifestPath), { recursive: true });\r\n writeFileSync(manifestPath, `${JSON.stringify(manifest, null, 2)}\\n`, 'utf8');\r\n}\r\n\r\nexport function regenerateManifest(\r\n cwd: string,\r\n coreVersion: string,\r\n): { created: boolean; path: string } {\r\n const manifestPath = join(cwd, '.idia', 'manifest.json');\r\n const manifest: IdiaManifest = {\r\n idiaCli: CLI_VERSION,\r\n core: coreVersion,\r\n };\r\n writeManifest(cwd, manifest);\r\n return { created: true, path: manifestPath };\r\n}\r\n\r\nexport function manifestExists(cwd: string): boolean {\r\n return fileExists(cwd, '.idia/manifest.json');\r\n}\r\n\r\nexport function validateManifestShape(manifest: IdiaManifest): boolean {\r\n return (\r\n typeof manifest.idiaCli === 'string' &&\r\n typeof manifest.core === 'string' &&\r\n /^\\d+\\.\\d+\\.\\d+/.test(manifest.idiaCli) &&\r\n /^\\d+\\.\\d+\\.\\d+/.test(manifest.core)\r\n );\r\n}\r\n\r\nexport { CLI_VERSION };\r\n","import { cpSync, existsSync, mkdirSync, readdirSync, statSync } from 'node:fs';\r\nimport { join } from 'node:path';\r\n\r\nimport { patchRootAgentsMd } from './agents-patch.js';\r\nimport {\r\n BRAIN_PACK_NAME,\r\n BRAIN_PACK_VERSION,\r\n BRAIN_TIER_DISCLAIMER,\r\n} from './constants.js';\r\nimport {\r\n brainPackSpecForApp,\r\n readBrainPackManifest,\r\n resolveBrainPackRoot,\r\n} from './pack.js';\r\nimport { runPmAddDev, runPmInstall } from '../utils/exec.js';\r\nimport { fileExists } from '../utils/fs.js';\r\nimport { readInstalledVersion, readPackageJson } from '../utils/package-json.js';\r\nimport { detectPackageManager } from '../utils/pm.js';\r\nimport { readManifest, writeManifest, CLI_VERSION } from '../utils/manifest.js';\r\nimport type { IdiaManifest } from '../types.js';\r\n\r\nexport type BrainInstallOptions = {\r\n cwd: string;\r\n repair?: boolean;\r\n force?: boolean;\r\n pm?: 'pnpm' | 'npm' | 'yarn';\r\n skipInstall?: boolean;\r\n};\r\n\r\nexport type BrainInstallResult = {\r\n alreadyInstalled: boolean;\r\n packRoot: string;\r\n sourceHash: string;\r\n agentsPatch: ReturnType<typeof patchRootAgentsMd>;\r\n};\r\n\r\nfunction copyDirRecursive(src: string, dest: string, force: boolean): void {\r\n mkdirSync(dest, { recursive: true });\r\n for (const entry of readdirSync(src)) {\r\n const srcPath = join(src, entry);\r\n const destPath = join(dest, entry);\r\n const stat = statSync(srcPath);\r\n if (stat.isDirectory()) {\r\n copyDirRecursive(srcPath, destPath, force);\r\n } else {\r\n if (!force && existsSync(destPath)) continue;\r\n cpSync(srcPath, destPath);\r\n }\r\n }\r\n}\r\n\r\nfunction ensureBrainPackDependency(\r\n cwd: string,\r\n pm: 'pnpm' | 'npm' | 'yarn',\r\n skipInstall: boolean,\r\n): void {\r\n const pkg = readPackageJson(cwd);\r\n if (!pkg) throw new Error('package.json not found');\r\n\r\n const spec = brainPackSpecForApp(cwd);\r\n const existing = pkg.devDependencies?.[BRAIN_PACK_NAME];\r\n if (existing === spec || existing === BRAIN_PACK_VERSION) {\r\n if (!skipInstall && !existsSync(join(cwd, 'node_modules', BRAIN_PACK_NAME))) {\r\n runPmInstall(cwd, pm);\r\n }\r\n return;\r\n }\r\n\r\n if (!skipInstall) {\r\n runPmAddDev(cwd, pm, `${BRAIN_PACK_NAME}@${spec}`);\r\n }\r\n}\r\n\r\nfunction isBrainInstalled(cwd: string, manifest: IdiaManifest | null): boolean {\r\n const hasAgents = fileExists(cwd, '.idia/brain/AGENTS.md');\r\n const hasFeature = Boolean(manifest?.features?.brain?.brainPack);\r\n return hasAgents && hasFeature;\r\n}\r\n\r\nexport function installBrainPack(options: BrainInstallOptions): BrainInstallResult {\r\n const { cwd, repair = false, force = false, skipInstall = false } = options;\r\n const pm = options.pm ?? detectPackageManager(cwd);\r\n const manifest = readManifest(cwd);\r\n\r\n if (isBrainInstalled(cwd, manifest) && !repair && !force) {\r\n const packRoot = resolveBrainPackRoot(cwd);\r\n if (packRoot) {\r\n const packManifest = readBrainPackManifest(packRoot);\r\n return {\r\n alreadyInstalled: true,\r\n packRoot,\r\n sourceHash: packManifest?.sourceHash ?? '',\r\n agentsPatch: { status: 'merged' },\r\n };\r\n }\r\n }\r\n\r\n ensureBrainPackDependency(cwd, pm, skipInstall);\r\n\r\n const packRoot = resolveBrainPackRoot(cwd);\r\n if (!packRoot) {\r\n throw new Error(\r\n `${BRAIN_PACK_NAME} not found. Run ${pm} add -D ${BRAIN_PACK_NAME} and retry.`,\r\n );\r\n }\r\n\r\n const packManifest = readBrainPackManifest(packRoot);\r\n if (!packManifest?.sourceHash) {\r\n throw new Error(`${BRAIN_PACK_NAME} pack-manifest.json missing or invalid.`);\r\n }\r\n\r\n const brainSrc = join(packRoot, 'brain');\r\n const rulesSrc = join(packRoot, 'cursor-rules');\r\n const brainDest = join(cwd, '.idia', 'brain');\r\n const rulesDest = join(cwd, '.cursor', 'rules');\r\n\r\n copyDirRecursive(brainSrc, brainDest, force || repair);\r\n mkdirSync(rulesDest, { recursive: true });\r\n copyDirRecursive(rulesSrc, rulesDest, force || repair);\r\n\r\n const agentsPatch = patchRootAgentsMd(cwd, { repair, force });\r\n\r\n const coreVersion =\r\n readInstalledVersion(cwd, '@idia-ui/core') ??\r\n manifest?.core ??\r\n packManifest.core;\r\n\r\n const nextManifest: IdiaManifest = {\r\n idiaCli: manifest?.idiaCli ?? CLI_VERSION,\r\n core: coreVersion,\r\n features: {\r\n ...manifest?.features,\r\n brain: {\r\n installed: new Date().toISOString(),\r\n brainPack: packManifest.brainPack,\r\n sourceHash: packManifest.sourceHash,\r\n },\r\n },\r\n };\r\n writeManifest(cwd, nextManifest);\r\n\r\n return {\r\n alreadyInstalled: false,\r\n packRoot,\r\n sourceHash: packManifest.sourceHash,\r\n agentsPatch,\r\n };\r\n}\r\n\r\nexport function printBrainInstallSummary(result: BrainInstallResult): void {\r\n if (result.alreadyInstalled) {\r\n console.log('✓ brain pack already installed');\r\n console.log(` .idia/brain/AGENTS.md`);\r\n console.log(` sourceHash: ${result.sourceHash || '(unknown)'}`);\r\n console.log('');\r\n console.log(BRAIN_TIER_DISCLAIMER);\r\n return;\r\n }\r\n\r\n console.log('✓ brain pack installed to .idia/brain/');\r\n console.log('✓ cursor rules copied to .cursor/rules/idia-ui-*.mdc');\r\n\r\n switch (result.agentsPatch.status) {\r\n case 'created':\r\n console.log('✓ AGENTS.md created with idia-ui brain block');\r\n break;\r\n case 'merged':\r\n console.log('✓ AGENTS.md updated with idia-ui brain block');\r\n break;\r\n case 'replaced':\r\n console.log('✓ AGENTS.md brain block repaired');\r\n break;\r\n case 'conflict':\r\n console.warn(\r\n `⚠ AGENTS.md conflict — wrote suggested patch: ${result.agentsPatch.patchPath}`,\r\n );\r\n console.warn(' Run idia-ui add brain --repair --force to overwrite.');\r\n break;\r\n }\r\n\r\n console.log(` sourceHash: ${result.sourceHash}`);\r\n console.log('');\r\n console.log(BRAIN_TIER_DISCLAIMER);\r\n}\r\n","import { mkdirSync, writeFileSync } from 'node:fs';\r\nimport { dirname, join } from 'node:path';\r\n\r\nimport {\r\n AGENTS_BEGIN,\r\n AGENTS_BRAIN_BLOCK,\r\n AGENTS_END,\r\n} from './constants.js';\r\nimport { readTextFile } from '../utils/fs.js';\r\n\r\nexport type AgentsPatchResult =\r\n | { status: 'created' | 'merged' | 'replaced' }\r\n | { status: 'conflict'; patchPath: string };\r\n\r\nexport function patchRootAgentsMd(\r\n cwd: string,\r\n options: { repair?: boolean; force?: boolean },\r\n): AgentsPatchResult {\r\n const agentsPath = join(cwd, 'AGENTS.md');\r\n const existing = readTextFile(cwd, 'AGENTS.md');\r\n\r\n if (existing === null) {\r\n writeFileSync(agentsPath, `${AGENTS_BRAIN_BLOCK}\\n`, 'utf8');\r\n return { status: 'created' };\r\n }\r\n\r\n const hasBegin = existing.includes(AGENTS_BEGIN);\r\n const hasEnd = existing.includes(AGENTS_END);\r\n\r\n if (hasBegin && hasEnd) {\r\n if (!options.repair && !options.force) {\r\n return { status: 'merged' };\r\n }\r\n const updated = existing.replace(\r\n new RegExp(`${escapeRegExp(AGENTS_BEGIN)}[\\\\s\\\\S]*?${escapeRegExp(AGENTS_END)}`),\r\n AGENTS_BRAIN_BLOCK,\r\n );\r\n if (updated === existing && !options.force) {\r\n return { status: 'merged' };\r\n }\r\n writeFileSync(agentsPath, updated, 'utf8');\r\n return { status: 'replaced' };\r\n }\r\n\r\n if (hasBegin !== hasEnd) {\r\n if (options.force) {\r\n const withoutPartial = existing\r\n .replace(new RegExp(`${escapeRegExp(AGENTS_BEGIN)}[\\\\s\\\\S]*`), '')\r\n .replace(AGENTS_END, '');\r\n writeFileSync(\r\n agentsPath,\r\n `${withoutPartial.trimEnd()}\\n\\n${AGENTS_BRAIN_BLOCK}\\n`,\r\n 'utf8',\r\n );\r\n return { status: 'replaced' };\r\n }\r\n return writeConflictPatch(cwd, existing);\r\n }\r\n\r\n writeFileSync(agentsPath, `${existing.trimEnd()}\\n\\n${AGENTS_BRAIN_BLOCK}\\n`, 'utf8');\r\n return { status: 'merged' };\r\n}\r\n\r\nfunction writeConflictPatch(cwd: string, existing: string): AgentsPatchResult {\r\n const patchDir = join(cwd, '.idia', 'patches');\r\n mkdirSync(patchDir, { recursive: true });\r\n const patchPath = join(patchDir, 'AGENTS.md.patch');\r\n const patchBody = [\r\n '# AGENTS.md brain block patch (idia-ui add brain)',\r\n '# Apply manually or run: idia-ui add brain --repair --force',\r\n '',\r\n AGENTS_BRAIN_BLOCK,\r\n '',\r\n '# --- existing AGENTS.md preserved below ---',\r\n '',\r\n existing,\r\n ].join('\\n');\r\n writeFileSync(patchPath, patchBody, 'utf8');\r\n return { status: 'conflict', patchPath };\r\n}\r\n\r\nfunction escapeRegExp(value: string): string {\r\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\r\n}\r\n","export const BRAIN_PACK_NAME = '@idia-ui/brain-pack';\r\nexport const BRAIN_PACK_VERSION = '0.2.0';\r\n\r\nexport const BRAIN_TIER_DISCLAIMER =\r\n '@idia-ui/brain-pack is a generated AI retrieval pack for idia-ui usage guidance. It does not imply Tier 1 passive external-agent graduation, GA readiness, or full-catalog efficacy.';\r\n\r\nexport const BRAIN_DOCTOR_DISCLAIMER =\r\n 'brain pack is experimental retrieval guidance; it does not imply Tier 1P graduation';\r\n\r\nexport const AGENTS_BEGIN = '<!-- idia-ui brain:begin -->';\r\nexport const AGENTS_END = '<!-- idia-ui brain:end -->';\r\n\r\nexport const AGENTS_BRAIN_BLOCK = `${AGENTS_BEGIN}\r\n## idia-ui design-system brain\r\n\r\nFor idia-ui component usage, design-system documentation, Storybook docs, UI generation, or AI-guided UI work, read:\r\n\r\n\\`.idia/brain/AGENTS.md\\`\r\n\r\nbefore using idia-ui components.\r\n\r\nThis installed brain pack is read-only generated guidance. Do not edit files under \\`.idia/brain/\\` directly.\r\n${AGENTS_END}`;\r\n","import { existsSync, readFileSync } from 'node:fs';\r\nimport { createRequire } from 'node:module';\r\nimport { dirname, join } from 'node:path';\r\n\r\nimport { BRAIN_PACK_NAME } from './constants.js';\r\n\r\nexport type BrainPackManifest = {\r\n brainPack: string;\r\n core: string;\r\n sourceHash: string;\r\n coverage?: Record<string, unknown>;\r\n tierClaims?: Record<string, string>;\r\n};\r\n\r\nexport function resolveBrainPackRoot(cwd: string): string | null {\r\n const local = join(cwd, 'node_modules', BRAIN_PACK_NAME);\r\n if (existsSync(join(local, 'pack-manifest.json'))) return local;\r\n\r\n try {\r\n const require = createRequire(join(cwd, 'package.json'));\r\n const pkgJson = require.resolve(`${BRAIN_PACK_NAME}/package.json`);\r\n return dirname(pkgJson);\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nexport function readBrainPackManifest(packRoot: string): BrainPackManifest | null {\r\n try {\r\n const raw = readFileSync(join(packRoot, 'pack-manifest.json'), 'utf8');\r\n return JSON.parse(raw) as BrainPackManifest;\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nexport function brainPackSpecForApp(cwd: string): string {\r\n try {\r\n const pkgPath = join(cwd, 'package.json');\r\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf8')) as {\r\n dependencies?: Record<string, string>;\r\n devDependencies?: Record<string, string>;\r\n };\r\n const deps = { ...pkg.dependencies, ...pkg.devDependencies };\r\n const usesWorkspace = Object.values(deps).some((v) => v === 'workspace:*');\r\n if (usesWorkspace) return 'workspace:*';\r\n } catch {\r\n // fall through\r\n }\r\n return '^0.2.0';\r\n}\r\n\r\nexport function readInstalledPackManifest(\r\n cwd: string,\r\n packageName: string,\r\n manifestFile = 'pack-manifest.json',\r\n): { sourceHash?: string } | null {\r\n try {\r\n const raw = readFileSync(\r\n join(cwd, 'node_modules', packageName, manifestFile),\r\n 'utf8',\r\n );\r\n return JSON.parse(raw) as { sourceHash?: string };\r\n } catch {\r\n return null;\r\n }\r\n}\r\n","export { runAddStorybook } from './storybook/add.js';\r\nexport type { AddStorybookOptions } from './storybook/add.js';\r\n\r\nimport { installBrainPack, printBrainInstallSummary } from '../brain/install.js';\r\nimport { BRAIN_TIER_DISCLAIMER } from '../brain/constants.js';\r\n\r\nexport type AddBrainOptions = {\r\n cwd: string;\r\n repair?: boolean;\r\n force?: boolean;\r\n pm?: 'pnpm' | 'npm' | 'yarn';\r\n};\r\n\r\nexport function runAddBrain(options: AddBrainOptions): void {\r\n try {\r\n const result = installBrainPack({\r\n cwd: options.cwd,\r\n repair: options.repair,\r\n force: options.force,\r\n pm: options.pm,\r\n });\r\n printBrainInstallSummary(result);\r\n\r\n if (result.agentsPatch.status === 'conflict') {\r\n process.exit(1);\r\n }\r\n } catch (error) {\r\n console.error(error instanceof Error ? error.message : String(error));\r\n console.error(BRAIN_TIER_DISCLAIMER);\r\n process.exit(1);\r\n }\r\n}\r\n\r\nexport function runAddUnknown(target: string): never {\r\n console.error(`Unknown add target: ${target}`);\r\n console.error('Available: storybook, brain');\r\n process.exit(1);\r\n}\r\n","import { readFileSync, readdirSync } from 'node:fs';\r\nimport { join } from 'node:path';\r\n\r\nimport type { CheckResult } from '../types.js';\r\nimport { BRAIN_DOCTOR_DISCLAIMER } from '../brain/constants.js';\r\nimport {\r\n readBrainPackManifest,\r\n readInstalledPackManifest,\r\n resolveBrainPackRoot,\r\n} from '../brain/pack.js';\r\nimport { fileExists, getMinor, readTextFile } from '../utils/fs.js';\r\nimport { readInstalledVersion } from '../utils/package-json.js';\r\nimport { readManifest } from '../utils/manifest.js';\r\n\r\nfunction readCoverageManifest(cwd: string): {\r\n components?: Record<string, { coverage?: string }>;\r\n} | null {\r\n try {\r\n const raw = readFileSync(\r\n join(cwd, 'node_modules/@idia-ui/storybook-docs/fragments/coverage-manifest.json'),\r\n 'utf8',\r\n );\r\n return JSON.parse(raw) as { components?: Record<string, { coverage?: string }> };\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nfunction listStoryComponentIds(cwd: string): string[] {\r\n const storiesDir = join(cwd, 'src/stories');\r\n const ids = new Set<string>();\r\n\r\n try {\r\n for (const file of readdirSync(storiesDir)) {\r\n const match = file.match(/^([A-Za-z]+)\\.stories\\.(tsx?|jsx?)$/);\r\n if (match) {\r\n ids.add(match[1].toLowerCase());\r\n }\r\n }\r\n } catch {\r\n return [];\r\n }\r\n\r\n return [...ids].sort();\r\n}\r\n\r\nexport function runStorybookChecks(cwd: string): CheckResult[] {\r\n const hasPreview = fileExists(cwd, '.storybook/preview.tsx');\r\n const storybookDocs = fileExists(\r\n cwd,\r\n 'node_modules/@idia-ui/storybook-docs/package.json',\r\n );\r\n\r\n if (!hasPreview && !storybookDocs) {\r\n return [\r\n {\r\n id: 'S1',\r\n status: 'info',\r\n message: 'Storybook not installed — skipping S* checks',\r\n },\r\n {\r\n id: 'S2',\r\n status: 'skip',\r\n message: '@idia-ui/storybook-docs not installed',\r\n },\r\n {\r\n id: 'S3',\r\n status: 'skip',\r\n message: 'storybook fragment manifest not available',\r\n },\r\n ];\r\n }\r\n\r\n const results: CheckResult[] = [];\r\n\r\n const preview = readTextFile(cwd, '.storybook/preview.tsx');\r\n const importsTamagui =\r\n preview !== null &&\r\n (/tamagui\\.config/.test(preview) || /AppProviders/.test(preview));\r\n\r\n if (importsTamagui) {\r\n results.push({\r\n id: 'S1',\r\n status: 'pass',\r\n message: '.storybook/preview.tsx wires AppProviders (shared token parity)',\r\n });\r\n } else {\r\n results.push({\r\n id: 'S1',\r\n status: 'fail',\r\n message: '.storybook/preview.tsx missing AppProviders / tamagui.config wiring',\r\n fixHint: 'idia-ui add storybook --repair',\r\n });\r\n }\r\n\r\n const docsVersion = readInstalledVersion(cwd, '@idia-ui/storybook-docs');\r\n const coreVersion = readInstalledVersion(cwd, '@idia-ui/core');\r\n const docsMinor = docsVersion ? getMinor(docsVersion) : null;\r\n const coreMinor = coreVersion ? getMinor(coreVersion) : null;\r\n\r\n if (!storybookDocs) {\r\n results.push({\r\n id: 'S2',\r\n status: 'warn',\r\n message: '@idia-ui/storybook-docs not installed',\r\n fixHint: 'idia-ui add storybook',\r\n });\r\n } else if (docsMinor && coreMinor && docsMinor === coreMinor) {\r\n results.push({\r\n id: 'S2',\r\n status: 'pass',\r\n message: `@idia-ui/storybook-docs@${docsVersion} matches @idia-ui/core@${coreVersion} minor`,\r\n });\r\n } else {\r\n results.push({\r\n id: 'S2',\r\n status: 'warn',\r\n message: `storybook-docs minor (${docsMinor ?? 'unknown'}) ≠ core minor (${coreMinor ?? 'unknown'})`,\r\n fixHint: 'idia-ui sync storybook',\r\n });\r\n }\r\n\r\n const coverage = readCoverageManifest(cwd);\r\n const coveredIds = coverage?.components ? Object.keys(coverage.components) : [];\r\n const storyIds = listStoryComponentIds(cwd);\r\n const uncovered = storyIds.filter((id) => !coveredIds.includes(id));\r\n\r\n if (!coverage) {\r\n results.push({\r\n id: 'S3',\r\n status: 'warn',\r\n message: 'coverage manifest not readable',\r\n fixHint: 'idia-ui sync storybook',\r\n });\r\n } else if (uncovered.length === 0) {\r\n results.push({\r\n id: 'S3',\r\n status: 'pass',\r\n message:\r\n coveredIds.length > 0\r\n ? `fragment manifest covers ${coveredIds.length} Wave 1 components; story files aligned`\r\n : 'fragment manifest present; no src/stories/ files to cross-ref',\r\n });\r\n if (coveredIds.length > 0 && coveredIds.length < 10) {\r\n results.push({\r\n id: 'S3-info',\r\n status: 'info',\r\n message: `storybook-docs pack has doc fragments for ${coveredIds.length} components. Other components render without brain prose.`,\r\n });\r\n }\r\n } else {\r\n results.push({\r\n id: 'S3',\r\n status: 'warn',\r\n message: `stories without fragments: ${uncovered.join(', ')}`,\r\n fixHint: 'upgrade @idia-ui/storybook-docs or remove uncovered stories',\r\n });\r\n }\r\n\r\n const manifest = readManifest(cwd);\r\n if (storybookDocs && !manifest?.features?.storybook) {\r\n results.push({\r\n id: 'S-manifest',\r\n status: 'warn',\r\n message: 'manifest features.storybook missing',\r\n fixHint: 'idia-ui sync storybook',\r\n });\r\n }\r\n\r\n return results;\r\n}\r\n\r\nfunction readStorybookDocsSourceHash(cwd: string): string | null {\r\n return (\r\n readInstalledPackManifest(\r\n cwd,\r\n '@idia-ui/storybook-docs',\r\n 'fragments/coverage-manifest.json',\r\n )?.sourceHash ??\r\n readInstalledPackManifest(cwd, '@idia-ui/storybook-docs', 'coverage-manifest.json')\r\n ?.sourceHash ??\r\n readInstalledPackManifest(cwd, '@idia-ui/storybook-docs')?.sourceHash ??\r\n null\r\n );\r\n}\r\n\r\nfunction readPackSourceHash(cwd: string, packageName: string): string | null {\r\n if (packageName === '@idia-ui/storybook-docs') {\r\n return readStorybookDocsSourceHash(cwd);\r\n }\r\n return readInstalledPackManifest(cwd, packageName)?.sourceHash ?? null;\r\n}\r\n\r\nexport function runBrainChecks(cwd: string): CheckResult[] {\r\n const brainPackInstalled = fileExists(\r\n cwd,\r\n 'node_modules/@idia-ui/brain-pack/package.json',\r\n );\r\n const brainAgents = fileExists(cwd, '.idia/brain/AGENTS.md');\r\n const rootAgents = readTextFile(cwd, 'AGENTS.md');\r\n const hasBrainBlock =\r\n rootAgents !== null &&\r\n /idia-ui brain:begin/.test(rootAgents) &&\r\n /idia-ui brain:end/.test(rootAgents);\r\n\r\n if (!brainPackInstalled && !brainAgents) {\r\n return [\r\n {\r\n id: 'B1',\r\n status: 'warn',\r\n message: 'brain pack not installed',\r\n fixHint: 'Run idia-ui add brain',\r\n },\r\n {\r\n id: 'B2',\r\n status: 'skip',\r\n message: 'AGENTS.md brain block not present',\r\n },\r\n {\r\n id: 'B3',\r\n status: 'skip',\r\n message: 'brain sourceHash coupling not checked',\r\n },\r\n {\r\n id: 'B4',\r\n status: 'skip',\r\n message: 'brain/storybook hash coupling not checked',\r\n },\r\n ];\r\n }\r\n\r\n const results: CheckResult[] = [];\r\n const manifest = readManifest(cwd);\r\n const manifestHash = manifest?.features?.brain?.sourceHash as string | undefined;\r\n const packRoot = resolveBrainPackRoot(cwd);\r\n const packManifest = packRoot ? readBrainPackManifest(packRoot) : null;\r\n const packHash = packManifest?.sourceHash;\r\n\r\n results.push({\r\n id: 'B1',\r\n status: brainAgents ? 'pass' : 'warn',\r\n message: brainAgents\r\n ? '✓ brain pack installed'\r\n : '.idia/brain/AGENTS.md missing',\r\n fixHint: brainAgents ? undefined : 'idia-ui add brain',\r\n });\r\n\r\n results.push({\r\n id: 'B2',\r\n status: hasBrainBlock ? 'pass' : 'warn',\r\n message: hasBrainBlock\r\n ? 'root AGENTS.md contains idia-ui brain block'\r\n : 'root AGENTS.md missing idia-ui brain:begin/end block',\r\n fixHint: hasBrainBlock ? undefined : 'idia-ui add brain --repair',\r\n });\r\n\r\n if (manifestHash && packHash && manifestHash === packHash) {\r\n results.push({\r\n id: 'B3',\r\n status: 'pass',\r\n message: 'manifest sourceHash matches installed brain pack',\r\n });\r\n } else if (manifestHash && packHash) {\r\n results.push({\r\n id: 'B3',\r\n status: 'warn',\r\n message: 'manifest sourceHash drifted from brain pack pin',\r\n fixHint: 'idia-ui sync brain',\r\n });\r\n } else {\r\n results.push({\r\n id: 'B3',\r\n status: 'warn',\r\n message: 'manifest sourceHash missing or brain pack not resolved',\r\n fixHint: 'idia-ui sync brain',\r\n });\r\n }\r\n\r\n const storybookHash = readStorybookDocsSourceHash(cwd);\r\n const storybookDocsInstalled = fileExists(\r\n cwd,\r\n 'node_modules/@idia-ui/storybook-docs/package.json',\r\n );\r\n if (!storybookDocsInstalled) {\r\n results.push({\r\n id: 'B4',\r\n status: 'skip',\r\n message: 'storybook-docs not installed — B4 hash coupling skipped',\r\n });\r\n } else if (!storybookHash) {\r\n results.push({\r\n id: 'B4',\r\n status: 'warn',\r\n message: 'storybook-docs installed but coverage-manifest sourceHash not readable',\r\n fixHint: 'idia-ui sync storybook',\r\n });\r\n } else if (packHash && storybookHash === packHash) {\r\n results.push({\r\n id: 'B4',\r\n status: 'pass',\r\n message: 'brain pack and storybook-docs share sourceHash (same generate run)',\r\n });\r\n } else {\r\n results.push({\r\n id: 'B4',\r\n status: 'warn',\r\n message:\r\n 'brain pack and storybook-docs sourceHash skew (expected when packs were published separately at the same minor — run idia-ui sync all to align)',\r\n fixHint: 'idia-ui sync all',\r\n });\r\n }\r\n\r\n results.push({\r\n id: 'B-tier',\r\n status: 'info',\r\n message: `⚠ ${BRAIN_DOCTOR_DISCLAIMER}`,\r\n });\r\n\r\n return results;\r\n}\r\n\r\nexport function runCustomCheck(cwd: string): CheckResult[] {\r\n const hasStories = fileExists(cwd, 'src/stories');\r\n if (!hasStories) {\r\n return [\r\n {\r\n id: 'C1',\r\n status: 'skip',\r\n message: 'no src/stories/ directory (Storybook not configured)',\r\n },\r\n ];\r\n }\r\n\r\n return [\r\n {\r\n id: 'C1',\r\n status: 'info',\r\n message: 'wrapper/story coverage check not implemented (stub)',\r\n fixHint: 'Add stories for components in src/components/',\r\n },\r\n ];\r\n}\r\n","import type { CheckResult } from '../types.js';\r\nimport {\r\n manifestExists,\r\n readManifest,\r\n regenerateManifest,\r\n validateManifestShape,\r\n} from '../utils/manifest.js';\r\nimport { readInstalledVersion, readPackageJson } from '../utils/package-json.js';\r\n\r\nexport function runManifestCheck(\r\n cwd: string,\r\n fix: boolean,\r\n): { results: CheckResult[]; fixed: boolean } {\r\n const results: CheckResult[] = [];\r\n let fixed = false;\r\n\r\n if (!manifestExists(cwd)) {\r\n if (fix) {\r\n const pkg = readPackageJson(cwd);\r\n const coreVersion =\r\n readInstalledVersion(cwd, '@idia-ui/core') ??\r\n pkg?.dependencies?.['@idia-ui/core']?.replace(/^[\\^~]/, '') ??\r\n '0.2.0';\r\n regenerateManifest(cwd, coreVersion);\r\n fixed = true;\r\n results.push({\r\n id: 'M1',\r\n status: 'pass',\r\n message: '.idia/manifest.json regenerated',\r\n fixHint: 'Created manifest with idiaCli + core versions',\r\n });\r\n return { results, fixed };\r\n }\r\n\r\n results.push({\r\n id: 'M1',\r\n status: 'warn',\r\n message: '.idia/manifest.json missing',\r\n fixHint: 'Run idia-ui doctor --fix or idia-ui sync all after first add-on',\r\n });\r\n return { results, fixed };\r\n }\r\n\r\n const manifest = readManifest(cwd);\r\n if (!manifest || !validateManifestShape(manifest)) {\r\n results.push({\r\n id: 'M1',\r\n status: 'fail',\r\n message: '.idia/manifest.json invalid or unparseable',\r\n fixHint: 'Run idia-ui doctor --fix to regenerate',\r\n });\r\n return { results, fixed };\r\n }\r\n\r\n results.push({\r\n id: 'M1',\r\n status: 'pass',\r\n message: `.idia/manifest.json valid (core ${manifest.core}, cli ${manifest.idiaCli})`,\r\n });\r\n\r\n return { results, fixed };\r\n}\r\n","import type { CheckResult } from '../types.js';\r\nimport { grepSrcForPattern, readTextFile } from '../utils/fs.js';\r\n\r\nexport function runNavigationChecks(cwd: string): CheckResult[] {\r\n const results: CheckResult[] = [];\r\n const providers =\r\n readTextFile(cwd, 'src/providers/AppProviders.tsx') ??\r\n readTextFile(cwd, 'src/providers/AppProviders.ts');\r\n\r\n // N1\r\n if (providers && /NavigationContainer/.test(providers)) {\r\n results.push({\r\n id: 'N1',\r\n status: 'pass',\r\n message: 'NavigationContainer in provider tree',\r\n });\r\n } else {\r\n results.push({\r\n id: 'N1',\r\n status: 'fail',\r\n message: 'NavigationContainer not found in AppProviders',\r\n fixHint: 'Wrap navigation in NavigationContainer per templates/consumer-app',\r\n });\r\n }\r\n\r\n // N2 — NavigationProvider if idia Link/navigate used\r\n const usesIdiaNav =\r\n grepSrcForPattern(cwd, /\\bLink\\b.*@idia-ui\\/core/) ||\r\n grepSrcForPattern(cwd, /NavigationProvider/) ||\r\n grepSrcForPattern(cwd, /useIdiaNavigation|navigateTo/);\r\n\r\n if (usesIdiaNav) {\r\n const hasNavProvider = providers\r\n ? /NavigationProvider/.test(providers)\r\n : grepSrcForPattern(cwd, /NavigationProvider/);\r\n if (!hasNavProvider) {\r\n results.push({\r\n id: 'N2',\r\n status: 'warn',\r\n message: 'idia Link/navigation helpers used but NavigationProvider missing',\r\n fixHint: 'Wrap navigation ref with NavigationProvider from @idia-ui/core',\r\n });\r\n } else {\r\n results.push({\r\n id: 'N2',\r\n status: 'pass',\r\n message: 'NavigationProvider present',\r\n });\r\n }\r\n } else {\r\n results.push({\r\n id: 'N2',\r\n status: 'pass',\r\n message: 'idia Link/navigation helpers not used (NavigationProvider optional)',\r\n });\r\n }\r\n\r\n return results;\r\n}\r\n","import type { CheckResult } from '../types.js';\r\nimport {\r\n getDepVersion,\r\n readInstalledVersion,\r\n readPeerRange,\r\n readPackageJson,\r\n} from '../utils/package-json.js';\r\nimport { satisfiesRange } from '../utils/fs.js';\r\nimport { detectPackageManager, pmAddCommand } from '../utils/pm.js';\r\n\r\nconst P2_PACKAGES = [\r\n 'react-native-reanimated',\r\n 'react-native-gesture-handler',\r\n 'react-native-screens',\r\n 'react-native-safe-area-context',\r\n] as const;\r\n\r\nconst BARREL_REQUIRED_PEERS = ['zustand', '@tanstack/react-table'] as const;\r\n\r\nconst BARREL_OPTIONAL_PEERS = [\r\n 'react-image-crop',\r\n '@fullcalendar/core',\r\n '@fullcalendar/daygrid',\r\n '@fullcalendar/timegrid',\r\n '@fullcalendar/interaction',\r\n '@fullcalendar/multimonth',\r\n '@fullcalendar/list',\r\n '@fullcalendar/react',\r\n] as const;\r\n\r\nexport function runPeerChecks(cwd: string): CheckResult[] {\r\n const pkg = readPackageJson(cwd);\r\n if (!pkg) {\r\n return [\r\n {\r\n id: 'P0',\r\n status: 'fail',\r\n message: 'package.json not found or unreadable',\r\n fixHint: 'Run idia-ui doctor from your app root',\r\n },\r\n ];\r\n }\r\n\r\n const pm = detectPackageManager(cwd);\r\n const results: CheckResult[] = [];\r\n\r\n // P1 — tamagui peer range\r\n const tamaguiVersion =\r\n readInstalledVersion(cwd, 'tamagui') ??\r\n getDepVersion(pkg, 'tamagui')?.replace(/^[\\^~]/, '') ??\r\n null;\r\n const coreRange =\r\n readPeerRange(cwd, '@idia-ui/core', 'tamagui') ??\r\n readPeerRange(cwd, '@idia-ui/theme', 'tamagui') ??\r\n '^1.70.0';\r\n\r\n if (!tamaguiVersion) {\r\n results.push({\r\n id: 'P1',\r\n status: 'fail',\r\n message: 'tamagui not installed',\r\n fixHint: pmAddCommand(pm, ['tamagui@^1.144.0']),\r\n });\r\n } else if (!satisfiesRange(tamaguiVersion, coreRange)) {\r\n results.push({\r\n id: 'P1',\r\n status: 'fail',\r\n message: `tamagui ${tamaguiVersion} outside peer range ${coreRange}`,\r\n fixHint: pmAddCommand(pm, [`tamagui@${coreRange}`]),\r\n });\r\n } else {\r\n results.push({\r\n id: 'P1',\r\n status: 'pass',\r\n message: `tamagui ${tamaguiVersion} in peer range`,\r\n });\r\n }\r\n\r\n // P2 — navigation/gesture peers\r\n const missingP2 = P2_PACKAGES.filter((name) => {\r\n const installed = readInstalledVersion(cwd, name);\r\n const declared = getDepVersion(pkg, name);\r\n return !installed && !declared;\r\n });\r\n\r\n if (missingP2.length > 0) {\r\n results.push({\r\n id: 'P2',\r\n status: 'fail',\r\n message: `missing navigation/gesture peers: ${missingP2.join(', ')}`,\r\n fixHint: pmAddCommand(pm, [...missingP2]),\r\n });\r\n } else {\r\n results.push({\r\n id: 'P2',\r\n status: 'pass',\r\n message:\r\n 'gesture-handler, reanimated, screens, safe-area-context present',\r\n });\r\n }\r\n\r\n // P3 — @idia-ui/* alignment + barrel peers\r\n const idiaPkgs = Object.keys({\r\n ...pkg.dependencies,\r\n ...pkg.devDependencies,\r\n }).filter((n) => n.startsWith('@idia-ui/'));\r\n\r\n const idiaVersions = idiaPkgs\r\n .map((name) => {\r\n const v =\r\n readInstalledVersion(cwd, name) ??\r\n getDepVersion(pkg, name)?.replace(/^[\\^~]/, '');\r\n return v ? { name, version: v } : null;\r\n })\r\n .filter((x): x is { name: string; version: string } => x !== null);\r\n\r\n const minors = new Set(\r\n idiaVersions\r\n .map((p) => {\r\n const parts = p.version.split('.');\r\n return parts.length >= 2 ? `${parts[0]}.${parts[1]}` : null;\r\n })\r\n .filter((m): m is string => m !== null && !m.includes('workspace')),\r\n );\r\n\r\n if (idiaVersions.length === 0) {\r\n results.push({\r\n id: 'P3',\r\n status: 'fail',\r\n message: 'no @idia-ui/* packages in dependencies',\r\n fixHint: pmAddCommand(pm, ['@idia-ui/core@latest', '@idia-ui/theme@latest']),\r\n });\r\n } else if (minors.size > 1) {\r\n results.push({\r\n id: 'P3',\r\n status: 'fail',\r\n message: `@idia-ui/* minor versions misaligned: ${[...minors].join(', ')}`,\r\n fixHint: `${pm === 'pnpm' ? 'pnpm' : pm} update @idia-ui/*`,\r\n });\r\n } else {\r\n results.push({\r\n id: 'P3',\r\n status: 'pass',\r\n message: `@idia-ui/* versions aligned (${idiaVersions.map((p) => `${p.name}@${p.version}`).join(', ')})`,\r\n });\r\n }\r\n\r\n for (const peer of BARREL_REQUIRED_PEERS) {\r\n const installed = readInstalledVersion(cwd, peer);\r\n const declared = getDepVersion(pkg, peer);\r\n if (!installed && !declared) {\r\n results.push({\r\n id: 'P3',\r\n status: 'fail',\r\n message: `barrel peer ${peer} not installed (required for @idia-ui/core Table graph)`,\r\n fixHint: `${pmAddCommand(pm, [peer])} — see docs/generated/peer-dep-matrix.md`,\r\n });\r\n }\r\n }\r\n\r\n for (const peer of BARREL_OPTIONAL_PEERS) {\r\n const installed = readInstalledVersion(cwd, peer);\r\n const declared = getDepVersion(pkg, peer);\r\n if (!installed && !declared) {\r\n results.push({\r\n id: 'P3',\r\n status: 'warn',\r\n message: `optional peer ${peer} not installed (barrel may require it)`,\r\n fixHint: `Install per peer-dep-matrix.md: ${pmAddCommand(pm, [peer])}`,\r\n });\r\n }\r\n }\r\n\r\n return results;\r\n}\r\n","import type { CheckResult } from '../types.js';\r\nimport { fileExists, grepSrcForPattern, readTextFile } from '../utils/fs.js';\r\n\r\nconst OVERLAY_IMPORT =\r\n /from\\s+['\"]@idia-ui\\/core['\"][\\s\\S]*?(Modal|Toast|Dialog|ConfirmationModal)/;\r\n\r\nexport function runRuntimeChecks(cwd: string): CheckResult[] {\r\n const results: CheckResult[] = [];\r\n\r\n // R1\r\n if (fileExists(cwd, 'tamagui.config.ts')) {\r\n results.push({\r\n id: 'R1',\r\n status: 'pass',\r\n message: 'tamagui.config.ts found',\r\n });\r\n } else {\r\n results.push({\r\n id: 'R1',\r\n status: 'fail',\r\n message: 'tamagui.config.ts missing at app root',\r\n fixHint: 'Restore from templates/consumer-app or re-scaffold',\r\n });\r\n }\r\n\r\n // R2\r\n const providers =\r\n readTextFile(cwd, 'src/providers/AppProviders.tsx') ??\r\n readTextFile(cwd, 'src/providers/AppProviders.ts');\r\n\r\n if (!providers) {\r\n results.push({\r\n id: 'R2',\r\n status: 'fail',\r\n message: 'AppProviders not found',\r\n fixHint: 'Add src/providers/AppProviders.tsx per templates/consumer-app',\r\n });\r\n } else {\r\n const hasTamagui = /TamaguiProvider/.test(providers);\r\n const hasTheme = /ThemeProvider/.test(providers) && /@idia-ui\\/theme/.test(providers);\r\n if (hasTamagui && hasTheme) {\r\n results.push({\r\n id: 'R2',\r\n status: 'pass',\r\n message: 'AppProviders: TamaguiProvider + ThemeProvider',\r\n });\r\n } else {\r\n results.push({\r\n id: 'R2',\r\n status: 'fail',\r\n message: 'AppProviders missing TamaguiProvider and/or ThemeProvider (@idia-ui/theme)',\r\n fixHint: 'Compare src/providers/AppProviders.tsx with templates/consumer-app',\r\n });\r\n }\r\n }\r\n\r\n // R3 — overlay providers\r\n const usesOverlays =\r\n grepSrcForPattern(cwd, OVERLAY_IMPORT) ||\r\n grepSrcForPattern(cwd, /\\b(Modal|Toast|Dialog)\\b.*@idia-ui\\/core/);\r\n\r\n if (usesOverlays) {\r\n const hasModal = providers ? /ModalProvider/.test(providers) : false;\r\n const hasToast = providers ? /ToastProvider/.test(providers) : false;\r\n if (!hasModal || !hasToast) {\r\n results.push({\r\n id: 'R3',\r\n status: 'warn',\r\n message: 'overlay components imported but ModalProvider/ToastProvider missing',\r\n fixHint: 'Add ModalProvider and ToastProvider to AppProviders per template',\r\n });\r\n } else {\r\n results.push({\r\n id: 'R3',\r\n status: 'pass',\r\n message: 'overlay providers present',\r\n });\r\n }\r\n } else {\r\n results.push({\r\n id: 'R3',\r\n status: 'pass',\r\n message: 'no overlay imports detected (Modal/Toast providers optional)',\r\n });\r\n }\r\n\r\n // R4 — font gate\r\n const fontGate =\r\n (providers && /waitForWebFonts/.test(providers)) ||\r\n grepSrcForPattern(cwd, /expo-font/) ||\r\n grepSrcForPattern(cwd, /useFonts/);\r\n\r\n if (fontGate) {\r\n results.push({\r\n id: 'R4',\r\n status: 'pass',\r\n message: 'web font gate configured (waitForWebFonts or expo-font)',\r\n });\r\n } else {\r\n results.push({\r\n id: 'R4',\r\n status: 'warn',\r\n message: 'no waitForWebFonts or expo-font pattern detected',\r\n fixHint: 'Copy font loading pattern from templates/consumer-app AppProviders',\r\n });\r\n }\r\n\r\n return results;\r\n}\r\n","import { runBrainChecks, runCustomCheck, runStorybookChecks } from './packs.js';\r\nimport { runManifestCheck } from './manifest.js';\r\nimport { runNavigationChecks } from './navigation.js';\r\nimport { runPeerChecks } from './peers.js';\r\nimport { runRuntimeChecks } from './runtime.js';\r\nimport type { CheckResult, DoctorOptions } from '../types.js';\r\n\r\nexport function runAllChecks(options: DoctorOptions): CheckResult[] {\r\n const { cwd, full, fix } = options;\r\n const checks: CheckResult[] = [];\r\n\r\n checks.push(...runPeerChecks(cwd));\r\n checks.push(...runRuntimeChecks(cwd));\r\n checks.push(...runNavigationChecks(cwd));\r\n\r\n const { results: manifestResults } = runManifestCheck(cwd, fix);\r\n checks.push(...manifestResults);\r\n\r\n if (full) {\r\n checks.push(...runStorybookChecks(cwd));\r\n checks.push(...runBrainChecks(cwd));\r\n checks.push(...runCustomCheck(cwd));\r\n }\r\n\r\n return checks;\r\n}\r\n\r\nexport function summarizeChecks(\r\n checks: CheckResult[],\r\n strict: boolean,\r\n): { passed: number; warnings: number; failures: number; skipped: number; exitCode: number } {\r\n let passed = 0;\r\n let warnings = 0;\r\n let failures = 0;\r\n let skipped = 0;\r\n\r\n for (const check of checks) {\r\n switch (check.status) {\r\n case 'pass':\r\n passed++;\r\n break;\r\n case 'warn':\r\n warnings++;\r\n break;\r\n case 'fail':\r\n failures++;\r\n break;\r\n case 'skip':\r\n case 'info':\r\n skipped++;\r\n break;\r\n }\r\n }\r\n\r\n let exitCode = 0;\r\n if (failures > 0) exitCode = 1;\r\n else if (strict && warnings > 0) exitCode = 1;\r\n\r\n return { passed, warnings, failures, skipped, exitCode };\r\n}\r\n","import { runAllChecks, summarizeChecks } from '../checks/index.js';\r\nimport type { DoctorOptions, DoctorReport } from '../types.js';\r\n\r\nconst STATUS_ICON: Record<string, string> = {\r\n pass: '✓',\r\n warn: '⚠',\r\n fail: '✗',\r\n info: 'ℹ',\r\n skip: '○',\r\n};\r\n\r\nexport function runDoctor(options: DoctorOptions): DoctorReport {\r\n const checks = runAllChecks(options);\r\n const summary = summarizeChecks(checks, options.strict);\r\n\r\n return {\r\n checks,\r\n summary: {\r\n passed: summary.passed,\r\n warnings: summary.warnings,\r\n failures: summary.failures,\r\n skipped: summary.skipped,\r\n },\r\n exitCode: summary.exitCode,\r\n };\r\n}\r\n\r\nexport function formatHumanReport(report: DoctorReport, full: boolean): string {\r\n const lines: string[] = ['idia-ui doctor', ''];\r\n\r\n for (const check of report.checks) {\r\n const icon = STATUS_ICON[check.status] ?? '·';\r\n lines.push(`${icon} ${check.id} ${check.message}`);\r\n if (check.fixHint && (check.status === 'fail' || check.status === 'warn')) {\r\n lines.push(` → ${check.fixHint}`);\r\n }\r\n }\r\n\r\n lines.push('');\r\n const { passed, warnings, failures } = report.summary;\r\n const mode = full ? 'full' : 'quick';\r\n lines.push(\r\n `${passed} passed, ${warnings} warnings, ${failures} failures (${mode} scan) — exit ${report.exitCode}`,\r\n );\r\n\r\n return lines.join('\\n');\r\n}\r\n\r\nexport function formatJsonReport(report: DoctorReport): string {\r\n return JSON.stringify(\r\n {\r\n checks: report.checks.map((c) => ({\r\n id: c.id,\r\n status: c.status,\r\n message: c.message,\r\n ...(c.fixHint ? { fixHint: c.fixHint } : {}),\r\n })),\r\n summary: report.summary,\r\n exitCode: report.exitCode,\r\n },\r\n null,\r\n 2,\r\n );\r\n}\r\n","import {\r\n STORYBOOK_CLI_VERSION,\r\n STORYBOOK_DOCS_VERSION,\r\n STORYBOOK_PRESET_VERSION,\r\n} from './constants.js'\r\nimport type { PackageManager } from '../../utils/pm.js'\r\nimport { detectPackageManager } from '../../utils/pm.js'\r\nimport { readInstalledVersion, readPackageJson } from '../../utils/package-json.js'\r\nimport { fileExists } from '../../utils/fs.js'\r\nimport { runPmAddDevDeps } from '../../utils/exec.js'\r\nimport { CLI_VERSION, readManifest, writeManifest } from '../../utils/manifest.js'\r\n\r\nexport type SyncStorybookOptions = {\r\n cwd: string\r\n pm?: PackageManager\r\n skipInstall?: boolean\r\n}\r\n\r\nexport type SyncStorybookResult = {\r\n synced: boolean\r\n message: string\r\n}\r\n\r\nfunction isStorybookInstalled(cwd: string): boolean {\r\n return fileExists(cwd, '.storybook/main.ts')\r\n}\r\n\r\nfunction runPmUpdate(cwd: string, pm: PackageManager): void {\r\n const packages = [\r\n `@idia-ui/storybook-docs@${STORYBOOK_DOCS_VERSION}`,\r\n `@idia-ui/storybook-preset-react-native-web@${STORYBOOK_PRESET_VERSION}`,\r\n ]\r\n runPmAddDevDeps(cwd, pm, packages)\r\n}\r\n\r\nexport function runSyncStorybook(options: SyncStorybookOptions): SyncStorybookResult {\r\n const { cwd, skipInstall = false } = options\r\n const pm = options.pm ?? detectPackageManager(cwd)\r\n\r\n if (!isStorybookInstalled(cwd)) {\r\n console.error('Storybook not installed — run idia-ui add storybook first')\r\n process.exit(1)\r\n }\r\n\r\n const manifest = readManifest(cwd)\r\n if (!manifest) {\r\n console.error('.idia/manifest.json missing — run idia-ui doctor --fix')\r\n process.exit(1)\r\n }\r\n\r\n const corePkg = readPackageJson(cwd)\r\n const coreVersion =\r\n readInstalledVersion(cwd, '@idia-ui/core') ??\r\n corePkg?.dependencies?.['@idia-ui/core']?.replace(/^[\\^~]/, '') ??\r\n manifest.core\r\n\r\n if (!skipInstall) {\r\n console.log(`Syncing storybook packs via ${pm}…`)\r\n runPmUpdate(cwd, pm)\r\n }\r\n\r\n manifest.idiaCli = CLI_VERSION\r\n manifest.core = coreVersion\r\n manifest.features ??= {}\r\n manifest.features.storybook = {\r\n installed: (manifest.features.storybook as { installed?: string } | undefined)?.installed ??\r\n new Date().toISOString(),\r\n storybookDocs: STORYBOOK_DOCS_VERSION,\r\n storybook: STORYBOOK_CLI_VERSION,\r\n preset: STORYBOOK_PRESET_VERSION,\r\n }\r\n writeManifest(cwd, manifest)\r\n\r\n console.log(`✓ Synced @idia-ui/storybook-docs@${STORYBOOK_DOCS_VERSION}`)\r\n console.log(`✓ Synced @idia-ui/storybook-preset-react-native-web@${STORYBOOK_PRESET_VERSION}`)\r\n\r\n return {\r\n synced: true,\r\n message: `storybook-docs@${STORYBOOK_DOCS_VERSION} aligned with core@${coreVersion}`,\r\n }\r\n}\r\n\r\n","import { installBrainPack, printBrainInstallSummary } from '../brain/install.js';\r\nimport { BRAIN_DOCTOR_DISCLAIMER, BRAIN_TIER_DISCLAIMER } from '../brain/constants.js';\r\nimport { runSyncStorybook as syncStorybookPack } from './storybook/sync.js';\r\nimport { fileExists } from '../utils/fs.js';\r\nimport { readManifest } from '../utils/manifest.js';\r\n\r\nexport type SyncOptions = {\r\n cwd: string;\r\n repair?: boolean;\r\n force?: boolean;\r\n pm?: 'pnpm' | 'npm' | 'yarn';\r\n};\r\n\r\nexport function runSyncBrain(options: SyncOptions): void {\r\n try {\r\n const result = installBrainPack({\r\n cwd: options.cwd,\r\n repair: true,\r\n force: options.force,\r\n pm: options.pm,\r\n });\r\n console.log('✓ brain pack synced');\r\n printBrainInstallSummary(result);\r\n } catch (error) {\r\n console.error(error instanceof Error ? error.message : String(error));\r\n console.error(BRAIN_TIER_DISCLAIMER);\r\n process.exit(1);\r\n }\r\n}\r\n\r\nexport function runSyncStorybook(options: SyncOptions): void {\r\n syncStorybookPack({\r\n cwd: options.cwd,\r\n pm: options.pm,\r\n });\r\n}\r\n\r\nexport function runSyncAll(options: SyncOptions): void {\r\n const { cwd } = options;\r\n const manifest = readManifest(cwd);\r\n const hasStorybook =\r\n fileExists(cwd, '.storybook/main.ts') || Boolean(manifest?.features?.storybook);\r\n const hasBrain = Boolean(manifest?.features?.brain?.brainPack);\r\n\r\n if (!hasStorybook && !hasBrain) {\r\n console.error('No storybook or brain features installed — run idia-ui add storybook or add brain first');\r\n process.exit(1);\r\n }\r\n\r\n if (hasStorybook) {\r\n syncStorybookPack({ cwd, pm: options.pm });\r\n } else {\r\n console.log('○ storybook not installed — skipping storybook sync');\r\n }\r\n\r\n if (hasBrain) {\r\n runSyncBrain(options);\r\n } else {\r\n console.log('○ brain not installed — skipping brain sync');\r\n console.error(BRAIN_DOCTOR_DISCLAIMER);\r\n }\r\n\r\n console.log('');\r\n console.log('✓ sync all complete');\r\n}\r\n\r\nexport function runSync(target: string, options: SyncOptions): void {\r\n switch (target) {\r\n case 'brain':\r\n runSyncBrain(options);\r\n break;\r\n case 'storybook':\r\n runSyncStorybook(options);\r\n break;\r\n case 'all':\r\n runSyncAll(options);\r\n break;\r\n default:\r\n console.error(`Unknown sync target: ${target}`);\r\n console.error('Available: storybook | brain | all');\r\n process.exit(1);\r\n }\r\n}\r\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,uBAAwB;AACxB,IAAAA,qBAAwB;;;ACDxB,IAAAC,kBAAyC;AACzC,IAAAC,oBAA8B;;;ACAvB,IAAM,yBAAyB;AAC/B,IAAM,2BAA2B;AACjC,IAAM,wBAAwB;AAE9B,IAAM,qBAAqB;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,2BAA2B,sBAAsB;AAAA,EACjD,8CAA8C,wBAAwB;AAAA,EACtE;AACF;AAEO,IAAM,wBAAwB;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AACF;;;ACrBO,SAAS,kBAA0B;AACxC,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAUT;AAEO,SAAS,sBAA8B;AAC5C,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAqBT;AAEO,SAAS,mBAA2B;AACzC,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgCT;;;ACtEA,qBAA2B;AAC3B,uBAA8B;AAI9B,SAAS,gBAAgB,OAAuB;AAC9C,MAAI,MAAM;AACV,SAAO,MAAM;AACX,YAAI,+BAAW,uBAAK,KAAK,gBAAgB,CAAC,EAAG,QAAO;AACpD,YAAI,+BAAW,uBAAK,KAAK,WAAW,CAAC,EAAG,QAAO;AAC/C,YAAI,+BAAW,uBAAK,KAAK,mBAAmB,CAAC,EAAG,QAAO;AACvD,UAAM,aAAS,0BAAQ,GAAG;AAC1B,QAAI,WAAW,IAAK,QAAO;AAC3B,UAAM;AAAA,EACR;AACF;AAEO,SAAS,qBAAqB,KAA6B;AAChE,QAAM,OAAO,gBAAgB,GAAG;AAChC,UAAI,+BAAW,uBAAK,MAAM,gBAAgB,CAAC,EAAG,QAAO;AACrD,UAAI,+BAAW,uBAAK,MAAM,WAAW,CAAC,EAAG,QAAO;AAChD,SAAO;AACT;AAEO,SAAS,aAAa,IAAoB,UAA4B;AAC3E,QAAM,OAAO,SAAS,KAAK,GAAG;AAC9B,UAAQ,IAAI;AAAA,IACV,KAAK;AACH,aAAO,YAAY,IAAI;AAAA,IACzB,KAAK;AACH,aAAO,YAAY,IAAI;AAAA,IACzB;AACE,aAAO,eAAe,IAAI;AAAA,EAC9B;AACF;;;AClCA,IAAAC,kBAA6B;AAC7B,IAAAC,oBAAqB;AAId,SAAS,gBAAgB,KAAiC;AAC/D,MAAI;AACF,UAAM,UAAM,kCAAa,wBAAK,KAAK,cAAc,GAAG,MAAM;AAC1D,WAAO,KAAK,MAAM,GAAG;AAAA,EACvB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,cACd,KACA,MACoB;AACpB,SAAO,IAAI,eAAe,IAAI,KAAK,IAAI,kBAAkB,IAAI;AAC/D;AAEO,SAAS,qBAAqB,KAAa,MAA6B;AAC7E,MAAI;AACF,UAAM,cAAU,wBAAK,KAAK,gBAAgB,MAAM,cAAc;AAC9D,UAAM,UAAM,8BAAa,SAAS,MAAM;AACxC,UAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,WAAO,OAAO,WAAW;AAAA,EAC3B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,cACd,KACA,aACA,UACe;AACf,MAAI;AACF,UAAM,cAAU,wBAAK,KAAK,gBAAgB,aAAa,cAAc;AACrE,UAAM,UAAM,8BAAa,SAAS,MAAM;AACxC,UAAM,SAAS,KAAK,MAAM,GAAG;AAG7B,WAAO,OAAO,mBAAmB,QAAQ,KAAK;AAAA,EAChD,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;AC/CA,IAAAC,kBAAgE;AAChE,IAAAC,oBAAqB;AAErB,oBAAmB;AAEZ,SAAS,eAAe,SAAiB,OAAwB;AACtE,QAAM,UAAU,QAAQ,QAAQ,cAAc,EAAE,EAAE,MAAM,GAAG,EAAE,CAAC,KAAK;AACnE,MAAI,UAAU,iBAAiB,MAAM,WAAW,OAAO,EAAG,QAAO;AACjE,QAAM,UAAU,cAAAC,QAAO,OAAO,OAAO;AACrC,MAAI,CAAC,QAAS,QAAO;AACrB,SAAO,cAAAA,QAAO,UAAU,SAAS,OAAO,EAAE,mBAAmB,KAAK,CAAC;AACrE;AAEO,SAAS,SAAS,SAAgC;AACvD,QAAM,UAAU,cAAAA,QAAO,OAAO,OAAO;AACrC,MAAI,CAAC,QAAS,QAAO;AACrB,SAAO,GAAG,QAAQ,KAAK,IAAI,QAAQ,KAAK;AAC1C;AAEO,SAAS,aAAa,KAAa,cAAqC;AAC7E,MAAI;AACF,eAAO,kCAAa,wBAAK,KAAK,YAAY,GAAG,MAAM;AAAA,EACrD,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,WAAW,KAAa,cAA+B;AACrE,MAAI;AACF,eAAO,gCAAW,wBAAK,KAAK,YAAY,CAAC;AAAA,EAC3C,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,kBAAkB,KAAa,SAA0B;AACvE,QAAM,cAAc;AAAA,IAClB;AAAA,IACA;AAAA,EACF;AAEA,aAAW,QAAQ,aAAa;AAC9B,UAAM,UAAU,aAAa,KAAK,IAAI;AACtC,QAAI,WAAW,QAAQ,KAAK,OAAO,EAAG,QAAO;AAAA,EAC/C;AAEA,QAAM,cAAU,wBAAK,KAAK,KAAK;AAC/B,MAAI;AACF,UAAM,OAAO,CAAC,QAAyB;AACrC,iBAAW,aAAS,6BAAY,GAAG,GAAG;AACpC,cAAM,WAAO,wBAAK,KAAK,KAAK;AAC5B,cAAM,WAAO,0BAAS,IAAI;AAC1B,YAAI,KAAK,YAAY,GAAG;AACtB,cAAI,KAAK,IAAI,EAAG,QAAO;AAAA,QACzB,WAAW,iBAAiB,KAAK,KAAK,GAAG;AACvC,gBAAM,cAAU,8BAAa,MAAM,MAAM;AACzC,cAAI,QAAQ,KAAK,OAAO,EAAG,QAAO;AAAA,QACpC;AAAA,MACF;AACA,aAAO;AAAA,IACT;AACA,YAAI,4BAAW,OAAO,EAAG,QAAO,KAAK,OAAO;AAAA,EAC9C,QAAQ;AAAA,EAER;AAEA,SAAO;AACT;;;ACnEA,gCAA0B;AAK1B,SAAS,WAAW,QAA8C;AAChE,MAAI,OAAO,MAAO,QAAO;AACzB,SAAO,OAAO,UAAU;AAC1B;AAEO,SAAS,QACd,IACA,MACA,KAC8B;AAC9B,QAAM,QAAQ,QAAQ,aAAa;AACnC,aAAO,qCAAU,IAAI,MAAM;AAAA,IACzB;AAAA,IACA,OAAO;AAAA,IACP,OAAO;AAAA,IACP,aAAa;AAAA,EACf,CAAC;AACH;AAEO,SAAS,aAAa,KAAa,IAA0B;AAClE,QAAM,SAAS,QAAQ,IAAI,YAAY,EAAE,GAAG,GAAG;AAC/C,MAAI,WAAW,MAAM,MAAM,GAAG;AAC5B,UAAM,IAAI,MAAM,GAAG,EAAE,yBAAyB,WAAW,MAAM,CAAC,GAAG;AAAA,EACrE;AACF;AAEO,SAAS,YACd,KACA,IACA,aACM;AACN,QAAM,SAAS,QAAQ,IAAI,WAAW,IAAI,WAAW,GAAG,GAAG;AAC3D,MAAI,WAAW,MAAM,MAAM,GAAG;AAC5B,UAAM,IAAI,MAAM,GAAG,EAAE,mBAAmB,WAAW,UAAU,WAAW,MAAM,CAAC,GAAG;AAAA,EACpF;AACF;AAEO,SAAS,gBACd,KACA,IACA,UACM;AACN,QAAM,SAAS,QAAQ,IAAI,gBAAgB,IAAI,QAAQ,GAAG,GAAG;AAC7D,MAAI,WAAW,MAAM,MAAM,GAAG;AAC5B,UAAM,IAAI,MAAM,GAAG,EAAE,qBAAqB,WAAW,MAAM,CAAC,GAAG;AAAA,EACjE;AACF;AAEA,SAAS,YAAY,IAA8B;AACjD,UAAQ,IAAI;AAAA,IACV,KAAK;AACH,aAAO,CAAC,SAAS;AAAA,IACnB,KAAK;AACH,aAAO,CAAC,SAAS;AAAA,IACnB;AACE,aAAO,CAAC,SAAS;AAAA,EACrB;AACF;AAEA,SAAS,WAAW,IAAoB,aAA+B;AACrE,SAAO,gBAAgB,IAAI,CAAC,WAAW,CAAC;AAC1C;AAEA,SAAS,gBAAgB,IAAoB,UAAuC;AAClF,UAAQ,IAAI;AAAA,IACV,KAAK;AACH,aAAO,CAAC,OAAO,MAAM,GAAG,QAAQ;AAAA,IAClC,KAAK;AACH,aAAO,CAAC,OAAO,MAAM,GAAG,QAAQ;AAAA,IAClC;AACE,aAAO,CAAC,WAAW,MAAM,GAAG,QAAQ;AAAA,EACxC;AACF;;;AC7EA,IAAAC,kBAAuD;AACvD,IAAAC,oBAA8B;AAK9B,IAAM,cAAc;AAEb,SAAS,aAAa,KAAkC;AAC7D,MAAI;AACF,UAAM,UAAM,kCAAa,wBAAK,KAAK,SAAS,eAAe,GAAG,MAAM;AACpE,WAAO,KAAK,MAAM,GAAG;AAAA,EACvB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,cAAc,KAAa,UAA8B;AACvE,QAAM,mBAAe,wBAAK,KAAK,SAAS,eAAe;AACvD,qCAAU,2BAAQ,YAAY,GAAG,EAAE,WAAW,KAAK,CAAC;AACpD,qCAAc,cAAc,GAAG,KAAK,UAAU,UAAU,MAAM,CAAC,CAAC;AAAA,GAAM,MAAM;AAC9E;AAEO,SAAS,mBACd,KACA,aACoC;AACpC,QAAM,mBAAe,wBAAK,KAAK,SAAS,eAAe;AACvD,QAAM,WAAyB;AAAA,IAC7B,SAAS;AAAA,IACT,MAAM;AAAA,EACR;AACA,gBAAc,KAAK,QAAQ;AAC3B,SAAO,EAAE,SAAS,MAAM,MAAM,aAAa;AAC7C;AAEO,SAAS,eAAe,KAAsB;AACnD,SAAO,WAAW,KAAK,qBAAqB;AAC9C;AAEO,SAAS,sBAAsB,UAAiC;AACrE,SACE,OAAO,SAAS,YAAY,YAC5B,OAAO,SAAS,SAAS,YACzB,iBAAiB,KAAK,SAAS,OAAO,KACtC,iBAAiB,KAAK,SAAS,IAAI;AAEvC;;;APTA,SAAS,eAAe,KAAa,cAAsB,SAAiB,OAAyB;AACnG,QAAM,eAAW,wBAAK,KAAK,YAAY;AACvC,MAAI,WAAW,KAAK,YAAY,KAAK,CAAC,OAAO;AAC3C,UAAM,WAAW,aAAa,KAAK,YAAY;AAC/C,QAAI,aAAa,QAAS,QAAO;AACjC,UAAM,IAAI;AAAA,MACR,aAAa,YAAY;AAAA,IAC3B;AAAA,EACF;AACA,qCAAU,2BAAQ,QAAQ,GAAG,EAAE,WAAW,KAAK,CAAC;AAChD,qCAAc,UAAU,SAAS,MAAM;AACvC,SAAO;AACT;AAEA,SAAS,aAAa,MAA+C;AACnE,MAAI,KAAK,WAAW,GAAG,GAAG;AACxB,UAAMC,MAAK,KAAK,QAAQ,KAAK,CAAC;AAC9B,WAAO,EAAE,MAAM,KAAK,MAAM,GAAGA,GAAE,GAAG,OAAO,KAAK,MAAMA,MAAK,CAAC,EAAE;AAAA,EAC9D;AACA,QAAM,KAAK,KAAK,QAAQ,GAAG;AAC3B,SAAO,EAAE,MAAM,KAAK,MAAM,GAAG,EAAE,GAAG,OAAO,KAAK,MAAM,KAAK,CAAC,EAAE;AAC9D;AAEA,SAAS,kBAAkB,MAAc,OAAuB;AAC9D,MAAI,KAAK,WAAW,yBAAyB,GAAG;AAC9C,WAAO,IAAI,sBAAsB;AAAA,EACnC;AACA,MAAI,KAAK,WAAW,4CAA4C,GAAG;AACjE,WAAO,IAAI,wBAAwB;AAAA,EACrC;AACA,SAAO,IAAI,MAAM,QAAQ,OAAO,EAAE,CAAC;AACrC;AAEA,SAAS,mBAAmB,KAAmB;AAC7C,QAAM,MAAM,gBAAgB,GAAG;AAC/B,MAAI,CAAC,IAAK,OAAM,IAAI,MAAM,wBAAwB;AAElD,MAAI,oBAAoB,CAAC;AACzB,aAAW,QAAQ,oBAAoB;AACrC,UAAM,EAAE,MAAM,MAAM,IAAI,aAAa,IAAI;AACzC,QAAI,gBAAgB,IAAI,IAAI,kBAAkB,MAAM,KAAK;AAAA,EAC3D;AAEA,MAAI,YAAY,CAAC;AACjB,MAAI,QAAQ,YAAY;AACxB,MAAI,QAAQ,iBAAiB,IAAI;AAEjC,yCAAc,wBAAK,KAAK,cAAc,GAAG,GAAG,KAAK,UAAU,KAAK,MAAM,CAAC,CAAC;AAAA,GAAM,MAAM;AACtF;AAEA,SAASC,cAAa,KAAa,IAA0B;AAC3D,kBAAgB,KAAK,IAAI,kBAAkB;AAC7C;AAEA,SAAS,mBAAmB,KAAa,KAA8D;AACrG,QAAM,YAAY,qBAAqB,KAAK,eAAe;AAC3D,MAAI,UAAW,QAAO;AAEtB,QAAM,WAAW,IAAI,eAAe,eAAe,KAAK;AACxD,MAAI,YAAY,CAAC,SAAS,WAAW,WAAW,GAAG;AACjD,WAAO,SAAS,QAAQ,UAAU,EAAE;AAAA,EACtC;AAEA,SAAO;AACT;AAEA,SAAS,wBAAwB,KAAa,UAAwB,aAA2B;AAC/F,WAAS,UAAU;AACnB,WAAS,OAAO;AAChB,WAAS,aAAa,CAAC;AACvB,WAAS,SAAS,YAAY;AAAA,IAC5B,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IAClC,eAAe;AAAA,IACf,WAAW;AAAA,IACX,QAAQ;AAAA,EACV;AACA,gBAAc,KAAK,QAAQ;AAC7B;AAEA,SAAS,qBAAqB,KAAsB;AAClD,SACE,WAAW,KAAK,oBAAoB,KACpC,QAAQ,gBAAgB,GAAG,GAAG,kBAAkB,yBAAyB,CAAC;AAE9E;AAEO,SAAS,gBAAgB,SAAkD;AAChF,QAAM,EAAE,KAAK,SAAS,OAAO,QAAQ,OAAO,cAAc,MAAM,IAAI;AACpE,QAAM,KAAK,QAAQ,MAAM,qBAAqB,GAAG;AACjD,QAAM,WAAqB,CAAC;AAC5B,QAAM,eAAyB,CAAC;AAEhC,QAAM,MAAM,gBAAgB,GAAG;AAC/B,MAAI,CAAC,KAAK;AACR,YAAQ,MAAM,sDAAiD;AAC/D,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI,WAAW,aAAa,GAAG;AAC/B,QAAM,cAAc,mBAAmB,KAAK,GAAG;AAC/C,MAAI,CAAC,UAAU;AACb,eAAW,EAAE,SAAS,aAAa,MAAM,YAAY;AACrD,aAAS,KAAK,kCAAkC;AAAA,EAClD,OAAO;AACL,aAAS,OAAO;AAAA,EAClB;AAEA,QAAM,mBAAmB,qBAAqB,GAAG;AACjD,MAAI,oBAAoB,CAAC,UAAU,CAAC,OAAO;AACzC,YAAQ,IAAI,8FAAyF;AACrG,4BAAwB,KAAK,UAAU,WAAW;AAClD,WAAO,EAAE,WAAW,MAAM,kBAAkB,MAAM,cAAc,SAAS;AAAA,EAC3E;AAEA,QAAM,eAAuE;AAAA,IAC3E,sBAAsB,gBAAgB;AAAA,IACtC,0BAA0B,oBAAoB;AAAA,IAC9C,kCAAkC,iBAAiB;AAAA,EACrD;AAEA,aAAW,gBAAgB,uBAAuB;AAChD,QAAI,UAAU,SAAS,CAAC,WAAW,KAAK,YAAY,GAAG;AACrD,YAAM,QAAQ,eAAe,KAAK,cAAc,aAAa,YAAY,GAAG,SAAS,MAAM;AAC3F,UAAI,MAAO,cAAa,KAAK,YAAY;AAAA,IAC3C;AAAA,EACF;AAEA,qBAAmB,GAAG;AAEtB,MAAI,CAAC,aAAa;AAChB,YAAQ,IAAI,4CAA4C,EAAE,QAAG;AAC7D,IAAAA,cAAa,KAAK,EAAE;AAAA,EACtB,OAAO;AACL,aAAS,KAAK,kDAAkD;AAAA,EAClE;AAEA,0BAAwB,KAAK,UAAU,WAAW;AAElD,UAAQ,IAAI,qCAAgC;AAC5C,UAAQ,IAAI,6BAA6B,sBAAsB,EAAE;AACjE,UAAQ,IAAI,gDAAgD,wBAAwB,EAAE;AACtF,UAAQ,IAAI,8CAA8C;AAE1D,SAAO,EAAE,WAAW,MAAM,kBAAkB,cAAc,SAAS;AACrE;;;AQtLA,IAAAC,kBAAqE;AACrE,IAAAC,oBAAqB;;;ACDrB,IAAAC,kBAAyC;AACzC,IAAAC,oBAA8B;;;ACDvB,IAAM,kBAAkB;AACxB,IAAM,qBAAqB;AAE3B,IAAM,wBACX;AAEK,IAAM,0BACX;AAEK,IAAM,eAAe;AACrB,IAAM,aAAa;AAEnB,IAAM,qBAAqB,GAAG,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAU/C,UAAU;;;ADRL,SAAS,kBACd,KACA,SACmB;AACnB,QAAM,iBAAa,wBAAK,KAAK,WAAW;AACxC,QAAM,WAAW,aAAa,KAAK,WAAW;AAE9C,MAAI,aAAa,MAAM;AACrB,uCAAc,YAAY,GAAG,kBAAkB;AAAA,GAAM,MAAM;AAC3D,WAAO,EAAE,QAAQ,UAAU;AAAA,EAC7B;AAEA,QAAM,WAAW,SAAS,SAAS,YAAY;AAC/C,QAAM,SAAS,SAAS,SAAS,UAAU;AAE3C,MAAI,YAAY,QAAQ;AACtB,QAAI,CAAC,QAAQ,UAAU,CAAC,QAAQ,OAAO;AACrC,aAAO,EAAE,QAAQ,SAAS;AAAA,IAC5B;AACA,UAAM,UAAU,SAAS;AAAA,MACvB,IAAI,OAAO,GAAG,aAAa,YAAY,CAAC,aAAa,aAAa,UAAU,CAAC,EAAE;AAAA,MAC/E;AAAA,IACF;AACA,QAAI,YAAY,YAAY,CAAC,QAAQ,OAAO;AAC1C,aAAO,EAAE,QAAQ,SAAS;AAAA,IAC5B;AACA,uCAAc,YAAY,SAAS,MAAM;AACzC,WAAO,EAAE,QAAQ,WAAW;AAAA,EAC9B;AAEA,MAAI,aAAa,QAAQ;AACvB,QAAI,QAAQ,OAAO;AACjB,YAAM,iBAAiB,SACpB,QAAQ,IAAI,OAAO,GAAG,aAAa,YAAY,CAAC,WAAW,GAAG,EAAE,EAChE,QAAQ,YAAY,EAAE;AACzB;AAAA,QACE;AAAA,QACA,GAAG,eAAe,QAAQ,CAAC;AAAA;AAAA,EAAO,kBAAkB;AAAA;AAAA,QACpD;AAAA,MACF;AACA,aAAO,EAAE,QAAQ,WAAW;AAAA,IAC9B;AACA,WAAO,mBAAmB,KAAK,QAAQ;AAAA,EACzC;AAEA,qCAAc,YAAY,GAAG,SAAS,QAAQ,CAAC;AAAA;AAAA,EAAO,kBAAkB;AAAA,GAAM,MAAM;AACpF,SAAO,EAAE,QAAQ,SAAS;AAC5B;AAEA,SAAS,mBAAmB,KAAa,UAAqC;AAC5E,QAAM,eAAW,wBAAK,KAAK,SAAS,SAAS;AAC7C,iCAAU,UAAU,EAAE,WAAW,KAAK,CAAC;AACvC,QAAM,gBAAY,wBAAK,UAAU,iBAAiB;AAClD,QAAM,YAAY;AAAA,IAChB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AACX,qCAAc,WAAW,WAAW,MAAM;AAC1C,SAAO,EAAE,QAAQ,YAAY,UAAU;AACzC;AAEA,SAAS,aAAa,OAAuB;AAC3C,SAAO,MAAM,QAAQ,uBAAuB,MAAM;AACpD;;;AEnFA,IAAAC,kBAAyC;AACzC,yBAA8B;AAC9B,IAAAC,oBAA8B;AAYvB,SAAS,qBAAqB,KAA4B;AAC/D,QAAM,YAAQ,wBAAK,KAAK,gBAAgB,eAAe;AACvD,UAAI,gCAAW,wBAAK,OAAO,oBAAoB,CAAC,EAAG,QAAO;AAE1D,MAAI;AACF,UAAMC,eAAU,sCAAc,wBAAK,KAAK,cAAc,CAAC;AACvD,UAAM,UAAUA,SAAQ,QAAQ,GAAG,eAAe,eAAe;AACjE,eAAO,2BAAQ,OAAO;AAAA,EACxB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,sBAAsB,UAA4C;AAChF,MAAI;AACF,UAAM,UAAM,kCAAa,wBAAK,UAAU,oBAAoB,GAAG,MAAM;AACrE,WAAO,KAAK,MAAM,GAAG;AAAA,EACvB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,oBAAoB,KAAqB;AACvD,MAAI;AACF,UAAM,cAAU,wBAAK,KAAK,cAAc;AACxC,UAAM,MAAM,KAAK,UAAM,8BAAa,SAAS,MAAM,CAAC;AAIpD,UAAM,OAAO,EAAE,GAAG,IAAI,cAAc,GAAG,IAAI,gBAAgB;AAC3D,UAAM,gBAAgB,OAAO,OAAO,IAAI,EAAE,KAAK,CAAC,MAAM,MAAM,aAAa;AACzE,QAAI,cAAe,QAAO;AAAA,EAC5B,QAAQ;AAAA,EAER;AACA,SAAO;AACT;AAEO,SAAS,0BACd,KACA,aACA,eAAe,sBACiB;AAChC,MAAI;AACF,UAAM,UAAM;AAAA,UACV,wBAAK,KAAK,gBAAgB,aAAa,YAAY;AAAA,MACnD;AAAA,IACF;AACA,WAAO,KAAK,MAAM,GAAG;AAAA,EACvB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;AH9BA,SAAS,iBAAiB,KAAa,MAAc,OAAsB;AACzE,iCAAU,MAAM,EAAE,WAAW,KAAK,CAAC;AACnC,aAAW,aAAS,6BAAY,GAAG,GAAG;AACpC,UAAM,cAAU,wBAAK,KAAK,KAAK;AAC/B,UAAM,eAAW,wBAAK,MAAM,KAAK;AACjC,UAAM,WAAO,0BAAS,OAAO;AAC7B,QAAI,KAAK,YAAY,GAAG;AACtB,uBAAiB,SAAS,UAAU,KAAK;AAAA,IAC3C,OAAO;AACL,UAAI,CAAC,aAAS,4BAAW,QAAQ,EAAG;AACpC,kCAAO,SAAS,QAAQ;AAAA,IAC1B;AAAA,EACF;AACF;AAEA,SAAS,0BACP,KACA,IACA,aACM;AACN,QAAM,MAAM,gBAAgB,GAAG;AAC/B,MAAI,CAAC,IAAK,OAAM,IAAI,MAAM,wBAAwB;AAElD,QAAM,OAAO,oBAAoB,GAAG;AACpC,QAAM,WAAW,IAAI,kBAAkB,eAAe;AACtD,MAAI,aAAa,QAAQ,aAAa,oBAAoB;AACxD,QAAI,CAAC,eAAe,KAAC,gCAAW,wBAAK,KAAK,gBAAgB,eAAe,CAAC,GAAG;AAC3E,mBAAa,KAAK,EAAE;AAAA,IACtB;AACA;AAAA,EACF;AAEA,MAAI,CAAC,aAAa;AAChB,gBAAY,KAAK,IAAI,GAAG,eAAe,IAAI,IAAI,EAAE;AAAA,EACnD;AACF;AAEA,SAAS,iBAAiB,KAAa,UAAwC;AAC7E,QAAM,YAAY,WAAW,KAAK,uBAAuB;AACzD,QAAM,aAAa,QAAQ,UAAU,UAAU,OAAO,SAAS;AAC/D,SAAO,aAAa;AACtB;AAEO,SAAS,iBAAiB,SAAkD;AACjF,QAAM,EAAE,KAAK,SAAS,OAAO,QAAQ,OAAO,cAAc,MAAM,IAAI;AACpE,QAAM,KAAK,QAAQ,MAAM,qBAAqB,GAAG;AACjD,QAAM,WAAW,aAAa,GAAG;AAEjC,MAAI,iBAAiB,KAAK,QAAQ,KAAK,CAAC,UAAU,CAAC,OAAO;AACxD,UAAMC,YAAW,qBAAqB,GAAG;AACzC,QAAIA,WAAU;AACZ,YAAMC,gBAAe,sBAAsBD,SAAQ;AACnD,aAAO;AAAA,QACL,kBAAkB;AAAA,QAClB,UAAAA;AAAA,QACA,YAAYC,eAAc,cAAc;AAAA,QACxC,aAAa,EAAE,QAAQ,SAAS;AAAA,MAClC;AAAA,IACF;AAAA,EACF;AAEA,4BAA0B,KAAK,IAAI,WAAW;AAE9C,QAAM,WAAW,qBAAqB,GAAG;AACzC,MAAI,CAAC,UAAU;AACb,UAAM,IAAI;AAAA,MACR,GAAG,eAAe,mBAAmB,EAAE,WAAW,eAAe;AAAA,IACnE;AAAA,EACF;AAEA,QAAM,eAAe,sBAAsB,QAAQ;AACnD,MAAI,CAAC,cAAc,YAAY;AAC7B,UAAM,IAAI,MAAM,GAAG,eAAe,yCAAyC;AAAA,EAC7E;AAEA,QAAM,eAAW,wBAAK,UAAU,OAAO;AACvC,QAAM,eAAW,wBAAK,UAAU,cAAc;AAC9C,QAAM,gBAAY,wBAAK,KAAK,SAAS,OAAO;AAC5C,QAAM,gBAAY,wBAAK,KAAK,WAAW,OAAO;AAE9C,mBAAiB,UAAU,WAAW,SAAS,MAAM;AACrD,iCAAU,WAAW,EAAE,WAAW,KAAK,CAAC;AACxC,mBAAiB,UAAU,WAAW,SAAS,MAAM;AAErD,QAAM,cAAc,kBAAkB,KAAK,EAAE,QAAQ,MAAM,CAAC;AAE5D,QAAM,cACJ,qBAAqB,KAAK,eAAe,KACzC,UAAU,QACV,aAAa;AAEf,QAAM,eAA6B;AAAA,IACjC,SAAS,UAAU,WAAW;AAAA,IAC9B,MAAM;AAAA,IACN,UAAU;AAAA,MACR,GAAG,UAAU;AAAA,MACb,OAAO;AAAA,QACL,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,QAClC,WAAW,aAAa;AAAA,QACxB,YAAY,aAAa;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AACA,gBAAc,KAAK,YAAY;AAE/B,SAAO;AAAA,IACL,kBAAkB;AAAA,IAClB;AAAA,IACA,YAAY,aAAa;AAAA,IACzB;AAAA,EACF;AACF;AAEO,SAAS,yBAAyB,QAAkC;AACzE,MAAI,OAAO,kBAAkB;AAC3B,YAAQ,IAAI,qCAAgC;AAC5C,YAAQ,IAAI,yBAAyB;AACrC,YAAQ,IAAI,iBAAiB,OAAO,cAAc,WAAW,EAAE;AAC/D,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,qBAAqB;AACjC;AAAA,EACF;AAEA,UAAQ,IAAI,6CAAwC;AACpD,UAAQ,IAAI,2DAAsD;AAElE,UAAQ,OAAO,YAAY,QAAQ;AAAA,IACjC,KAAK;AACH,cAAQ,IAAI,mDAA8C;AAC1D;AAAA,IACF,KAAK;AACH,cAAQ,IAAI,mDAA8C;AAC1D;AAAA,IACF,KAAK;AACH,cAAQ,IAAI,uCAAkC;AAC9C;AAAA,IACF,KAAK;AACH,cAAQ;AAAA,QACN,2DAAiD,OAAO,YAAY,SAAS;AAAA,MAC/E;AACA,cAAQ,KAAK,wDAAwD;AACrE;AAAA,EACJ;AAEA,UAAQ,IAAI,iBAAiB,OAAO,UAAU,EAAE;AAChD,UAAQ,IAAI,EAAE;AACd,UAAQ,IAAI,qBAAqB;AACnC;;;AI1KO,SAAS,YAAY,SAAgC;AAC1D,MAAI;AACF,UAAM,SAAS,iBAAiB;AAAA,MAC9B,KAAK,QAAQ;AAAA,MACb,QAAQ,QAAQ;AAAA,MAChB,OAAO,QAAQ;AAAA,MACf,IAAI,QAAQ;AAAA,IACd,CAAC;AACD,6BAAyB,MAAM;AAE/B,QAAI,OAAO,YAAY,WAAW,YAAY;AAC5C,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,SAAS,OAAO;AACd,YAAQ,MAAM,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AACpE,YAAQ,MAAM,qBAAqB;AACnC,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAEO,SAAS,cAAc,QAAuB;AACnD,UAAQ,MAAM,uBAAuB,MAAM,EAAE;AAC7C,UAAQ,MAAM,6BAA6B;AAC3C,UAAQ,KAAK,CAAC;AAChB;;;ACrCA,IAAAC,kBAA0C;AAC1C,IAAAC,oBAAqB;AAarB,SAAS,qBAAqB,KAErB;AACP,MAAI;AACF,UAAM,UAAM;AAAA,UACV,wBAAK,KAAK,uEAAuE;AAAA,MACjF;AAAA,IACF;AACA,WAAO,KAAK,MAAM,GAAG;AAAA,EACvB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,sBAAsB,KAAuB;AACpD,QAAM,iBAAa,wBAAK,KAAK,aAAa;AAC1C,QAAM,MAAM,oBAAI,IAAY;AAE5B,MAAI;AACF,eAAW,YAAQ,6BAAY,UAAU,GAAG;AAC1C,YAAM,QAAQ,KAAK,MAAM,qCAAqC;AAC9D,UAAI,OAAO;AACT,YAAI,IAAI,MAAM,CAAC,EAAE,YAAY,CAAC;AAAA,MAChC;AAAA,IACF;AAAA,EACF,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AAEA,SAAO,CAAC,GAAG,GAAG,EAAE,KAAK;AACvB;AAEO,SAAS,mBAAmB,KAA4B;AAC7D,QAAM,aAAa,WAAW,KAAK,wBAAwB;AAC3D,QAAM,gBAAgB;AAAA,IACpB;AAAA,IACA;AAAA,EACF;AAEA,MAAI,CAAC,cAAc,CAAC,eAAe;AACjC,WAAO;AAAA,MACL;AAAA,QACE,IAAI;AAAA,QACJ,QAAQ;AAAA,QACR,SAAS;AAAA,MACX;AAAA,MACA;AAAA,QACE,IAAI;AAAA,QACJ,QAAQ;AAAA,QACR,SAAS;AAAA,MACX;AAAA,MACA;AAAA,QACE,IAAI;AAAA,QACJ,QAAQ;AAAA,QACR,SAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAEA,QAAM,UAAyB,CAAC;AAEhC,QAAM,UAAU,aAAa,KAAK,wBAAwB;AAC1D,QAAM,iBACJ,YAAY,SACX,kBAAkB,KAAK,OAAO,KAAK,eAAe,KAAK,OAAO;AAEjE,MAAI,gBAAgB;AAClB,YAAQ,KAAK;AAAA,MACX,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,SAAS;AAAA,IACX,CAAC;AAAA,EACH,OAAO;AACL,YAAQ,KAAK;AAAA,MACX,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAEA,QAAM,cAAc,qBAAqB,KAAK,yBAAyB;AACvE,QAAM,cAAc,qBAAqB,KAAK,eAAe;AAC7D,QAAM,YAAY,cAAc,SAAS,WAAW,IAAI;AACxD,QAAM,YAAY,cAAc,SAAS,WAAW,IAAI;AAExD,MAAI,CAAC,eAAe;AAClB,YAAQ,KAAK;AAAA,MACX,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,SAAS;AAAA,IACX,CAAC;AAAA,EACH,WAAW,aAAa,aAAa,cAAc,WAAW;AAC5D,YAAQ,KAAK;AAAA,MACX,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,SAAS,2BAA2B,WAAW,0BAA0B,WAAW;AAAA,IACtF,CAAC;AAAA,EACH,OAAO;AACL,YAAQ,KAAK;AAAA,MACX,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,SAAS,yBAAyB,aAAa,SAAS,wBAAmB,aAAa,SAAS;AAAA,MACjG,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAEA,QAAM,WAAW,qBAAqB,GAAG;AACzC,QAAM,aAAa,UAAU,aAAa,OAAO,KAAK,SAAS,UAAU,IAAI,CAAC;AAC9E,QAAM,WAAW,sBAAsB,GAAG;AAC1C,QAAM,YAAY,SAAS,OAAO,CAAC,OAAO,CAAC,WAAW,SAAS,EAAE,CAAC;AAElE,MAAI,CAAC,UAAU;AACb,YAAQ,KAAK;AAAA,MACX,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,SAAS;AAAA,IACX,CAAC;AAAA,EACH,WAAW,UAAU,WAAW,GAAG;AACjC,YAAQ,KAAK;AAAA,MACX,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,SACE,WAAW,SAAS,IAChB,4BAA4B,WAAW,MAAM,4CAC7C;AAAA,IACR,CAAC;AACD,QAAI,WAAW,SAAS,KAAK,WAAW,SAAS,IAAI;AACnD,cAAQ,KAAK;AAAA,QACX,IAAI;AAAA,QACJ,QAAQ;AAAA,QACR,SAAS,6CAA6C,WAAW,MAAM;AAAA,MACzE,CAAC;AAAA,IACH;AAAA,EACF,OAAO;AACL,YAAQ,KAAK;AAAA,MACX,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,SAAS,8BAA8B,UAAU,KAAK,IAAI,CAAC;AAAA,MAC3D,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAEA,QAAM,WAAW,aAAa,GAAG;AACjC,MAAI,iBAAiB,CAAC,UAAU,UAAU,WAAW;AACnD,YAAQ,KAAK;AAAA,MACX,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAEA,SAAS,4BAA4B,KAA4B;AAC/D,SACE;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAAG,cACH,0BAA0B,KAAK,2BAA2B,wBAAwB,GAC9E,cACJ,0BAA0B,KAAK,yBAAyB,GAAG,cAC3D;AAEJ;AASO,SAAS,eAAe,KAA4B;AACzD,QAAM,qBAAqB;AAAA,IACzB;AAAA,IACA;AAAA,EACF;AACA,QAAM,cAAc,WAAW,KAAK,uBAAuB;AAC3D,QAAM,aAAa,aAAa,KAAK,WAAW;AAChD,QAAM,gBACJ,eAAe,QACf,sBAAsB,KAAK,UAAU,KACrC,oBAAoB,KAAK,UAAU;AAErC,MAAI,CAAC,sBAAsB,CAAC,aAAa;AACvC,WAAO;AAAA,MACL;AAAA,QACE,IAAI;AAAA,QACJ,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,SAAS;AAAA,MACX;AAAA,MACA;AAAA,QACE,IAAI;AAAA,QACJ,QAAQ;AAAA,QACR,SAAS;AAAA,MACX;AAAA,MACA;AAAA,QACE,IAAI;AAAA,QACJ,QAAQ;AAAA,QACR,SAAS;AAAA,MACX;AAAA,MACA;AAAA,QACE,IAAI;AAAA,QACJ,QAAQ;AAAA,QACR,SAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAEA,QAAM,UAAyB,CAAC;AAChC,QAAM,WAAW,aAAa,GAAG;AACjC,QAAM,eAAe,UAAU,UAAU,OAAO;AAChD,QAAM,WAAW,qBAAqB,GAAG;AACzC,QAAM,eAAe,WAAW,sBAAsB,QAAQ,IAAI;AAClE,QAAM,WAAW,cAAc;AAE/B,UAAQ,KAAK;AAAA,IACX,IAAI;AAAA,IACJ,QAAQ,cAAc,SAAS;AAAA,IAC/B,SAAS,cACL,gCACA;AAAA,IACJ,SAAS,cAAc,SAAY;AAAA,EACrC,CAAC;AAED,UAAQ,KAAK;AAAA,IACX,IAAI;AAAA,IACJ,QAAQ,gBAAgB,SAAS;AAAA,IACjC,SAAS,gBACL,gDACA;AAAA,IACJ,SAAS,gBAAgB,SAAY;AAAA,EACvC,CAAC;AAED,MAAI,gBAAgB,YAAY,iBAAiB,UAAU;AACzD,YAAQ,KAAK;AAAA,MACX,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,SAAS;AAAA,IACX,CAAC;AAAA,EACH,WAAW,gBAAgB,UAAU;AACnC,YAAQ,KAAK;AAAA,MACX,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,SAAS;AAAA,IACX,CAAC;AAAA,EACH,OAAO;AACL,YAAQ,KAAK;AAAA,MACX,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAEA,QAAM,gBAAgB,4BAA4B,GAAG;AACrD,QAAM,yBAAyB;AAAA,IAC7B;AAAA,IACA;AAAA,EACF;AACA,MAAI,CAAC,wBAAwB;AAC3B,YAAQ,KAAK;AAAA,MACX,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,SAAS;AAAA,IACX,CAAC;AAAA,EACH,WAAW,CAAC,eAAe;AACzB,YAAQ,KAAK;AAAA,MACX,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,SAAS;AAAA,IACX,CAAC;AAAA,EACH,WAAW,YAAY,kBAAkB,UAAU;AACjD,YAAQ,KAAK;AAAA,MACX,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,SAAS;AAAA,IACX,CAAC;AAAA,EACH,OAAO;AACL,YAAQ,KAAK;AAAA,MACX,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,SACE;AAAA,MACF,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAEA,UAAQ,KAAK;AAAA,IACX,IAAI;AAAA,IACJ,QAAQ;AAAA,IACR,SAAS,UAAK,uBAAuB;AAAA,EACvC,CAAC;AAED,SAAO;AACT;AAEO,SAAS,eAAe,KAA4B;AACzD,QAAM,aAAa,WAAW,KAAK,aAAa;AAChD,MAAI,CAAC,YAAY;AACf,WAAO;AAAA,MACL;AAAA,QACE,IAAI;AAAA,QACJ,QAAQ;AAAA,QACR,SAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,MACE,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,SAAS;AAAA,IACX;AAAA,EACF;AACF;;;AC5UO,SAAS,iBACd,KACA,KAC4C;AAC5C,QAAM,UAAyB,CAAC;AAChC,MAAI,QAAQ;AAEZ,MAAI,CAAC,eAAe,GAAG,GAAG;AACxB,QAAI,KAAK;AACP,YAAM,MAAM,gBAAgB,GAAG;AAC/B,YAAM,cACJ,qBAAqB,KAAK,eAAe,KACzC,KAAK,eAAe,eAAe,GAAG,QAAQ,UAAU,EAAE,KAC1D;AACF,yBAAmB,KAAK,WAAW;AACnC,cAAQ;AACR,cAAQ,KAAK;AAAA,QACX,IAAI;AAAA,QACJ,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,SAAS;AAAA,MACX,CAAC;AACD,aAAO,EAAE,SAAS,MAAM;AAAA,IAC1B;AAEA,YAAQ,KAAK;AAAA,MACX,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,SAAS;AAAA,IACX,CAAC;AACD,WAAO,EAAE,SAAS,MAAM;AAAA,EAC1B;AAEA,QAAM,WAAW,aAAa,GAAG;AACjC,MAAI,CAAC,YAAY,CAAC,sBAAsB,QAAQ,GAAG;AACjD,YAAQ,KAAK;AAAA,MACX,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,SAAS;AAAA,IACX,CAAC;AACD,WAAO,EAAE,SAAS,MAAM;AAAA,EAC1B;AAEA,UAAQ,KAAK;AAAA,IACX,IAAI;AAAA,IACJ,QAAQ;AAAA,IACR,SAAS,mCAAmC,SAAS,IAAI,SAAS,SAAS,OAAO;AAAA,EACpF,CAAC;AAED,SAAO,EAAE,SAAS,MAAM;AAC1B;;;AC1DO,SAAS,oBAAoB,KAA4B;AAC9D,QAAM,UAAyB,CAAC;AAChC,QAAM,YACJ,aAAa,KAAK,gCAAgC,KAClD,aAAa,KAAK,+BAA+B;AAGnD,MAAI,aAAa,sBAAsB,KAAK,SAAS,GAAG;AACtD,YAAQ,KAAK;AAAA,MACX,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,SAAS;AAAA,IACX,CAAC;AAAA,EACH,OAAO;AACL,YAAQ,KAAK;AAAA,MACX,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAGA,QAAM,cACJ,kBAAkB,KAAK,0BAA0B,KACjD,kBAAkB,KAAK,oBAAoB,KAC3C,kBAAkB,KAAK,8BAA8B;AAEvD,MAAI,aAAa;AACf,UAAM,iBAAiB,YACnB,qBAAqB,KAAK,SAAS,IACnC,kBAAkB,KAAK,oBAAoB;AAC/C,QAAI,CAAC,gBAAgB;AACnB,cAAQ,KAAK;AAAA,QACX,IAAI;AAAA,QACJ,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,SAAS;AAAA,MACX,CAAC;AAAA,IACH,OAAO;AACL,cAAQ,KAAK;AAAA,QACX,IAAI;AAAA,QACJ,QAAQ;AAAA,QACR,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAAA,EACF,OAAO;AACL,YAAQ,KAAK;AAAA,MACX,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAEA,SAAO;AACT;;;AChDA,IAAM,cAAc;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,wBAAwB,CAAC,WAAW,uBAAuB;AAEjE,IAAM,wBAAwB;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,SAAS,cAAc,KAA4B;AACxD,QAAM,MAAM,gBAAgB,GAAG;AAC/B,MAAI,CAAC,KAAK;AACR,WAAO;AAAA,MACL;AAAA,QACE,IAAI;AAAA,QACJ,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,SAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAEA,QAAM,KAAK,qBAAqB,GAAG;AACnC,QAAM,UAAyB,CAAC;AAGhC,QAAM,iBACJ,qBAAqB,KAAK,SAAS,KACnC,cAAc,KAAK,SAAS,GAAG,QAAQ,UAAU,EAAE,KACnD;AACF,QAAM,YACJ,cAAc,KAAK,iBAAiB,SAAS,KAC7C,cAAc,KAAK,kBAAkB,SAAS,KAC9C;AAEF,MAAI,CAAC,gBAAgB;AACnB,YAAQ,KAAK;AAAA,MACX,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,SAAS,aAAa,IAAI,CAAC,kBAAkB,CAAC;AAAA,IAChD,CAAC;AAAA,EACH,WAAW,CAAC,eAAe,gBAAgB,SAAS,GAAG;AACrD,YAAQ,KAAK;AAAA,MACX,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,SAAS,WAAW,cAAc,uBAAuB,SAAS;AAAA,MAClE,SAAS,aAAa,IAAI,CAAC,WAAW,SAAS,EAAE,CAAC;AAAA,IACpD,CAAC;AAAA,EACH,OAAO;AACL,YAAQ,KAAK;AAAA,MACX,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,SAAS,WAAW,cAAc;AAAA,IACpC,CAAC;AAAA,EACH;AAGA,QAAM,YAAY,YAAY,OAAO,CAAC,SAAS;AAC7C,UAAM,YAAY,qBAAqB,KAAK,IAAI;AAChD,UAAM,WAAW,cAAc,KAAK,IAAI;AACxC,WAAO,CAAC,aAAa,CAAC;AAAA,EACxB,CAAC;AAED,MAAI,UAAU,SAAS,GAAG;AACxB,YAAQ,KAAK;AAAA,MACX,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,SAAS,qCAAqC,UAAU,KAAK,IAAI,CAAC;AAAA,MAClE,SAAS,aAAa,IAAI,CAAC,GAAG,SAAS,CAAC;AAAA,IAC1C,CAAC;AAAA,EACH,OAAO;AACL,YAAQ,KAAK;AAAA,MACX,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,SACE;AAAA,IACJ,CAAC;AAAA,EACH;AAGA,QAAM,WAAW,OAAO,KAAK;AAAA,IAC3B,GAAG,IAAI;AAAA,IACP,GAAG,IAAI;AAAA,EACT,CAAC,EAAE,OAAO,CAAC,MAAM,EAAE,WAAW,WAAW,CAAC;AAE1C,QAAM,eAAe,SAClB,IAAI,CAAC,SAAS;AACb,UAAM,IACJ,qBAAqB,KAAK,IAAI,KAC9B,cAAc,KAAK,IAAI,GAAG,QAAQ,UAAU,EAAE;AAChD,WAAO,IAAI,EAAE,MAAM,SAAS,EAAE,IAAI;AAAA,EACpC,CAAC,EACA,OAAO,CAAC,MAA8C,MAAM,IAAI;AAEnE,QAAM,SAAS,IAAI;AAAA,IACjB,aACG,IAAI,CAAC,MAAM;AACV,YAAM,QAAQ,EAAE,QAAQ,MAAM,GAAG;AACjC,aAAO,MAAM,UAAU,IAAI,GAAG,MAAM,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,KAAK;AAAA,IACzD,CAAC,EACA,OAAO,CAAC,MAAmB,MAAM,QAAQ,CAAC,EAAE,SAAS,WAAW,CAAC;AAAA,EACtE;AAEA,MAAI,aAAa,WAAW,GAAG;AAC7B,YAAQ,KAAK;AAAA,MACX,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,SAAS,aAAa,IAAI,CAAC,wBAAwB,uBAAuB,CAAC;AAAA,IAC7E,CAAC;AAAA,EACH,WAAW,OAAO,OAAO,GAAG;AAC1B,YAAQ,KAAK;AAAA,MACX,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,SAAS,yCAAyC,CAAC,GAAG,MAAM,EAAE,KAAK,IAAI,CAAC;AAAA,MACxE,SAAS,GAAG,OAAO,SAAS,SAAS,EAAE;AAAA,IACzC,CAAC;AAAA,EACH,OAAO;AACL,YAAQ,KAAK;AAAA,MACX,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,SAAS,gCAAgC,aAAa,IAAI,CAAC,MAAM,GAAG,EAAE,IAAI,IAAI,EAAE,OAAO,EAAE,EAAE,KAAK,IAAI,CAAC;AAAA,IACvG,CAAC;AAAA,EACH;AAEA,aAAW,QAAQ,uBAAuB;AACxC,UAAM,YAAY,qBAAqB,KAAK,IAAI;AAChD,UAAM,WAAW,cAAc,KAAK,IAAI;AACxC,QAAI,CAAC,aAAa,CAAC,UAAU;AAC3B,cAAQ,KAAK;AAAA,QACX,IAAI;AAAA,QACJ,QAAQ;AAAA,QACR,SAAS,eAAe,IAAI;AAAA,QAC5B,SAAS,GAAG,aAAa,IAAI,CAAC,IAAI,CAAC,CAAC;AAAA,MACtC,CAAC;AAAA,IACH;AAAA,EACF;AAEA,aAAW,QAAQ,uBAAuB;AACxC,UAAM,YAAY,qBAAqB,KAAK,IAAI;AAChD,UAAM,WAAW,cAAc,KAAK,IAAI;AACxC,QAAI,CAAC,aAAa,CAAC,UAAU;AAC3B,cAAQ,KAAK;AAAA,QACX,IAAI;AAAA,QACJ,QAAQ;AAAA,QACR,SAAS,iBAAiB,IAAI;AAAA,QAC9B,SAAS,mCAAmC,aAAa,IAAI,CAAC,IAAI,CAAC,CAAC;AAAA,MACtE,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AACT;;;AC3KA,IAAM,iBACJ;AAEK,SAAS,iBAAiB,KAA4B;AAC3D,QAAM,UAAyB,CAAC;AAGhC,MAAI,WAAW,KAAK,mBAAmB,GAAG;AACxC,YAAQ,KAAK;AAAA,MACX,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,SAAS;AAAA,IACX,CAAC;AAAA,EACH,OAAO;AACL,YAAQ,KAAK;AAAA,MACX,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAGA,QAAM,YACJ,aAAa,KAAK,gCAAgC,KAClD,aAAa,KAAK,+BAA+B;AAEnD,MAAI,CAAC,WAAW;AACd,YAAQ,KAAK;AAAA,MACX,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,SAAS;AAAA,IACX,CAAC;AAAA,EACH,OAAO;AACL,UAAM,aAAa,kBAAkB,KAAK,SAAS;AACnD,UAAM,WAAW,gBAAgB,KAAK,SAAS,KAAK,kBAAkB,KAAK,SAAS;AACpF,QAAI,cAAc,UAAU;AAC1B,cAAQ,KAAK;AAAA,QACX,IAAI;AAAA,QACJ,QAAQ;AAAA,QACR,SAAS;AAAA,MACX,CAAC;AAAA,IACH,OAAO;AACL,cAAQ,KAAK;AAAA,QACX,IAAI;AAAA,QACJ,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAAA,EACF;AAGA,QAAM,eACJ,kBAAkB,KAAK,cAAc,KACrC,kBAAkB,KAAK,0CAA0C;AAEnE,MAAI,cAAc;AAChB,UAAM,WAAW,YAAY,gBAAgB,KAAK,SAAS,IAAI;AAC/D,UAAM,WAAW,YAAY,gBAAgB,KAAK,SAAS,IAAI;AAC/D,QAAI,CAAC,YAAY,CAAC,UAAU;AAC1B,cAAQ,KAAK;AAAA,QACX,IAAI;AAAA,QACJ,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,SAAS;AAAA,MACX,CAAC;AAAA,IACH,OAAO;AACL,cAAQ,KAAK;AAAA,QACX,IAAI;AAAA,QACJ,QAAQ;AAAA,QACR,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAAA,EACF,OAAO;AACL,YAAQ,KAAK;AAAA,MACX,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAGA,QAAM,WACH,aAAa,kBAAkB,KAAK,SAAS,KAC9C,kBAAkB,KAAK,WAAW,KAClC,kBAAkB,KAAK,UAAU;AAEnC,MAAI,UAAU;AACZ,YAAQ,KAAK;AAAA,MACX,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,SAAS;AAAA,IACX,CAAC;AAAA,EACH,OAAO;AACL,YAAQ,KAAK;AAAA,MACX,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAEA,SAAO;AACT;;;ACrGO,SAAS,aAAa,SAAuC;AAClE,QAAM,EAAE,KAAK,MAAM,IAAI,IAAI;AAC3B,QAAM,SAAwB,CAAC;AAE/B,SAAO,KAAK,GAAG,cAAc,GAAG,CAAC;AACjC,SAAO,KAAK,GAAG,iBAAiB,GAAG,CAAC;AACpC,SAAO,KAAK,GAAG,oBAAoB,GAAG,CAAC;AAEvC,QAAM,EAAE,SAAS,gBAAgB,IAAI,iBAAiB,KAAK,GAAG;AAC9D,SAAO,KAAK,GAAG,eAAe;AAE9B,MAAI,MAAM;AACR,WAAO,KAAK,GAAG,mBAAmB,GAAG,CAAC;AACtC,WAAO,KAAK,GAAG,eAAe,GAAG,CAAC;AAClC,WAAO,KAAK,GAAG,eAAe,GAAG,CAAC;AAAA,EACpC;AAEA,SAAO;AACT;AAEO,SAAS,gBACd,QACA,QAC2F;AAC3F,MAAI,SAAS;AACb,MAAI,WAAW;AACf,MAAI,WAAW;AACf,MAAI,UAAU;AAEd,aAAW,SAAS,QAAQ;AAC1B,YAAQ,MAAM,QAAQ;AAAA,MACpB,KAAK;AACH;AACA;AAAA,MACF,KAAK;AACH;AACA;AAAA,MACF,KAAK;AACH;AACA;AAAA,MACF,KAAK;AAAA,MACL,KAAK;AACH;AACA;AAAA,IACJ;AAAA,EACF;AAEA,MAAI,WAAW;AACf,MAAI,WAAW,EAAG,YAAW;AAAA,WACpB,UAAU,WAAW,EAAG,YAAW;AAE5C,SAAO,EAAE,QAAQ,UAAU,UAAU,SAAS,SAAS;AACzD;;;ACxDA,IAAM,cAAsC;AAAA,EAC1C,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AACR;AAEO,SAAS,UAAU,SAAsC;AAC9D,QAAM,SAAS,aAAa,OAAO;AACnC,QAAM,UAAU,gBAAgB,QAAQ,QAAQ,MAAM;AAEtD,SAAO;AAAA,IACL;AAAA,IACA,SAAS;AAAA,MACP,QAAQ,QAAQ;AAAA,MAChB,UAAU,QAAQ;AAAA,MAClB,UAAU,QAAQ;AAAA,MAClB,SAAS,QAAQ;AAAA,IACnB;AAAA,IACA,UAAU,QAAQ;AAAA,EACpB;AACF;AAEO,SAAS,kBAAkB,QAAsB,MAAuB;AAC7E,QAAM,QAAkB,CAAC,kBAAkB,EAAE;AAE7C,aAAW,SAAS,OAAO,QAAQ;AACjC,UAAM,OAAO,YAAY,MAAM,MAAM,KAAK;AAC1C,UAAM,KAAK,GAAG,IAAI,IAAI,MAAM,EAAE,KAAK,MAAM,OAAO,EAAE;AAClD,QAAI,MAAM,YAAY,MAAM,WAAW,UAAU,MAAM,WAAW,SAAS;AACzE,YAAM,KAAK,cAAS,MAAM,OAAO,EAAE;AAAA,IACrC;AAAA,EACF;AAEA,QAAM,KAAK,EAAE;AACb,QAAM,EAAE,QAAQ,UAAU,SAAS,IAAI,OAAO;AAC9C,QAAM,OAAO,OAAO,SAAS;AAC7B,QAAM;AAAA,IACJ,GAAG,MAAM,YAAY,QAAQ,cAAc,QAAQ,cAAc,IAAI,sBAAiB,OAAO,QAAQ;AAAA,EACvG;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;AAEO,SAAS,iBAAiB,QAA8B;AAC7D,SAAO,KAAK;AAAA,IACV;AAAA,MACE,QAAQ,OAAO,OAAO,IAAI,CAAC,OAAO;AAAA,QAChC,IAAI,EAAE;AAAA,QACN,QAAQ,EAAE;AAAA,QACV,SAAS,EAAE;AAAA,QACX,GAAI,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,IAAI,CAAC;AAAA,MAC5C,EAAE;AAAA,MACF,SAAS,OAAO;AAAA,MAChB,UAAU,OAAO;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;ACxCA,SAASC,sBAAqB,KAAsB;AAClD,SAAO,WAAW,KAAK,oBAAoB;AAC7C;AAEA,SAAS,YAAY,KAAa,IAA0B;AAC1D,QAAM,WAAW;AAAA,IACf,2BAA2B,sBAAsB;AAAA,IACjD,8CAA8C,wBAAwB;AAAA,EACxE;AACA,kBAAgB,KAAK,IAAI,QAAQ;AACnC;AAEO,SAAS,iBAAiB,SAAoD;AACnF,QAAM,EAAE,KAAK,cAAc,MAAM,IAAI;AACrC,QAAM,KAAK,QAAQ,MAAM,qBAAqB,GAAG;AAEjD,MAAI,CAACA,sBAAqB,GAAG,GAAG;AAC9B,YAAQ,MAAM,gEAA2D;AACzE,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,WAAW,aAAa,GAAG;AACjC,MAAI,CAAC,UAAU;AACb,YAAQ,MAAM,6DAAwD;AACtE,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,UAAU,gBAAgB,GAAG;AACnC,QAAM,cACJ,qBAAqB,KAAK,eAAe,KACzC,SAAS,eAAe,eAAe,GAAG,QAAQ,UAAU,EAAE,KAC9D,SAAS;AAEX,MAAI,CAAC,aAAa;AAChB,YAAQ,IAAI,+BAA+B,EAAE,QAAG;AAChD,gBAAY,KAAK,EAAE;AAAA,EACrB;AAEA,WAAS,UAAU;AACnB,WAAS,OAAO;AAChB,WAAS,aAAa,CAAC;AACvB,WAAS,SAAS,YAAY;AAAA,IAC5B,WAAY,SAAS,SAAS,WAAkD,cAC9E,oBAAI,KAAK,GAAE,YAAY;AAAA,IACzB,eAAe;AAAA,IACf,WAAW;AAAA,IACX,QAAQ;AAAA,EACV;AACA,gBAAc,KAAK,QAAQ;AAE3B,UAAQ,IAAI,yCAAoC,sBAAsB,EAAE;AACxE,UAAQ,IAAI,4DAAuD,wBAAwB,EAAE;AAE7F,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,SAAS,kBAAkB,sBAAsB,sBAAsB,WAAW;AAAA,EACpF;AACF;;;ACnEO,SAAS,aAAa,SAA4B;AACvD,MAAI;AACF,UAAM,SAAS,iBAAiB;AAAA,MAC9B,KAAK,QAAQ;AAAA,MACb,QAAQ;AAAA,MACR,OAAO,QAAQ;AAAA,MACf,IAAI,QAAQ;AAAA,IACd,CAAC;AACD,YAAQ,IAAI,0BAAqB;AACjC,6BAAyB,MAAM;AAAA,EACjC,SAAS,OAAO;AACd,YAAQ,MAAM,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AACpE,YAAQ,MAAM,qBAAqB;AACnC,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAEO,SAASC,kBAAiB,SAA4B;AAC3D,mBAAkB;AAAA,IAChB,KAAK,QAAQ;AAAA,IACb,IAAI,QAAQ;AAAA,EACd,CAAC;AACH;AAEO,SAAS,WAAW,SAA4B;AACrD,QAAM,EAAE,IAAI,IAAI;AAChB,QAAM,WAAW,aAAa,GAAG;AACjC,QAAM,eACJ,WAAW,KAAK,oBAAoB,KAAK,QAAQ,UAAU,UAAU,SAAS;AAChF,QAAM,WAAW,QAAQ,UAAU,UAAU,OAAO,SAAS;AAE7D,MAAI,CAAC,gBAAgB,CAAC,UAAU;AAC9B,YAAQ,MAAM,8FAAyF;AACvG,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI,cAAc;AAChB,qBAAkB,EAAE,KAAK,IAAI,QAAQ,GAAG,CAAC;AAAA,EAC3C,OAAO;AACL,YAAQ,IAAI,+DAAqD;AAAA,EACnE;AAEA,MAAI,UAAU;AACZ,iBAAa,OAAO;AAAA,EACtB,OAAO;AACL,YAAQ,IAAI,uDAA6C;AACzD,YAAQ,MAAM,uBAAuB;AAAA,EACvC;AAEA,UAAQ,IAAI,EAAE;AACd,UAAQ,IAAI,0BAAqB;AACnC;AAEO,SAAS,QAAQ,QAAgB,SAA4B;AAClE,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,mBAAa,OAAO;AACpB;AAAA,IACF,KAAK;AACH,MAAAA,kBAAiB,OAAO;AACxB;AAAA,IACF,KAAK;AACH,iBAAW,OAAO;AAClB;AAAA,IACF;AACE,cAAQ,MAAM,wBAAwB,MAAM,EAAE;AAC9C,cAAQ,MAAM,oCAAoC;AAClD,cAAQ,KAAK,CAAC;AAAA,EAClB;AACF;;;AtBtEA,IAAM,UAAU,IAAI,yBAAQ;AAE5B,QACG,KAAK,SAAS,EACd,YAAY,mEAA8D,EAC1E,QAAQ,WAAW;AAEtB,QACG,QAAQ,QAAQ,EAChB,YAAY,2CAA2C,EACvD,OAAO,gBAAgB,sBAAsB,QAAQ,IAAI,CAAC,EAC1D,OAAO,UAAU,8CAA8C,EAC/D,OAAO,SAAS,4CAA4C,EAC5D,OAAO,YAAY,4BAA4B,EAC/C,OAAO,UAAU,8BAA8B,EAC/C,OAAO,CAAC,SAA2F;AAClG,QAAM,UAAM,4BAAQ,KAAK,GAAG;AAC5B,QAAM,SAAS,UAAU;AAAA,IACvB;AAAA,IACA,MAAM,QAAQ,KAAK,IAAI;AAAA,IACvB,KAAK,QAAQ,KAAK,GAAG;AAAA,IACrB,QAAQ,QAAQ,KAAK,MAAM;AAAA,IAC3B,MAAM,QAAQ,KAAK,IAAI;AAAA,EACzB,CAAC;AAED,MAAI,KAAK,MAAM;AACb,YAAQ,IAAI,iBAAiB,MAAM,CAAC;AAAA,EACtC,OAAO;AACL,YAAQ,IAAI,kBAAkB,QAAQ,QAAQ,KAAK,IAAI,CAAC,CAAC;AAAA,EAC3D;AAEA,UAAQ,KAAK,OAAO,QAAQ;AAC9B,CAAC;AAEH,IAAM,SAAS,QAAQ,QAAQ,KAAK,EAAE,YAAY,2BAA2B;AAE7E,OACG,QAAQ,WAAW,EACnB,YAAY,6BAA6B,EACzC,OAAO,YAAY,mCAAmC,EACtD,OAAO,WAAW,qCAAqC,EACvD,OAAO,kBAAkB,8BAA8B,EACvD,OAAO,kBAAkB,0CAA0C,EACnE,OAAO,gBAAgB,sBAAsB,QAAQ,IAAI,CAAC,EAC1D;AAAA,EACC,CAAC,SAMK;AACJ,oBAAgB;AAAA,MACd,SAAK,4BAAQ,KAAK,GAAG;AAAA,MACrB,QAAQ,QAAQ,KAAK,MAAM;AAAA,MAC3B,OAAO,QAAQ,KAAK,KAAK;AAAA,MACzB,aAAa,QAAQ,KAAK,WAAW;AAAA,MACrC,IAAI,QAAQ,KAAK,EAAE;AAAA,IACrB,CAAC;AACD,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAEF,OACG,QAAQ,OAAO,EACf,YAAY,qDAAgD,EAC5D,OAAO,YAAY,0DAA0D,EAC7E,OAAO,WAAW,qCAAqC,EACvD,OAAO,kBAAkB,0CAA0C,EACnE,OAAO,gBAAgB,sBAAsB,QAAQ,IAAI,CAAC,EAC1D,OAAO,CAAC,SAA0E;AACjF,cAAY;AAAA,IACV,SAAK,4BAAQ,KAAK,GAAG;AAAA,IACrB,QAAQ,QAAQ,KAAK,MAAM;AAAA,IAC3B,OAAO,QAAQ,KAAK,KAAK;AAAA,IACzB,IAAI,QAAQ,KAAK,EAAE;AAAA,EACrB,CAAC;AACH,CAAC;AAEH,OACG,SAAS,YAAY,eAAe,EACpC,OAAO,CAAC,WAA+B;AACtC,MAAI,CAAC,QAAQ;AACX,YAAQ,MAAM,sCAAsC;AACpD,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,gBAAc,MAAM;AACtB,CAAC;AAEH,IAAM,UAAU,QACb,QAAQ,MAAM,EACd,YAAY,2CAA2C;AAE1D,QACG,SAAS,YAAY,yBAAyB,EAC9C,OAAO,WAAW,4BAA4B,EAC9C,OAAO,kBAAkB,0CAA0C,EACnE,OAAO,gBAAgB,sBAAsB,QAAQ,IAAI,CAAC,EAC1D,OAAO,CAAC,QAAgB,SAAwD;AAC/E,UAAQ,QAAQ;AAAA,IACd,SAAK,4BAAQ,KAAK,GAAG;AAAA,IACrB,OAAO,QAAQ,KAAK,KAAK;AAAA,IACzB,IAAI,QAAQ,KAAK,EAAE;AAAA,EACrB,CAAC;AACH,CAAC;AAEH,QAAQ,MAAM;AAEd,SAAS,QAAQ,OAAgE;AAC/E,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,aAAa,MAAM,YAAY;AACrC,MAAI,eAAe,UAAU,eAAe,SAAS,eAAe,QAAQ;AAC1E,WAAO;AAAA,EACT;AACA,UAAQ,MAAM,uBAAuB,KAAK,4BAA4B;AACtE,UAAQ,KAAK,CAAC;AAChB;","names":["import_node_path","import_node_fs","import_node_path","import_node_fs","import_node_path","import_node_fs","import_node_path","semver","import_node_fs","import_node_path","at","runPmInstall","import_node_fs","import_node_path","import_node_fs","import_node_path","import_node_fs","import_node_path","require","packRoot","packManifest","import_node_fs","import_node_path","isStorybookInstalled","runSyncStorybook"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@idia-ui/cli",
3
- "version": "0.2.1",
3
+ "version": "0.2.3",
4
4
  "description": "idia-ui CLI — doctor, brain add-on, and sync for consumer apps",
5
5
  "license": "MIT",
6
6
  "repository": {