{"version":3,"file":"index.mjs","names":["fmtBox","httpRequest","io","io","defaultOutput","io","io","evalCmd","exportCmd","importCmd"],"sources":["../src/app-target.ts","../src/format.ts","../src/app-client.ts","../src/headless.ts","../src/rpc-data.ts","../src/commands/analyze/clusters.ts","../src/commands/analyze/colors.ts","../src/commands/analyze/overlaps.ts","../src/commands/analyze/spacing.ts","../src/commands/analyze/typography.ts","../src/commands/analyze/index.ts","../src/commands/convert.ts","../src/commands/documents.ts","../src/commands/eval.ts","../src/commands/export.ts","../src/commands/find.ts","../src/commands/formats.ts","../src/commands/import.ts","../src/commands/info.ts","../src/commands/lint.ts","../src/commands/node.ts","../src/commands/pages.ts","../src/commands/query.ts","../src/commands/selection.ts","../src/commands/tree.ts","../src/commands/variables.ts","../src/index.ts"],"sourcesContent":["export type AppTargetCLIArgs = {\n  'document-id'?: string\n  'page-id'?: string\n}\n\nexport const appTargetOptions = {\n  'document-id': {\n    type: 'string',\n    description: 'Target OpenPencil document/tab ID when connected to the running app',\n    required: false\n  },\n  'page-id': {\n    type: 'string',\n    description: 'Target page ID when connected to the running app',\n    required: false\n  }\n} as const\n\nexport function appTargetRPCArgs(args: AppTargetCLIArgs): {\n  document_id?: string\n  page_id?: string\n} {\n  return {\n    ...(args['document-id'] ? { document_id: args['document-id'] } : {}),\n    ...(args['page-id'] ? { page_id: args['page-id'] } : {})\n  }\n}\n","import {\n  ok,\n  fail,\n  dim,\n  bold,\n  cyan,\n  box as fmtBox,\n  entity,\n  kv,\n  tree as fmtTree,\n  list as fmtList,\n  node as fmtNode,\n  histogram as fmtHistogram,\n  summary as fmtSummary\n} from 'agentfmt'\nimport type { TreeNode, ListItem, NodeData } from 'agentfmt'\n\nimport type { SceneGraph, SceneNode } from '@open-pencil/scene-graph'\n\nexport {\n  ok,\n  fail,\n  dim,\n  bold,\n  cyan,\n  entity,\n  kv,\n  fmtTree,\n  fmtList,\n  fmtNode,\n  fmtHistogram,\n  fmtSummary\n}\n\nexport function printNodeResults(\n  results: Array<{ type: string; name: string; id: string }>,\n  formatLabel: (n: { type: string; name: string; id: string }) => string = (n) => n.name\n): void {\n  if (results.length === 0) {\n    console.log('No nodes found.')\n    return\n  }\n  console.log('')\n  console.log(bold(`  Found ${results.length} node${results.length > 1 ? 's' : ''}`))\n  console.log('')\n  console.log(\n    fmtList(\n      results.map((n) => ({\n        header: entity(formatType(n.type), formatLabel(n), n.id)\n      }))\n    )\n  )\n  console.log('')\n}\n\nconst TYPE_LABELS: Record<string, string> = {\n  FRAME: 'frame',\n  RECTANGLE: 'rect',\n  ROUNDED_RECTANGLE: 'rounded-rect',\n  ELLIPSE: 'ellipse',\n  TEXT: 'text',\n  COMPONENT: 'component',\n  COMPONENT_SET: 'component-set',\n  INSTANCE: 'instance',\n  GROUP: 'group',\n  VECTOR: 'vector',\n  LINE: 'line',\n  POLYGON: 'polygon',\n  STAR: 'star',\n  BOOLEAN_OPERATION: 'boolean',\n  SECTION: 'section',\n  CANVAS: 'page'\n}\n\nexport function formatType(type: string): string {\n  return TYPE_LABELS[type] ?? type.toLowerCase()\n}\n\nexport function formatBox(node: SceneNode): string {\n  return fmtBox(\n    Math.round(node.width),\n    Math.round(node.height),\n    Math.round(node.x),\n    Math.round(node.y)\n  )\n}\n\nfunction formatFill(node: SceneNode): string | null {\n  if (!node.fills.length) return null\n  const solid = node.fills.find((f) => f.type === 'SOLID' && f.visible)\n  if (!solid?.color) return null\n  const { r, g, b } = solid.color\n  const hex =\n    '#' +\n    [r, g, b]\n      .map((c) =>\n        Math.round(c * 255)\n          .toString(16)\n          .padStart(2, '0')\n      )\n      .join('')\n  return solid.opacity < 1 ? `${hex} ${Math.round(solid.opacity * 100)}%` : hex\n}\n\nfunction formatStroke(node: SceneNode): string | null {\n  if (!node.strokes.length) return null\n  const s = node.strokes[0]\n  const { r, g, b } = s.color\n  const hex =\n    '#' +\n    [r, g, b]\n      .map((c) =>\n        Math.round(c * 255)\n          .toString(16)\n          .padStart(2, '0')\n      )\n      .join('')\n  return `${hex} ${s.weight}px`\n}\n\nexport function nodeToData(node: SceneNode): NodeData {\n  return {\n    type: formatType(node.type),\n    name: node.name,\n    id: node.id,\n    width: Math.round(node.width),\n    height: Math.round(node.height),\n    x: Math.round(node.x),\n    y: Math.round(node.y)\n  }\n}\n\nexport function nodeDetails(node: SceneNode): Record<string, unknown> {\n  const details: Record<string, unknown> = {}\n\n  const fill = formatFill(node)\n  if (fill) details.fill = fill\n\n  const stroke = formatStroke(node)\n  if (stroke) details.stroke = stroke\n\n  if (node.cornerRadius) details.radius = `${node.cornerRadius}px`\n\n  if (node.effects.length > 0) {\n    details.effects = node.effects\n      .map((e) => {\n        if (e.type === 'DROP_SHADOW') return `shadow(${e.radius}px)`\n        if (e.type === 'INNER_SHADOW') return `inner-shadow(${e.radius}px)`\n        if (e.type === 'LAYER_BLUR') return `blur(${e.radius}px)`\n        if (e.type === 'BACKGROUND_BLUR') return `backdrop-blur(${e.radius}px)`\n        return e.type.toLowerCase()\n      })\n      .join(', ')\n  }\n\n  if (node.rotation) details.rotate = `${Math.round(node.rotation)}°`\n  if (node.opacity < 1) details.opacity = node.opacity\n  if (node.blendMode !== 'PASS_THROUGH' && node.blendMode !== 'NORMAL') {\n    details.blend = node.blendMode.toLowerCase().replace(/_/g, '-')\n  }\n  if (node.clipsContent) details.overflow = 'hidden'\n  if (!node.visible) details.visible = false\n  if (node.locked) details.locked = true\n\n  if (node.fontFamily) {\n    details.font = `${node.fontSize}px ${node.fontFamily}`\n  }\n\n  if (node.layoutMode !== 'NONE') {\n    let layout = node.layoutMode.toLowerCase()\n    if (node.layoutWrap === 'WRAP') layout += ' wrap'\n    if (node.itemSpacing) layout += ` gap=${node.itemSpacing}`\n    details.layout = layout\n  }\n\n  if (node.componentId) details.componentId = node.componentId\n\n  return details\n}\n\nexport function nodeToTreeNode(\n  graph: SceneGraph,\n  node: SceneNode,\n  maxDepth: number,\n  depth = 0\n): TreeNode {\n  const treeNode: TreeNode = {\n    header: entity(formatType(node.type), node.name, node.id),\n    details: nodeDetails(node)\n  }\n\n  if (depth < maxDepth && node.childIds.length > 0) {\n    treeNode.children = node.childIds\n      .map((id) => graph.getNode(id))\n      .filter((n): n is SceneNode => n !== undefined)\n      .map((child) => nodeToTreeNode(graph, child, maxDepth, depth + 1))\n  }\n\n  return treeNode\n}\n\nexport function nodeToListItem(node: SceneNode): ListItem {\n  const details = nodeDetails(node)\n  return {\n    header: entity(formatType(node.type), node.name, node.id),\n    details: Object.keys(details).length > 0 ? details : undefined\n  }\n}\n\nexport function formatNodeSingle(node: SceneNode): string {\n  return fmtNode(nodeToData(node), nodeDetails(node))\n}\n\nexport function printError(error: unknown): void {\n  const message = error instanceof Error ? error.message : String(error)\n  console.error(fail(message))\n}\n","import { request as httpRequest } from 'node:http'\nimport type { IncomingMessage } from 'node:http'\n\nimport { readDiscoveryFile } from '@open-pencil/mcp/discovery'\nimport type { DiscoveryInfo } from '@open-pencil/mcp/discovery'\nimport { platformHasUnixSockets } from '@open-pencil/mcp/transport'\n\n/** Maximum time to wait for a single RPC request before giving up. */\nconst RPC_TIMEOUT_MS = 30_000\n\nlet cachedInfo: DiscoveryInfo | null = null\n\nasync function resolveDiscovery(): Promise<DiscoveryInfo> {\n  if (cachedInfo) return cachedInfo\n\n  const info = await readDiscoveryFile()\n  if (!info) {\n    throw new Error(\n      'Could not read MCP discovery file.\\n' +\n        'Is the app running? Start it with: bun run tauri dev'\n    )\n  }\n\n  cachedInfo = info\n  return cachedInfo\n}\n\nfunction doRequest(\n  info: DiscoveryInfo,\n  path: string,\n  method: string,\n  body?: Record<string, unknown>,\n  forceTcp = false\n): Promise<{ status: number; data: unknown }> {\n  return new Promise((resolve, reject) => {\n    const bodyJSON = body ? JSON.stringify(body) : undefined\n    const headers: Record<string, string> = {\n      ...(bodyJSON ? { 'Content-Type': 'application/json' } : {}),\n      ...(info.authToken ? { Authorization: `Bearer ${info.authToken}` } : {})\n    }\n\n    // Use the narrowed `useSocket` variable (string | false) to construct\n    // request options so TypeScript knows socketPath is a string when truthy.\n    const useSocket = !forceTcp && platformHasUnixSockets() && info.socketPath\n    const reqOpts = useSocket\n      ? { socketPath: useSocket, path, method, headers }\n      : { hostname: '127.0.0.1', port: info.httpPort, path, method, headers }\n\n    const req = httpRequest(reqOpts, (res: IncomingMessage) => {\n      const chunks: Buffer[] = []\n      res.on('data', (chunk: Buffer) => chunks.push(chunk))\n      res.on('end', () => {\n        clearTimeout(timer)\n        const raw = Buffer.concat(chunks).toString('utf-8')\n        let data: unknown\n        try {\n          data = JSON.parse(raw)\n        } catch {\n          data = raw\n        }\n        resolve({ status: res.statusCode ?? 500, data })\n      })\n      res.on('error', (err) => {\n        clearTimeout(timer)\n        reject(err)\n      })\n    })\n\n    const timer = setTimeout(() => {\n      req.destroy(new Error(`RPC request timed out after ${RPC_TIMEOUT_MS / 1000}s`))\n    }, RPC_TIMEOUT_MS)\n\n    req.on('error', (err) => {\n      clearTimeout(timer)\n      reject(err)\n    })\n    if (bodyJSON) req.write(bodyJSON)\n    req.end()\n  })\n}\n\nasync function doRPC<T>(\n  info: DiscoveryInfo,\n  command: string,\n  args: unknown,\n  forceTcp = false\n): Promise<T> {\n  const { status, data } = await doRequest(info, '/rpc', 'POST', { command, args }, forceTcp)\n\n  if (status === 401) {\n    throw new UnauthorizedError(\n      'Unauthorized: the auth token in the MCP discovery file may be stale'\n    )\n  }\n  if (status >= 400) {\n    const errData = data as { error?: string }\n    throw new Error(errData.error ?? `RPC failed: HTTP ${status}`)\n  }\n\n  const body = data as { ok?: boolean; result?: T; error?: string }\n  if (body.ok === false) throw new Error(body.error ?? 'RPC failed')\n  return body.result as T\n}\n\n/** Error class to distinguish auth failures for retry logic. */\nclass UnauthorizedError extends Error {\n  constructor(message: string) {\n    super(message)\n    this.name = 'UnauthorizedError'\n  }\n}\n\nfunction isSocketConnectionError(error: unknown): boolean {\n  if (!(error instanceof Error)) return false\n  const code = 'code' in error ? String(error.code) : ''\n  return (\n    code === 'ECONNREFUSED' ||\n    code === 'ENOENT' ||\n    code === 'FailedToOpenSocket' ||\n    error.message.includes('ECONNREFUSED') ||\n    error.message.includes('ENOENT')\n  )\n}\n\nasync function rpcWithFallback<T>(info: DiscoveryInfo, command: string, args: unknown): Promise<T> {\n  try {\n    return await doRPC<T>(info, command, args)\n  } catch (error) {\n    if (\n      !platformHasUnixSockets() ||\n      !info.socketPath ||\n      info.httpPort <= 0 ||\n      !isSocketConnectionError(error)\n    ) {\n      throw error\n    }\n    return doRPC<T>(info, command, args, true)\n  }\n}\n\nexport async function rpc<T = unknown>(command: string, args: unknown = {}): Promise<T> {\n  try {\n    return await rpcWithFallback<T>(await resolveDiscovery(), command, args)\n  } catch (error) {\n    if (!(error instanceof UnauthorizedError) && !isSocketConnectionError(error)) throw error\n    cachedInfo = null\n    return rpcWithFallback<T>(await resolveDiscovery(), command, args)\n  }\n}\n\nexport function isAppMode(file?: string): boolean {\n  return !file\n}\n\nexport function requireFile(file?: string): string {\n  if (!file) throw new Error('File path is required for headless mode')\n  return file\n}\n","import { readFile } from 'node:fs/promises'\n\nimport { BUILTIN_IO_FORMATS, IORegistry, initCanvasKit } from '@open-pencil/core/io'\nimport { populateAllLazyFigImportRoots, populateLazyFigImportRoots } from '@open-pencil/core/kiwi'\nimport { computeAllLayouts } from '@open-pencil/core/layout'\nimport type { SceneGraph } from '@open-pencil/scene-graph'\n\nexport { initCanvasKit }\n\nconst io = new IORegistry(BUILTIN_IO_FORMATS)\n\nexport async function loadDocument(filePath: string): Promise<SceneGraph> {\n  const bytes = new Uint8Array(await readFile(filePath))\n  const { graph } = await io.readDocument({ name: filePath, data: bytes })\n  computeAllLayouts(graph)\n  return graph\n}\n\nexport function populateDocumentPage(graph: SceneGraph, pageId: string): boolean {\n  const changed = populateLazyFigImportRoots(graph, [pageId])\n  if (changed) computeAllLayouts(graph, pageId)\n  return changed\n}\n\nexport function populateWholeDocument(graph: SceneGraph): boolean {\n  const changed = populateAllLazyFigImportRoots(graph)\n  if (changed) computeAllLayouts(graph)\n  return changed\n}\n\nfunction pageNameFromArgs(args: unknown): string | undefined {\n  if (!args || typeof args !== 'object' || Array.isArray(args)) return undefined\n  const page = (args as { page?: unknown }).page\n  return typeof page === 'string' ? page : undefined\n}\n\nfunction populateRequestedPage(graph: SceneGraph, pageName?: string): void {\n  const pages = graph.getPages()\n  const page = pageName ? pages.find((candidate) => candidate.name === pageName) : pages[0]\n  if (page) populateDocumentPage(graph, page.id)\n}\n\nexport function prepareDocumentForRPC(graph: SceneGraph, command: string, args?: unknown): void {\n  if (command === 'pages' || command === 'variables') return\n  if (command === 'tree') {\n    populateRequestedPage(graph, pageNameFromArgs(args))\n    return\n  }\n  if (command === 'find' || command === 'query') {\n    const pageName = pageNameFromArgs(args)\n    if (pageName) populateRequestedPage(graph, pageName)\n    else populateWholeDocument(graph)\n    return\n  }\n  populateWholeDocument(graph)\n}\n","import { executeRPCCommand } from '@open-pencil/core/rpc'\n\nimport { isAppMode, requireFile, rpc } from '#cli/app-client'\nimport { appTargetRPCArgs, type AppTargetCLIArgs } from '#cli/app-target'\nimport { loadDocument, prepareDocumentForRPC } from '#cli/headless'\n\ntype RPCArgs = { [key: string]: unknown }\n\nfunction isRPCArgs(value: unknown): value is RPCArgs {\n  return Boolean(value && typeof value === 'object' && !Array.isArray(value))\n}\n\nexport async function loadRPCData<Result>(\n  file: string | undefined,\n  command: string,\n  args?: unknown,\n  targetArgs?: AppTargetCLIArgs\n): Promise<Result> {\n  if (isAppMode(file)) {\n    return rpc<Result>(command, {\n      ...(isRPCArgs(args) ? args : {}),\n      ...(targetArgs ? appTargetRPCArgs(targetArgs) : {})\n    })\n  }\n  const graph = await loadDocument(requireFile(file))\n  prepareDocumentForRPC(graph, command, args)\n  return executeRPCCommand(graph, command, args) as Result\n}\n","import { defineCommand } from 'citty'\n\nimport type { AnalyzeClustersResult } from '@open-pencil/core/rpc'\nimport { calcClusterConfidence } from '@open-pencil/core/tools'\n\nimport { appTargetOptions } from '#cli/app-target'\nimport { bold, fmtList, fmtSummary } from '#cli/format'\nimport { loadRPCData } from '#cli/rpc-data'\n\nfunction formatSignature(sig: string): string {\n  const [typeSize, children] = sig.split('|')\n  const type = typeSize.split(':')[0]\n  if (!type) return sig\n  const typeName = type.charAt(0) + type.slice(1).toLowerCase()\n  if (!children) return typeName\n\n  const childParts = children.split(',').map((c) => {\n    const [t, count] = c.split(':')\n    if (!t) return ''\n    const name = t.charAt(0) + t.slice(1).toLowerCase()\n    return Number(count) > 1 ? `${name}×${count}` : name\n  })\n\n  return `${typeName} > [${childParts.join(', ')}]`\n}\n\nexport default defineCommand({\n  meta: { description: 'Find repeated design patterns (potential components)' },\n  args: {\n    file: {\n      type: 'positional',\n      description: '.fig file path (omit to connect to running app)',\n      required: false\n    },\n    limit: { type: 'string', description: 'Max clusters to show', default: '20' },\n    'min-size': { type: 'string', description: 'Min node size in px', default: '30' },\n    'min-count': { type: 'string', description: 'Min instances to form cluster', default: '2' },\n    ...appTargetOptions,\n    json: { type: 'boolean', description: 'Output as JSON' }\n  },\n  async run({ args }) {\n    const data = await loadRPCData<AnalyzeClustersResult>(\n      args.file,\n      'analyze_clusters',\n      {\n        limit: Number(args.limit),\n        minSize: Number(args['min-size']),\n        minCount: Number(args['min-count'])\n      },\n      args\n    )\n\n    if (args.json) {\n      console.log(JSON.stringify(data, null, 2))\n      return\n    }\n\n    if (data.clusters.length === 0) {\n      console.log('No repeated patterns found.')\n      return\n    }\n\n    console.log('')\n    console.log(bold('  Repeated patterns'))\n    console.log('')\n\n    const items = data.clusters.map((c) => {\n      const first = c.nodes[0]\n      const confidence = calcClusterConfidence(c.nodes)\n\n      const widths = c.nodes.map((n) => n.width)\n      const heights = c.nodes.map((n) => n.height)\n      const wRange = Math.max(...widths) - Math.min(...widths)\n      const hRange = Math.max(...heights) - Math.min(...heights)\n      const avgW = Math.round(widths.reduce((a, b) => a + b, 0) / widths.length)\n      const avgH = Math.round(heights.reduce((a, b) => a + b, 0) / heights.length)\n\n      const sizeStr =\n        wRange <= 4 && hRange <= 4\n          ? `${avgW}×${avgH}`\n          : `${avgW}×${avgH} (±${Math.max(wRange, hRange)}px)`\n\n      return {\n        header: `${c.nodes.length}× ${first.type.toLowerCase()} \"${first.name}\" (${confidence}% match)`,\n        details: {\n          size: sizeStr,\n          structure: formatSignature(c.signature),\n          examples: c.nodes\n            .slice(0, 3)\n            .map((n) => n.id)\n            .join(', ')\n        }\n      }\n    })\n\n    console.log(fmtList(items, { numbered: true }))\n\n    const clusteredNodes = data.clusters.reduce((sum, c) => sum + c.nodes.length, 0)\n    console.log('')\n    console.log(\n      fmtSummary({\n        clusters: data.clusters.length,\n        'total nodes': data.totalNodes,\n        clustered: clusteredNodes\n      })\n    )\n    console.log('')\n  }\n})\n","import { defineCommand } from 'citty'\n\nimport type { AnalyzeColorsResult } from '@open-pencil/core/rpc'\n\nimport { appTargetOptions } from '#cli/app-target'\nimport { bold, fmtHistogram, fmtList, fmtSummary } from '#cli/format'\nimport { loadRPCData } from '#cli/rpc-data'\n\nexport default defineCommand({\n  meta: { description: 'Analyze color palette usage' },\n  args: {\n    file: {\n      type: 'positional',\n      description: '.fig file path (omit to connect to running app)',\n      required: false\n    },\n    limit: { type: 'string', description: 'Max colors to show', default: '30' },\n    threshold: {\n      type: 'string',\n      description: 'Distance threshold for clustering similar colors (0–50)',\n      default: '15'\n    },\n    similar: { type: 'boolean', description: 'Show similar color clusters' },\n    ...appTargetOptions,\n    json: { type: 'boolean', description: 'Output as JSON' }\n  },\n  async run({ args }) {\n    const data = await loadRPCData<AnalyzeColorsResult>(\n      args.file,\n      'analyze_colors',\n      {\n        threshold: Number(args.threshold),\n        similar: args.similar\n      },\n      args\n    )\n    const limit = Number(args.limit)\n\n    if (args.json) {\n      console.log(JSON.stringify(data, null, 2))\n      return\n    }\n\n    if (data.colors.length === 0) {\n      console.log('No colors found.')\n      return\n    }\n\n    const sorted = data.colors.slice(0, limit)\n\n    console.log('')\n    console.log(bold('  Colors by usage'))\n    console.log('')\n    console.log(\n      fmtHistogram(\n        sorted.map((c) => ({\n          label: c.hex,\n          value: c.count,\n          tag: c.variableName ? `$${c.variableName}` : undefined\n        }))\n      )\n    )\n\n    const hardcoded = data.colors.filter((c) => !c.variableName)\n    const fromVars = data.colors.filter((c) => c.variableName)\n\n    console.log('')\n    console.log(\n      fmtSummary({\n        'unique colors': data.colors.length,\n        'from variables': fromVars.length,\n        hardcoded: hardcoded.length\n      })\n    )\n\n    if (args.similar && data.clusters.length > 0) {\n      console.log('')\n      console.log(bold('  Similar colors (consider merging)'))\n      console.log('')\n      console.log(\n        fmtList(\n          data.clusters.slice(0, 10).map((cluster) => ({\n            header: cluster.colors.map((c) => c.hex).join(', '),\n            details: { suggest: cluster.suggestedHex, total: `${cluster.totalCount}×` }\n          }))\n        )\n      )\n    }\n\n    console.log('')\n  }\n})\n","import { defineCommand } from 'citty'\n\nimport type { AnalyzeOverlapsResult } from '@open-pencil/core/rpc'\nimport {\n  VALID_OVERLAP_CATEGORIES,\n  VALID_OVERLAP_SCOPES,\n  VALID_OVERLAP_SEVERITIES,\n  parseOverlapCategories,\n  parseOverlapScope,\n  parseOverlapSeverity\n} from '@open-pencil/core/tools'\n\nimport { bold, fail, fmtList, fmtSummary, kv } from '#cli/format'\nimport { loadRPCData } from '#cli/rpc-data'\n\nfunction validateScope(scope: string): string | undefined {\n  const normalized = scope.toLowerCase()\n  return (VALID_OVERLAP_SCOPES as readonly string[]).includes(normalized)\n    ? undefined\n    : `Invalid scope \"${scope}\". Must be one of: ${[...VALID_OVERLAP_SCOPES].join(', ')}`\n}\n\nfunction validateSeverity(severity: string): string | undefined {\n  const normalized = severity.toLowerCase()\n  return (VALID_OVERLAP_SEVERITIES as readonly string[]).includes(normalized)\n    ? undefined\n    : `Invalid severity \"${severity}\". Must be one of: ${[...VALID_OVERLAP_SEVERITIES].join(', ')}`\n}\n\nfunction validateMinRatio(minRatio: number | undefined): string | undefined {\n  if (minRatio === undefined) return undefined\n  if (Number.isNaN(minRatio) || minRatio < 0 || minRatio > 1) {\n    return '--min-ratio must be a number between 0.0 and 1.0'\n  }\n  return undefined\n}\n\nfunction validateLimit(limit: string): string | undefined {\n  const value = Number(limit)\n  if (!Number.isFinite(value) || !Number.isInteger(value) || value <= 0) {\n    return '--limit must be a positive integer'\n  }\n  return undefined\n}\n\nfunction validateMinArea(minArea: string): string | undefined {\n  const value = Number(minArea)\n  if (!Number.isFinite(value) || value < 0) {\n    return '--min-area must be a non-negative number'\n  }\n  return undefined\n}\n\nfunction validateCategory(category: string): string | undefined {\n  const values = category\n    .split(',')\n    .map((c) => c.trim().toLowerCase())\n    .filter((c) => c.length > 0)\n  if (values.length === 0) return undefined\n  const validCount = (parseOverlapCategories(category) ?? []).length\n  if (validCount === 0) {\n    return `Invalid categories: ${values.join(', ')}. Must be one or more of: ${[...VALID_OVERLAP_CATEGORIES].join(', ')}`\n  }\n  const invalid = values.filter((c) => !(VALID_OVERLAP_CATEGORIES as readonly string[]).includes(c))\n  if (invalid.length > 0) {\n    return `Invalid categor${invalid.length === 1 ? 'y' : 'ies'}: ${invalid.join(', ')}. Must be one or more of: ${[...VALID_OVERLAP_CATEGORIES].join(', ')}`\n  }\n  return undefined\n}\n\nfunction collectValidationError(args: {\n  scope: string\n  severity: string\n  category?: string\n  limit: string\n  'min-area'?: string\n  'min-ratio'?: string\n}): string | undefined {\n  return (\n    validateScope(args.scope) ??\n    validateSeverity(args.severity) ??\n    validateLimit(args.limit) ??\n    (args.category ? validateCategory(args.category) : undefined) ??\n    (args['min-area'] !== undefined ? validateMinArea(args['min-area']) : undefined) ??\n    validateMinRatio(args['min-ratio'] ? Number(args['min-ratio']) : undefined)\n  )\n}\n\nfunction buildRPCArgs(args: {\n  scope: string\n  severity: string\n  category?: string\n  limit: string\n  'min-area'?: string\n  'min-ratio'?: string\n  'include-hidden'?: boolean\n  'include-locked'?: boolean\n  'include-absolute'?: boolean\n  page?: string\n  'page-id'?: string\n  type?: string\n}): { rpcArgs: Record<string, unknown>; error?: string } {\n  const error = collectValidationError(args)\n  if (error) return { rpcArgs: {}, error }\n\n  const minAreaRaw = args['min-area']\n  const minArea = minAreaRaw ? Number(minAreaRaw) : undefined\n  const minRatio = args['min-ratio'] ? Number(args['min-ratio']) : undefined\n\n  const rpcArgs: Record<string, unknown> = {\n    scope: parseOverlapScope(args.scope) ?? 'all',\n    severity: parseOverlapSeverity(args.severity) ?? 'info',\n    limit: Number(args.limit)\n  }\n  if (args.category) rpcArgs.category = args.category\n  if (minArea !== undefined) rpcArgs.min_area = minArea\n  if (minRatio !== undefined) rpcArgs.min_ratio = minRatio\n  if (args['include-hidden']) rpcArgs.include_hidden = true\n  if (args['include-locked']) rpcArgs.include_locked = true\n  if (args['include-absolute']) rpcArgs.include_absolute = true\n  if (args.page) rpcArgs.page = args.page\n  if (args['page-id']) rpcArgs.page_id = args['page-id']\n  if (args.type) rpcArgs.type = args.type\n\n  return { rpcArgs }\n}\n\nexport default defineCommand({\n  meta: { description: 'Detect visual overlaps and layout overflows' },\n  args: {\n    file: {\n      type: 'positional',\n      description: '.fig file path (omit to connect to running app)',\n      required: false\n    },\n    scope: {\n      type: 'string',\n      description:\n        'Which pairs to inspect: all, same-parent, cross-parent, top-level, inside-parent',\n      default: 'all'\n    },\n    category: {\n      type: 'string',\n      description: 'Comma-separated categories: sibling-overlap, parent-overflow, overlay'\n    },\n    severity: {\n      type: 'string',\n      description: 'Minimum severity to include: critical, major, minor, info',\n      default: 'info'\n    },\n    'min-area': {\n      type: 'string',\n      description: 'Minimum overlap area in square pixels'\n    },\n    'min-ratio': {\n      type: 'string',\n      description: 'Minimum overlap ratio relative to the smaller node, 0.0–1.0'\n    },\n    'include-hidden': {\n      type: 'boolean',\n      description: 'Include hidden nodes in the analysis'\n    },\n    'include-locked': {\n      type: 'boolean',\n      description: 'Include locked nodes in the analysis'\n    },\n    'include-absolute': {\n      type: 'boolean',\n      description: 'Include absolutely-positioned nodes in the analysis'\n    },\n    page: {\n      type: 'string',\n      description: 'Limit analysis to nodes on the named page'\n    },\n    'page-id': {\n      type: 'string',\n      description: 'Limit analysis to nodes on the page with this stable ID'\n    },\n    'document-id': {\n      type: 'string',\n      description: 'Target OpenPencil document/tab ID when connected to the running app',\n      required: false\n    },\n    type: {\n      type: 'string',\n      description: 'Comma-separated node types to analyze, e.g. FRAME,TEXT'\n    },\n    limit: {\n      type: 'string',\n      description: 'Maximum overlap findings to show',\n      default: '100'\n    },\n    json: { type: 'boolean', description: 'Output as JSON' }\n  },\n  async run({ args }) {\n    const { rpcArgs, error } = buildRPCArgs(args)\n    if (error) {\n      console.error(fail(error))\n      process.exit(1)\n    }\n\n    const data = await loadRPCData<AnalyzeOverlapsResult>(\n      args.file,\n      'analyze_overlaps',\n      rpcArgs,\n      args\n    )\n\n    if (args.json) {\n      console.log(JSON.stringify(data, null, 2))\n      return\n    }\n\n    if (data.summary.overlapCount === 0) {\n      console.log(kv('status', 'No overlaps found'))\n      console.log(fmtSummary({ 'analyzed nodes': data.summary.analyzedNodes }))\n      return\n    }\n\n    const showing = data.overlaps.length\n    const total = data.summary.overlapCount\n    const header =\n      showing === total\n        ? `  Overlaps — ${total} found`\n        : `  Overlaps — ${total} found (${showing} shown)`\n\n    console.log('')\n    console.log(bold(header))\n    console.log('')\n\n    console.log(\n      fmtList(\n        data.overlaps.map((overlap) => ({\n          header: `[${overlap.severity}] ${overlap.category}`,\n          details: {\n            message: overlap.message,\n            area: `${overlap.area}px`,\n            ratio: `${(overlap.ratio * 100).toFixed(1)}%`,\n            a: `${overlap.nodeA.type} \"${overlap.nodeA.name}\" (${overlap.nodeA.id})`,\n            b: `${overlap.nodeB.type} \"${overlap.nodeB.name}\" (${overlap.nodeB.id})`,\n            suggestion: overlap.suggestion\n          }\n        }))\n      )\n    )\n\n    console.log('')\n    console.log(\n      fmtSummary({\n        'analyzed nodes': data.summary.analyzedNodes,\n        'total nodes': data.summary.totalNodes\n      })\n    )\n    console.log(\n      kv(\n        'by category',\n        Object.entries(data.summary.byCategory)\n          .filter(([, count]) => count > 0)\n          .map(([k, count]) => `${k}: ${count}`)\n          .join(', ') || 'none'\n      )\n    )\n    console.log(\n      kv(\n        'by severity',\n        Object.entries(data.summary.bySeverity)\n          .filter(([, count]) => count > 0)\n          .map(([k, count]) => `${k}: ${count}`)\n          .join(', ') || 'none'\n      )\n    )\n    console.log('')\n  }\n})\n","import { defineCommand } from 'citty'\n\nimport type { AnalyzeSpacingResult } from '@open-pencil/core/rpc'\n\nimport { appTargetOptions } from '#cli/app-target'\nimport { bold, kv, fmtHistogram, fmtSummary } from '#cli/format'\nimport { loadRPCData } from '#cli/rpc-data'\n\nexport default defineCommand({\n  meta: { description: 'Analyze spacing values (gap, padding)' },\n  args: {\n    file: {\n      type: 'positional',\n      description: '.fig file path (omit to connect to running app)',\n      required: false\n    },\n    grid: { type: 'string', description: 'Base grid size to check against', default: '8' },\n    ...appTargetOptions,\n    json: { type: 'boolean', description: 'Output as JSON' }\n  },\n  async run({ args }) {\n    const data = await loadRPCData<AnalyzeSpacingResult>(\n      args.file,\n      'analyze_spacing',\n      undefined,\n      args\n    )\n    const gridSize = Number(args.grid)\n\n    if (args.json) {\n      console.log(JSON.stringify(data, null, 2))\n      return\n    }\n\n    console.log('')\n\n    if (data.gaps.length > 0) {\n      console.log(bold('  Gap values'))\n      console.log('')\n      console.log(\n        fmtHistogram(\n          data.gaps.slice(0, 15).map((g) => ({\n            label: `${String(g.value).padStart(4)}px`,\n            value: g.count,\n            suffix: g.value % gridSize !== 0 ? '⚠' : undefined\n          }))\n        )\n      )\n      console.log('')\n    }\n\n    if (data.paddings.length > 0) {\n      console.log(bold('  Padding values'))\n      console.log('')\n      console.log(\n        fmtHistogram(\n          data.paddings.slice(0, 15).map((p) => ({\n            label: `${String(p.value).padStart(4)}px`,\n            value: p.count,\n            suffix: p.value % gridSize !== 0 ? '⚠' : undefined\n          }))\n        )\n      )\n      console.log('')\n    }\n\n    if (data.gaps.length === 0 && data.paddings.length === 0) {\n      console.log('No auto-layout nodes with spacing found.')\n      console.log('')\n      return\n    }\n\n    console.log(\n      fmtSummary({ 'gap values': data.gaps.length, 'padding values': data.paddings.length })\n    )\n\n    const offGridGaps = data.gaps.filter((g) => g.value % gridSize !== 0)\n    const offGridPaddings = data.paddings.filter((p) => p.value % gridSize !== 0)\n\n    if (offGridGaps.length > 0 || offGridPaddings.length > 0) {\n      console.log('')\n      console.log(bold(`  ⚠ Off-grid values (not ÷${gridSize}px)`))\n      if (offGridGaps.length > 0) {\n        console.log(kv('Gaps', offGridGaps.map((g) => `${g.value}px`).join(', ')))\n      }\n      if (offGridPaddings.length > 0) {\n        console.log(kv('Paddings', offGridPaddings.map((p) => `${p.value}px`).join(', ')))\n      }\n    }\n\n    console.log('')\n  }\n})\n","import { defineCommand } from 'citty'\n\nimport type { AnalyzeTypographyResult } from '@open-pencil/core/rpc'\n\nimport { appTargetOptions } from '#cli/app-target'\nimport { bold, fmtHistogram, fmtSummary } from '#cli/format'\nimport { loadRPCData } from '#cli/rpc-data'\n\nfunction weightName(w: number): string {\n  if (w <= 100) return 'Thin'\n  if (w <= 200) return 'ExtraLight'\n  if (w <= 300) return 'Light'\n  if (w <= 400) return 'Regular'\n  if (w <= 500) return 'Medium'\n  if (w <= 600) return 'SemiBold'\n  if (w <= 700) return 'Bold'\n  if (w <= 800) return 'ExtraBold'\n  return 'Black'\n}\n\nexport default defineCommand({\n  meta: { description: 'Analyze typography usage' },\n  args: {\n    file: {\n      type: 'positional',\n      description: '.fig file path (omit to connect to running app)',\n      required: false\n    },\n    'group-by': {\n      type: 'string',\n      description: 'Group by: family, size, weight (default: show all styles)'\n    },\n    limit: { type: 'string', description: 'Max styles to show', default: '30' },\n    ...appTargetOptions,\n    json: { type: 'boolean', description: 'Output as JSON' }\n  },\n  async run({ args }) {\n    const data = await loadRPCData<AnalyzeTypographyResult>(\n      args.file,\n      'analyze_typography',\n      {},\n      args\n    )\n    const limit = Number(args.limit)\n    const groupBy = args['group-by']\n\n    if (args.json) {\n      console.log(JSON.stringify(data, null, 2))\n      return\n    }\n\n    if (data.styles.length === 0) {\n      console.log('No text nodes found.')\n      return\n    }\n\n    console.log('')\n\n    if (groupBy === 'family') {\n      const byFamily = new Map<string, number>()\n      for (const s of data.styles) byFamily.set(s.family, (byFamily.get(s.family) ?? 0) + s.count)\n      console.log(bold('  Font families'))\n      console.log('')\n      console.log(\n        fmtHistogram(\n          [...byFamily.entries()]\n            .sort((a, b) => b[1] - a[1])\n            .map(([family, count]) => ({ label: family, value: count }))\n        )\n      )\n    } else if (groupBy === 'size') {\n      const bySize = new Map<number, number>()\n      for (const s of data.styles) bySize.set(s.size, (bySize.get(s.size) ?? 0) + s.count)\n      console.log(bold('  Font sizes'))\n      console.log('')\n      console.log(\n        fmtHistogram(\n          [...bySize.entries()]\n            .sort((a, b) => a[0] - b[0])\n            .map(([size, count]) => ({ label: `${size}px`, value: count }))\n        )\n      )\n    } else if (groupBy === 'weight') {\n      const byWeight = new Map<number, number>()\n      for (const s of data.styles) byWeight.set(s.weight, (byWeight.get(s.weight) ?? 0) + s.count)\n      console.log(bold('  Font weights'))\n      console.log('')\n      console.log(\n        fmtHistogram(\n          [...byWeight.entries()]\n            .sort((a, b) => b[1] - a[1])\n            .map(([weight, count]) => ({ label: `${weight} ${weightName(weight)}`, value: count }))\n        )\n      )\n    } else {\n      console.log(bold('  Typography styles'))\n      console.log('')\n      const items = data.styles.slice(0, limit).map((s) => {\n        const lh = s.lineHeight !== 'auto' ? ` / ${s.lineHeight}` : ''\n        return { label: `${s.family} ${s.size}px ${weightName(s.weight)}${lh}`, value: s.count }\n      })\n      console.log(fmtHistogram(items))\n    }\n\n    console.log('')\n    console.log(\n      fmtSummary({ 'unique styles': data.styles.length, 'text nodes': data.totalTextNodes })\n    )\n    console.log('')\n  }\n})\n","import { defineCommand } from 'citty'\n\nimport clusters from './clusters'\nimport colors from './colors'\nimport overlaps from './overlaps'\nimport spacing from './spacing'\nimport typography from './typography'\n\nexport default defineCommand({\n  meta: { description: 'Analyze design tokens and patterns' },\n  subCommands: {\n    colors,\n    typography,\n    spacing,\n    clusters,\n    overlaps\n  }\n})\n","import { writeFile } from 'node:fs/promises'\nimport { basename, extname, resolve } from 'node:path'\n\nimport { defineCommand } from 'citty'\n\nimport { BUILTIN_IO_FORMATS, IORegistry } from '@open-pencil/core/io'\n\nimport { requireFile } from '#cli/app-client'\nimport { ok, printError } from '#cli/format'\nimport { loadDocument, populateWholeDocument } from '#cli/headless'\n\nconst io = new IORegistry(BUILTIN_IO_FORMATS)\n\nfunction writableFormatIds(): string[] {\n  return io.listWritableFormats().map((format) => format.id)\n}\n\nfunction defaultOutput(file: string, format: string): string {\n  const base = basename(file, extname(file))\n  return resolve(`${base}.${format.toLowerCase()}`)\n}\n\nexport default defineCommand({\n  meta: { description: 'Convert a document to another writable format' },\n  args: {\n    file: {\n      type: 'positional',\n      description: 'Input document file path',\n      required: true\n    },\n    output: {\n      type: 'string',\n      alias: 'o',\n      description: 'Output file path (default: <name>.<format>)',\n      required: false\n    },\n    format: {\n      type: 'string',\n      alias: 'f',\n      description: 'Output format: fig (default: fig)',\n      default: 'fig'\n    }\n  },\n  async run({ args }) {\n    const format = args.format.toLowerCase()\n    const writableFormats = writableFormatIds()\n    if (!writableFormats.includes(format)) {\n      printError(`Invalid format \"${args.format}\". Use ${writableFormats.join(', ')}.`)\n      process.exit(1)\n    }\n\n    const file = requireFile(args.file)\n    const graph = await loadDocument(file)\n    populateWholeDocument(graph)\n    const result = await io.writeDocument(format, graph)\n    const output = args.output ? resolve(args.output) : defaultOutput(file, format)\n    await writeFile(output, result.data as Uint8Array)\n    console.log(ok(`Converted ${file} → ${output}`))\n  }\n})\n","import { defineCommand } from 'citty'\n\nimport type { AutomationDocumentSummary } from '@open-pencil/core/rpc'\n\nimport { rpc } from '#cli/app-client'\nimport { bold, entity, fmtList, kv, printError } from '#cli/format'\n\nexport default defineCommand({\n  meta: { description: 'List open documents in the running app' },\n  args: {\n    json: { type: 'boolean', description: 'Output as JSON' }\n  },\n  async run({ args }) {\n    try {\n      const data = await rpc<{ documents: AutomationDocumentSummary[] }>('list_documents')\n      const documents = data.documents\n\n      if (args.json) {\n        console.log(JSON.stringify(documents, null, 2))\n        return\n      }\n\n      console.log('')\n      console.log(bold(`  ${documents.length} open document${documents.length !== 1 ? 's' : ''}`))\n      console.log('')\n      console.log(\n        fmtList(\n          documents.map((doc) => ({\n            header: `${entity('document', doc.name, doc.id)}${doc.active ? ' [active]' : ''}`,\n            details: {\n              ...(doc.path ? { path: doc.path } : {}),\n              current: `${doc.current_page_name} (${doc.current_page_id})`,\n              pages: doc.pages.map((page) => `${page.name} (${page.id})`).join(', ')\n            }\n          })),\n          { compact: true }\n        )\n      )\n      console.log('')\n      console.log(kv('target flags', '--document-id <id> --page-id <id>'))\n      console.log('')\n    } catch (error) {\n      printError(error)\n      process.exit(1)\n    }\n  }\n})\n","import { writeFile } from 'node:fs/promises'\n\nimport { defineCommand } from 'citty'\n\nimport { FigmaAPI } from '@open-pencil/core/figma-api'\n\nimport { isAppMode, requireFile, rpc } from '#cli/app-client'\nimport { appTargetOptions, appTargetRPCArgs } from '#cli/app-target'\nimport { printError } from '#cli/format'\nimport { loadDocument, populateWholeDocument } from '#cli/headless'\n\nfunction printResult(value: unknown, json: boolean) {\n  if (json || !process.stdout.isTTY) {\n    console.log(JSON.stringify(value, null, 2))\n  } else {\n    console.log(value)\n  }\n}\n\nfunction serializeResult(value: unknown): unknown {\n  if (value === undefined || value === null) return value\n  if (typeof value === 'object' && 'toJSON' in value && typeof value.toJSON === 'function') {\n    return value.toJSON()\n  }\n  if (Array.isArray(value)) return value.map(serializeResult)\n  return value\n}\n\nexport default defineCommand({\n  meta: { description: 'Execute JavaScript with Figma plugin API' },\n  args: {\n    file: {\n      type: 'positional',\n      description: 'Document file path (omit to connect to running app)',\n      required: false\n    },\n    code: { type: 'string', alias: 'c', description: 'JavaScript code to execute' },\n    stdin: { type: 'boolean', description: 'Read code from stdin' },\n    write: { type: 'boolean', alias: 'w', description: 'Write changes back to the input file' },\n    output: {\n      type: 'string',\n      alias: 'o',\n      description: 'Write to a different file',\n      required: false\n    },\n    ...appTargetOptions,\n    json: { type: 'boolean', description: 'Output as JSON' },\n    quiet: { type: 'boolean', alias: 'q', description: 'Suppress output' }\n  },\n  async run({ args }) {\n    let code = args.code\n\n    if (args.stdin) {\n      const chunks: Buffer[] = []\n      for await (const chunk of process.stdin) chunks.push(chunk as Buffer)\n      code = Buffer.concat(chunks).toString('utf-8')\n    }\n\n    if (!code) {\n      printError('Provide code via --code or --stdin')\n      process.exit(1)\n    }\n\n    if (isAppMode(args.file)) {\n      const result = await rpc('eval', { code, ...appTargetRPCArgs(args) })\n      if (!args.quiet && result !== undefined && result !== null) {\n        printResult(result, !!args.json)\n      }\n      return\n    }\n\n    const file = requireFile(args.file)\n    const graph = await loadDocument(file)\n    populateWholeDocument(graph)\n    const figma = new FigmaAPI(graph)\n\n    type AsyncFunctionConstructor = new (\n      ...args: string[]\n    ) => (...args: unknown[]) => Promise<unknown>\n    const AsyncFunction = Object.getPrototypeOf(async () => undefined)\n      .constructor as AsyncFunctionConstructor\n    const wrappedCode = code.trim().startsWith('return')\n      ? code\n      : `return (async () => { ${code} })()`\n\n    let result: unknown\n    try {\n      const fn = new AsyncFunction('figma', wrappedCode)\n      result = await fn(figma)\n    } catch (err) {\n      printError(err instanceof Error ? err.message : String(err))\n      process.exit(1)\n    }\n\n    if (!args.quiet && result !== undefined) {\n      printResult(serializeResult(result), !!args.json)\n    }\n\n    if (args.write || args.output) {\n      const { BUILTIN_IO_FORMATS, IORegistry } = await import('@open-pencil/core/io')\n      const io = new IORegistry(BUILTIN_IO_FORMATS)\n      const outPath = args.output ? args.output : file\n      const result = await io.writeDocument('fig', graph)\n      await writeFile(outPath, result.data as Uint8Array)\n      if (!args.quiet) {\n        console.error(`Written to ${outPath}`)\n      }\n    }\n  }\n})\n","import { mkdir, writeFile } from 'node:fs/promises'\nimport { basename, dirname, extname, join, resolve } from 'node:path'\n\nimport { defineCommand } from 'citty'\n\nimport { decodeBase64 } from '@open-pencil/core/bytes'\nimport { BUILTIN_IO_FORMATS, IORegistry } from '@open-pencil/core/io'\nimport type { RasterExportFormat } from '@open-pencil/core/io'\nimport {\n  exportHTMLBundle,\n  sceneGraphToDesignDocument,\n  type ExportHTMLBundleOptions\n} from '@open-pencil/dom-css'\n\nimport { isAppMode, requireFile, rpc } from '#cli/app-client'\nimport { appTargetOptions, appTargetRPCArgs } from '#cli/app-target'\nimport { ok, printError } from '#cli/format'\nimport { loadDocument, populateDocumentPage, populateWholeDocument } from '#cli/headless'\n\nconst io = new IORegistry(BUILTIN_IO_FORMATS)\nconst RASTER_FORMATS = ['PNG', 'JPG', 'WEBP']\nconst ALL_FORMATS = new Set([...RASTER_FORMATS, 'SVG', 'PDF', 'PPTX', 'JSX', 'FIG', 'HTML'])\nconst JSX_STYLES = new Set(['openpencil', 'tailwind'])\nconst HTML_STYLES = new Set(['inline', 'tailwind'])\nconst HTML_MODES = new Set(['fragment', 'standalone'])\nconst HTML_ASSETS = new Set(['inline', 'external'])\nconst HTML_FONTS = new Set(['assets', 'none'])\n\ninterface ExportArgs {\n  file?: string\n  output?: string\n  format: string\n  scale: string\n  quality?: string\n  page?: string\n  node?: string\n  style: string\n  html: string\n  css: string\n  assets: string\n  fonts: string\n  thumbnail?: boolean\n  width: string\n  height: string\n  'document-id'?: string\n  'page-id'?: string\n}\n\nasync function writeAndLog(path: string, content: string | Uint8Array) {\n  await writeFile(path, content)\n  const size = typeof content === 'string' ? content.length : content.length\n  console.log(ok(`Exported ${path} (${(size / 1024).toFixed(1)} KB)`))\n}\n\nasync function exportViaApp(format: string, args: ExportArgs) {\n  const targetArgs = appTargetRPCArgs(args)\n  if (format === 'SVG') {\n    const result = await rpc<{ svg: string }>('tool', {\n      ...targetArgs,\n      name: 'export_svg',\n      args: { ids: args.node ? [args.node] : undefined }\n    })\n    if (!result.svg) {\n      printError('Nothing to export.')\n      process.exit(1)\n    }\n    await writeAndLog(resolve(args.output ?? 'export.svg'), result.svg)\n    return\n  }\n\n  if (format === 'PDF') {\n    const result = await rpc<{ base64: string }>('tool', {\n      ...targetArgs,\n      name: 'export_pdf',\n      args: { ids: args.node ? [args.node] : undefined }\n    })\n    if (!result.base64) {\n      printError('Nothing to export.')\n      process.exit(1)\n    }\n    const data = decodeBase64(result.base64)\n    await writeAndLog(resolve(args.output ?? 'export.pdf'), data)\n    return\n  }\n\n  if (format === 'JSX' || format === 'HTML' || format === 'FIG' || format === 'PPTX') {\n    printError(`${format} export is only available in file mode right now.`)\n    process.exit(1)\n  }\n\n  const result = await rpc<{ base64: string }>('export', {\n    ...targetArgs,\n    nodeIds: args.node ? [args.node] : undefined,\n    scale: Number(args.scale),\n    format: format.toLowerCase()\n  })\n  const data = decodeBase64(result.base64)\n  const ext = format.toLowerCase() === 'jpg' ? 'jpg' : format.toLowerCase()\n  await writeAndLog(resolve(args.output ?? `export.${ext}`), data)\n}\n\nfunction exportFileName(defaultName: string, extension: string, scale?: number): string {\n  return scale ? `${defaultName}@${scale}x.${extension}` : `${defaultName}.${extension}`\n}\n\nfunction targetLabel(pageName?: string, nodeId?: string, wholeDocument = false): string {\n  if (wholeDocument) return 'whole document'\n  if (nodeId) return `node ${nodeId}`\n  return pageName ? `page \"${pageName}\"` : 'first page'\n}\n\ntype FileExportTarget = { scope: 'node'; nodeId: string } | { scope: 'page'; pageId: string }\n\nasync function writeHTMLFiles(\n  output: string,\n  bundle: Awaited<ReturnType<typeof exportHTMLBundle>>\n) {\n  const entrypoint = bundle.files.find((file) => file.path === bundle.entrypoint)\n  if (!entrypoint) {\n    printError(`HTML export did not include ${bundle.entrypoint}.`)\n    process.exit(1)\n  }\n\n  await writeAndLog(output, entrypoint.content)\n  const outputDir = dirname(output)\n  const assetFiles = bundle.files.filter((file) => file.path !== bundle.entrypoint)\n  for (const file of assetFiles) {\n    const assetPath = join(outputDir, file.path)\n    await mkdir(dirname(assetPath), { recursive: true })\n    await writeFile(assetPath, file.content)\n  }\n  if (assetFiles.length > 0) console.log(ok(`Assets: ${assetFiles.length} files`))\n}\n\nasync function exportHTMLFromFile(\n  args: ExportArgs,\n  graph: Awaited<ReturnType<typeof loadDocument>>,\n  target: FileExportTarget,\n  defaultName: string\n) {\n  const document = sceneGraphToDesignDocument(graph, {\n    rootId: target.scope === 'page' ? target.pageId : target.nodeId\n  })\n  const output = resolve(args.output ?? exportFileName(defaultName, 'html'))\n  const assetBasePath = `${basename(output, extname(output))}.assets`\n  const bundle = await exportHTMLBundle(document, {\n    html: args.html as ExportHTMLBundleOptions['html'],\n    style: args.css as ExportHTMLBundleOptions['style'],\n    assets: args.assets as ExportHTMLBundleOptions['assets'],\n    fonts: args.fonts as ExportHTMLBundleOptions['fonts'],\n    assetBasePath\n  })\n  await writeHTMLFiles(output, bundle)\n  console.log(ok(`Target: ${targetLabel(args.page, args.node)}`))\n}\n\nfunction prepareGraphForExport(\n  graph: Awaited<ReturnType<typeof loadDocument>>,\n  pageId: string,\n  format: string,\n  args: ExportArgs\n): boolean {\n  const wholeDocument = (format === 'FIG' || format === 'PPTX') && !args.page && !args.node\n  if (wholeDocument || args.node) populateWholeDocument(graph)\n  else populateDocumentPage(graph, pageId)\n  return wholeDocument\n}\n\nasync function executeFileExport(\n  formatId: string,\n  graph: Awaited<ReturnType<typeof loadDocument>>,\n  target: FileExportTarget,\n  options:\n    | { format?: string; scale?: number; quality?: number; renderThumbnail?: boolean }\n    | undefined,\n  wholeDocument: boolean\n) {\n  if (wholeDocument) {\n    if (formatId === 'fig') return io.writeDocument(formatId, graph, options)\n    return io.exportContent(formatId, { graph, target: { scope: 'document' } }, options)\n  }\n  return io.exportContent(formatId, { graph, target }, options)\n}\n\nasync function exportFromFile(format: string, args: ExportArgs) {\n  const file = requireFile(args.file)\n  const graph = await loadDocument(file)\n\n  const pages = graph.getPages()\n  const page = args.page ? pages.find((p) => p.name === args.page) : pages[0]\n  if (!page) {\n    const available = pages.map((p) => `\"${p.name}\"`).join(', ')\n    printError(\n      args.page\n        ? `Page \"${args.page}\" not found. Available pages: ${available || 'none'}.`\n        : 'Document has no pages.'\n    )\n    process.exit(1)\n  }\n\n  const defaultName = basename(file, extname(file))\n\n  if (args.page && args.node) {\n    printError('--page and --node cannot be used together.')\n    process.exit(1)\n  }\n\n  const wholeDocument = prepareGraphForExport(graph, page.id, format, args)\n\n  const target = args.node\n    ? { scope: 'node' as const, nodeId: args.node }\n    : { scope: 'page' as const, pageId: page.id }\n\n  if (args.thumbnail) {\n    printError('Thumbnail export is not supported by the shared file export path yet.')\n    process.exit(1)\n  }\n\n  const formatId = format.toLowerCase()\n  let options:\n    | { format?: string; scale?: number; quality?: number; renderThumbnail?: boolean }\n    | undefined\n  if (format === 'HTML') {\n    await exportHTMLFromFile(args, graph, target, defaultName)\n    return\n  }\n\n  if (format === 'JSX') {\n    options = { format: args.style }\n  } else if (format === 'FIG') {\n    options = { renderThumbnail: true }\n  } else if (format === 'PNG' || format === 'JPG' || format === 'WEBP') {\n    options = {\n      format,\n      scale: Number(args.scale),\n      quality: args.quality ? Number(args.quality) : undefined\n    }\n  }\n\n  const result = await executeFileExport(formatId, graph, target, options, wholeDocument)\n  const output = resolve(\n    args.output ??\n      exportFileName(\n        defaultName,\n        result.extension,\n        format === 'PNG' || format === 'JPG' || format === 'WEBP' ? Number(args.scale) : undefined\n      )\n  )\n  await writeAndLog(output, result.data as string | Uint8Array)\n  console.log(ok(`Target: ${targetLabel(args.page, args.node, wholeDocument)}`))\n}\n\nexport default defineCommand({\n  meta: { description: 'Export a document to PNG, JPG, WEBP, SVG, PDF, PPTX, JSX, HTML, or .fig' },\n  args: {\n    file: {\n      type: 'positional',\n      description: 'Document file path (omit to connect to running app)',\n      required: false\n    },\n    output: {\n      type: 'string',\n      alias: 'o',\n      description: 'Output file path (default: <name>.<format>)',\n      required: false\n    },\n    format: {\n      type: 'string',\n      alias: 'f',\n      description: 'Export format: png, jpg, webp, svg, pdf, pptx, jsx, html, fig (default: png)',\n      default: 'png'\n    },\n    scale: { type: 'string', alias: 's', description: 'Export scale (default: 1)', default: '1' },\n    quality: {\n      type: 'string',\n      alias: 'q',\n      description: 'Quality 0-100 for JPG/WEBP (default: 90)',\n      required: false\n    },\n    page: {\n      type: 'string',\n      description: 'Export a specific page by name (FIG defaults to the whole document)',\n      required: false\n    },\n    node: {\n      type: 'string',\n      description: 'Export a specific node by ID (cannot be combined with --page)',\n      required: false\n    },\n    style: {\n      type: 'string',\n      description: 'JSX style: openpencil or tailwind (default: openpencil)',\n      default: 'openpencil'\n    },\n    html: {\n      type: 'string',\n      description: 'HTML output mode: fragment or standalone (default: fragment)',\n      default: 'fragment'\n    },\n    css: {\n      type: 'string',\n      description: 'HTML CSS output: inline or tailwind (default: inline)',\n      default: 'inline'\n    },\n    assets: {\n      type: 'string',\n      description: 'HTML asset output: inline or external (default: inline)',\n      default: 'inline'\n    },\n    fonts: {\n      type: 'string',\n      description: 'HTML font output: assets or none (default: none)',\n      default: 'none'\n    },\n    thumbnail: { type: 'boolean', description: 'Export page thumbnail instead of full render' },\n    width: { type: 'string', description: 'Thumbnail width (default: 1920)', default: '1920' },\n    height: { type: 'string', description: 'Thumbnail height (default: 1080)', default: '1080' },\n    ...appTargetOptions\n  },\n  async run({ args }) {\n    const format = args.format.toUpperCase() as RasterExportFormat | 'SVG' | 'JSX' | 'FIG' | 'HTML'\n    if (!ALL_FORMATS.has(format)) {\n      printError(\n        `Invalid format \"${args.format}\". Use png, jpg, webp, svg, pdf, pptx, jsx, html, or fig.`\n      )\n      process.exit(1)\n    }\n\n    if (format === 'JSX' && !JSX_STYLES.has(args.style)) {\n      printError(`Invalid JSX style \"${args.style}\". Use openpencil or tailwind.`)\n      process.exit(1)\n    }\n\n    if (format === 'HTML' && !HTML_MODES.has(args.html)) {\n      printError(`Invalid HTML mode \"${args.html}\". Use fragment or standalone.`)\n      process.exit(1)\n    }\n\n    if (format === 'HTML' && !HTML_STYLES.has(args.css)) {\n      printError(`Invalid HTML CSS output \"${args.css}\". Use inline or tailwind.`)\n      process.exit(1)\n    }\n\n    if (format === 'HTML' && !HTML_ASSETS.has(args.assets)) {\n      printError(`Invalid HTML asset output \"${args.assets}\". Use inline or external.`)\n      process.exit(1)\n    }\n\n    if (format === 'HTML' && !HTML_FONTS.has(args.fonts)) {\n      printError(`Invalid HTML font output \"${args.fonts}\". Use assets or none.`)\n      process.exit(1)\n    }\n\n    if (isAppMode(args.file)) {\n      await exportViaApp(format, args)\n    } else {\n      await exportFromFile(format, args)\n    }\n  }\n})\n","import { defineCommand } from 'citty'\n\nimport type { FindNodeResult } from '@open-pencil/core/rpc'\n\nimport { appTargetOptions } from '#cli/app-target'\nimport { printNodeResults } from '#cli/format'\nimport { loadRPCData } from '#cli/rpc-data'\n\nexport default defineCommand({\n  meta: { description: 'Find nodes by name or type' },\n  args: {\n    file: {\n      type: 'positional',\n      description: 'Document file path (omit to connect to running app)',\n      required: false\n    },\n    name: { type: 'string', description: 'Node name (partial match, case-insensitive)' },\n    type: { type: 'string', description: 'Node type: FRAME, TEXT, RECTANGLE, INSTANCE, etc.' },\n    page: { type: 'string', description: 'Page name (default: all pages)' },\n    limit: { type: 'string', description: 'Max results (default: 100)', default: '100' },\n    ...appTargetOptions,\n    json: { type: 'boolean', description: 'Output as JSON' }\n  },\n  async run({ args }) {\n    const results = await loadRPCData<FindNodeResult[]>(\n      args.file,\n      'find',\n      {\n        name: args.name,\n        type: args.type,\n        page: args.page,\n        limit: args.limit ? Number(args.limit) : undefined\n      },\n      args\n    )\n\n    if (args.json) {\n      console.log(JSON.stringify(results, null, 2))\n      return\n    }\n\n    printNodeResults(results)\n  }\n})\n","import { defineCommand } from 'citty'\n\nimport { BUILTIN_IO_FORMATS, IORegistry } from '@open-pencil/core/io'\n\nimport { bold, fmtList, kv } from '#cli/format'\n\nconst io = new IORegistry(BUILTIN_IO_FORMATS)\n\nfunction supportLabels(format: ReturnType<IORegistry['listFormats']>[number]): string[] {\n  const labels: string[] = []\n  if (format.support.readDocument) labels.push('read')\n  if (format.support.writeDocument) labels.push('write')\n  if (format.support.exportDocument) labels.push('export-document')\n  if (format.support.exportPage) labels.push('export-page')\n  if (format.support.exportSelection) labels.push('export-selection')\n  if (format.support.exportNode) labels.push('export-node')\n  return labels\n}\n\nexport default defineCommand({\n  meta: { description: 'List supported document and export formats' },\n  args: {\n    json: { type: 'boolean', description: 'Output as JSON' }\n  },\n  async run({ args }) {\n    const formats = io.listFormats().map((format) => ({\n      id: format.id,\n      label: format.label,\n      role: format.role,\n      category: format.category,\n      extensions: format.extensions,\n      mimeTypes: format.mimeTypes,\n      support: supportLabels(format)\n    }))\n\n    if (args.json) {\n      console.log(JSON.stringify(formats, null, 2))\n      return\n    }\n\n    console.log('')\n    console.log(bold(`  ${formats.length} format${formats.length !== 1 ? 's' : ''}`))\n    console.log('')\n    console.log(\n      fmtList(\n        formats.map((format) => ({\n          header: `${format.label} (${format.id})`,\n          details: {\n            role: format.role,\n            category: format.category,\n            ext: format.extensions.map((ext) => `.${ext}`).join(', '),\n            support: format.support.join(', '),\n            mime: format.mimeTypes.join(', ')\n          }\n        })),\n        { compact: true }\n      )\n    )\n    console.log('')\n    console.log(\n      kv(\n        'Readable',\n        io\n          .listReadableFormats()\n          .map((f) => f.id)\n          .join(', ') || 'none'\n      )\n    )\n    console.log(\n      kv(\n        'Writable',\n        io\n          .listWritableFormats()\n          .map((f) => f.id)\n          .join(', ') || 'none'\n      )\n    )\n    console.log('')\n  }\n})\n","import { basename, extname, resolve } from 'node:path'\n\nimport { defineCommand } from 'citty'\n\nimport { BUILTIN_IO_FORMATS, IORegistry } from '@open-pencil/core/io'\nimport {\n  createHeadlessCSSRuntime,\n  htmlToDesignDocument,\n  htmlToSceneGraph,\n  tailwindHTMLToDesignDocument,\n  tailwindHTMLToSceneGraph,\n  type DesignDocument\n} from '@open-pencil/dom-css'\n\nimport { requireFile } from '#cli/app-client'\nimport { fmtList, ok, printError } from '#cli/format'\n\nconst io = new IORegistry(BUILTIN_IO_FORMATS)\nconst OUTPUT_FORMATS = new Set(['fig', 'json'])\n\ninterface ImportArgs {\n  file?: string\n  output?: string\n  format: string\n  css?: string\n  cssText?: string\n  tailwind?: string\n  tailwindFile?: string\n  pageName: string\n  json?: boolean\n}\n\nfunction defaultOutput(input: string, format: string): string {\n  const base = basename(input, extname(input))\n  return resolve(`${base}.${format}`)\n}\n\nasync function readTextFile(path: string): Promise<string> {\n  return Bun.file(requireFile(path)).text()\n}\n\nasync function cssTextForArgs(args: ImportArgs): Promise<string | undefined> {\n  const cssParts = []\n  if (args.css) cssParts.push(await readTextFile(args.css))\n  if (args.cssText) cssParts.push(args.cssText)\n  return cssParts.length > 0 ? cssParts.join('\\n') : undefined\n}\n\nasync function tailwindCandidatesForArgs(args: ImportArgs): Promise<string[] | undefined> {\n  const parts = []\n  if (args.tailwind) parts.push(args.tailwind)\n  if (args.tailwindFile) parts.push(await readTextFile(args.tailwindFile))\n  const classes = parts\n    .flatMap((part) => part.split(/\\s+/))\n    .filter((className) => className.length > 0)\n  return classes.length > 0 ? classes : undefined\n}\n\nfunction childCount(document: DesignDocument): number {\n  return document.children.length\n}\n\nasync function importHTML(args: ImportArgs) {\n  const file = requireFile(args.file)\n  const html = await readTextFile(file)\n  const runtime = createHeadlessCSSRuntime()\n  const tailwind = await tailwindCandidatesForArgs(args)\n  const cssText = await cssTextForArgs(args)\n\n  if (tailwind) {\n    const options = { ...args, css: cssText, runtime }\n    return {\n      document: await tailwindHTMLToDesignDocument(html, tailwind, options),\n      graph: await tailwindHTMLToSceneGraph(html, tailwind, options)\n    }\n  }\n\n  const options = { cssText, runtime, pageName: args.pageName }\n  return {\n    document: await htmlToDesignDocument(html, options),\n    graph: await htmlToSceneGraph(html, options)\n  }\n}\n\nasync function writeOutput(\n  args: ImportArgs,\n  document: DesignDocument,\n  graph: Awaited<ReturnType<typeof htmlToSceneGraph>>\n) {\n  const format = args.format.toLowerCase()\n  const output = args.output ? resolve(args.output) : defaultOutput(requireFile(args.file), format)\n\n  if (format === 'json') {\n    await Bun.write(output, `${JSON.stringify(document, null, 2)}\\n`)\n    return output\n  }\n\n  const result = await io.writeDocument('fig', graph)\n  await Bun.write(output, result.data as Uint8Array)\n  return output\n}\n\nexport default defineCommand({\n  meta: { description: 'Import HTML/CSS/Tailwind into an OpenPencil document' },\n  args: {\n    file: {\n      type: 'positional',\n      description: 'Input HTML file path',\n      required: true\n    },\n    output: {\n      type: 'string',\n      alias: 'o',\n      description: 'Output file path (default: <name>.<format>)',\n      required: false\n    },\n    format: {\n      type: 'string',\n      alias: 'f',\n      description: 'Output format: fig or json (default: fig)',\n      default: 'fig'\n    },\n    css: {\n      type: 'string',\n      description: 'CSS file to apply before conversion',\n      required: false\n    },\n    cssText: {\n      type: 'string',\n      description: 'Inline CSS text to apply before conversion',\n      required: false\n    },\n    tailwind: {\n      type: 'string',\n      description: 'Tailwind utility candidates to compile and apply',\n      required: false\n    },\n    tailwindFile: {\n      type: 'string',\n      description: 'File containing Tailwind utility candidates',\n      required: false\n    },\n    pageName: {\n      type: 'string',\n      description: 'Scene graph page name (default: DOM/CSS)',\n      default: 'DOM/CSS'\n    },\n    json: {\n      type: 'boolean',\n      description: 'Print a machine-readable summary to stdout'\n    }\n  },\n  async run({ args }) {\n    const format = args.format.toLowerCase()\n    if (!OUTPUT_FORMATS.has(format)) {\n      printError(`Invalid format \"${args.format}\". Use fig or json.`)\n      process.exit(1)\n    }\n\n    const { document, graph } = await importHTML(args)\n    const output = await writeOutput(args, document, graph)\n    const pages = graph.getPages()\n    const summary = {\n      input: requireFile(args.file),\n      output,\n      format,\n      pages: pages.length,\n      rootElements: childCount(document)\n    }\n\n    if (args.json) {\n      console.log(JSON.stringify(summary, null, 2))\n      return\n    }\n\n    console.log(ok(`Converted ${summary.input} → ${summary.output}`))\n    console.log(\n      fmtList([\n        {\n          header: 'HTML/CSS import',\n          details: summary\n        }\n      ])\n    )\n  }\n})\n","import { defineCommand } from 'citty'\n\nimport type { InfoResult } from '@open-pencil/core/rpc'\n\nimport { appTargetOptions } from '#cli/app-target'\nimport { bold, fmtHistogram, fmtSummary, kv } from '#cli/format'\nimport { loadRPCData } from '#cli/rpc-data'\n\nexport default defineCommand({\n  meta: { description: 'Show document info (pages, node counts, fonts)' },\n  args: {\n    file: {\n      type: 'positional',\n      description: 'Document file path (omit to connect to running app)',\n      required: false\n    },\n    ...appTargetOptions,\n    json: { type: 'boolean', description: 'Output as JSON' }\n  },\n  async run({ args }) {\n    const data = await loadRPCData<InfoResult>(args.file, 'info', undefined, args)\n\n    if (args.json) {\n      console.log(JSON.stringify(data, null, 2))\n      return\n    }\n\n    console.log('')\n    console.log(bold(`  ${data.pages} pages, ${data.totalNodes} nodes`))\n    console.log('')\n\n    const pageItems = Object.entries(data.pageCounts).map(([label, value]) => ({ label, value }))\n    console.log(fmtHistogram(pageItems, { unit: 'nodes' }))\n\n    console.log('')\n    console.log(fmtSummary(data.types))\n\n    if (data.fonts.length > 0) {\n      console.log('')\n      console.log(kv('Fonts', data.fonts.join(', ')))\n    }\n    console.log('')\n  }\n})\n","import { defineCommand } from 'citty'\n\nimport { allRules, createLinter, presets, type LintMessage } from '@open-pencil/core/lint'\n\nimport { bold, dim, fail, fmtList, ok } from '#cli/format'\nimport { loadDocument } from '#cli/headless'\n\nfunction formatSeverity(severity: LintMessage['severity']) {\n  if (severity === 'error') return fail('error')\n  if (severity === 'warning') return fail('warn')\n  return ok('info')\n}\n\nfunction formatMessage(message: LintMessage) {\n  return {\n    header: `${formatSeverity(message.severity)} ${bold(message.ruleId)} ${dim(message.nodePath.join(' / '))}`,\n    details: {\n      message: message.message,\n      node: `${message.nodeName} (${message.nodeId})`,\n      suggest: message.suggest\n    }\n  }\n}\n\nexport default defineCommand({\n  meta: {\n    name: 'lint',\n    description: 'Lint design documents for consistency, structure, and accessibility issues'\n  },\n  args: {\n    file: {\n      type: 'positional',\n      required: true,\n      description: 'Design document to lint (.fig, .pen)'\n    },\n    preset: {\n      type: 'string',\n      default: 'recommended',\n      description: 'Preset: recommended, strict, accessibility'\n    },\n    rule: { type: 'string', description: 'Run specific rule(s) only (repeatable)' },\n    json: { type: 'boolean', default: false, description: 'Output as JSON' },\n    'list-rules': { type: 'boolean', default: false, description: 'List rules and exit' }\n  },\n  async run({ args }) {\n    if (args['list-rules']) {\n      console.log('')\n      console.log(bold('Available rules'))\n      console.log('')\n      console.log(\n        fmtList(\n          Object.entries(allRules).map(([id, rule]) => ({\n            header: bold(id),\n            details: { category: rule.meta.category, description: rule.meta.description }\n          }))\n        )\n      )\n      console.log('')\n      console.log(bold(`Presets: ${Object.keys(presets).join(', ')}`))\n      console.log('')\n      return\n    }\n\n    const graph = await loadDocument(args.file)\n    const rules = args.rule ? (Array.isArray(args.rule) ? args.rule : [args.rule]) : undefined\n    const result = createLinter({ preset: args.preset, rules }).lintGraph(graph)\n\n    if (args.json) {\n      console.log(JSON.stringify(result, null, 2))\n    } else if (result.messages.length === 0) {\n      console.log(ok('No lint issues found.'))\n    } else {\n      console.log('')\n      console.log(\n        bold(\n          `Lint issues: ${result.errorCount} errors, ${result.warningCount} warnings, ${result.infoCount} info`\n        )\n      )\n      console.log('')\n      console.log(fmtList(result.messages.map(formatMessage)))\n      console.log('')\n    }\n\n    if (result.errorCount > 0) process.exit(1)\n  }\n})\n","import { defineCommand } from 'citty'\n\nimport { colorToHex } from '@open-pencil/core/color'\nimport type { NodeResult } from '@open-pencil/core/rpc'\nimport type { Color } from '@open-pencil/scene-graph/primitives'\n\nimport { appTargetOptions } from '#cli/app-target'\nimport { fmtNode, printError, formatType } from '#cli/format'\nimport { loadRPCData } from '#cli/rpc-data'\n\nexport default defineCommand({\n  meta: { description: 'Show detailed node properties by ID' },\n  args: {\n    file: {\n      type: 'positional',\n      description: 'Document file path (omit to connect to running app)',\n      required: false\n    },\n    id: { type: 'string', description: 'Node ID', required: true },\n    ...appTargetOptions,\n    json: { type: 'boolean', description: 'Output as JSON' }\n  },\n  async run({ args }) {\n    const data = await loadRPCData<NodeResult | { error: string }>(\n      args.file,\n      'node',\n      {\n        id: args.id\n      },\n      args\n    )\n\n    if ('error' in data) {\n      printError(data.error)\n      process.exit(1)\n    }\n\n    if (args.json) {\n      console.log(JSON.stringify(data, null, 2))\n      return\n    }\n\n    const nodeData = {\n      type: formatType(data.type),\n      name: data.name,\n      id: data.id,\n      width: data.width,\n      height: data.height,\n      x: data.x,\n      y: data.y\n    }\n\n    const details: Record<string, unknown> = {}\n    if (data.parent) details.parent = `${data.parent.name} (${data.parent.id})`\n    if (data.text) details.text = data.text\n    if (data.fills.length > 0) {\n      const solid = (\n        data.fills as Array<{ type: string; visible: boolean; color: Color; opacity: number }>\n      ).find((f) => f.type === 'SOLID' && f.visible)\n      if (solid) {\n        const hex = colorToHex(solid.color)\n        details.fill = solid.opacity < 1 ? `${hex} ${Math.round(solid.opacity * 100)}%` : hex\n      }\n    }\n    if (data.cornerRadius) details.radius = `${data.cornerRadius}px`\n    if (data.rotation) details.rotate = `${Math.round(data.rotation)}°`\n    if (data.opacity < 1) details.opacity = data.opacity\n    if (!data.visible) details.visible = false\n    if (data.locked) details.locked = true\n    if (data.fontFamily) details.font = `${data.fontSize}px ${data.fontFamily}`\n    if (data.layoutMode !== 'NONE') details.layout = data.layoutMode.toLowerCase()\n    if (data.children > 0) details.children = data.children\n    for (const [field, name] of Object.entries(data.boundVariables)) {\n      details[`var:${field}`] = name\n    }\n\n    console.log('')\n    console.log(fmtNode(nodeData, details))\n    console.log('')\n  }\n})\n","import { defineCommand } from 'citty'\n\nimport type { PageItem } from '@open-pencil/core/rpc'\n\nimport { appTargetOptions } from '#cli/app-target'\nimport { bold, fmtList, entity } from '#cli/format'\nimport { loadRPCData } from '#cli/rpc-data'\n\nexport default defineCommand({\n  meta: { description: 'List pages in a document' },\n  args: {\n    file: {\n      type: 'positional',\n      description: 'Document file path (omit to connect to running app)',\n      required: false\n    },\n    ...appTargetOptions,\n    json: { type: 'boolean', description: 'Output as JSON' }\n  },\n  async run({ args }) {\n    const pages = await loadRPCData<PageItem[]>(args.file, 'pages', undefined, args)\n\n    if (args.json) {\n      console.log(JSON.stringify(pages, null, 2))\n      return\n    }\n\n    console.log('')\n    console.log(bold(`  ${pages.length} page${pages.length !== 1 ? 's' : ''}`))\n    console.log('')\n    console.log(\n      fmtList(\n        pages.map((page) => ({\n          header: entity('page', page.name, page.id),\n          details: { nodes: page.nodes }\n        })),\n        { compact: true }\n      )\n    )\n    console.log('')\n  }\n})\n","import { defineCommand } from 'citty'\n\nimport type { QueryNodeResult } from '@open-pencil/core/rpc'\n\nimport { appTargetOptions } from '#cli/app-target'\nimport { printNodeResults, printError } from '#cli/format'\nimport { loadRPCData } from '#cli/rpc-data'\n\nexport default defineCommand({\n  meta: {\n    description: 'Query nodes using XPath selectors'\n  },\n  args: {\n    file: {\n      type: 'positional',\n      description: 'Document file path (omit to connect to running app)',\n      required: false\n    },\n    selector: {\n      type: 'positional',\n      description: 'XPath selector (e.g., //FRAME[@width < 300], //TEXT[contains(@name, \"Label\")])',\n      required: true\n    },\n    page: { type: 'string', description: 'Page name (default: all pages)' },\n    limit: { type: 'string', description: 'Max results (default: 1000)', default: '1000' },\n    ...appTargetOptions,\n    json: { type: 'boolean', description: 'Output as JSON' }\n  },\n  async run({ args }) {\n    const results = await loadRPCData<QueryNodeResult[] | { error: string }>(\n      args.file,\n      'query',\n      {\n        selector: args.selector,\n        page: args.page,\n        limit: args.limit ? Number(args.limit) : undefined\n      },\n      args\n    )\n\n    if ('error' in results) {\n      printError(results.error)\n      process.exit(1)\n    }\n\n    if (args.json) {\n      console.log(JSON.stringify(results, null, 2))\n      return\n    }\n\n    printNodeResults(results, (n) => {\n      const q = n as { width?: number; height?: number; name: string }\n      return `${q.name}  ${q.width}×${q.height}`\n    })\n  }\n})\n","import { defineCommand } from 'citty'\n\nimport { rpc } from '#cli/app-client'\nimport { appTargetOptions, appTargetRPCArgs } from '#cli/app-target'\nimport { bold, entity, fmtList, formatType, printError } from '#cli/format'\n\ninterface SelectionNode {\n  id: string\n  name: string\n  type: string\n  width: number\n  height: number\n  xpath: string | null\n}\n\nexport default defineCommand({\n  meta: { description: 'Get current selection from the running app' },\n  args: {\n    ...appTargetOptions,\n    json: { type: 'boolean', description: 'Output as JSON' }\n  },\n  async run({ args }) {\n    try {\n      const nodes = await rpc<SelectionNode[]>('selection', appTargetRPCArgs(args))\n\n      if (args.json) {\n        console.log(JSON.stringify(nodes, null, 2))\n        return\n      }\n\n      if (nodes.length === 0) {\n        console.log('\\n  No nodes selected.\\n')\n        return\n      }\n\n      console.log('')\n      console.log(bold(`  ${nodes.length} selected node${nodes.length !== 1 ? 's' : ''}`))\n      console.log('')\n      console.log(\n        fmtList(\n          nodes.map((n) => ({\n            header: entity(formatType(n.type), n.name, n.id),\n            details: {\n              size: `${n.width}×${n.height}`,\n              ...(n.xpath ? { xpath: n.xpath } : {})\n            }\n          }))\n        )\n      )\n      console.log('')\n    } catch (error) {\n      printError(error)\n      process.exit(1)\n    }\n  }\n})\n","import type { TreeNode } from 'agentfmt'\nimport { defineCommand } from 'citty'\n\nimport type { TreeNodeResult, TreeResult } from '@open-pencil/core/rpc'\n\nimport { appTargetOptions } from '#cli/app-target'\nimport { fmtTree, printError, entity, formatType } from '#cli/format'\nimport { loadRPCData } from '#cli/rpc-data'\n\nfunction toAgentfmtTree(node: TreeNodeResult, maxDepth: number, depth = 0): TreeNode {\n  const treeNode: TreeNode = {\n    header: entity(formatType(node.type), node.name, node.id)\n  }\n  if (node.children && depth < maxDepth) {\n    treeNode.children = node.children.map((c) => toAgentfmtTree(c, maxDepth, depth + 1))\n  }\n  return treeNode\n}\n\nexport default defineCommand({\n  meta: { description: 'Print the node tree' },\n  args: {\n    file: {\n      type: 'positional',\n      description: 'Document file path (omit to connect to running app)',\n      required: false\n    },\n    page: { type: 'string', description: 'Page name (default: first page)' },\n    depth: { type: 'string', description: 'Max depth (default: unlimited)' },\n    ...appTargetOptions,\n    json: { type: 'boolean', description: 'Output as JSON' }\n  },\n  async run({ args }) {\n    const data = await loadRPCData<TreeResult | { error: string }>(\n      args.file,\n      'tree',\n      {\n        page: args.page,\n        depth: args.depth ? Number(args.depth) : undefined\n      },\n      args\n    )\n    const maxDepth = args.depth ? Number(args.depth) : Infinity\n\n    if ('error' in data) {\n      printError(data.error)\n      process.exit(1)\n    }\n\n    if (args.json) {\n      console.log(JSON.stringify(data.children, null, 2))\n      return\n    }\n\n    const root = {\n      header: entity(formatType(data.page.type), data.page.name, data.page.id),\n      children: data.children.map((c) => toAgentfmtTree(c, maxDepth))\n    }\n\n    console.log('')\n    console.log(fmtTree(root, { maxDepth }))\n    console.log('')\n  }\n})\n","import { defineCommand } from 'citty'\n\nimport type { VariablesResult } from '@open-pencil/core/rpc'\n\nimport { appTargetOptions } from '#cli/app-target'\nimport { bold, entity, fmtList, fmtSummary } from '#cli/format'\nimport { loadRPCData } from '#cli/rpc-data'\n\nexport default defineCommand({\n  meta: { description: 'List design variables and collections' },\n  args: {\n    file: {\n      type: 'positional',\n      description: 'Document file path (omit to connect to running app)',\n      required: false\n    },\n    collection: { type: 'string', description: 'Filter by collection name' },\n    type: { type: 'string', description: 'Filter by type: COLOR, FLOAT, STRING, BOOLEAN' },\n    ...appTargetOptions,\n    json: { type: 'boolean', description: 'Output as JSON' }\n  },\n  async run({ args }) {\n    const data = await loadRPCData<VariablesResult>(\n      args.file,\n      'variables',\n      {\n        collection: args.collection,\n        type: args.type\n      },\n      args\n    )\n\n    if (data.totalVariables === 0) {\n      console.log('No variables found.')\n      return\n    }\n\n    if (args.json) {\n      console.log(JSON.stringify(data, null, 2))\n      return\n    }\n\n    console.log('')\n\n    for (const coll of data.collections) {\n      console.log(bold(entity(coll.name, coll.modes.join(', '))))\n      console.log('')\n      console.log(\n        fmtList(\n          coll.variables.map((v) => ({\n            header: v.name,\n            details: { value: v.value, type: v.type.toLowerCase() }\n          })),\n          { compact: true }\n        )\n      )\n      console.log('')\n    }\n\n    console.log(\n      fmtSummary({\n        variables: data.totalVariables,\n        collections: data.totalCollections\n      })\n    )\n    console.log('')\n  }\n})\n","#!/usr/bin/env bun\nimport { defineCommand, runMain } from 'citty'\n\nimport analyze from './commands/analyze'\nimport convert from './commands/convert'\nimport documents from './commands/documents'\nimport evalCmd from './commands/eval'\nimport exportCmd from './commands/export'\nimport find from './commands/find'\nimport formats from './commands/formats'\nimport importCmd from './commands/import'\nimport info from './commands/info'\nimport lint from './commands/lint'\nimport node from './commands/node'\nimport pages from './commands/pages'\nimport query from './commands/query'\nimport selection from './commands/selection'\nimport tree from './commands/tree'\nimport variables from './commands/variables'\n\nconst { version } = await import('../package.json')\n\nconst main = defineCommand({\n  meta: {\n    name: 'openpencil',\n    description: 'OpenPencil CLI — inspect, export, and lint OpenPencil design documents',\n    version\n  },\n  subCommands: {\n    analyze,\n    convert,\n    documents,\n    eval: evalCmd,\n    export: exportCmd,\n    import: importCmd,\n    find,\n    formats,\n    info,\n    lint,\n    query,\n    node,\n    pages,\n    selection,\n    tree,\n    variables\n  }\n})\n\nvoid runMain(main)\n"],"mappings":"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"}