uilint 0.2.49 → 0.2.50

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/remove-ui.tsx","../src/commands/remove/components/RemoveApp.tsx"],"sourcesContent":["/**\n * Remove command with Ink-based UI\n *\n * Dedicated flow for removing UILint components from a project:\n * 1. Analyze project to find installed components\n * 2. Show selection UI with only installed items\n * 3. Confirm selection\n * 4. Execute removal\n */\n\nimport React from \"react\";\nimport { render } from \"ink\";\nimport { RemoveApp } from \"./remove/components/RemoveApp.js\";\nimport { analyze } from \"./init/analyze.js\";\nimport { execute } from \"./init/execute.js\";\nimport type { ExecuteOptions, InstallAction } from \"./init/types.js\";\nimport type { InstallerSelection } from \"./init/installers/types.js\";\nimport { pc } from \"../utils/prompts.js\";\n\n// Import installers to trigger registration\nimport \"./init/installers/index.js\";\n\nfunction limitList(items: string[], max: number): string[] {\n if (items.length <= max) return items;\n return [...items.slice(0, max), pc.dim(`…and ${items.length - max} more`)];\n}\n\nfunction printRemoveReport(\n result: Awaited<ReturnType<typeof execute>>\n): void {\n const failedActions = result.actionsPerformed.filter((r) => !r.success);\n const okActions = result.actionsPerformed.filter((r) => r.success);\n\n // High-level header\n if (result.success) {\n console.log(`\\n${pc.green(\"✓\")} Removal completed successfully`);\n } else {\n console.log(`\\n${pc.yellow(\"⚠\")} Removal completed with errors`);\n }\n\n // Files changed\n const { summary } = result;\n const modified = summary.filesModified;\n const deleted = summary.filesDeleted;\n\n if (modified.length + deleted.length > 0) {\n console.log(`\\n${pc.bold(\"Files:\")}`);\n for (const p of limitList(modified, 20))\n console.log(`- ${pc.yellow(\"~\")} ${p}`);\n for (const p of limitList(deleted, 20))\n console.log(`- ${pc.red(\"-\")} ${p}`);\n }\n\n // Failures\n if (failedActions.length > 0) {\n console.log(`\\n${pc.bold(pc.red(\"Failures:\"))}`);\n for (const a of failedActions) {\n const action = a.action as Record<string, unknown>;\n const type = String(action.type || \"unknown\");\n const pathish =\n (typeof action.path === \"string\" && action.path) ||\n (typeof action.projectPath === \"string\" && action.projectPath) ||\n (typeof action.packagePath === \"string\" && action.packagePath) ||\n \"\";\n\n console.error(`- ${type}${pathish ? ` (${pathish})` : \"\"}`);\n if (a.error) console.error(` ${a.error}`);\n }\n }\n\n // Quick stats\n console.log(\n pc.dim(\n `\\nSummary: ${okActions.length} action(s) ok, ${failedActions.length} failed`\n )\n );\n}\n\n/**\n * Build removal plan from installer selections\n */\nfunction buildRemovalPlan(\n selections: InstallerSelection[],\n project: Awaited<ReturnType<typeof analyze>>\n): InstallAction[] {\n const actions: InstallAction[] = [];\n\n for (const selection of selections) {\n if (!selection.selected || selection.targets.length === 0) continue;\n const { installer, targets } = selection;\n\n // Call planRemove if the installer supports it\n if (installer.planRemove) {\n const removePlan = installer.planRemove(targets, project);\n actions.push(...removePlan.actions);\n }\n }\n\n return actions;\n}\n\nexport interface RemoveOptions {\n /** Preview changes without actually removing */\n dryRun?: boolean;\n /** Skip confirmation prompt */\n yes?: boolean;\n}\n\n/**\n * Check if terminal supports interactive mode\n */\nfunction isInteractiveTerminal(): boolean {\n return Boolean(process.stdin.isTTY && process.stdout.isTTY);\n}\n\n/**\n * Main remove function with Ink UI\n */\nexport async function removeUI(\n options: RemoveOptions = {}\n): Promise<void> {\n const projectPath = process.cwd();\n\n // Check if terminal supports interactive mode\n if (!isInteractiveTerminal()) {\n console.error(\"\\n✗ Interactive mode requires a TTY terminal.\");\n console.error(\"Run uilint remove in an interactive terminal.\\n\");\n process.exit(1);\n }\n\n // Start project analysis\n const projectPromise = analyze(projectPath);\n\n // Render the Ink app\n const { waitUntilExit } = render(\n <RemoveApp\n projectPromise={projectPromise}\n skipConfirmation={options.yes}\n dryRun={options.dryRun}\n onComplete={async (selections) => {\n const project = await projectPromise;\n\n if (selections.length === 0) {\n console.log(\"\\nNo components selected for removal\");\n process.exit(0);\n }\n\n // Build removal plan\n const actions = buildRemovalPlan(selections, project);\n\n if (actions.length === 0) {\n console.log(\"\\nNo removal actions to perform\");\n process.exit(0);\n }\n\n // Execute the plan\n const result = await execute(\n { actions, dependencies: [] },\n {\n dryRun: options.dryRun,\n projectPath: project.projectPath,\n }\n );\n\n // Display results\n printRemoveReport(result);\n\n process.exit(result.success ? 0 : 1);\n }}\n onError={(error) => {\n console.error(\"\\n✗ Error:\", error.message);\n process.exit(1);\n }}\n />\n );\n\n // Wait for the app to exit\n await waitUntilExit();\n}\n","/**\n * RemoveApp - Ink React component for the remove UI\n *\n * Simplified flow for removing UILint components:\n * 1. Loading (analyze project)\n * 2. Project selection (if multiple projects have installed components)\n * 3. Selection (show installed items with checkboxes)\n * 4. Confirmation (preview what will be removed)\n * 5. Executing (progress indicator)\n */\n\nimport React, { useState, useEffect } from \"react\";\nimport { Box, Text, useApp, useInput } from \"ink\";\nimport { Spinner } from \"../../init/components/Spinner.js\";\nimport type { ProjectState } from \"../../init/types.js\";\nimport type { InstallerSelection, InstallTarget, Installer } from \"../../init/installers/types.js\";\nimport { getAllInstallers } from \"../../init/installers/registry.js\";\n\ntype RemovePhase = \"loading\" | \"select-project\" | \"select\" | \"confirm\" | \"executing\" | \"done\" | \"error\";\n\n/**\n * Detected project with installed components\n */\ninterface ProjectWithInstalls {\n /** Unique ID */\n id: string;\n /** Project name/label (relative path) */\n name: string;\n /** Project path (absolute) */\n path: string;\n /** Framework type */\n type: \"nextjs\" | \"vite\" | \"eslint\" | \"global\";\n /** Framework badge/hint */\n hint: string;\n /** Number of installed components */\n installedCount: number;\n}\n\n/**\n * Item to display in the selection list\n */\ninterface RemoveItem {\n id: string;\n installerId: string;\n installer: Installer;\n label: string;\n hint?: string;\n target: InstallTarget;\n}\n\nexport interface RemoveAppProps {\n /** Project scan promise (resolves to ProjectState) */\n projectPromise: Promise<ProjectState>;\n /** Skip confirmation prompt */\n skipConfirmation?: boolean;\n /** Dry run mode - preview only */\n dryRun?: boolean;\n /** Callback when removal is complete */\n onComplete: (selections: InstallerSelection[]) => void;\n /** Callback when error occurs */\n onError?: (error: Error) => void;\n}\n\n/**\n * Get all projects that have installed UILint components\n */\nfunction getProjectsWithInstalls(project: ProjectState): ProjectWithInstalls[] {\n const installers = getAllInstallers();\n const projects: ProjectWithInstalls[] = [];\n const seenPaths = new Set<string>();\n\n for (const installer of installers) {\n if (!installer.isApplicable(project)) continue;\n\n const targets = installer.getTargets(project);\n for (const target of targets) {\n if (!target.isInstalled) continue;\n\n // Determine project type and path\n let projectPath = target.path;\n let type: ProjectWithInstalls[\"type\"] = \"global\";\n let hint = \"Other\";\n\n if (installer.id === \"next\") {\n type = \"nextjs\";\n hint = \"Next.js App Router\";\n } else if (installer.id === \"vite\") {\n type = \"vite\";\n hint = \"Vite + React\";\n } else if (installer.id === \"eslint\") {\n type = \"eslint\";\n hint = \"ESLint\";\n } else if (installer.id === \"genstyleguide\" || installer.id === \"skill\") {\n // Global features - group them under workspace root\n projectPath = project.workspaceRoot;\n type = \"global\";\n hint = \"Global\";\n }\n\n // Avoid duplicates\n if (seenPaths.has(projectPath)) {\n // Increment count for existing project\n const existing = projects.find(p => p.path === projectPath);\n if (existing) {\n existing.installedCount++;\n }\n continue;\n }\n\n seenPaths.add(projectPath);\n const relativePath = projectPath.replace(project.workspaceRoot + \"/\", \"\");\n\n projects.push({\n id: `${type}:${projectPath}`,\n name: relativePath || \".\",\n path: projectPath,\n type,\n hint,\n installedCount: 1,\n });\n }\n }\n\n return projects;\n}\n\n/**\n * Get installed items for a specific project path\n */\nfunction getInstalledItemsForProject(\n project: ProjectState,\n selectedProject: ProjectWithInstalls | null\n): RemoveItem[] {\n const installers = getAllInstallers();\n const items: RemoveItem[] = [];\n\n for (const installer of installers) {\n if (!installer.isApplicable(project)) continue;\n\n const targets = installer.getTargets(project);\n for (const target of targets) {\n if (!target.isInstalled) continue;\n\n // Filter by selected project if one is selected\n if (selectedProject) {\n // For global installers, only show if \"global\" project is selected\n if (installer.id === \"genstyleguide\" || installer.id === \"skill\") {\n if (selectedProject.type !== \"global\") continue;\n } else {\n // For project-specific installers, match by path\n if (target.path !== selectedProject.path) continue;\n }\n }\n\n items.push({\n id: `${installer.id}:${target.id}`,\n installerId: installer.id,\n installer,\n label: installer.name,\n hint: target.hint,\n target,\n });\n }\n }\n\n return items;\n}\n\n/**\n * Header component with app branding\n */\nfunction Header({ subtitle }: { subtitle?: string }): React.ReactElement {\n return (\n <Box flexDirection=\"column\" marginBottom={1}>\n <Box>\n <Text bold color=\"cyan\">◆ UILint</Text>\n <Text dimColor> v0.5.0</Text>\n {subtitle && <Text dimColor> · {subtitle}</Text>}\n </Box>\n </Box>\n );\n}\n\n/**\n * Framework badge for project selector\n */\nfunction FrameworkBadge({ type }: { type: ProjectWithInstalls[\"type\"] }): React.ReactElement {\n switch (type) {\n case \"nextjs\":\n return <Text color=\"white\" backgroundColor=\"black\"> Next.js </Text>;\n case \"vite\":\n return <Text color=\"black\" backgroundColor=\"yellow\"> Vite </Text>;\n case \"eslint\":\n return <Text color=\"white\" backgroundColor=\"blue\"> ESLint </Text>;\n case \"global\":\n return <Text color=\"white\" backgroundColor=\"magenta\"> Global </Text>;\n default:\n return <Text dimColor>Other</Text>;\n }\n}\n\n/**\n * Project selector for choosing which project to remove from\n */\nfunction ProjectSelector({\n projects,\n cursor,\n onSelect,\n onCancel,\n}: {\n projects: ProjectWithInstalls[];\n cursor: number;\n onSelect: (project: ProjectWithInstalls) => void;\n onCancel: () => void;\n}): React.ReactElement {\n return (\n <Box flexDirection=\"column\">\n <Box marginBottom={1}>\n <Text bold>Select a project to remove components from:</Text>\n </Box>\n\n {projects.map((project, index) => {\n const isCursor = index === cursor;\n return (\n <Box key={project.id} paddingLeft={1}>\n {/* Cursor */}\n <Text color={isCursor ? \"cyan\" : undefined}>\n {isCursor ? \"› \" : \" \"}\n </Text>\n\n {/* Framework badge */}\n <Box width={12}>\n <FrameworkBadge type={project.type} />\n </Box>\n\n {/* Project name */}\n <Box width={30}>\n <Text color={isCursor ? \"cyan\" : undefined} bold={isCursor}>\n {project.name}\n </Text>\n </Box>\n\n {/* Installed count */}\n <Text color=\"green\" dimColor>\n {project.installedCount} installed\n </Text>\n </Box>\n );\n })}\n\n {/* Footer */}\n <Box marginTop={1} borderStyle=\"single\" borderColor=\"gray\" paddingX={1}>\n <Text dimColor>\n <Text color=\"cyan\">↑↓</Text> navigate{\" \"}\n <Text color=\"cyan\">enter</Text> select{\" \"}\n <Text color=\"cyan\">q</Text> quit\n </Text>\n </Box>\n </Box>\n );\n}\n\n/**\n * Selection item with checkbox\n */\nfunction SelectionItem({\n item,\n isSelected,\n isCursor,\n}: {\n item: RemoveItem;\n isSelected: boolean;\n isCursor: boolean;\n}): React.ReactElement {\n return (\n <Box paddingLeft={2}>\n <Text color={isCursor ? \"cyan\" : undefined}>\n {isCursor ? \"› \" : \" \"}\n </Text>\n <Box width={2}>\n <Text color={isSelected ? \"red\" : \"gray\"}>\n {isSelected ? \"✗\" : \"○\"}\n </Text>\n </Box>\n <Box width={28}>\n <Text\n color={isSelected ? \"red\" : isCursor ? \"cyan\" : undefined}\n >\n {item.label}\n </Text>\n </Box>\n <Box width={20}>\n <Text dimColor>{item.hint || \"\"}</Text>\n </Box>\n <Text color=\"green\" dimColor>installed</Text>\n </Box>\n );\n}\n\n/**\n * Selection list component\n */\nfunction SelectionList({\n items,\n selectedIds,\n cursor,\n selectedProject,\n canGoBack,\n onBack,\n}: {\n items: RemoveItem[];\n selectedIds: Set<string>;\n cursor: number;\n selectedProject: ProjectWithInstalls | null;\n canGoBack: boolean;\n onBack: () => void;\n}): React.ReactElement {\n return (\n <Box flexDirection=\"column\">\n {/* Show selected project context */}\n {selectedProject && (\n <Box marginBottom={1}>\n <Text dimColor>Project: </Text>\n <Text bold color=\"cyan\">{selectedProject.name}</Text>\n <Text dimColor> ({selectedProject.hint})</Text>\n </Box>\n )}\n\n <Box marginBottom={1}>\n <Text>Select components to remove:</Text>\n </Box>\n\n {items.map((item, index) => (\n <SelectionItem\n key={item.id}\n item={item}\n isSelected={selectedIds.has(item.id)}\n isCursor={index === cursor}\n />\n ))}\n\n {/* Footer with keyboard hints */}\n <Box marginTop={1} borderStyle=\"single\" borderColor=\"gray\" paddingX={1}>\n <Text dimColor>\n <Text color=\"cyan\">↑↓</Text> navigate{\" \"}\n <Text color=\"cyan\">space</Text> toggle{\" \"}\n <Text color=\"cyan\">a</Text> all{\" \"}\n <Text color=\"cyan\">n</Text> none{\" \"}\n <Text color=\"cyan\">enter</Text> remove{\" \"}\n <Text color=\"cyan\">q</Text> quit\n </Text>\n </Box>\n\n {/* Back hint if multiple projects */}\n {canGoBack && (\n <Box marginTop={1}>\n <Text dimColor>\n Press <Text color=\"cyan\">b</Text> or <Text color=\"cyan\">←</Text> to select a different project\n </Text>\n </Box>\n )}\n\n {/* Selection summary */}\n <Box marginTop={1}>\n <Text>\n <Text color=\"red\">{selectedIds.size}</Text>\n <Text dimColor> to remove</Text>\n </Text>\n </Box>\n </Box>\n );\n}\n\n/**\n * Confirmation component\n */\nfunction Confirmation({\n items,\n selectedIds,\n dryRun,\n onConfirm,\n onBack,\n}: {\n items: RemoveItem[];\n selectedIds: Set<string>;\n dryRun?: boolean;\n onConfirm: () => void;\n onBack: () => void;\n}): React.ReactElement {\n const selectedItems = items.filter((item) => selectedIds.has(item.id));\n\n useInput((input, key) => {\n if (input === \"y\" || key.return) {\n onConfirm();\n } else if (input === \"n\" || key.escape || input === \"b\") {\n onBack();\n }\n });\n\n return (\n <Box flexDirection=\"column\">\n <Box marginBottom={1}>\n <Text bold>\n {dryRun ? \"Preview: Would remove\" : \"Confirm removal of\"} {selectedItems.length} component(s):\n </Text>\n </Box>\n\n {selectedItems.map((item) => (\n <Box key={item.id} paddingLeft={2}>\n <Text color=\"red\">✗ </Text>\n <Text>{item.label}</Text>\n {item.hint && <Text dimColor> ({item.hint})</Text>}\n </Box>\n ))}\n\n <Box marginTop={1}>\n {dryRun ? (\n <Text dimColor>\n Dry run mode - no changes will be made.{\" \"}\n Press <Text color=\"cyan\">enter</Text> to see details or <Text color=\"cyan\">b</Text> to go back.\n </Text>\n ) : (\n <Text dimColor>\n Press <Text color=\"cyan\">y</Text> or <Text color=\"cyan\">enter</Text> to confirm, <Text color=\"cyan\">n</Text> or <Text color=\"cyan\">b</Text> to go back.\n </Text>\n )}\n </Box>\n </Box>\n );\n}\n\nexport function RemoveApp({\n projectPromise,\n skipConfirmation = false,\n dryRun = false,\n onComplete,\n onError,\n}: RemoveAppProps): React.ReactElement {\n const { exit } = useApp();\n const [phase, setPhase] = useState<RemovePhase>(\"loading\");\n const [project, setProject] = useState<ProjectState | null>(null);\n const [projectsWithInstalls, setProjectsWithInstalls] = useState<ProjectWithInstalls[]>([]);\n const [selectedProject, setSelectedProject] = useState<ProjectWithInstalls | null>(null);\n const [items, setItems] = useState<RemoveItem[]>([]);\n const [selectedIds, setSelectedIds] = useState<Set<string>>(new Set());\n const [cursor, setCursor] = useState(0);\n const [projectCursor, setProjectCursor] = useState(0);\n const [error, setError] = useState<Error | null>(null);\n\n // Phase 1: Load project\n useEffect(() => {\n if (phase !== \"loading\") return;\n\n projectPromise\n .then((proj) => {\n setProject(proj);\n\n const projects = getProjectsWithInstalls(proj);\n setProjectsWithInstalls(projects);\n\n if (projects.length === 0) {\n setError(new Error(\"No UILint components are installed in this project.\"));\n setPhase(\"error\");\n return;\n }\n\n // If only one project has installed components, skip project selection\n if (projects.length === 1) {\n const singleProject = projects[0]!;\n setSelectedProject(singleProject);\n const installedItems = getInstalledItemsForProject(proj, singleProject);\n setItems(installedItems);\n setPhase(\"select\");\n } else {\n setPhase(\"select-project\");\n }\n })\n .catch((err) => {\n setError(err as Error);\n setPhase(\"error\");\n onError?.(err as Error);\n });\n }, [phase, projectPromise, onError]);\n\n // Keyboard input for project selection phase\n useInput((input, key) => {\n if (phase === \"select-project\") {\n if (key.upArrow) {\n setProjectCursor((prev) => (prev > 0 ? prev - 1 : projectsWithInstalls.length - 1));\n } else if (key.downArrow) {\n setProjectCursor((prev) => (prev < projectsWithInstalls.length - 1 ? prev + 1 : 0));\n } else if (key.return) {\n const selected = projectsWithInstalls[projectCursor];\n if (selected && project) {\n setSelectedProject(selected);\n const installedItems = getInstalledItemsForProject(project, selected);\n setItems(installedItems);\n setCursor(0);\n setSelectedIds(new Set());\n setPhase(\"select\");\n }\n } else if (input === \"q\" || key.escape) {\n exit();\n }\n return;\n }\n\n if (phase !== \"select\") return;\n\n if (key.upArrow) {\n setCursor((prev) => (prev > 0 ? prev - 1 : items.length - 1));\n } else if (key.downArrow) {\n setCursor((prev) => (prev < items.length - 1 ? prev + 1 : 0));\n } else if (input === \" \") {\n // Toggle selection\n const item = items[cursor];\n if (item) {\n setSelectedIds((prev) => {\n const next = new Set(prev);\n if (next.has(item.id)) {\n next.delete(item.id);\n } else {\n next.add(item.id);\n }\n return next;\n });\n }\n } else if (input === \"a\") {\n // Select all\n setSelectedIds(new Set(items.map((item) => item.id)));\n } else if (input === \"n\") {\n // Select none\n setSelectedIds(new Set());\n } else if (key.return) {\n // Submit\n if (selectedIds.size === 0) {\n // Nothing selected - exit\n exit();\n return;\n }\n if (skipConfirmation) {\n finishSelection();\n } else {\n setPhase(\"confirm\");\n }\n } else if ((input === \"b\" || key.leftArrow) && projectsWithInstalls.length > 1) {\n // Go back to project selection\n setSelectedProject(null);\n setPhase(\"select-project\");\n } else if (input === \"q\" || key.escape) {\n exit();\n }\n });\n\n // Build installer selections from selected IDs\n const finishSelection = () => {\n if (!project) return;\n\n const selections: InstallerSelection[] = [];\n\n // Group selected items by installer\n const installerMap = new Map<string, { installer: Installer; targets: InstallTarget[] }>();\n\n for (const item of items) {\n if (!selectedIds.has(item.id)) continue;\n\n const existing = installerMap.get(item.installerId);\n if (existing) {\n existing.targets.push(item.target);\n } else {\n installerMap.set(item.installerId, {\n installer: item.installer,\n targets: [item.target],\n });\n }\n }\n\n for (const [, { installer, targets }] of installerMap) {\n selections.push({\n installer,\n targets,\n selected: true,\n });\n }\n\n onComplete(selections);\n };\n\n // Render: Loading\n if (phase === \"loading\") {\n return (\n <Box flexDirection=\"column\">\n <Header subtitle=\"Remove\" />\n <Box>\n <Spinner />\n <Text> Scanning project...</Text>\n </Box>\n </Box>\n );\n }\n\n // Render: Error\n if (phase === \"error\") {\n return (\n <Box flexDirection=\"column\">\n <Header />\n <Box>\n <Text color=\"red\">✗ </Text>\n <Text color=\"red\">{error?.message || \"An unknown error occurred\"}</Text>\n </Box>\n </Box>\n );\n }\n\n // Render: Project selection\n if (phase === \"select-project\") {\n return (\n <Box flexDirection=\"column\">\n <Header subtitle=\"Remove\" />\n <ProjectSelector\n projects={projectsWithInstalls}\n cursor={projectCursor}\n onSelect={(selected) => {\n if (project) {\n setSelectedProject(selected);\n const installedItems = getInstalledItemsForProject(project, selected);\n setItems(installedItems);\n setCursor(0);\n setSelectedIds(new Set());\n setPhase(\"select\");\n }\n }}\n onCancel={() => exit()}\n />\n </Box>\n );\n }\n\n // Render: Selection\n if (phase === \"select\") {\n return (\n <Box flexDirection=\"column\">\n <Header subtitle=\"Remove\" />\n <SelectionList\n items={items}\n selectedIds={selectedIds}\n cursor={cursor}\n selectedProject={selectedProject}\n canGoBack={projectsWithInstalls.length > 1}\n onBack={() => {\n setSelectedProject(null);\n setPhase(\"select-project\");\n }}\n />\n </Box>\n );\n }\n\n // Render: Confirmation\n if (phase === \"confirm\") {\n return (\n <Box flexDirection=\"column\">\n <Header subtitle=\"Remove\" />\n <Confirmation\n items={items}\n selectedIds={selectedIds}\n dryRun={dryRun}\n onConfirm={finishSelection}\n onBack={() => setPhase(\"select\")}\n />\n </Box>\n );\n }\n\n // Fallback\n return (\n <Box flexDirection=\"column\">\n <Header />\n <Text dimColor>Loading...</Text>\n </Box>\n );\n}\n"],"mappings":"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","names":["jsx"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "uilint",
3
- "version": "0.2.49",
3
+ "version": "0.2.50",
4
4
  "description": "CLI for UILint - AI-powered UI consistency checking",
5
5
  "author": "Peter Suggate",
6
6
  "repository": {
@@ -48,9 +48,9 @@
48
48
  "react": "^19.2.3",
49
49
  "typescript": "^5.9.3",
50
50
  "ws": "^8.19.0",
51
- "uilint-duplicates": "0.2.49",
52
- "uilint-core": "0.2.49",
53
- "uilint-eslint": "0.2.49"
51
+ "uilint-core": "0.2.50",
52
+ "uilint-duplicates": "0.2.50",
53
+ "uilint-eslint": "0.2.50"
54
54
  },
55
55
  "optionalDependencies": {
56
56
  "@langfuse/client": "^4.5.1",
@@ -66,7 +66,7 @@
66
66
  "ink-testing-library": "^4.0.0",
67
67
  "tsup": "^8.5.1",
68
68
  "vitest": "^4.0.17",
69
- "uilint-react": "0.2.49"
69
+ "uilint-react": "0.2.50"
70
70
  },
71
71
  "keywords": [
72
72
  "cli",