uilint 0.2.70 → 0.2.72
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{plan-P2XKOXH5.js → chunk-2BNEL5IX.js} +2 -1
- package/dist/index.js +9 -3
- package/dist/index.js.map +1 -1
- package/dist/{init-ui-ZDR65J2L.js → init-ui-VOLYNE5G.js} +179 -4
- package/dist/init-ui-VOLYNE5G.js.map +1 -0
- package/dist/plan-RACOU2VV.js +13 -0
- package/dist/plan-RACOU2VV.js.map +1 -0
- package/package.json +5 -5
- package/dist/init-ui-ZDR65J2L.js.map +0 -1
- /package/dist/{plan-P2XKOXH5.js.map → chunk-2BNEL5IX.js.map} +0 -0
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
createPlan
|
|
4
|
+
} from "./chunk-2BNEL5IX.js";
|
|
2
5
|
import {
|
|
3
6
|
Spinner,
|
|
4
7
|
analyze,
|
|
@@ -10,6 +13,7 @@ import {
|
|
|
10
13
|
detectCoverageSetup
|
|
11
14
|
} from "./chunk-WRXJULXA.js";
|
|
12
15
|
import "./chunk-VSBVUS56.js";
|
|
16
|
+
import "./chunk-TKJ27W62.js";
|
|
13
17
|
import "./chunk-ZDSDZNIB.js";
|
|
14
18
|
import {
|
|
15
19
|
pc
|
|
@@ -1456,9 +1460,152 @@ function InstallApp({
|
|
|
1456
1460
|
] });
|
|
1457
1461
|
}
|
|
1458
1462
|
|
|
1463
|
+
// src/commands/init/test-helpers.ts
|
|
1464
|
+
async function gatherChoices(state, options, prompter) {
|
|
1465
|
+
let items;
|
|
1466
|
+
const hasExplicitFlags = options.genstyleguide !== void 0 || options.skill !== void 0 || options.routes !== void 0 || options.react !== void 0;
|
|
1467
|
+
if (hasExplicitFlags || options.eslint) {
|
|
1468
|
+
items = [];
|
|
1469
|
+
if (options.genstyleguide) items.push("genstyleguide");
|
|
1470
|
+
if (options.skill) items.push("skill");
|
|
1471
|
+
if (options.routes || options.react) items.push("next");
|
|
1472
|
+
if (options.eslint) items.push("eslint");
|
|
1473
|
+
} else {
|
|
1474
|
+
items = await prompter.selectInstallItems();
|
|
1475
|
+
}
|
|
1476
|
+
let nextChoices;
|
|
1477
|
+
if (items.includes("next")) {
|
|
1478
|
+
if (state.nextApps.length === 0) {
|
|
1479
|
+
throw new Error(
|
|
1480
|
+
"Could not find a Next.js App Router app root (expected app/ or src/app/). Run this from your Next.js project root."
|
|
1481
|
+
);
|
|
1482
|
+
} else if (state.nextApps.length === 1) {
|
|
1483
|
+
nextChoices = {
|
|
1484
|
+
projectPath: state.nextApps[0].projectPath,
|
|
1485
|
+
detection: state.nextApps[0].detection,
|
|
1486
|
+
// In non-interactive mode, default to creating providers.tsx
|
|
1487
|
+
createProviders: hasExplicitFlags
|
|
1488
|
+
};
|
|
1489
|
+
} else {
|
|
1490
|
+
const selected = await prompter.selectNextApp(state.nextApps);
|
|
1491
|
+
nextChoices = {
|
|
1492
|
+
projectPath: selected.projectPath,
|
|
1493
|
+
detection: selected.detection,
|
|
1494
|
+
// In non-interactive mode, default to creating providers.tsx
|
|
1495
|
+
createProviders: hasExplicitFlags
|
|
1496
|
+
};
|
|
1497
|
+
}
|
|
1498
|
+
}
|
|
1499
|
+
let viteChoices;
|
|
1500
|
+
if (items.includes("vite")) {
|
|
1501
|
+
if (state.viteApps.length === 0) {
|
|
1502
|
+
throw new Error(
|
|
1503
|
+
"Could not find a Vite + React project (expected vite.config.* + react deps). Run this from your Vite project root."
|
|
1504
|
+
);
|
|
1505
|
+
} else if (state.viteApps.length === 1) {
|
|
1506
|
+
viteChoices = {
|
|
1507
|
+
projectPath: state.viteApps[0].projectPath,
|
|
1508
|
+
detection: state.viteApps[0].detection
|
|
1509
|
+
};
|
|
1510
|
+
} else {
|
|
1511
|
+
const selected = await prompter.selectViteApp(state.viteApps);
|
|
1512
|
+
viteChoices = {
|
|
1513
|
+
projectPath: selected.projectPath,
|
|
1514
|
+
detection: selected.detection
|
|
1515
|
+
};
|
|
1516
|
+
}
|
|
1517
|
+
}
|
|
1518
|
+
let eslintChoices;
|
|
1519
|
+
if (items.includes("eslint")) {
|
|
1520
|
+
const packagesWithEslint = state.packages.filter(
|
|
1521
|
+
(p) => p.eslintConfigPath !== null
|
|
1522
|
+
);
|
|
1523
|
+
if (packagesWithEslint.length === 0) {
|
|
1524
|
+
throw new Error(
|
|
1525
|
+
"No packages with eslint.config.{ts,mjs,js,cjs} found. Create an ESLint config first."
|
|
1526
|
+
);
|
|
1527
|
+
}
|
|
1528
|
+
const packagePaths = await prompter.selectEslintPackages(
|
|
1529
|
+
packagesWithEslint
|
|
1530
|
+
);
|
|
1531
|
+
if (packagePaths.length > 0) {
|
|
1532
|
+
let selectedRules = await prompter.selectEslintRules();
|
|
1533
|
+
const severity = await prompter.selectEslintRuleSeverity();
|
|
1534
|
+
if (severity !== "defaults") {
|
|
1535
|
+
selectedRules = selectedRules.map((rule) => ({
|
|
1536
|
+
...rule,
|
|
1537
|
+
defaultSeverity: severity
|
|
1538
|
+
}));
|
|
1539
|
+
}
|
|
1540
|
+
const hasConfigurableRules = selectedRules.some(
|
|
1541
|
+
(r) => r.optionSchema && r.optionSchema.fields.length > 0
|
|
1542
|
+
);
|
|
1543
|
+
if (hasConfigurableRules) {
|
|
1544
|
+
const customizeOptions = await prompter.confirmCustomizeRuleOptions();
|
|
1545
|
+
if (customizeOptions) {
|
|
1546
|
+
selectedRules = await configureRuleOptions(selectedRules, prompter);
|
|
1547
|
+
}
|
|
1548
|
+
}
|
|
1549
|
+
eslintChoices = { packagePaths, selectedRules };
|
|
1550
|
+
}
|
|
1551
|
+
}
|
|
1552
|
+
return {
|
|
1553
|
+
items,
|
|
1554
|
+
next: nextChoices,
|
|
1555
|
+
vite: viteChoices,
|
|
1556
|
+
eslint: eslintChoices
|
|
1557
|
+
};
|
|
1558
|
+
}
|
|
1559
|
+
async function configureRuleOptions(rules, prompter) {
|
|
1560
|
+
const configured = [];
|
|
1561
|
+
for (const rule of rules) {
|
|
1562
|
+
if (rule.optionSchema && rule.optionSchema.fields.length > 0) {
|
|
1563
|
+
const options = await prompter.configureRuleOptions(rule);
|
|
1564
|
+
if (options) {
|
|
1565
|
+
const existingOptions = rule.defaultOptions && rule.defaultOptions.length > 0 ? rule.defaultOptions[0] : {};
|
|
1566
|
+
configured.push({
|
|
1567
|
+
...rule,
|
|
1568
|
+
defaultOptions: [{ ...existingOptions, ...options }]
|
|
1569
|
+
});
|
|
1570
|
+
} else {
|
|
1571
|
+
configured.push(rule);
|
|
1572
|
+
}
|
|
1573
|
+
} else {
|
|
1574
|
+
configured.push(rule);
|
|
1575
|
+
}
|
|
1576
|
+
}
|
|
1577
|
+
return configured;
|
|
1578
|
+
}
|
|
1579
|
+
|
|
1459
1580
|
// src/commands/init-ui.tsx
|
|
1460
1581
|
import { ruleRegistry } from "uilint-eslint";
|
|
1461
1582
|
import { jsx as jsx7 } from "react/jsx-runtime";
|
|
1583
|
+
var autoPrompter = {
|
|
1584
|
+
async selectInstallItems() {
|
|
1585
|
+
return [];
|
|
1586
|
+
},
|
|
1587
|
+
async selectNextApp(apps) {
|
|
1588
|
+
return apps[0];
|
|
1589
|
+
},
|
|
1590
|
+
async selectViteApp(apps) {
|
|
1591
|
+
return apps[0];
|
|
1592
|
+
},
|
|
1593
|
+
async selectEslintPackages(packages) {
|
|
1594
|
+
return packages.map((p) => p.path);
|
|
1595
|
+
},
|
|
1596
|
+
async selectEslintRules() {
|
|
1597
|
+
return ruleRegistry;
|
|
1598
|
+
},
|
|
1599
|
+
async selectEslintRuleSeverity() {
|
|
1600
|
+
return "defaults";
|
|
1601
|
+
},
|
|
1602
|
+
async confirmCustomizeRuleOptions() {
|
|
1603
|
+
return false;
|
|
1604
|
+
},
|
|
1605
|
+
async configureRuleOptions() {
|
|
1606
|
+
return void 0;
|
|
1607
|
+
}
|
|
1608
|
+
};
|
|
1462
1609
|
function limitList(items, max) {
|
|
1463
1610
|
if (items.length <= max) return items;
|
|
1464
1611
|
return [...items.slice(0, max), pc.dim(`\u2026and ${items.length - max} more`)];
|
|
@@ -1614,11 +1761,39 @@ function selectionsToUserChoices(selections, project, eslintRules, injectionPoin
|
|
|
1614
1761
|
function isInteractiveTerminal() {
|
|
1615
1762
|
return Boolean(process.stdin.isTTY && process.stdout.isTTY);
|
|
1616
1763
|
}
|
|
1764
|
+
function hasNonInteractiveFlags(options) {
|
|
1765
|
+
return Boolean(
|
|
1766
|
+
options.react || options.eslint || options.genstyleguide || options.skill
|
|
1767
|
+
);
|
|
1768
|
+
}
|
|
1769
|
+
async function initNonInteractive(options, executeOptions = {}) {
|
|
1770
|
+
const projectPath = process.cwd();
|
|
1771
|
+
console.log(pc.blue("UILint init (non-interactive mode)"));
|
|
1772
|
+
console.log(pc.dim("Analyzing project..."));
|
|
1773
|
+
const project = await analyze(projectPath);
|
|
1774
|
+
const choices = await gatherChoices(project, options, autoPrompter);
|
|
1775
|
+
if (choices.items.length === 0) {
|
|
1776
|
+
console.log("\nNo features selected. Use --react, --eslint, --genstyleguide, or --skill.");
|
|
1777
|
+
process.exit(1);
|
|
1778
|
+
}
|
|
1779
|
+
console.log(pc.dim(`Installing: ${choices.items.join(", ")}`));
|
|
1780
|
+
const plan = createPlan(project, choices, { force: options.force });
|
|
1781
|
+
const result = await execute(plan, {
|
|
1782
|
+
...executeOptions,
|
|
1783
|
+
projectPath: project.projectPath
|
|
1784
|
+
});
|
|
1785
|
+
printInstallReport(result);
|
|
1786
|
+
process.exit(result.success ? 0 : 1);
|
|
1787
|
+
}
|
|
1617
1788
|
async function initUI(options = {}, executeOptions = {}) {
|
|
1618
1789
|
const projectPath = process.cwd();
|
|
1790
|
+
if (hasNonInteractiveFlags(options)) {
|
|
1791
|
+
await initNonInteractive(options, executeOptions);
|
|
1792
|
+
return;
|
|
1793
|
+
}
|
|
1619
1794
|
if (!isInteractiveTerminal()) {
|
|
1620
1795
|
console.error("\n\u2717 Interactive mode requires a TTY terminal.");
|
|
1621
|
-
console.error("
|
|
1796
|
+
console.error("Use --react, --eslint, --genstyleguide, or --skill for non-interactive mode.\n");
|
|
1622
1797
|
process.exit(1);
|
|
1623
1798
|
}
|
|
1624
1799
|
const projectPromise = analyze(projectPath);
|
|
@@ -1636,8 +1811,8 @@ async function initUI(options = {}, executeOptions = {}) {
|
|
|
1636
1811
|
console.log("\nNo changes selected");
|
|
1637
1812
|
process.exit(0);
|
|
1638
1813
|
}
|
|
1639
|
-
const { createPlan } = await import("./plan-
|
|
1640
|
-
const plan =
|
|
1814
|
+
const { createPlan: createPlan2 } = await import("./plan-RACOU2VV.js");
|
|
1815
|
+
const plan = createPlan2(project, choices, { force: options.force });
|
|
1641
1816
|
if (hasRemovals && removeSelections) {
|
|
1642
1817
|
for (const selection of removeSelections) {
|
|
1643
1818
|
if (!selection.selected || selection.targets.length === 0) continue;
|
|
@@ -1688,4 +1863,4 @@ ${pc.blue("Running tests with coverage...")}`);
|
|
|
1688
1863
|
export {
|
|
1689
1864
|
initUI
|
|
1690
1865
|
};
|
|
1691
|
-
//# sourceMappingURL=init-ui-
|
|
1866
|
+
//# sourceMappingURL=init-ui-VOLYNE5G.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/init-ui.tsx","../src/commands/init/components/InstallApp.tsx","../src/commands/init/components/ProjectSelector.tsx","../src/commands/init/components/MultiSelect.tsx","../src/commands/init/components/RuleSelector.tsx","../src/commands/init/components/OptionField.tsx","../src/commands/init/components/InjectionPointSelector.tsx","../src/commands/init/test-helpers.ts"],"sourcesContent":["/**\n * Init command with Ink-based UI\n *\n * This is the init flow that shows:\n * 1. Project selection (which Next.js/Vite app to configure)\n * 2. Feature selection (what to install)\n * 3. ESLint rule configuration (if ESLint selected)\n * 4. Completion summary\n *\n * Non-interactive mode:\n * Use --react, --eslint, --genstyleguide, or --skill flags to skip prompts.\n */\n\nimport React from \"react\";\nimport { render } from \"ink\";\nimport { InstallApp, type InjectionPointConfig } from \"./init/components/InstallApp.js\";\nimport { analyze } from \"./init/analyze.js\";\nimport { execute } from \"./init/execute.js\";\nimport { createPlan } from \"./init/plan.js\";\nimport { gatherChoices, type Prompter } from \"./init/test-helpers.js\";\nimport type {\n InstallOptions,\n ExecuteOptions,\n UserChoices,\n InstallItem,\n ProjectState,\n} from \"./init/types.js\";\nimport type {\n InstallerSelection,\n InstallTarget,\n} from \"./init/installers/types.js\";\nimport type { ConfiguredRule } from \"./init/components/RuleSelector.js\";\nimport { ruleRegistry } from \"uilint-eslint\";\nimport { pc } from \"../utils/prompts.js\";\nimport { detectCoverageSetup } from \"../utils/coverage-detect.js\";\nimport { runTestsWithCoverage, detectPackageManager } from \"../utils/package-manager.js\";\n\n// Import installers to trigger registration\nimport \"./init/installers/index.js\";\n\n/**\n * Auto-selecting prompter for non-interactive mode.\n * Automatically selects the first option when choices are needed.\n */\nconst autoPrompter: Prompter = {\n async selectInstallItems() {\n // This shouldn't be called in non-interactive mode since flags determine items\n return [];\n },\n async selectNextApp(apps) {\n // Auto-select first app\n return apps[0];\n },\n async selectViteApp(apps) {\n // Auto-select first app\n return apps[0];\n },\n async selectEslintPackages(packages) {\n // Auto-select all packages with ESLint config\n return packages.map((p) => p.path);\n },\n async selectEslintRules() {\n // Use all available rules with defaults\n return ruleRegistry;\n },\n async selectEslintRuleSeverity() {\n return \"defaults\";\n },\n async confirmCustomizeRuleOptions() {\n return false;\n },\n async configureRuleOptions() {\n return undefined;\n },\n};\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 printInstallReport(\n result: Awaited<ReturnType<typeof execute>>,\n testCoverageResult?: { ran: boolean; success: boolean; error?: string }\n): void {\n const failedDeps = result.dependencyResults.filter((r) => !r.success);\n const okDeps = result.dependencyResults.filter((r) => r.success);\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(\"✓\")} Operation completed successfully`);\n } else {\n console.log(`\\n${pc.yellow(\"⚠\")} Operation completed with errors`);\n }\n\n // What was installed/changed (summary)\n const { summary } = result;\n const installed = summary.installedItems.map((x) => String(x));\n const created = summary.filesCreated;\n const modified = summary.filesModified;\n const deleted = summary.filesDeleted;\n\n if (installed.length > 0) {\n console.log(`\\n${pc.bold(\"Installed:\")}`);\n for (const item of installed) console.log(`- ${pc.green(\"✓\")} ${item}`);\n }\n\n if (summary.eslintTargets.length > 0) {\n console.log(`\\n${pc.bold(\"ESLint configured:\")}`);\n for (const t of summary.eslintTargets) {\n console.log(\n `- ${pc.green(\"✓\")} ${t.displayName} ${pc.dim(`(${t.configFile})`)}`\n );\n }\n }\n\n if (created.length + modified.length + deleted.length > 0) {\n console.log(`\\n${pc.bold(\"Files:\")}`);\n for (const p of limitList(created, 20))\n console.log(`- ${pc.green(\"+\")} ${p}`);\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 if (summary.dependenciesInstalled.length > 0) {\n console.log(`\\n${pc.bold(\"Dependencies installed:\")}`);\n for (const d of summary.dependenciesInstalled) {\n console.log(\n `- ${pc.green(\"✓\")} ${d.packagePath} ${pc.dim(`← ${d.packages.join(\", \")}`)}`\n );\n }\n }\n\n // Test coverage result\n if (testCoverageResult?.ran) {\n console.log(`\\n${pc.bold(\"Test coverage:\")}`);\n if (testCoverageResult.success) {\n console.log(`- ${pc.green(\"✓\")} Coverage data generated successfully`);\n } else {\n console.log(`- ${pc.yellow(\"⚠\")} Tests ran with errors`);\n if (testCoverageResult.error) {\n console.log(pc.dim(` ${testCoverageResult.error.split(\"\\n\")[0]}`));\n }\n }\n }\n\n // Failures (include error info)\n if (failedDeps.length > 0 || failedActions.length > 0) {\n console.log(`\\n${pc.bold(pc.red(\"Failures:\"))}`);\n }\n\n if (failedDeps.length > 0) {\n console.log(`\\n${pc.bold(\"Dependency installs failed:\")}`);\n for (const dep of failedDeps) {\n const pkgs = dep.install.packages.join(\", \");\n console.log(\n `- ${pc.red(\"✗\")} ${dep.install.packageManager} in ${dep.install.packagePath} ${pc.dim(`← ${pkgs}`)}`\n );\n if (dep.error) console.log(pc.dim(dep.error.split(\"\\n\").slice(0, 30).join(\"\\n\")));\n }\n }\n\n if (failedActions.length > 0) {\n console.log(`\\n${pc.bold(\"Actions failed:\")}`);\n for (const a of failedActions) {\n const action = a.action as unknown 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 (useful for CI logs)\n console.log(\n pc.dim(\n `\\nSummary: ${okActions.length} action(s) ok, ${failedActions.length} failed · ` +\n `${okDeps.length} dep install(s) ok, ${failedDeps.length} failed`\n )\n );\n}\n\n/**\n * Convert installer selections and configured rules to UserChoices for the execute phase\n */\nfunction selectionsToUserChoices(\n selections: InstallerSelection[],\n project: ProjectState,\n eslintRules?: ConfiguredRule[],\n injectionPointConfig?: InjectionPointConfig\n): UserChoices {\n const items: InstallItem[] = [];\n const choices: UserChoices = { items };\n\n for (const selection of selections) {\n if (!selection.selected || selection.targets.length === 0) continue;\n\n const { installer, targets } = selection;\n\n if (installer.id === \"genstyleguide\") {\n items.push(\"genstyleguide\");\n } else if (installer.id === \"skill\") {\n items.push(\"skill\");\n } else if (installer.id === \"eslint\") {\n items.push(\"eslint\");\n // Add ESLint choices with configured rules\n choices.eslint = {\n packagePaths: targets.map((t: InstallTarget) => t.path),\n // Use configured rules if provided, otherwise fall back to all rules\n selectedRules: eslintRules\n ? eslintRules.map((cr) => ({\n ...cr.rule,\n // Override severity with user's selection\n defaultSeverity: cr.severity,\n defaultOptions: cr.options,\n }))\n : ruleRegistry,\n };\n } else if (installer.id === \"next\") {\n items.push(\"next\");\n // Add Next.js choices\n const target = targets[0];\n const appInfo = project.nextApps.find(\n (app) => app.projectPath === target?.path\n );\n if (appInfo) {\n choices.next = {\n projectPath: appInfo.projectPath,\n detection: appInfo.detection,\n // Use injection point from follow-up UI selection\n targetFile: injectionPointConfig?.targetFile,\n createProviders: injectionPointConfig?.createProviders,\n };\n }\n } else if (installer.id === \"vite\") {\n items.push(\"vite\");\n // Add Vite choices\n const target = targets[0];\n const appInfo = project.viteApps.find(\n (app) => app.projectPath === target?.path\n );\n if (appInfo) {\n choices.vite = {\n projectPath: appInfo.projectPath,\n detection: appInfo.detection,\n };\n }\n }\n }\n\n return choices;\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 * Check if non-interactive flags are provided\n */\nfunction hasNonInteractiveFlags(options: InstallOptions): boolean {\n return Boolean(\n options.react || options.eslint || options.genstyleguide || options.skill\n );\n}\n\n/**\n * Run init in non-interactive mode using CLI flags\n */\nasync function initNonInteractive(\n options: InstallOptions,\n executeOptions: ExecuteOptions = {}\n): Promise<void> {\n const projectPath = process.cwd();\n\n console.log(pc.blue(\"UILint init (non-interactive mode)\"));\n console.log(pc.dim(\"Analyzing project...\"));\n\n const project = await analyze(projectPath);\n\n // Gather choices using flags (auto-prompter handles edge cases)\n const choices = await gatherChoices(project, options, autoPrompter);\n\n if (choices.items.length === 0) {\n console.log(\"\\nNo features selected. Use --react, --eslint, --genstyleguide, or --skill.\");\n process.exit(1);\n }\n\n console.log(pc.dim(`Installing: ${choices.items.join(\", \")}`));\n\n // Create and execute plan\n const plan = createPlan(project, choices, { force: options.force });\n const result = await execute(plan, {\n ...executeOptions,\n projectPath: project.projectPath,\n });\n\n // Display results\n printInstallReport(result);\n\n process.exit(result.success ? 0 : 1);\n}\n\n/**\n * Main init function with Ink UI\n *\n * @param options - CLI options\n * @param executeOptions - Options for the execute phase\n */\nexport async function initUI(\n options: InstallOptions = {},\n executeOptions: ExecuteOptions = {}\n): Promise<void> {\n const projectPath = process.cwd();\n\n // Non-interactive mode: use flags directly without TTY\n if (hasNonInteractiveFlags(options)) {\n await initNonInteractive(options, executeOptions);\n return;\n }\n\n // Check if terminal supports interactive mode\n if (!isInteractiveTerminal()) {\n console.error(\"\\n✗ Interactive mode requires a TTY terminal.\");\n console.error(\"Use --react, --eslint, --genstyleguide, or --skill for non-interactive mode.\\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 <InstallApp\n projectPromise={projectPromise}\n onComplete={async (selections, eslintRules, injectionPointConfig, removeSelections) => {\n // When user completes selection, proceed with installation\n const project = await projectPromise;\n const choices = selectionsToUserChoices(selections, project, eslintRules, injectionPointConfig);\n\n const hasInstalls = choices.items.length > 0;\n const hasRemovals = removeSelections && removeSelections.length > 0;\n\n if (!hasInstalls && !hasRemovals) {\n console.log(\"\\nNo changes selected\");\n process.exit(0);\n }\n\n // Generate install plan using existing plan logic\n const { createPlan } = await import(\"./init/plan.js\");\n const plan = createPlan(project, choices, { force: options.force });\n\n // Generate removal plan actions\n if (hasRemovals && removeSelections) {\n for (const selection of removeSelections) {\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 // Prepend removal actions to the plan (remove first, then install)\n plan.actions = [...removePlan.actions, ...plan.actions];\n }\n }\n }\n\n // Execute the plan with projectPath for prettier formatting\n const result = await execute(plan, {\n ...executeOptions,\n projectPath: project.projectPath,\n });\n\n // Run tests with coverage if require-test-coverage was installed\n let testCoverageResult: { ran: boolean; success: boolean; error?: string } | undefined;\n\n if (result.success && eslintRules?.some(r => r.rule.id === \"require-test-coverage\")) {\n // Get the target paths where ESLint was configured\n const eslintTargetPaths = choices.eslint?.packagePaths ?? [];\n\n for (const targetPath of eslintTargetPaths) {\n const coverageSetup = detectCoverageSetup(targetPath);\n\n // Only run tests if vitest and coverage config are set up\n if (coverageSetup.hasVitest && coverageSetup.hasCoverageConfig) {\n console.log(`\\n${pc.blue(\"Running tests with coverage...\")}`);\n const pm = detectPackageManager(targetPath);\n\n try {\n await runTestsWithCoverage(pm, targetPath);\n testCoverageResult = { ran: true, success: true };\n console.log(`${pc.green(\"✓\")} Coverage data generated`);\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : String(error);\n testCoverageResult = { ran: true, success: false, error: errorMsg };\n console.log(`${pc.yellow(\"⚠\")} Tests completed with errors`);\n }\n }\n }\n }\n\n // Display results\n printInstallReport(result, testCoverageResult);\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 * InstallApp - Main Ink React component for the installer UI\n *\n * Multi-phase installation flow:\n * 1. Select a project (Next.js app, Vite app, etc.)\n * 2. Select features to install\n * 3. Configure injection point (if Next.js/Vite overlay selected with multiple options)\n * 4. Configure ESLint rules (if ESLint selected)\n */\n\nimport React, { useState, useEffect } from \"react\";\nimport { Box, Text, useApp, useInput } from \"ink\";\nimport { Spinner } from \"./Spinner.js\";\nimport { ProjectSelector, getDetectedProjects, type DetectedProject } from \"./ProjectSelector.js\";\nimport { ConfigSelector, type ConfigItem, type ItemStatus } from \"./MultiSelect.js\";\nimport { RuleSelector, type ConfiguredRule } from \"./RuleSelector.js\";\nimport { InjectionPointSelector } from \"./InjectionPointSelector.js\";\nimport type { ProjectState } from \"../types.js\";\nimport type { InstallerSelection, InstallTarget } from \"../installers/types.js\";\nimport { getAllInstallers } from \"../installers/registry.js\";\nimport { getInjectionPoints, type InjectionPoint } from \"../installers/next-overlay.js\";\n\n/**\n * Map InstallTarget to ConfigItem status\n */\nfunction getTargetStatus(target: InstallTarget): ItemStatus {\n if (!target.isInstalled) {\n return \"not_installed\";\n }\n if (target.canUpgrade) {\n return \"upgradeable\";\n }\n return \"installed\";\n}\n\ntype AppPhase =\n | \"checking-requirements\"\n | \"scanning\"\n | \"select-project\"\n | \"configure-features\"\n | \"configure-injection-point\"\n | \"configure-eslint\"\n | \"error\";\n\n/**\n * Selected injection point config to pass to installer\n */\nexport interface InjectionPointConfig {\n targetFile?: string;\n createProviders?: boolean;\n}\n\nexport interface InstallAppProps {\n /** Project scan promise (resolves to ProjectState) */\n projectPromise: Promise<ProjectState>;\n /** Callback when installation is complete */\n onComplete: (\n selections: InstallerSelection[],\n eslintRules?: ConfiguredRule[],\n injectionPointConfig?: InjectionPointConfig,\n removeSelections?: InstallerSelection[]\n ) => void;\n /** Callback when error occurs */\n onError?: (error: Error) => void;\n}\n\n/**\n * Build config items for a specific project\n */\nfunction buildConfigItemsForProject(\n project: ProjectState,\n selectedProject: DetectedProject,\n selections: InstallerSelection[]\n): ConfigItem[] {\n const items: ConfigItem[] = [];\n\n for (const selection of selections) {\n const { installer, targets } = selection;\n\n // Filter targets to those relevant to the selected project\n const relevantTargets = targets.filter((target) => {\n // For overlay installers, match by path\n if (installer.id === \"next\" || installer.id === \"vite\") {\n return target.path === selectedProject.path;\n }\n // For ESLint, match by package path\n if (installer.id === \"eslint\") {\n return target.path === selectedProject.path;\n }\n // Global features (genstyleguide, skill) always included\n return true;\n });\n\n if (relevantTargets.length === 0) continue;\n\n // Map installer IDs to display info\n const displayInfo: Record<string, { category: string; icon: string }> = {\n next: { category: \"UI Analysis\", icon: \"🔍\" },\n vite: { category: \"UI Analysis\", icon: \"🔍\" },\n eslint: { category: \"ESLint Rules\", icon: \"📋\" },\n genstyleguide: { category: \"Cursor Integration\", icon: \"📝\" },\n skill: { category: \"Cursor Integration\", icon: \"⚡\" },\n };\n\n const info = displayInfo[installer.id] || { category: \"Other\", icon: \"•\" };\n\n for (const target of relevantTargets) {\n items.push({\n id: `${installer.id}:${target.id}`,\n label: installer.name,\n hint: target.hint,\n status: getTargetStatus(target),\n category: info.category,\n categoryIcon: info.icon,\n });\n }\n }\n\n return items;\n}\n\n/**\n * Build config items for global features only (no project-specific items)\n */\nfunction buildGlobalConfigItems(selections: InstallerSelection[]): ConfigItem[] {\n const items: ConfigItem[] = [];\n\n for (const selection of selections) {\n const { installer, targets } = selection;\n\n // Only include global installers\n if (installer.id !== \"genstyleguide\" && installer.id !== \"skill\") {\n continue;\n }\n\n const displayInfo: Record<string, { category: string; icon: string }> = {\n genstyleguide: { category: \"Cursor Integration\", icon: \"📝\" },\n skill: { category: \"Cursor Integration\", icon: \"⚡\" },\n };\n\n const info = displayInfo[installer.id] || { category: \"Other\", icon: \"•\" };\n\n for (const target of targets) {\n items.push({\n id: `${installer.id}:${target.id}`,\n label: installer.name,\n hint: target.hint,\n status: getTargetStatus(target),\n category: info.category,\n categoryIcon: info.icon,\n });\n }\n }\n\n return items;\n}\n\n/**\n * Minimum required Node.js version (major.minor)\n * Required by dependencies like chokidar, jsdom, etc.\n */\nconst MIN_NODE_MAJOR = 20;\nconst MIN_NODE_MINOR = 19;\n\n/**\n * Check if the current Node.js version meets the minimum requirement\n */\nfunction checkNodeVersion(): { ok: boolean; current: string; required: string } {\n const ver = process.versions.node || \"\";\n const parts = ver.split(\".\");\n const major = Number.parseInt(parts[0] || \"\", 10);\n const minor = Number.parseInt(parts[1] || \"\", 10);\n\n const meetsRequirement =\n Number.isFinite(major) &&\n Number.isFinite(minor) &&\n (major > MIN_NODE_MAJOR || (major === MIN_NODE_MAJOR && minor >= MIN_NODE_MINOR));\n\n return {\n ok: meetsRequirement,\n current: ver,\n required: `${MIN_NODE_MAJOR}.${MIN_NODE_MINOR}.0`,\n };\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 * Feature configuration with back support\n */\nfunction FeatureConfig({\n selectedProject,\n configItems,\n canGoBack,\n onSubmit,\n onBack,\n onCancel,\n}: {\n selectedProject: DetectedProject | null;\n configItems: ConfigItem[];\n canGoBack: boolean;\n onSubmit: (selectedIds: string[], uninstallIds: string[]) => void;\n onBack: () => void;\n onCancel: () => void;\n}): React.ReactElement {\n useInput((input, key) => {\n if ((input === \"b\" || key.leftArrow) && canGoBack) {\n onBack();\n }\n });\n\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 <ConfigSelector\n items={configItems}\n onSubmit={onSubmit}\n onCancel={onCancel}\n />\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 </Box>\n );\n}\n\nexport function InstallApp({\n projectPromise,\n onComplete,\n onError,\n}: InstallAppProps): React.ReactElement {\n const { exit } = useApp();\n const [phase, setPhase] = useState<AppPhase>(\"checking-requirements\");\n const [nodeVersionCheck, setNodeVersionCheck] = useState<{\n ok: boolean;\n current: string;\n required: string;\n } | null>(null);\n const [project, setProject] = useState<ProjectState | null>(null);\n const [detectedProjects, setDetectedProjects] = useState<DetectedProject[]>([]);\n const [selectedProject, setSelectedProject] = useState<DetectedProject | null>(null);\n const [selections, setSelections] = useState<InstallerSelection[]>([]);\n const [configItems, setConfigItems] = useState<ConfigItem[]>([]);\n const [selectedFeatureIds, setSelectedFeatureIds] = useState<string[]>([]);\n const [removeFeatureIds, setRemoveFeatureIds] = useState<string[]>([]);\n const [error, setError] = useState<Error | null>(null);\n\n // Injection point state\n const [injectionPoints, setInjectionPoints] = useState<InjectionPoint[]>([]);\n const [selectedInjectionPoint, setSelectedInjectionPoint] = useState<InjectionPointConfig | undefined>(undefined);\n\n // Check if ESLint is selected\n const isEslintSelected = selectedFeatureIds.some((id) => id.startsWith(\"eslint:\"));\n\n // Check if Next.js overlay is selected\n const isNextSelected = selectedFeatureIds.some((id) => id.startsWith(\"next:\"));\n\n // Phase 0: Check requirements (Node version)\n useEffect(() => {\n if (phase !== \"checking-requirements\") return;\n\n // Small delay for visual feedback that the check is happening\n const timer = setTimeout(() => {\n const result = checkNodeVersion();\n setNodeVersionCheck(result);\n\n if (result.ok) {\n setPhase(\"scanning\");\n } else {\n setError(\n new Error(\n `Node.js v${result.required}+ is required. You are running v${result.current}.`\n )\n );\n setPhase(\"error\");\n }\n }, 300);\n\n return () => clearTimeout(timer);\n }, [phase]);\n\n // Phase 1: Scan project\n useEffect(() => {\n if (phase !== \"scanning\") return;\n\n projectPromise\n .then((proj) => {\n setProject(proj);\n\n // Get detected projects\n const projects = getDetectedProjects(proj);\n setDetectedProjects(projects);\n\n // Build installer selections\n const installers = getAllInstallers();\n const initialSelections: InstallerSelection[] = installers\n .filter((installer) => installer.isApplicable(proj))\n .map((installer) => {\n const targets = installer.getTargets(proj);\n // Select if there are non-installed targets OR upgradeable targets\n const actionableTargets = targets.filter(\n (t) => !t.isInstalled || t.canUpgrade\n );\n return {\n installer,\n targets,\n selected: actionableTargets.length > 0,\n };\n });\n setSelections(initialSelections);\n\n // If only one project, skip project selection\n if (projects.length === 1) {\n const singleProject = projects[0]!;\n setSelectedProject(singleProject);\n const items = buildConfigItemsForProject(proj, singleProject, initialSelections);\n setConfigItems(items);\n setPhase(\"configure-features\");\n } else if (projects.length === 0) {\n // No projects detected - go straight to global features\n setPhase(\"configure-features\");\n const items = buildGlobalConfigItems(initialSelections);\n setConfigItems(items);\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 // Handle project selection\n const handleProjectSelect = (selected: DetectedProject) => {\n setSelectedProject(selected);\n if (project) {\n const items = buildConfigItemsForProject(project, selected, selections);\n setConfigItems(items);\n }\n setPhase(\"configure-features\");\n };\n\n // Handle back to project selection\n const handleBackToProject = () => {\n if (detectedProjects.length > 1) {\n setSelectedProject(null);\n setPhase(\"select-project\");\n }\n };\n\n // Handle feature selection submission\n const handleFeatureSubmit = (selectedIds: string[], removeIds: string[]) => {\n setSelectedFeatureIds(selectedIds);\n setRemoveFeatureIds(removeIds);\n\n // Check if Next.js overlay is selected - if so, check injection points\n const nextSelected = selectedIds.some((id) => id.startsWith(\"next:\"));\n\n if (nextSelected && project && selectedProject) {\n // Find the Next.js app info\n const appInfo = project.nextApps.find(\n (app) => app.projectPath === selectedProject.path\n );\n\n if (appInfo) {\n const points = getInjectionPoints(appInfo.projectPath, appInfo.detection.appRoot);\n\n // If there's only one injection point, auto-select it\n if (points.length === 1) {\n const point = points[0]!;\n setSelectedInjectionPoint({\n targetFile: point.filePath,\n createProviders: point.createProviders,\n });\n // Continue to next phase\n proceedAfterInjectionPoint(selectedIds, {\n targetFile: point.filePath,\n createProviders: point.createProviders,\n });\n return;\n }\n\n // Multiple injection points - show selection UI\n if (points.length > 1) {\n setInjectionPoints(points);\n setPhase(\"configure-injection-point\");\n return;\n }\n }\n }\n\n // No injection point selection needed, check ESLint\n proceedAfterInjectionPoint(selectedIds, undefined);\n };\n\n // Proceed after injection point selection (or skip)\n const proceedAfterInjectionPoint = (\n selectedIds: string[],\n injectionConfig?: InjectionPointConfig\n ) => {\n // Check if ESLint is selected - if so, go to rule configuration\n const eslintSelected = selectedIds.some((id) => id.startsWith(\"eslint:\"));\n\n if (eslintSelected) {\n setPhase(\"configure-eslint\");\n } else {\n // No ESLint, complete with current selections\n finishInstallation(selectedIds, undefined, injectionConfig);\n }\n };\n\n // Handle injection point selection\n const handleInjectionPointSubmit = (point: InjectionPoint) => {\n const config: InjectionPointConfig = {\n targetFile: point.filePath,\n createProviders: point.createProviders,\n };\n setSelectedInjectionPoint(config);\n proceedAfterInjectionPoint(selectedFeatureIds, config);\n };\n\n // Handle back from injection point selection\n const handleBackFromInjectionPoint = () => {\n setPhase(\"configure-features\");\n };\n\n // Handle ESLint rule configuration submission\n const handleRuleSubmit = (configuredRules: ConfiguredRule[]) => {\n finishInstallation(selectedFeatureIds, configuredRules, selectedInjectionPoint);\n };\n\n // Handle back from ESLint config to feature selection\n const handleBackToFeatures = () => {\n setPhase(\"configure-features\");\n };\n\n // Finalize installation with all selections\n const finishInstallation = (\n selectedIds: string[],\n eslintRules?: ConfiguredRule[],\n injectionConfig?: InjectionPointConfig\n ) => {\n const selectedSet = new Set(selectedIds);\n const removeSet = new Set(removeFeatureIds);\n\n // Build install selections\n const updatedSelections = selections.map((sel) => {\n const selectedTargets = sel.targets.filter((t) =>\n selectedSet.has(`${sel.installer.id}:${t.id}`)\n );\n return {\n ...sel,\n targets: selectedTargets,\n selected: selectedTargets.length > 0,\n };\n });\n\n // Build remove selections\n const removeSelections = selections.map((sel) => {\n const removeTargets = sel.targets.filter((t) =>\n removeSet.has(`${sel.installer.id}:${t.id}`)\n );\n return {\n ...sel,\n targets: removeTargets,\n selected: removeTargets.length > 0,\n };\n }).filter((sel) => sel.selected);\n\n setSelections(updatedSelections);\n onComplete(updatedSelections, eslintRules, injectionConfig, removeSelections.length > 0 ? removeSelections : undefined);\n };\n\n const handleCancel = () => {\n exit();\n };\n\n // Render: Checking requirements\n if (phase === \"checking-requirements\") {\n return (\n <Box flexDirection=\"column\">\n <Header subtitle=\"Install\" />\n <Box>\n <Spinner />\n <Text> Checking requirements...</Text>\n </Box>\n </Box>\n );\n }\n\n // Render: Scanning\n if (phase === \"scanning\") {\n return (\n <Box flexDirection=\"column\">\n <Header subtitle=\"Install\" />\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=\"Install\" />\n <ProjectSelector\n projects={detectedProjects}\n onSelect={handleProjectSelect}\n onCancel={handleCancel}\n />\n </Box>\n );\n }\n\n // Render: Feature configuration\n if (phase === \"configure-features\" && project && configItems.length > 0) {\n return (\n <Box flexDirection=\"column\">\n <Header subtitle=\"Features\" />\n <FeatureConfig\n selectedProject={selectedProject}\n configItems={configItems}\n canGoBack={detectedProjects.length > 1}\n onSubmit={handleFeatureSubmit}\n onBack={handleBackToProject}\n onCancel={handleCancel}\n />\n </Box>\n );\n }\n\n // Render: Injection point configuration\n if (phase === \"configure-injection-point\" && injectionPoints.length > 0) {\n return (\n <Box flexDirection=\"column\">\n <Header subtitle=\"Injection Point\" />\n {selectedProject && (\n <Box marginBottom={1}>\n <Text dimColor>Project: </Text>\n <Text bold color=\"cyan\">{selectedProject.name}</Text>\n </Box>\n )}\n <InjectionPointSelector\n points={injectionPoints}\n onSubmit={handleInjectionPointSubmit}\n onBack={handleBackFromInjectionPoint}\n onCancel={handleCancel}\n />\n </Box>\n );\n }\n\n // Render: ESLint rule configuration\n if (phase === \"configure-eslint\") {\n return (\n <Box flexDirection=\"column\">\n <Header subtitle=\"ESLint Rules\" />\n {selectedProject && (\n <Box marginBottom={1}>\n <Text dimColor>Project: </Text>\n <Text bold color=\"cyan\">{selectedProject.name}</Text>\n </Box>\n )}\n <RuleSelector\n onSubmit={handleRuleSubmit}\n onBack={handleBackToFeatures}\n onCancel={handleCancel}\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","/**\n * ProjectSelector - First step: select which project to configure\n *\n * Shows a simple list of detected projects (Next.js apps, Vite apps, etc.)\n * and lets the user select one to configure.\n */\n\nimport React, { useState } from \"react\";\nimport { Box, Text, useInput, useApp } from \"ink\";\nimport type { ProjectState } from \"../types.js\";\n\nexport interface DetectedProject {\n /** Unique ID */\n id: string;\n /** Project name/label */\n name: string;\n /** Project path (relative to workspace) */\n path: string;\n /** Framework type */\n type: \"nextjs\" | \"vite\" | \"other\";\n /** Framework badge/hint */\n hint: string;\n /** Whether UILint is already configured */\n isConfigured: boolean;\n}\n\nexport interface ProjectSelectorProps {\n projects: DetectedProject[];\n onSelect: (project: DetectedProject) => void;\n onCancel?: () => void;\n}\n\n/**\n * Extract detected projects from ProjectState\n */\nexport function getDetectedProjects(project: ProjectState): DetectedProject[] {\n const projects: DetectedProject[] = [];\n\n // Add Next.js apps\n for (const app of project.nextApps) {\n const relativePath = app.projectPath.replace(project.workspaceRoot + \"/\", \"\");\n projects.push({\n id: `next:${app.projectPath}`,\n name: relativePath || \".\",\n path: app.projectPath,\n type: \"nextjs\",\n hint: \"Next.js App Router\",\n isConfigured: false, // TODO: detect if overlay is installed\n });\n }\n\n // Add Vite apps\n for (const app of project.viteApps) {\n const relativePath = app.projectPath.replace(project.workspaceRoot + \"/\", \"\");\n projects.push({\n id: `vite:${app.projectPath}`,\n name: relativePath || \".\",\n path: app.projectPath,\n type: \"vite\",\n hint: \"Vite + React\",\n isConfigured: false,\n });\n }\n\n return projects;\n}\n\nfunction FrameworkBadge({ type }: { type: DetectedProject[\"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 default:\n return <Text dimColor>Other</Text>;\n }\n}\n\nexport function ProjectSelector({\n projects,\n onSelect,\n onCancel,\n}: ProjectSelectorProps): React.ReactElement {\n const { exit } = useApp();\n const [cursor, setCursor] = useState(0);\n\n useInput((input, key) => {\n if (key.upArrow) {\n setCursor((prev) => (prev > 0 ? prev - 1 : projects.length - 1));\n } else if (key.downArrow) {\n setCursor((prev) => (prev < projects.length - 1 ? prev + 1 : 0));\n } else if (key.return) {\n const selected = projects[cursor];\n if (selected) {\n onSelect(selected);\n }\n } else if (input === \"q\" || key.escape) {\n onCancel?.();\n exit();\n }\n });\n\n if (projects.length === 0) {\n return (\n <Box flexDirection=\"column\">\n <Text color=\"yellow\">No projects detected.</Text>\n <Text dimColor>\n UILint works with Next.js (App Router) and Vite + React projects.\n </Text>\n </Box>\n );\n }\n\n return (\n <Box flexDirection=\"column\">\n <Box marginBottom={1}>\n <Text bold>Select a project to configure:</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 {/* Status */}\n {project.isConfigured && (\n <Text color=\"green\" dimColor>\n configured\n </Text>\n )}\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 * Configuration item for the installer dashboard\n */\n\nimport React, { useState, useCallback } from \"react\";\nimport { Box, Text, useInput, useApp } from \"ink\";\n\nexport type ItemStatus =\n | \"installed\"\n | \"not_installed\"\n | \"selected\"\n | \"partial\"\n | \"upgradeable\"\n | \"remove\";\n\nexport interface ConfigItem {\n /** Unique ID */\n id: string;\n /** Display label */\n label: string;\n /** Optional description/hint */\n hint?: string;\n /** Current installation status */\n status: ItemStatus;\n /** Category/group this item belongs to */\n category: string;\n /** Icon for the category */\n categoryIcon?: string;\n /** Whether this item can be toggled */\n disabled?: boolean;\n}\n\nexport interface ConfigSelectorProps {\n items: ConfigItem[];\n onSubmit: (selectedIds: string[], uninstallIds: string[]) => void;\n onCancel?: () => void;\n}\n\nfunction StatusIndicator({ status, isSelected, isMarkedForRemoval }: { status: ItemStatus; isSelected: boolean; isMarkedForRemoval: boolean }): React.ReactElement {\n // Show red X if item is marked for removal\n if (isMarkedForRemoval) {\n return <Text color=\"red\">✗</Text>;\n }\n if (status === \"installed\") {\n return <Text color=\"green\">✓</Text>;\n }\n if (status === \"upgradeable\") {\n // Upgradeable: show blue up arrow if selected, green check if not\n return isSelected ? <Text color=\"blue\">⬆</Text> : <Text color=\"green\">✓</Text>;\n }\n if (isSelected || status === \"selected\") {\n return <Text color=\"cyan\">◉</Text>;\n }\n if (status === \"partial\") {\n return <Text color=\"yellow\">◐</Text>;\n }\n return <Text dimColor>○</Text>;\n}\n\nfunction StatusLabel({ status, isMarkedForRemoval }: { status: ItemStatus; isMarkedForRemoval: boolean }): React.ReactElement {\n if (isMarkedForRemoval) {\n return <Text color=\"red\" dimColor>remove</Text>;\n }\n if (status === \"installed\") {\n return <Text color=\"green\" dimColor>installed</Text>;\n }\n if (status === \"upgradeable\") {\n return <Text color=\"blue\" dimColor>upgrade available</Text>;\n }\n if (status === \"partial\") {\n return <Text color=\"yellow\" dimColor>partial</Text>;\n }\n return <Text dimColor>-</Text>;\n}\n\nexport function ConfigSelector({\n items,\n onSubmit,\n onCancel,\n}: ConfigSelectorProps): React.ReactElement {\n const { exit } = useApp();\n const [cursor, setCursor] = useState(0);\n const [selected, setSelected] = useState<Set<string>>(() => {\n // Pre-select items that aren't fully installed (including upgradeable)\n return new Set(\n items\n .filter((item) => item.status !== \"installed\" && !item.disabled)\n .map((item) => item.id)\n );\n });\n // Track installed items that are marked for removal\n const [markedForRemoval, setMarkedForRemoval] = useState<Set<string>>(new Set());\n\n // Group items by category\n const categories = Array.from(new Set(items.map((item) => item.category)));\n const itemsByCategory = new Map<string, ConfigItem[]>();\n for (const cat of categories) {\n itemsByCategory.set(cat, items.filter((item) => item.category === cat));\n }\n\n // Flatten for navigation\n const flatItems = items;\n\n const handleToggle = useCallback(() => {\n const item = flatItems[cursor];\n if (!item || item.disabled) return;\n\n // Handle installed items - toggle them for removal\n if (item.status === \"installed\") {\n setMarkedForRemoval((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 return;\n }\n\n // Handle non-installed items (including upgradeable, partial, not_installed)\n setSelected((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 }, [cursor, flatItems]);\n\n useInput((input, key) => {\n if (key.upArrow) {\n setCursor((prev) => (prev > 0 ? prev - 1 : flatItems.length - 1));\n } else if (key.downArrow) {\n setCursor((prev) => (prev < flatItems.length - 1 ? prev + 1 : 0));\n } else if (input === \" \") {\n handleToggle();\n } else if (key.return) {\n onSubmit(Array.from(selected), Array.from(markedForRemoval));\n } else if (input === \"q\" || key.escape) {\n onCancel?.();\n exit();\n } else if (input === \"a\") {\n // Select all non-installed and upgradeable\n setSelected(\n new Set(\n items\n .filter((item) => item.status !== \"installed\" && !item.disabled)\n .map((item) => item.id)\n )\n );\n // Clear removal selections\n setMarkedForRemoval(new Set());\n } else if (input === \"n\") {\n // Select none\n setSelected(new Set());\n // Clear removal selections too\n setMarkedForRemoval(new Set());\n }\n });\n\n let globalIndex = 0;\n\n return (\n <Box flexDirection=\"column\">\n {categories.map((category) => {\n const categoryItems = itemsByCategory.get(category) || [];\n const categoryIcon = categoryItems[0]?.categoryIcon || \"•\";\n\n return (\n <Box key={category} flexDirection=\"column\" marginBottom={1}>\n {/* Category header */}\n <Box>\n <Text bold color=\"white\">\n {categoryIcon} {category}\n </Text>\n </Box>\n\n {/* Category items */}\n {categoryItems.map((item) => {\n const itemIndex = globalIndex++;\n const isCursor = itemIndex === cursor;\n const isItemSelected = selected.has(item.id);\n const isItemMarkedForRemoval = markedForRemoval.has(item.id);\n // Items are only disabled if explicitly marked as such\n const isDisabled = item.disabled === true;\n\n return (\n <Box key={item.id} paddingLeft={2}>\n {/* Cursor indicator */}\n <Text color={isCursor ? \"cyan\" : undefined}>\n {isCursor ? \"› \" : \" \"}\n </Text>\n\n {/* Status checkbox */}\n <Box width={2}>\n <StatusIndicator status={item.status} isSelected={isItemSelected} isMarkedForRemoval={isItemMarkedForRemoval} />\n </Box>\n\n {/* Label */}\n <Box width={28}>\n <Text\n color={isItemMarkedForRemoval ? \"red\" : isDisabled ? undefined : isCursor ? \"cyan\" : undefined}\n dimColor={isDisabled && !isItemMarkedForRemoval}\n >\n {item.label}\n </Text>\n </Box>\n\n {/* Hint */}\n <Box width={20}>\n <Text dimColor>{item.hint || \"\"}</Text>\n </Box>\n\n {/* Status */}\n <StatusLabel status={item.status} isMarkedForRemoval={isItemMarkedForRemoval} />\n </Box>\n );\n })}\n </Box>\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> apply{\" \"}\n <Text color=\"cyan\">q</Text> quit\n </Text>\n </Box>\n\n {/* Selection summary */}\n <Box marginTop={1}>\n <Text>\n <Text color=\"cyan\">{selected.size}</Text>\n <Text dimColor> to install</Text>\n {markedForRemoval.size > 0 && (\n <>\n <Text dimColor>, </Text>\n <Text color=\"red\">{markedForRemoval.size}</Text>\n <Text dimColor> to remove</Text>\n </>\n )}\n </Text>\n </Box>\n </Box>\n );\n}\n","/**\n * RuleSelector - ESLint rule configuration UI\n *\n * Shows a list of available ESLint rules with:\n * - Toggle to enable/disable each rule\n * - Severity selection (error/warn)\n * - Rule documentation on hover/select\n * - Option configuration for rules with configurable options\n */\n\nimport React, { useState, useMemo } from \"react\";\nimport { Box, Text, useInput, useApp } from \"ink\";\nimport { getRulesByCategory, getCategoryMeta } from \"uilint-eslint\";\nimport type { RuleMeta } from \"uilint-eslint\";\nimport { OptionField, convertFieldValue } from \"./OptionField.js\";\n\nexport interface ConfiguredRule {\n rule: RuleMeta;\n severity: \"error\" | \"warn\" | \"off\";\n options?: unknown[];\n}\n\nexport interface RuleSelectorProps {\n onSubmit: (configuredRules: ConfiguredRule[]) => void;\n onBack?: () => void;\n onCancel?: () => void;\n}\n\ntype ViewMode = \"list\" | \"docs\" | \"confirm-options\" | \"edit-options\";\n\nfunction SeverityBadge({ severity }: { severity: \"error\" | \"warn\" | \"off\" }): React.ReactElement {\n if (severity === \"error\") {\n return <Text color=\"red\">error</Text>;\n }\n if (severity === \"warn\") {\n return <Text color=\"yellow\">warn</Text>;\n }\n return <Text dimColor>off</Text>;\n}\n\nfunction CategoryHeader({ name, icon }: { name: string; icon: string }): React.ReactElement {\n return (\n <Box marginTop={1} marginBottom={0}>\n <Text bold color=\"white\">\n {icon} {name}\n </Text>\n </Box>\n );\n}\n\nexport function RuleSelector({\n onSubmit,\n onBack,\n onCancel,\n}: RuleSelectorProps): React.ReactElement {\n const { exit } = useApp();\n\n const staticRules = useMemo(() => getRulesByCategory(\"static\"), []);\n const semanticRules = useMemo(() => getRulesByCategory(\"semantic\"), []);\n const allRules = useMemo(() => [...staticRules, ...semanticRules], [staticRules, semanticRules]);\n\n const [cursor, setCursor] = useState(0);\n const [viewMode, setViewMode] = useState<ViewMode>(\"list\");\n\n // Track enabled state and severity for each rule\n const [ruleStates, setRuleStates] = useState<Map<string, { enabled: boolean; severity: \"error\" | \"warn\" }>>(\n () => {\n const map = new Map();\n // Use rule metadata for default enablement\n for (const rule of allRules) {\n const categoryMeta = getCategoryMeta(rule.category);\n const enabled = rule.defaultEnabled ?? categoryMeta?.defaultEnabled ?? false;\n map.set(rule.id, {\n enabled,\n severity: rule.defaultSeverity === \"off\" ? \"warn\" : rule.defaultSeverity\n });\n }\n return map;\n }\n );\n\n // Track custom options for rules (only populated when user configures them)\n const [customOptions, setCustomOptions] = useState<Map<string, Record<string, unknown>>>(new Map());\n\n // For option editing: which rule and which field cursor\n const [editingRuleIndex, setEditingRuleIndex] = useState(0);\n const [editingFieldCursor, setEditingFieldCursor] = useState(0);\n\n // For confirm-options view: cursor position (0 = Yes, 1 = No)\n const [confirmCursor, setConfirmCursor] = useState(1); // Default to \"No\"\n\n const currentRule = allRules[cursor];\n\n // Get enabled rules that have configurable options\n const enabledRulesWithOptions = useMemo(() => {\n return allRules.filter((rule) => {\n const state = ruleStates.get(rule.id);\n return state?.enabled && rule.optionSchema && rule.optionSchema.fields.length > 0;\n });\n }, [allRules, ruleStates]);\n\n // Current rule being edited in edit-options mode\n const currentEditingRule = enabledRulesWithOptions[editingRuleIndex];\n const currentEditingFields = currentEditingRule?.optionSchema?.fields ?? [];\n\n const toggleRule = () => {\n if (!currentRule) return;\n setRuleStates((prev) => {\n const next = new Map(prev);\n const current = next.get(currentRule.id)!;\n next.set(currentRule.id, { ...current, enabled: !current.enabled });\n return next;\n });\n };\n\n const cycleSeverity = () => {\n if (!currentRule) return;\n setRuleStates((prev) => {\n const next = new Map(prev);\n const current = next.get(currentRule.id)!;\n const newSeverity = current.severity === \"error\" ? \"warn\" : \"error\";\n next.set(currentRule.id, { ...current, severity: newSeverity });\n return next;\n });\n };\n\n // Final submit - build configured rules with options\n const finalSubmit = () => {\n const configuredRules: ConfiguredRule[] = [];\n for (const rule of allRules) {\n const state = ruleStates.get(rule.id);\n if (state?.enabled) {\n const custom = customOptions.get(rule.id);\n const baseOptions = rule.defaultOptions?.[0] ?? {};\n configuredRules.push({\n rule,\n severity: state.severity,\n options: custom ? [{ ...baseOptions, ...custom }] : rule.defaultOptions,\n });\n }\n }\n onSubmit(configuredRules);\n };\n\n // Transition from list to confirm/submit\n const handleListSubmit = () => {\n if (enabledRulesWithOptions.length > 0) {\n // Show confirm dialog\n setViewMode(\"confirm-options\");\n setConfirmCursor(1); // Default to \"No\"\n } else {\n // No rules with options, submit directly\n finalSubmit();\n }\n };\n\n // Handle confirm-options selection\n const handleConfirmSelection = () => {\n if (confirmCursor === 0) {\n // Yes - configure options\n setEditingRuleIndex(0);\n setEditingFieldCursor(0);\n // Initialize custom options with defaults for the first rule\n if (enabledRulesWithOptions[0]) {\n initializeRuleOptions(enabledRulesWithOptions[0]);\n }\n setViewMode(\"edit-options\");\n } else {\n // No - use defaults\n finalSubmit();\n }\n };\n\n // Initialize custom options for a rule with its defaults\n const initializeRuleOptions = (rule: RuleMeta) => {\n if (!customOptions.has(rule.id) && rule.optionSchema) {\n const baseOptions = rule.defaultOptions?.[0] ?? {};\n const initial: Record<string, unknown> = {};\n for (const field of rule.optionSchema.fields) {\n initial[field.key] = (baseOptions as Record<string, unknown>)[field.key] ?? field.defaultValue;\n }\n setCustomOptions((prev) => {\n const next = new Map(prev);\n next.set(rule.id, initial);\n return next;\n });\n }\n };\n\n // Update a field value for current editing rule\n const updateFieldValue = (fieldKey: string, value: unknown) => {\n if (!currentEditingRule) return;\n setCustomOptions((prev) => {\n const next = new Map(prev);\n const current = next.get(currentEditingRule.id) ?? {};\n next.set(currentEditingRule.id, { ...current, [fieldKey]: value });\n return next;\n });\n };\n\n // Move to next rule in edit-options mode\n const nextEditingRule = () => {\n if (editingRuleIndex < enabledRulesWithOptions.length - 1) {\n const nextIndex = editingRuleIndex + 1;\n setEditingRuleIndex(nextIndex);\n setEditingFieldCursor(0);\n // Initialize options for next rule\n if (enabledRulesWithOptions[nextIndex]) {\n initializeRuleOptions(enabledRulesWithOptions[nextIndex]!);\n }\n } else {\n // Done with all rules\n finalSubmit();\n }\n };\n\n // Skip current rule (use defaults) and move to next\n const skipCurrentRule = () => {\n // Remove any custom options for this rule (use defaults)\n if (currentEditingRule) {\n setCustomOptions((prev) => {\n const next = new Map(prev);\n next.delete(currentEditingRule.id);\n return next;\n });\n }\n nextEditingRule();\n };\n\n useInput((input, key) => {\n // Docs view\n if (viewMode === \"docs\") {\n if (key.escape || key.return || input === \"d\" || input === \"q\") {\n setViewMode(\"list\");\n }\n return;\n }\n\n // Confirm options view\n if (viewMode === \"confirm-options\") {\n if (key.upArrow || key.downArrow) {\n setConfirmCursor((prev) => (prev === 0 ? 1 : 0));\n } else if (key.return || input === \" \") {\n handleConfirmSelection();\n } else if (key.escape || input === \"q\") {\n setViewMode(\"list\");\n }\n return;\n }\n\n // Edit options view\n if (viewMode === \"edit-options\") {\n if (key.upArrow) {\n setEditingFieldCursor((prev) =>\n prev > 0 ? prev - 1 : currentEditingFields.length - 1\n );\n } else if (key.downArrow) {\n setEditingFieldCursor((prev) =>\n prev < currentEditingFields.length - 1 ? prev + 1 : 0\n );\n } else if (key.return) {\n // Confirm this rule's options and move to next\n nextEditingRule();\n } else if (key.escape) {\n // Skip this rule (use defaults)\n skipCurrentRule();\n } else if (input === \"q\") {\n // Cancel and go back to list\n setViewMode(\"list\");\n }\n // Note: Individual field inputs are handled by OptionField component\n return;\n }\n\n // List view controls\n if (key.upArrow) {\n setCursor((prev) => (prev > 0 ? prev - 1 : allRules.length - 1));\n } else if (key.downArrow) {\n setCursor((prev) => (prev < allRules.length - 1 ? prev + 1 : 0));\n } else if (input === \" \") {\n toggleRule();\n } else if (input === \"s\") {\n cycleSeverity();\n } else if (input === \"d\") {\n setViewMode(\"docs\");\n } else if (key.return) {\n handleListSubmit();\n } else if (key.escape || input === \"q\") {\n onCancel?.();\n exit();\n } else if ((input === \"b\" || key.leftArrow) && onBack) {\n onBack();\n } else if (input === \"a\") {\n // Enable all\n setRuleStates((prev) => {\n const next = new Map(prev);\n for (const rule of allRules) {\n const current = next.get(rule.id)!;\n next.set(rule.id, { ...current, enabled: true });\n }\n return next;\n });\n } else if (input === \"n\") {\n // Disable all\n setRuleStates((prev) => {\n const next = new Map(prev);\n for (const rule of allRules) {\n const current = next.get(rule.id)!;\n next.set(rule.id, { ...current, enabled: false });\n }\n return next;\n });\n }\n });\n\n // Show documentation view\n if (viewMode === \"docs\" && currentRule) {\n const docLines = currentRule.docs.trim().split(\"\\n\").slice(0, 20);\n return (\n <Box flexDirection=\"column\">\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">{currentRule.name}</Text>\n <Text dimColor> - {currentRule.description}</Text>\n </Box>\n\n <Box flexDirection=\"column\" borderStyle=\"single\" borderColor=\"gray\" paddingX={1}>\n {docLines.map((line, i) => (\n <Text key={i} dimColor={line.startsWith(\"#\")}>\n {line}\n </Text>\n ))}\n {currentRule.docs.split(\"\\n\").length > 20 && (\n <Text dimColor>... (truncated)</Text>\n )}\n </Box>\n\n <Box marginTop={1}>\n <Text dimColor>\n Press any key to return to list\n </Text>\n </Box>\n </Box>\n );\n }\n\n // Show confirm options view\n if (viewMode === \"confirm-options\") {\n return (\n <Box flexDirection=\"column\">\n <Box marginBottom={1}>\n <Text bold>Configure Rule Options</Text>\n </Box>\n\n <Box marginBottom={1}>\n <Text>\n <Text color=\"cyan\">{enabledRulesWithOptions.length}</Text>\n <Text> selected rules have configurable options. Would you like to customize them?</Text>\n </Text>\n </Box>\n\n <Box flexDirection=\"column\" paddingLeft={2}>\n <Box>\n <Text color={confirmCursor === 0 ? \"cyan\" : undefined}>\n {confirmCursor === 0 ? \"› \" : \" \"}\n </Text>\n <Text color={confirmCursor === 0 ? \"cyan\" : undefined} bold={confirmCursor === 0}>\n Yes\n </Text>\n <Text dimColor> - Configure each rule's options</Text>\n </Box>\n <Box>\n <Text color={confirmCursor === 1 ? \"cyan\" : undefined}>\n {confirmCursor === 1 ? \"› \" : \" \"}\n </Text>\n <Text color={confirmCursor === 1 ? \"cyan\" : undefined} bold={confirmCursor === 1}>\n No\n </Text>\n <Text dimColor> - Use defaults for all rules</Text>\n </Box>\n </Box>\n\n <Box marginTop={1}>\n <Text dimColor>\n Rules with options:{\" \"}\n {enabledRulesWithOptions.map((r) => r.name).join(\", \")}\n </Text>\n </Box>\n\n <Box marginTop={1} borderStyle=\"single\" borderColor=\"gray\" paddingX={1}>\n <Text dimColor>\n <Text color=\"cyan\">↑↓</Text> select{\" \"}\n <Text color=\"cyan\">enter</Text> confirm{\" \"}\n <Text color=\"cyan\">esc</Text> back\n </Text>\n </Box>\n </Box>\n );\n }\n\n // Show edit options view\n if (viewMode === \"edit-options\" && currentEditingRule) {\n const ruleOptions = customOptions.get(currentEditingRule.id) ?? {};\n const baseOptions = currentEditingRule.defaultOptions?.[0] ?? {};\n\n return (\n <Box flexDirection=\"column\">\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">\n {currentEditingRule.icon ?? \"⚙️\"} {currentEditingRule.name}\n </Text>\n <Text dimColor> ({editingRuleIndex + 1}/{enabledRulesWithOptions.length})</Text>\n </Box>\n\n <Box marginBottom={1}>\n <Text dimColor>{currentEditingRule.description}</Text>\n </Box>\n\n <Box flexDirection=\"column\">\n {currentEditingFields.map((field, i) => {\n const currentValue = ruleOptions[field.key] ??\n (baseOptions as Record<string, unknown>)[field.key] ??\n field.defaultValue;\n const defaultValue = (baseOptions as Record<string, unknown>)[field.key] ?? field.defaultValue;\n\n return (\n <OptionField\n key={field.key}\n field={field}\n value={currentValue}\n onChange={(newValue) => {\n const converted = convertFieldValue(newValue, field, defaultValue);\n updateFieldValue(field.key, converted);\n }}\n isActive={i === editingFieldCursor}\n />\n );\n })}\n </Box>\n\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\">enter</Text> next rule{\" \"}\n <Text color=\"cyan\">esc</Text> skip (use defaults)\n </Text>\n </Box>\n </Box>\n );\n }\n\n // Count enabled rules\n const enabledCount = Array.from(ruleStates.values()).filter((s) => s.enabled).length;\n const errorCount = Array.from(ruleStates.entries()).filter(\n ([, s]) => s.enabled && s.severity === \"error\"\n ).length;\n const warnCount = enabledCount - errorCount;\n\n // Build flat list with category markers\n let globalIndex = 0;\n\n return (\n <Box flexDirection=\"column\">\n <Box marginBottom={1}>\n <Text bold>Configure ESLint Rules</Text>\n </Box>\n\n {/* Static rules */}\n {(() => {\n const cat = getCategoryMeta(\"static\");\n return cat ? (\n <>\n <CategoryHeader name={cat.name} icon={cat.icon} />\n <Text dimColor> {cat.description}</Text>\n </>\n ) : null;\n })()}\n\n {staticRules.map((rule) => {\n const itemIndex = globalIndex++;\n const isCursor = itemIndex === cursor;\n const state = ruleStates.get(rule.id)!;\n const hasOptions = rule.optionSchema && rule.optionSchema.fields.length > 0;\n\n return (\n <Box key={rule.id} paddingLeft={2}>\n <Text color={isCursor ? \"cyan\" : undefined}>\n {isCursor ? \"› \" : \" \"}\n </Text>\n <Box width={3}>\n <Text color={state.enabled ? \"green\" : undefined} dimColor={!state.enabled}>\n {state.enabled ? \"✓\" : \"○\"}\n </Text>\n </Box>\n <Box width={30}>\n <Text\n color={isCursor ? \"cyan\" : undefined}\n dimColor={!state.enabled}\n bold={isCursor}\n >\n {rule.name}\n </Text>\n </Box>\n <Box width={8}>\n {state.enabled ? (\n <SeverityBadge severity={state.severity} />\n ) : (\n <Text dimColor>-</Text>\n )}\n </Box>\n {hasOptions && state.enabled && (\n <Text dimColor> ⚙</Text>\n )}\n </Box>\n );\n })}\n\n {/* Semantic rules */}\n {(() => {\n const cat = getCategoryMeta(\"semantic\");\n return cat ? (\n <>\n <CategoryHeader name={cat.name} icon={cat.icon} />\n <Text dimColor> {cat.description}</Text>\n </>\n ) : null;\n })()}\n\n {semanticRules.map((rule) => {\n const itemIndex = globalIndex++;\n const isCursor = itemIndex === cursor;\n const state = ruleStates.get(rule.id)!;\n const hasOptions = rule.optionSchema && rule.optionSchema.fields.length > 0;\n\n return (\n <Box key={rule.id} paddingLeft={2}>\n <Text color={isCursor ? \"cyan\" : undefined}>\n {isCursor ? \"› \" : \" \"}\n </Text>\n <Box width={3}>\n <Text color={state.enabled ? \"green\" : undefined} dimColor={!state.enabled}>\n {state.enabled ? \"✓\" : \"○\"}\n </Text>\n </Box>\n <Box width={30}>\n <Text\n color={isCursor ? \"cyan\" : undefined}\n dimColor={!state.enabled}\n bold={isCursor}\n >\n {rule.name}\n </Text>\n </Box>\n <Box width={8}>\n {state.enabled ? (\n <SeverityBadge severity={state.severity} />\n ) : (\n <Text dimColor>-</Text>\n )}\n </Box>\n {hasOptions && state.enabled && (\n <Text dimColor> ⚙</Text>\n )}\n </Box>\n );\n })}\n\n {/* Current rule description */}\n {currentRule && (\n <Box marginTop={1} paddingX={2}>\n <Text dimColor>{currentRule.description}</Text>\n </Box>\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\">s</Text> severity{\" \"}\n <Text color=\"cyan\">d</Text> docs{\" \"}\n <Text color=\"cyan\">a</Text> all{\" \"}\n <Text color=\"cyan\">n</Text> none{\" \"}\n <Text color=\"cyan\">enter</Text> confirm\n </Text>\n </Box>\n\n {/* Summary */}\n <Box marginTop={1}>\n <Text>\n <Text color=\"cyan\">{enabledCount}</Text>\n <Text dimColor> rules enabled (</Text>\n <Text color=\"red\">{errorCount}</Text>\n <Text dimColor> errors, </Text>\n <Text color=\"yellow\">{warnCount}</Text>\n <Text dimColor> warnings)</Text>\n {enabledRulesWithOptions.length > 0 && (\n <Text dimColor>, {enabledRulesWithOptions.length} with options ⚙</Text>\n )}\n </Text>\n </Box>\n </Box>\n );\n}\n","/**\n * OptionField - Ink components for editing rule option fields\n *\n * Renders appropriate input UI based on field type:\n * - boolean: Toggle checkbox\n * - number: Text input with number validation\n * - text: Text input\n * - select: Single-select list\n * - multiselect: Multi-select list\n */\n\nimport React, { useState } from \"react\";\nimport { Box, Text, useInput } from \"ink\";\nimport type { OptionFieldSchema } from \"uilint-eslint\";\n\nexport interface OptionFieldProps {\n field: OptionFieldSchema;\n value: unknown;\n onChange: (value: unknown) => void;\n isActive: boolean;\n}\n\n/**\n * Boolean field - toggle with space\n */\nfunction BooleanField({\n field,\n value,\n onChange,\n isActive,\n}: OptionFieldProps): React.ReactElement {\n const checked = Boolean(value);\n\n useInput(\n (input) => {\n if (isActive && input === \" \") {\n onChange(!checked);\n }\n },\n { isActive }\n );\n\n return (\n <Box>\n <Text color={isActive ? \"cyan\" : undefined}>\n {isActive ? \"› \" : \" \"}\n </Text>\n <Text color={checked ? \"green\" : \"gray\"}>\n {checked ? \"[✓]\" : \"[ ]\"}\n </Text>\n <Text> {field.label}</Text>\n {field.description && (\n <Text dimColor> - {field.description}</Text>\n )}\n </Box>\n );\n}\n\n/**\n * Number field - text input with validation\n */\nfunction NumberField({\n field,\n value,\n onChange,\n isActive,\n}: OptionFieldProps): React.ReactElement {\n const [inputValue, setInputValue] = useState(String(value ?? field.defaultValue ?? \"\"));\n const [error, setError] = useState<string | null>(null);\n\n useInput(\n (input, key) => {\n if (!isActive) return;\n\n if (key.backspace || key.delete) {\n const newValue = inputValue.slice(0, -1);\n setInputValue(newValue);\n const num = Number(newValue);\n if (!isNaN(num) && newValue !== \"\") {\n onChange(num);\n setError(null);\n } else if (newValue === \"\") {\n setError(null);\n } else {\n setError(\"Enter a valid number\");\n }\n } else if (/^[0-9.-]$/.test(input)) {\n const newValue = inputValue + input;\n setInputValue(newValue);\n const num = Number(newValue);\n if (!isNaN(num)) {\n onChange(num);\n setError(null);\n } else {\n setError(\"Enter a valid number\");\n }\n }\n },\n { isActive }\n );\n\n return (\n <Box flexDirection=\"column\">\n <Box>\n <Text color={isActive ? \"cyan\" : undefined}>\n {isActive ? \"› \" : \" \"}\n </Text>\n <Text>{field.label}: </Text>\n <Text color={isActive ? \"cyan\" : undefined} underline={isActive}>\n {inputValue || field.placeholder || \"\"}\n </Text>\n {field.description && (\n <Text dimColor> ({field.description})</Text>\n )}\n </Box>\n {error && (\n <Box paddingLeft={4}>\n <Text color=\"red\">{error}</Text>\n </Box>\n )}\n </Box>\n );\n}\n\n/**\n * Text field - simple text input\n */\nfunction TextField({\n field,\n value,\n onChange,\n isActive,\n}: OptionFieldProps): React.ReactElement {\n // Handle array values by joining with commas\n const displayValue = Array.isArray(value)\n ? value.join(\", \")\n : String(value ?? field.defaultValue ?? \"\");\n const [inputValue, setInputValue] = useState(displayValue);\n\n useInput(\n (input, key) => {\n if (!isActive) return;\n\n if (key.backspace || key.delete) {\n const newValue = inputValue.slice(0, -1);\n setInputValue(newValue);\n onChange(newValue);\n } else if (input && !key.ctrl && !key.meta) {\n const newValue = inputValue + input;\n setInputValue(newValue);\n onChange(newValue);\n }\n },\n { isActive }\n );\n\n return (\n <Box>\n <Text color={isActive ? \"cyan\" : undefined}>\n {isActive ? \"› \" : \" \"}\n </Text>\n <Text>{field.label}: </Text>\n <Text color={isActive ? \"cyan\" : undefined} underline={isActive}>\n {inputValue || field.placeholder || \"(empty)\"}\n </Text>\n {field.description && (\n <Text dimColor> ({field.description})</Text>\n )}\n </Box>\n );\n}\n\n/**\n * Select field - cycle through options with space or left/right arrows\n * Uses inline display to avoid conflicts with parent navigation\n */\nfunction SelectField({\n field,\n value,\n onChange,\n isActive,\n}: OptionFieldProps): React.ReactElement {\n const options = field.options ?? [];\n const currentIndex = options.findIndex(\n (opt) => String(opt.value) === String(value)\n );\n const selectedIndex = currentIndex >= 0 ? currentIndex : 0;\n\n useInput(\n (input, key) => {\n if (!isActive || options.length === 0) return;\n\n // Space or right arrow cycles forward\n if (input === \" \" || key.rightArrow) {\n const newIndex = selectedIndex < options.length - 1 ? selectedIndex + 1 : 0;\n onChange(options[newIndex]!.value);\n }\n // Left arrow cycles backward\n else if (key.leftArrow) {\n const newIndex = selectedIndex > 0 ? selectedIndex - 1 : options.length - 1;\n onChange(options[newIndex]!.value);\n }\n },\n { isActive }\n );\n\n const selectedOption = options[selectedIndex];\n\n return (\n <Box>\n <Text color={isActive ? \"cyan\" : undefined}>\n {isActive ? \"› \" : \" \"}\n </Text>\n <Text>{field.label}: </Text>\n <Text color={isActive ? \"cyan\" : undefined} bold={isActive}>\n {\"◀ \"}\n {selectedOption?.label ?? \"(none)\"}\n {\" ▶\"}\n </Text>\n {field.description && (\n <Text dimColor> ({field.description})</Text>\n )}\n </Box>\n );\n}\n\n/**\n * Multiselect field - multiple selections from options\n */\nfunction MultiselectField({\n field,\n value,\n onChange,\n isActive,\n}: OptionFieldProps): React.ReactElement {\n const options = field.options ?? [];\n const selectedValues = new Set(\n Array.isArray(value) ? value.map(String) : []\n );\n const [cursor, setCursor] = useState(0);\n\n useInput(\n (input, key) => {\n if (!isActive || options.length === 0) return;\n\n if (key.upArrow) {\n setCursor((prev) => (prev > 0 ? prev - 1 : options.length - 1));\n } else if (key.downArrow) {\n setCursor((prev) => (prev < options.length - 1 ? prev + 1 : 0));\n } else if (input === \" \") {\n const opt = options[cursor]!;\n const newSelected = new Set(selectedValues);\n if (newSelected.has(String(opt.value))) {\n newSelected.delete(String(opt.value));\n } else {\n newSelected.add(String(opt.value));\n }\n onChange(Array.from(newSelected));\n }\n },\n { isActive }\n );\n\n return (\n <Box flexDirection=\"column\">\n <Box>\n <Text color={isActive ? \"cyan\" : undefined}>\n {isActive ? \"› \" : \" \"}\n </Text>\n <Text>{field.label}</Text>\n {field.description && (\n <Text dimColor> - {field.description}</Text>\n )}\n </Box>\n {isActive && (\n <Box flexDirection=\"column\" paddingLeft={4}>\n {options.map((opt, i) => {\n const isSelected = selectedValues.has(String(opt.value));\n const isCursor = i === cursor;\n return (\n <Box key={String(opt.value)}>\n <Text color={isCursor ? \"cyan\" : undefined}>\n {isCursor ? \"› \" : \" \"}\n </Text>\n <Text color={isSelected ? \"green\" : undefined}>\n {isSelected ? \"[✓]\" : \"[ ]\"}\n </Text>\n <Text color={isCursor ? \"cyan\" : undefined}>\n {\" \"}{opt.label}\n </Text>\n </Box>\n );\n })}\n </Box>\n )}\n {!isActive && (\n <Box paddingLeft={4}>\n <Text dimColor>\n Selected: {Array.from(selectedValues).length > 0\n ? Array.from(selectedValues).join(\", \")\n : \"(none)\"}\n </Text>\n </Box>\n )}\n </Box>\n );\n}\n\n/**\n * Main OptionField component - renders the appropriate field type\n */\nexport function OptionField(props: OptionFieldProps): React.ReactElement {\n const { field } = props;\n\n switch (field.type) {\n case \"boolean\":\n return <BooleanField {...props} />;\n case \"number\":\n return <NumberField {...props} />;\n case \"text\":\n return <TextField {...props} />;\n case \"select\":\n return <SelectField {...props} />;\n case \"multiselect\":\n return <MultiselectField {...props} />;\n default:\n return (\n <Box>\n <Text dimColor>Unknown field type: {field.type}</Text>\n </Box>\n );\n }\n}\n\n/**\n * Converts field value to the expected type for rule options.\n * Handles comma-separated text → array conversion for array-typed defaults.\n */\nexport function convertFieldValue(\n value: unknown,\n field: OptionFieldSchema,\n defaultValue: unknown\n): unknown {\n // If defaultValue is an array but field type is text, parse comma-separated\n if (Array.isArray(defaultValue) && field.type === \"text\" && typeof value === \"string\") {\n return value\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean);\n }\n return value;\n}\n","/**\n * InjectionPointSelector - Select where to inject the UI devtools component\n *\n * Shows a list of possible injection points (client boundaries) and lets\n * the user select one. Only one can be selected (single-select).\n */\n\nimport React, { useState } from \"react\";\nimport { Box, Text, useInput, useApp } from \"ink\";\nimport type { InjectionPoint } from \"../installers/next-overlay.js\";\n\nexport interface InjectionPointSelectorProps {\n /** Available injection points */\n points: InjectionPoint[];\n /** Callback when user selects a point */\n onSubmit: (point: InjectionPoint) => void;\n /** Callback to go back */\n onBack?: () => void;\n /** Callback when user cancels */\n onCancel?: () => void;\n}\n\nexport function InjectionPointSelector({\n points,\n onSubmit,\n onBack,\n onCancel,\n}: InjectionPointSelectorProps): React.ReactElement {\n const { exit } = useApp();\n\n // Find the recommended point to pre-select, or default to first\n const recommendedIndex = points.findIndex((p) => p.recommended);\n const [cursor, setCursor] = useState(recommendedIndex >= 0 ? recommendedIndex : 0);\n\n useInput((input, key) => {\n if (key.upArrow) {\n setCursor((prev) => (prev > 0 ? prev - 1 : points.length - 1));\n } else if (key.downArrow) {\n setCursor((prev) => (prev < points.length - 1 ? prev + 1 : 0));\n } else if (key.return) {\n const selected = points[cursor];\n if (selected) {\n onSubmit(selected);\n }\n } else if (input === \"b\" || key.leftArrow) {\n onBack?.();\n } else if (input === \"q\" || key.escape) {\n onCancel?.();\n exit();\n }\n });\n\n return (\n <Box flexDirection=\"column\">\n <Box marginBottom={1}>\n <Text bold>Where should the devtools component be injected?</Text>\n </Box>\n\n {points.map((point, index) => {\n const isCursor = index === cursor;\n\n return (\n <Box key={point.id} paddingLeft={1}>\n {/* Cursor indicator */}\n <Text color={isCursor ? \"cyan\" : undefined}>\n {isCursor ? \"› \" : \" \"}\n </Text>\n\n {/* Radio button */}\n <Box width={2}>\n <Text color={isCursor ? \"cyan\" : undefined}>\n {isCursor ? \"◉\" : \"○\"}\n </Text>\n </Box>\n\n {/* Label */}\n <Box>\n <Text color={isCursor ? \"cyan\" : undefined}>\n {point.label}\n </Text>\n {point.hint && (\n <Text dimColor> ({point.hint})</Text>\n )}\n </Box>\n </Box>\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\">enter</Text> select{\" \"}\n <Text color=\"cyan\">b</Text> back{\" \"}\n <Text color=\"cyan\">q</Text> quit\n </Text>\n </Box>\n </Box>\n );\n}\n","/**\n * Test helpers for the install command\n *\n * These helpers provide backward compatibility with existing tests\n * by bridging between the old Prompter-based API and the new installer system.\n */\n\nimport type { RuleMetadata } from \"uilint-eslint\";\nimport type {\n InstallItem,\n NextAppInfo,\n ViteAppInfo,\n EslintPackageInfo,\n UserChoices,\n NextChoices,\n ViteChoices,\n EslintChoices,\n InstallOptions,\n ProjectState,\n} from \"./types.js\";\n\n// ============================================================================\n// Prompter Interface (for backward compatibility with tests)\n// ============================================================================\n\nexport interface Prompter {\n selectInstallItems(): Promise<InstallItem[]>;\n selectNextApp(apps: NextAppInfo[]): Promise<NextAppInfo>;\n selectViteApp(apps: ViteAppInfo[]): Promise<ViteAppInfo>;\n selectEslintPackages(packages: EslintPackageInfo[]): Promise<string[]>;\n selectEslintRules(): Promise<RuleMetadata[]>;\n selectEslintRuleSeverity(): Promise<\"warn\" | \"error\" | \"defaults\">;\n confirmCustomizeRuleOptions(): Promise<boolean>;\n configureRuleOptions(\n rule: RuleMetadata\n ): Promise<Record<string, unknown> | undefined>;\n}\n\n// ============================================================================\n// Choice Gathering Logic (for backward compatibility with tests)\n// ============================================================================\n\n/**\n * Gather all user choices using the prompter or CLI flags\n *\n * This function provides backward compatibility with existing tests.\n */\nexport async function gatherChoices(\n state: ProjectState,\n options: InstallOptions,\n prompter: Prompter\n): Promise<UserChoices> {\n // Determine items from flags or prompts\n let items: InstallItem[];\n\n const hasExplicitFlags =\n options.genstyleguide !== undefined ||\n options.skill !== undefined ||\n options.routes !== undefined ||\n options.react !== undefined;\n\n if (hasExplicitFlags || options.eslint) {\n items = [];\n if (options.genstyleguide) items.push(\"genstyleguide\");\n if (options.skill) items.push(\"skill\");\n if (options.routes || options.react) items.push(\"next\");\n if (options.eslint) items.push(\"eslint\");\n } else {\n items = await prompter.selectInstallItems();\n }\n\n // Next.js app selection\n let nextChoices: NextChoices | undefined;\n if (items.includes(\"next\")) {\n if (state.nextApps.length === 0) {\n throw new Error(\n \"Could not find a Next.js App Router app root (expected app/ or src/app/). Run this from your Next.js project root.\"\n );\n } else if (state.nextApps.length === 1) {\n nextChoices = {\n projectPath: state.nextApps[0].projectPath,\n detection: state.nextApps[0].detection,\n // In non-interactive mode, default to creating providers.tsx\n createProviders: hasExplicitFlags,\n };\n } else {\n const selected = await prompter.selectNextApp(state.nextApps);\n nextChoices = {\n projectPath: selected.projectPath,\n detection: selected.detection,\n // In non-interactive mode, default to creating providers.tsx\n createProviders: hasExplicitFlags,\n };\n }\n }\n\n // Vite app selection\n let viteChoices: ViteChoices | undefined;\n if (items.includes(\"vite\")) {\n if (state.viteApps.length === 0) {\n throw new Error(\n \"Could not find a Vite + React project (expected vite.config.* + react deps). Run this from your Vite project root.\"\n );\n } else if (state.viteApps.length === 1) {\n viteChoices = {\n projectPath: state.viteApps[0].projectPath,\n detection: state.viteApps[0].detection,\n };\n } else {\n const selected = await prompter.selectViteApp(state.viteApps);\n viteChoices = {\n projectPath: selected.projectPath,\n detection: selected.detection,\n };\n }\n }\n\n // ESLint choices\n let eslintChoices: EslintChoices | undefined;\n if (items.includes(\"eslint\")) {\n // Filter to packages with ESLint config\n const packagesWithEslint = state.packages.filter(\n (p) => p.eslintConfigPath !== null\n );\n\n if (packagesWithEslint.length === 0) {\n throw new Error(\n \"No packages with eslint.config.{ts,mjs,js,cjs} found. Create an ESLint config first.\"\n );\n }\n\n const packagePaths = await prompter.selectEslintPackages(\n packagesWithEslint\n );\n\n if (packagePaths.length > 0) {\n let selectedRules = await prompter.selectEslintRules();\n\n // Apply a global severity choice (default: warn)\n const severity = await prompter.selectEslintRuleSeverity();\n if (severity !== \"defaults\") {\n selectedRules = selectedRules.map((rule) => ({\n ...rule,\n defaultSeverity: severity,\n }));\n }\n\n // Ask if user wants to customize individual rule options\n const hasConfigurableRules = selectedRules.some(\n (r) => r.optionSchema && r.optionSchema.fields.length > 0\n );\n\n if (hasConfigurableRules) {\n const customizeOptions = await prompter.confirmCustomizeRuleOptions();\n\n if (customizeOptions) {\n selectedRules = await configureRuleOptions(selectedRules, prompter);\n }\n }\n\n eslintChoices = { packagePaths, selectedRules };\n }\n }\n\n return {\n items,\n next: nextChoices,\n vite: viteChoices,\n eslint: eslintChoices,\n };\n}\n\n/**\n * Configure options for individual rules based on their schemas\n */\nasync function configureRuleOptions(\n rules: RuleMetadata[],\n prompter: Prompter\n): Promise<RuleMetadata[]> {\n const configured: RuleMetadata[] = [];\n\n for (const rule of rules) {\n if (rule.optionSchema && rule.optionSchema.fields.length > 0) {\n const options = await prompter.configureRuleOptions(rule);\n if (options) {\n // Merge with existing defaultOptions structure\n const existingOptions =\n rule.defaultOptions && rule.defaultOptions.length > 0\n ? (rule.defaultOptions[0] as Record<string, unknown>)\n : ({} as Record<string, unknown>);\n configured.push({\n ...rule,\n defaultOptions: [{ ...existingOptions, ...options }],\n });\n } else {\n configured.push(rule);\n }\n } else {\n // No configuration needed for this rule\n configured.push(rule);\n }\n }\n\n return configured;\n}\n"],"mappings":"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","names":["useState","Box","Text","useApp","useInput","useState","Box","Text","useInput","useApp","jsx","jsxs","useState","Box","Text","useInput","useApp","useState","Box","Text","useInput","jsx","jsxs","Fragment","jsx","jsxs","Text","Box","useApp","useState","useInput","useState","Box","Text","useInput","useApp","jsx","jsxs","jsx","jsxs","Box","Text","useInput","useApp","useState","jsx","createPlan"]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
createPlan,
|
|
4
|
+
getMissingRules
|
|
5
|
+
} from "./chunk-2BNEL5IX.js";
|
|
6
|
+
import "./chunk-VSBVUS56.js";
|
|
7
|
+
import "./chunk-TKJ27W62.js";
|
|
8
|
+
import "./chunk-JPE27ROY.js";
|
|
9
|
+
export {
|
|
10
|
+
createPlan,
|
|
11
|
+
getMissingRules
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=plan-RACOU2VV.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "uilint",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.72",
|
|
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.
|
|
52
|
-
"uilint-
|
|
53
|
-
"uilint-
|
|
51
|
+
"uilint-duplicates": "0.2.72",
|
|
52
|
+
"uilint-eslint": "0.2.72",
|
|
53
|
+
"uilint-core": "0.2.72"
|
|
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.
|
|
69
|
+
"uilint-react": "0.2.72"
|
|
70
70
|
},
|
|
71
71
|
"keywords": [
|
|
72
72
|
"cli",
|