ux-toolkit 0.4.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli.ts","../src/installer.ts","../src/paths.ts","../src/manifest.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { parseArgs } from 'node:util';\nimport { install } from './installer.js';\nimport { SKILLS, AGENTS, COMMANDS } from './manifest.js';\n\nconst HELP = `\nux-toolkit - AI-powered UI/UX review toolkit\n\nUSAGE:\n npx ux-toolkit <command> [options]\n\nCOMMANDS:\n install Install skills, agents, and commands\n list List available components\n\nOPTIONS:\n --global, -g Install to global config (~/.config/opencode)\n --project, -p Install to project config (.opencode/)\n --force, -f Overwrite existing files\n --verbose, -v Verbose output\n --help, -h Show this help\n\nEXAMPLES:\n npx ux-toolkit install --global\n npx ux-toolkit install --project --force\n npx ux-toolkit list\n`;\n\nasync function main() {\n const { values, positionals } = parseArgs({\n allowPositionals: true,\n options: {\n global: { type: 'boolean', short: 'g', default: false },\n project: { type: 'boolean', short: 'p', default: false },\n force: { type: 'boolean', short: 'f', default: false },\n verbose: { type: 'boolean', short: 'v', default: false },\n help: { type: 'boolean', short: 'h', default: false },\n },\n });\n\n if (values.help || positionals.length === 0) {\n console.log(HELP);\n process.exit(0);\n }\n\n const command = positionals[0];\n\n switch (command) {\n case 'install': {\n const isGlobal = values.global || !values.project;\n\n console.log(`\\nInstalling UX Toolkit ${isGlobal ? 'globally' : 'to project'}...\\n`);\n\n const result = await install({\n global: isGlobal,\n force: values.force,\n verbose: values.verbose,\n });\n\n if (result.installed.length > 0) {\n console.log(`Installed ${result.installed.length} components:`);\n result.installed.forEach((item) => console.log(` + ${item}`));\n }\n\n if (result.skipped.length > 0) {\n console.log(`\\nSkipped ${result.skipped.length} (already exist, use --force to overwrite):`);\n result.skipped.forEach((item) => console.log(` - ${item}`));\n }\n\n if (result.errors.length > 0) {\n console.error(`\\nErrors:`);\n result.errors.forEach((err) => console.error(` ! ${err}`));\n process.exit(1);\n }\n\n console.log('\\nDone!');\n break;\n }\n\n case 'list': {\n console.log('\\nSkills:');\n SKILLS.forEach((s) => console.log(` ${s.name.padEnd(25)} ${s.description}`));\n\n console.log('\\nAgents:');\n AGENTS.forEach((a) => console.log(` ${a.name.padEnd(25)} ${a.description}`));\n\n console.log('\\nCommands:');\n COMMANDS.forEach((c) => console.log(` /${c.name.padEnd(24)} ${c.description}`));\n break;\n }\n\n default:\n console.error(`Unknown command: ${command}`);\n console.log(HELP);\n process.exit(1);\n }\n}\n\nmain().catch((err) => {\n console.error('Error:', err);\n process.exit(1);\n});\n","import { existsSync, mkdirSync, cpSync, readdirSync } from 'node:fs';\nimport { join, dirname } from 'node:path';\nimport { getPackageRoot, getDestinationPaths } from './paths.js';\n\nexport interface InstallOptions {\n /** Install globally to ~/.config/opencode */\n global?: boolean;\n /** Project root for local installation */\n projectRoot?: string;\n /** Only install specific categories */\n categories?: ('skills' | 'agents' | 'commands')[];\n /** Overwrite existing files */\n force?: boolean;\n /** Verbose output */\n verbose?: boolean;\n}\n\nexport interface InstallResult {\n installed: string[];\n skipped: string[];\n errors: string[];\n}\n\nexport async function install(options: InstallOptions = {}): Promise<InstallResult> {\n const {\n global: isGlobal = false,\n projectRoot = process.cwd(),\n categories = ['skills', 'agents', 'commands'],\n force = false,\n verbose = false,\n } = options;\n\n const result: InstallResult = {\n installed: [],\n skipped: [],\n errors: [],\n };\n\n const packageRoot = getPackageRoot();\n const destinations = getDestinationPaths(isGlobal, projectRoot);\n\n const log = (msg: string) => {\n if (verbose) console.log(msg);\n };\n\n if (categories.includes('skills')) {\n const skillsDir = join(packageRoot, 'skills');\n if (existsSync(skillsDir)) {\n const skills = readdirSync(skillsDir, { withFileTypes: true })\n .filter((d) => d.isDirectory())\n .map((d) => d.name);\n\n for (const skill of skills) {\n const src = join(skillsDir, skill);\n const dest = join(destinations.skills, skill);\n\n try {\n if (existsSync(dest) && !force) {\n result.skipped.push(`skill:${skill}`);\n log(`Skipped skill/${skill} (already exists)`);\n continue;\n }\n\n mkdirSync(dirname(dest), { recursive: true });\n cpSync(src, dest, { recursive: true });\n result.installed.push(`skill:${skill}`);\n log(`Installed skill/${skill}`);\n } catch (err) {\n result.errors.push(`skill:${skill}: ${err}`);\n }\n }\n }\n }\n\n if (categories.includes('agents')) {\n const agentsDir = join(packageRoot, 'agents');\n if (existsSync(agentsDir)) {\n const agents = readdirSync(agentsDir)\n .filter((f) => f.endsWith('.md'))\n .map((f) => f.replace('.md', ''));\n\n for (const agent of agents) {\n const src = join(agentsDir, `${agent}.md`);\n const dest = join(destinations.agents, `${agent}.md`);\n\n try {\n if (existsSync(dest) && !force) {\n result.skipped.push(`agent:${agent}`);\n log(`Skipped agents/${agent}.md (already exists)`);\n continue;\n }\n\n mkdirSync(dirname(dest), { recursive: true });\n cpSync(src, dest);\n result.installed.push(`agent:${agent}`);\n log(`Installed agents/${agent}.md`);\n } catch (err) {\n result.errors.push(`agent:${agent}: ${err}`);\n }\n }\n }\n }\n\n if (categories.includes('commands')) {\n const commandsDir = join(packageRoot, 'commands');\n if (existsSync(commandsDir)) {\n const commands = readdirSync(commandsDir)\n .filter((f) => f.endsWith('.md'))\n .map((f) => f.replace('.md', ''));\n\n for (const command of commands) {\n const src = join(commandsDir, `${command}.md`);\n const dest = join(destinations.commands, `${command}.md`);\n\n try {\n if (existsSync(dest) && !force) {\n result.skipped.push(`command:${command}`);\n log(`Skipped commands/${command}.md (already exists)`);\n continue;\n }\n\n mkdirSync(dirname(dest), { recursive: true });\n cpSync(src, dest);\n result.installed.push(`command:${command}`);\n log(`Installed commands/${command}.md`);\n } catch (err) {\n result.errors.push(`command:${command}: ${err}`);\n }\n }\n }\n }\n\n return result;\n}\n","import { homedir } from 'node:os';\nimport { join, dirname } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\n\nexport function getPackageRoot(): string {\n return join(__dirname, '..');\n}\n\nexport function getSkillPath(skillName: string): string {\n return join(getPackageRoot(), 'skills', skillName, 'SKILL.md');\n}\n\nexport function getAgentPath(agentName: string): string {\n return join(getPackageRoot(), 'agents', `${agentName}.md`);\n}\n\nexport function getCommandPath(commandName: string): string {\n return join(getPackageRoot(), 'commands', `${commandName}.md`);\n}\n\nexport function getGlobalConfigDir(): string {\n return join(homedir(), '.config', 'opencode');\n}\n\nexport function getProjectConfigDir(projectRoot: string = process.cwd()): string {\n return join(projectRoot, '.opencode');\n}\n\nexport function getDestinationPaths(global: boolean, projectRoot?: string) {\n const baseDir = global ? getGlobalConfigDir() : getProjectConfigDir(projectRoot);\n\n return {\n skills: join(baseDir, 'skills'),\n agents: join(baseDir, 'agents'),\n commands: join(baseDir, 'commands'),\n };\n}\n","export const SKILLS = [\n // Core UX Skills\n {\n name: 'ux-heuristics',\n description: \"Nielsen's 10 usability heuristics with evaluation methodology\",\n category: 'core',\n },\n {\n name: 'wcag-accessibility',\n description: 'WCAG 2.2 compliance checklist and ARIA patterns',\n category: 'core',\n },\n {\n name: 'visual-design-system',\n description: 'Layout, typography, color theory, spacing systems',\n category: 'core',\n },\n {\n name: 'interaction-patterns',\n description: 'Micro-interactions, loading states, feedback mechanisms',\n category: 'core',\n },\n {\n name: 'mobile-responsive-ux',\n description: 'Touch targets, gestures, responsive patterns',\n category: 'core',\n },\n\n // Page Structure Skills\n {\n name: 'page-structure-patterns',\n description: 'Base requirements for page states, layout, and structure',\n category: 'structure',\n },\n {\n name: 'list-page-patterns',\n description: 'Filters, sorting, pagination, and grid/table displays',\n category: 'structure',\n },\n {\n name: 'detail-page-patterns',\n description: 'Headers, tabs, multi-column layouts, related data',\n category: 'structure',\n },\n {\n name: 'navigation-patterns',\n description: 'Sidebar, mobile drawer, breadcrumbs, app shell',\n category: 'structure',\n },\n\n // Component Skills\n {\n name: 'modal-patterns',\n description: 'Confirmation, edit, selector, and wizard modals',\n category: 'component',\n },\n {\n name: 'form-patterns',\n description: 'Validation, field layouts, multi-step wizards',\n category: 'component',\n },\n {\n name: 'data-density-patterns',\n description: 'Dense layouts, z-index, overflow, readability',\n category: 'component',\n },\n {\n name: 'toast-notification-patterns',\n description: 'Toast notifications, alerts, and system feedback',\n category: 'component',\n },\n\n // Interaction Skills\n {\n name: 'keyboard-shortcuts-patterns',\n description: 'Keyboard shortcuts, command palette (Cmd+K), power user navigation',\n category: 'interaction',\n },\n {\n name: 'drag-drop-patterns',\n description: 'Drag and drop interactions, visual feedback, drop zones',\n category: 'interaction',\n },\n\n // Editor/Workspace Skills\n {\n name: 'editor-workspace-patterns',\n description: 'Multi-tab editors, dirty state, real-time validation, workspaces',\n category: 'editor',\n },\n {\n name: 'comparison-patterns',\n description: 'Side-by-side comparison, diff highlighting, multi-item comparison',\n category: 'editor',\n },\n {\n name: 'split-panel-patterns',\n description: 'Resizable panels, dividers, collapsible sidebars, synchronized views',\n category: 'editor',\n },\n\n // Game/Interactive Skills\n {\n name: 'canvas-grid-patterns',\n description: 'Hex grids, tactical maps, pan/zoom, tokens, coordinate systems',\n category: 'game',\n },\n {\n name: 'turn-based-ui-patterns',\n description: 'Phase banners, turn indicators, action bars, game state feedback',\n category: 'game',\n },\n {\n name: 'playback-replay-patterns',\n description: 'VCR controls, timeline scrubbing, speed selection, replay viewers',\n category: 'game',\n },\n {\n name: 'status-visualization-patterns',\n description: 'Health bars, progress meters, heat gauges, pip displays, stat blocks',\n category: 'game',\n },\n\n // Data Display Skills\n {\n name: 'info-card-patterns',\n description: 'Compact/standard/expanded cards, stat blocks, badges, entity displays',\n category: 'data',\n },\n {\n name: 'event-timeline-patterns',\n description: 'Activity feeds, audit logs, chronological events, filtering, infinite scroll',\n category: 'data',\n },\n\n // Framework Skills\n {\n name: 'react-ux-patterns',\n description: 'React/Next.js specific UX patterns',\n category: 'framework',\n },\n] as const;\n\nexport const AGENTS = [\n // General Purpose Agents\n {\n name: 'ux-auditor',\n description: 'Full UX audit against heuristics (read-only)',\n mode: 'analysis',\n },\n {\n name: 'ux-engineer',\n description: 'UX analysis + implements fixes',\n mode: 'fix',\n },\n {\n name: 'accessibility-auditor',\n description: 'WCAG 2.2 compliance review (read-only)',\n mode: 'analysis',\n },\n {\n name: 'accessibility-engineer',\n description: 'Accessibility fixes',\n mode: 'fix',\n },\n {\n name: 'visual-reviewer',\n description: 'Design system consistency check',\n mode: 'analysis',\n },\n {\n name: 'interaction-reviewer',\n description: 'Micro-interactions and feedback review',\n mode: 'analysis',\n },\n\n // Specialized Page Reviewers\n {\n name: 'list-page-reviewer',\n description: 'List/browse page UX review',\n mode: 'analysis',\n },\n {\n name: 'detail-page-reviewer',\n description: 'Detail/entity page UX review',\n mode: 'analysis',\n },\n {\n name: 'navigation-reviewer',\n description: 'Navigation and routing review',\n mode: 'analysis',\n },\n {\n name: 'form-reviewer',\n description: 'Form and input UX review',\n mode: 'analysis',\n },\n {\n name: 'density-reviewer',\n description: 'Data density and layout review',\n mode: 'analysis',\n },\n\n // Advanced Specialized Reviewers\n {\n name: 'editor-reviewer',\n description: 'Editor/workspace UI with multi-tab, drag-drop, validation',\n mode: 'analysis',\n },\n {\n name: 'comparison-reviewer',\n description: 'Side-by-side comparison and diff UIs',\n mode: 'analysis',\n },\n {\n name: 'settings-reviewer',\n description: 'Settings, preferences, and configuration pages',\n mode: 'analysis',\n },\n\n // Game & Interactive Reviewers\n {\n name: 'game-ui-reviewer',\n description: 'Tactical maps, turn-based combat, status displays, hex grids',\n mode: 'analysis',\n },\n {\n name: 'replay-reviewer',\n description: 'Playback controls, timeline scrubbing, event feeds',\n mode: 'analysis',\n },\n {\n name: 'card-reviewer',\n description: 'Info cards, stat blocks, entity displays with density levels',\n mode: 'analysis',\n },\n {\n name: 'panel-reviewer',\n description: 'Resizable panels, collapsible sidebars, split views',\n mode: 'analysis',\n },\n] as const;\n\nexport const COMMANDS = [\n {\n name: 'ux-audit',\n description: 'Comprehensive UX audit',\n },\n {\n name: 'a11y-check',\n description: 'Quick accessibility scan',\n },\n {\n name: 'design-review',\n description: 'Visual consistency check',\n },\n {\n name: 'screenshot-review',\n description: 'Visual review from screenshot',\n },\n] as const;\n\nexport type SkillName = (typeof SKILLS)[number]['name'];\nexport type AgentName = (typeof AGENTS)[number]['name'];\nexport type CommandName = (typeof COMMANDS)[number]['name'];\n"],"mappings":"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","names":["join","dirname","join","dirname"]}
1
+ {"version":3,"sources":["../src/cli.ts","../src/installer.ts","../src/paths.ts","../src/manifest.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { parseArgs } from 'node:util';\nimport { createInterface } from 'node:readline';\nimport { install, uninstall, getStatus } from './installer.js';\nimport { SKILLS, AGENTS, COMMANDS } from './manifest.js';\nimport { getPlatformInfo, isOpenCodeInstalled, isClaudeInstalled, type InstallTarget } from './paths.js';\n\n// Prompting utility\nasync function prompt(question: string): Promise<string> {\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n \n return new Promise((resolve) => {\n rl.question(question, (answer) => {\n rl.close();\n resolve(answer.trim().toLowerCase());\n });\n });\n}\n\nasync function promptYesNo(question: string, defaultYes = true): Promise<boolean> {\n const suffix = defaultYes ? '[Y/n]' : '[y/N]';\n const answer = await prompt(`${question} ${suffix} `);\n \n if (answer === '') return defaultYes;\n return answer === 'y' || answer === 'yes';\n}\n\nconst HELP = `\nux-toolkit - AI-powered UI/UX review toolkit\n\nUSAGE:\n npx ux-toolkit <command> [options]\n\nCOMMANDS:\n install Install skills, agents, and commands\n uninstall Remove installed skills, agents, and commands\n upgrade Reinstall all components (alias for install --force)\n status Show what's installed vs available\n doctor Diagnose installation issues\n list List available components\n info Show platform and config information\n\nTARGET (choose one):\n --opencode Target OpenCode (default) - ~/.config/opencode\n --claude Target Claude Code - ~/.claude\n\nSCOPE:\n --global, -g Install to global config (default)\n --project, -p Install to project config (.opencode/ or .claude/)\n\nOPTIONS:\n --all, -a Install to all detected platforms (no prompt)\n --force, -f Overwrite existing files\n --verbose, -v Verbose output\n --only Install specific categories (skills,agents,commands)\n --skill Install specific skill(s) by name (can repeat)\n --agent Install specific agent(s) by name (can repeat)\n --command Install specific command(s) by name (can repeat)\n --help, -h Show this help\n\nENVIRONMENT:\n UX_TOOLKIT_CONFIG_DIR Override config directory\n OPENCODE_CONFIG_DIR OpenCode config directory override\n CLAUDE_CONFIG_DIR Claude Code config directory override\n XDG_CONFIG_HOME Linux XDG config home (respected)\n\nEXAMPLES:\n # OpenCode (default)\n npx ux-toolkit install --global\n npx ux-toolkit install --opencode --global\n \n # Claude Code\n npx ux-toolkit install --claude --global\n npx ux-toolkit uninstall --claude --global\n \n # Both platforms\n npx ux-toolkit install --opencode --global && npx ux-toolkit install --claude --global\n \n # Project-level\n npx ux-toolkit install --project\n npx ux-toolkit install --claude --project\n \n # Selective\n npx ux-toolkit install --global --only=skills,agents\n \n # Other commands\n npx ux-toolkit info\n npx ux-toolkit list\n`;\n\ntype Category = 'skills' | 'agents' | 'commands';\n\nfunction parseCategories(only: string | undefined): Category[] | undefined {\n if (!only) return undefined;\n const valid: Category[] = ['skills', 'agents', 'commands'];\n const parsed = only.split(',').map((s) => s.trim().toLowerCase()) as Category[];\n const filtered = parsed.filter((c) => valid.includes(c));\n return filtered.length > 0 ? filtered : undefined;\n}\n\nasync function main() {\n const { values, positionals } = parseArgs({\n allowPositionals: true,\n options: {\n global: { type: 'boolean', short: 'g', default: false },\n project: { type: 'boolean', short: 'p', default: false },\n force: { type: 'boolean', short: 'f', default: false },\n verbose: { type: 'boolean', short: 'v', default: false },\n help: { type: 'boolean', short: 'h', default: false },\n only: { type: 'string' },\n opencode: { type: 'boolean', default: false },\n claude: { type: 'boolean', default: false },\n all: { type: 'boolean', short: 'a', default: false },\n skill: { type: 'string', multiple: true },\n agent: { type: 'string', multiple: true },\n command: { type: 'string', multiple: true },\n },\n });\n\n if (values.help || positionals.length === 0) {\n console.log(HELP);\n process.exit(0);\n }\n\n const command = positionals[0];\n const isGlobal = values.global || !values.project;\n const categories = parseCategories(values.only);\n \n // Helper to run install for a specific target\n async function runInstall(target: InstallTarget, showHeader = true): Promise<boolean> {\n const targetName = target === 'claude' ? 'Claude Code' : 'OpenCode';\n \n if (showHeader) {\n console.log(`\\nInstalling UX Toolkit to ${targetName} ${isGlobal ? 'globally' : 'in project'}...\\n`);\n }\n\n const result = await install({\n global: isGlobal,\n target,\n force: values.force,\n verbose: values.verbose,\n categories,\n skills: values.skill,\n agents: values.agent,\n commands: values.command,\n });\n\n if (result.installed.length > 0) {\n console.log(`Installed ${result.installed.length} components:`);\n result.installed.forEach((item) => console.log(` + ${item}`));\n }\n\n if (result.skipped.length > 0) {\n console.log(`\\nSkipped ${result.skipped.length} (already exist, use --force to overwrite):`);\n result.skipped.forEach((item) => console.log(` - ${item}`));\n }\n\n if (result.errors.length > 0) {\n console.error(`\\nErrors:`);\n result.errors.forEach((err) => console.error(` ! ${err}`));\n return false;\n }\n\n return true;\n }\n\n switch (command) {\n case 'install': {\n const opencodeInstalled = isOpenCodeInstalled();\n const claudeInstalled = isClaudeInstalled();\n const explicitTarget = values.opencode || values.claude;\n \n // Determine targets to install to\n let targets: InstallTarget[] = [];\n \n if (values.all) {\n // --all flag: install to all detected platforms\n if (opencodeInstalled) targets.push('opencode');\n if (claudeInstalled) targets.push('claude');\n if (targets.length === 0) {\n console.warn('\\n⚠️ No platforms detected. Installing to OpenCode by default.\\n');\n targets = ['opencode'];\n }\n } else if (explicitTarget) {\n // Explicit target specified\n targets = [values.claude ? 'claude' : 'opencode'];\n } else if (isGlobal && opencodeInstalled && claudeInstalled) {\n // Both platforms detected, prompt user\n console.log('\\n🔍 Detected both OpenCode and Claude Code installations.\\n');\n const installBoth = await promptYesNo('Install to both platforms?', true);\n \n if (installBoth) {\n targets = ['opencode', 'claude'];\n } else {\n const choice = await prompt('Which platform? (opencode/claude) [opencode]: ');\n targets = [choice === 'claude' ? 'claude' : 'opencode'];\n }\n } else if (isGlobal && claudeInstalled && !opencodeInstalled) {\n // Only Claude detected\n console.log('\\n🔍 Detected Claude Code (OpenCode not found).\\n');\n targets = ['claude'];\n } else {\n // Default to opencode\n targets = ['opencode'];\n }\n \n // Run installation for each target\n let hasErrors = false;\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n if (i > 0) console.log(''); // Separator between targets\n const success = await runInstall(target);\n if (!success) hasErrors = true;\n }\n \n console.log('\\nDone!');\n if (hasErrors) process.exit(1);\n break;\n }\n\n case 'uninstall': {\n const target: InstallTarget = values.claude ? 'claude' : 'opencode';\n const targetName = target === 'claude' ? 'Claude Code' : 'OpenCode';\n console.log(`\\nUninstalling UX Toolkit from ${targetName} ${isGlobal ? 'globally' : 'in project'}...\\n`);\n\n const result = await uninstall({\n global: isGlobal,\n target,\n verbose: values.verbose,\n categories,\n });\n\n if (result.removed.length > 0) {\n console.log(`Removed ${result.removed.length} components:`);\n result.removed.forEach((item) => console.log(` - ${item}`));\n }\n\n if (result.notFound.length > 0 && values.verbose) {\n console.log(`\\nNot found (${result.notFound.length}):`);\n result.notFound.forEach((item) => console.log(` ? ${item}`));\n }\n\n if (result.errors.length > 0) {\n console.error(`\\nErrors:`);\n result.errors.forEach((err) => console.error(` ! ${err}`));\n process.exit(1);\n }\n\n console.log('\\nDone!');\n break;\n }\n\n case 'upgrade': {\n const target: InstallTarget = values.claude ? 'claude' : 'opencode';\n const targetName = target === 'claude' ? 'Claude Code' : 'OpenCode';\n console.log(`\\nUpgrading UX Toolkit in ${targetName} ${isGlobal ? 'globally' : 'in project'}...\\n`);\n\n const result = await install({\n global: isGlobal,\n target,\n force: true, // Always force for upgrade\n verbose: values.verbose,\n categories,\n });\n\n if (result.installed.length > 0) {\n console.log(`Upgraded ${result.installed.length} components:`);\n result.installed.forEach((item) => console.log(` ↑ ${item}`));\n }\n\n if (result.errors.length > 0) {\n console.error(`\\nErrors:`);\n result.errors.forEach((err) => console.error(` ! ${err}`));\n process.exit(1);\n }\n\n console.log('\\nDone!');\n break;\n }\n\n case 'status': {\n const status = await getStatus({ global: isGlobal });\n \n console.log('\\nUX Toolkit - Installation Status\\n');\n \n // Helper to format status line\n const formatStatus = (installed: number, total: number): string => {\n if (installed === 0) return `✗ 0/${total}`;\n if (installed === total) return `✓ ${installed}/${total}`;\n return `◐ ${installed}/${total}`;\n };\n \n // Helper to get missing components\n const getMissing = (components: { name: string; installed: boolean }[]): string[] => {\n return components.filter(c => !c.installed).map(c => c.name);\n };\n \n // OpenCode status\n console.log(' OpenCode:');\n if (!status.opencode.available) {\n console.log(' Not installed (no config directory found)');\n } else {\n console.log(` Skills: ${formatStatus(status.opencode.skills.installed, status.opencode.skills.total)}`);\n console.log(` Agents: ${formatStatus(status.opencode.agents.installed, status.opencode.agents.total)}`);\n console.log(` Commands: ${formatStatus(status.opencode.commands.installed, status.opencode.commands.total)}`);\n \n if (values.verbose) {\n const missingSkills = getMissing(status.opencode.skills.components);\n const missingAgents = getMissing(status.opencode.agents.components);\n const missingCommands = getMissing(status.opencode.commands.components);\n \n if (missingSkills.length > 0) {\n console.log(` Missing skills: ${missingSkills.join(', ')}`);\n }\n if (missingAgents.length > 0) {\n console.log(` Missing agents: ${missingAgents.join(', ')}`);\n }\n if (missingCommands.length > 0) {\n console.log(` Missing commands: ${missingCommands.join(', ')}`);\n }\n }\n }\n \n // Claude Code status\n console.log('\\n Claude Code:');\n if (!status.claude.available) {\n console.log(' Not installed (no config directory found)');\n } else {\n console.log(` Skills: ${formatStatus(status.claude.skills.installed, status.claude.skills.total)}`);\n console.log(` Agents: ${formatStatus(status.claude.agents.installed, status.claude.agents.total)}`);\n console.log(` Commands: ${formatStatus(status.claude.commands.installed, status.claude.commands.total)}`);\n \n if (values.verbose) {\n const missingSkills = getMissing(status.claude.skills.components);\n const missingAgents = getMissing(status.claude.agents.components);\n const missingCommands = getMissing(status.claude.commands.components);\n \n if (missingSkills.length > 0) {\n console.log(` Missing skills: ${missingSkills.join(', ')}`);\n }\n if (missingAgents.length > 0) {\n console.log(` Missing agents: ${missingAgents.join(', ')}`);\n }\n if (missingCommands.length > 0) {\n console.log(` Missing commands: ${missingCommands.join(', ')}`);\n }\n }\n }\n \n // Summary\n const totalOpencode = status.opencode.skills.installed + status.opencode.agents.installed + status.opencode.commands.installed;\n const totalClaude = status.claude.skills.installed + status.claude.agents.installed + status.claude.commands.installed;\n const totalAvailable = SKILLS.length + AGENTS.length + COMMANDS.length;\n \n console.log('\\n Summary:');\n if (status.opencode.available && totalOpencode === totalAvailable) {\n console.log(' OpenCode: ✓ Fully installed');\n } else if (status.opencode.available && totalOpencode > 0) {\n console.log(` OpenCode: ◐ Partially installed (${totalOpencode}/${totalAvailable})`);\n } else if (status.opencode.available) {\n console.log(' OpenCode: ✗ Not installed');\n }\n \n if (status.claude.available && totalClaude === totalAvailable) {\n console.log(' Claude Code: ✓ Fully installed');\n } else if (status.claude.available && totalClaude > 0) {\n console.log(` Claude Code: ◐ Partially installed (${totalClaude}/${totalAvailable})`);\n } else if (status.claude.available) {\n console.log(' Claude Code: ✗ Not installed');\n }\n \n break;\n }\n\n case 'doctor': {\n console.log('\\nUX Toolkit - Diagnostics\\n');\n \n const issues: string[] = [];\n const warnings: string[] = [];\n const ok: string[] = [];\n \n // Check Node.js version\n const nodeVersion = process.version;\n const majorVersion = parseInt(nodeVersion.slice(1).split('.')[0], 10);\n if (majorVersion < 18) {\n issues.push(`Node.js ${nodeVersion} is below minimum (v18+)`);\n } else {\n ok.push(`Node.js ${nodeVersion}`);\n }\n \n // Check platform detection\n const platformInfo = getPlatformInfo();\n \n // OpenCode checks\n if (platformInfo.opencode.exists) {\n ok.push(`OpenCode detected at ${platformInfo.opencode.configDir}`);\n \n // Check if skills/agents/commands directories exist\n const { existsSync } = await import('node:fs');\n const { join } = await import('node:path');\n \n const skillsDir = join(platformInfo.opencode.configDir, 'skills');\n const agentsDir = join(platformInfo.opencode.configDir, 'agents');\n const commandsDir = join(platformInfo.opencode.configDir, 'commands');\n \n if (!existsSync(skillsDir)) {\n warnings.push('OpenCode skills directory missing');\n }\n if (!existsSync(agentsDir)) {\n warnings.push('OpenCode agents directory missing');\n }\n if (!existsSync(commandsDir)) {\n warnings.push('OpenCode commands directory missing');\n }\n } else {\n warnings.push('OpenCode not detected (config directory not found)');\n }\n \n // Claude Code checks\n if (platformInfo.claude.exists) {\n ok.push(`Claude Code detected at ${platformInfo.claude.configDir}`);\n \n const { existsSync } = await import('node:fs');\n const { join } = await import('node:path');\n \n const skillsDir = join(platformInfo.claude.configDir, 'skills');\n const agentsDir = join(platformInfo.claude.configDir, 'agents');\n const commandsDir = join(platformInfo.claude.configDir, 'commands');\n \n if (!existsSync(skillsDir)) {\n warnings.push('Claude Code skills directory missing');\n }\n if (!existsSync(agentsDir)) {\n warnings.push('Claude Code agents directory missing');\n }\n if (!existsSync(commandsDir)) {\n warnings.push('Claude Code commands directory missing');\n }\n } else {\n warnings.push('Claude Code not detected (config directory not found)');\n }\n \n // Check installation status\n const status = await getStatus({ global: true });\n \n const opencodeTotal = status.opencode.skills.installed + status.opencode.agents.installed + status.opencode.commands.installed;\n const claudeTotal = status.claude.skills.installed + status.claude.agents.installed + status.claude.commands.installed;\n const totalAvailable = SKILLS.length + AGENTS.length + COMMANDS.length;\n \n if (status.opencode.available) {\n if (opencodeTotal === totalAvailable) {\n ok.push('OpenCode: All components installed');\n } else if (opencodeTotal > 0) {\n warnings.push(`OpenCode: Partial installation (${opencodeTotal}/${totalAvailable})`);\n } else {\n warnings.push('OpenCode: No components installed');\n }\n }\n \n if (status.claude.available) {\n if (claudeTotal === totalAvailable) {\n ok.push('Claude Code: All components installed');\n } else if (claudeTotal > 0) {\n warnings.push(`Claude Code: Partial installation (${claudeTotal}/${totalAvailable})`);\n } else {\n warnings.push('Claude Code: No components installed');\n }\n }\n \n // Print results\n if (ok.length > 0) {\n console.log(' ✓ OK:');\n ok.forEach(item => console.log(` • ${item}`));\n }\n \n if (warnings.length > 0) {\n console.log('\\n ⚠ Warnings:');\n warnings.forEach(item => console.log(` • ${item}`));\n }\n \n if (issues.length > 0) {\n console.log('\\n ✗ Issues:');\n issues.forEach(item => console.log(` • ${item}`));\n }\n \n // Summary\n console.log('\\n Summary:');\n if (issues.length === 0 && warnings.length === 0) {\n console.log(' Everything looks good!');\n } else if (issues.length === 0) {\n console.log(` ${warnings.length} warning(s), no critical issues`);\n } else {\n console.log(` ${issues.length} issue(s), ${warnings.length} warning(s)`);\n }\n \n // Suggestions\n if (warnings.length > 0 || issues.length > 0) {\n console.log('\\n Suggestions:');\n if (!platformInfo.opencode.exists && !platformInfo.claude.exists) {\n console.log(' • Install OpenCode or Claude Code first');\n }\n if (opencodeTotal < totalAvailable && status.opencode.available) {\n console.log(' • Run: npx ux-toolkit install --opencode --global');\n }\n if (claudeTotal < totalAvailable && status.claude.available) {\n console.log(' • Run: npx ux-toolkit install --claude --global');\n }\n }\n \n break;\n }\n\n case 'info': {\n const platformInfo = getPlatformInfo();\n \n console.log('\\nUX Toolkit - Platform Information\\n');\n console.log(` Platform: ${platformInfo.platform}`);\n console.log(` Node Version: ${process.version}`);\n \n console.log('\\n OpenCode:');\n console.log(` Config Dir: ${platformInfo.opencode.configDir}`);\n console.log(` Installed: ${platformInfo.opencode.exists ? 'Yes' : 'No'}`);\n \n console.log('\\n Claude Code:');\n console.log(` Config Dir: ${platformInfo.claude.configDir}`);\n console.log(` Installed: ${platformInfo.claude.exists ? 'Yes' : 'No'}`);\n \n if (process.env.UX_TOOLKIT_CONFIG_DIR || process.env.OPENCODE_CONFIG_DIR || \n process.env.CLAUDE_CONFIG_DIR || process.env.XDG_CONFIG_HOME) {\n console.log('\\n Environment Overrides:');\n if (process.env.UX_TOOLKIT_CONFIG_DIR) {\n console.log(` UX_TOOLKIT_CONFIG_DIR: ${process.env.UX_TOOLKIT_CONFIG_DIR}`);\n }\n if (process.env.OPENCODE_CONFIG_DIR) {\n console.log(` OPENCODE_CONFIG_DIR: ${process.env.OPENCODE_CONFIG_DIR}`);\n }\n if (process.env.CLAUDE_CONFIG_DIR) {\n console.log(` CLAUDE_CONFIG_DIR: ${process.env.CLAUDE_CONFIG_DIR}`);\n }\n if (process.env.XDG_CONFIG_HOME) {\n console.log(` XDG_CONFIG_HOME: ${process.env.XDG_CONFIG_HOME}`);\n }\n }\n \n console.log(`\\n Components:`);\n console.log(` Skills: ${SKILLS.length}`);\n console.log(` Agents: ${AGENTS.length}`);\n console.log(` Commands: ${COMMANDS.length}`);\n break;\n }\n\n case 'list': {\n console.log('\\nSkills:');\n SKILLS.forEach((s) => console.log(` ${s.name.padEnd(25)} ${s.description}`));\n\n console.log('\\nAgents:');\n AGENTS.forEach((a) => console.log(` ${a.name.padEnd(25)} ${a.description}`));\n\n console.log('\\nCommands:');\n COMMANDS.forEach((c) => console.log(` /${c.name.padEnd(24)} ${c.description}`));\n break;\n }\n\n default:\n console.error(`Unknown command: ${command}`);\n console.log(HELP);\n process.exit(1);\n }\n}\n\nmain().catch((err) => {\n console.error('Error:', err);\n process.exit(1);\n});\n","import { existsSync, mkdirSync, cpSync, readdirSync, rmSync, statSync } from 'node:fs';\nimport { join, dirname } from 'node:path';\nimport { getPackageRoot, getDestinationPaths, isOpenCodeInstalled, isClaudeInstalled, type InstallTarget } from './paths.js';\nimport { SKILLS, AGENTS, COMMANDS } from './manifest.js';\n\nexport interface InstallOptions {\n /** Install globally to config directory */\n global?: boolean;\n /** Project root for local installation */\n projectRoot?: string;\n /** Target platform: 'opencode' or 'claude' */\n target?: InstallTarget;\n /** Only install specific categories */\n categories?: ('skills' | 'agents' | 'commands')[];\n /** Specific skills to install (by name) */\n skills?: string[];\n /** Specific agents to install (by name) */\n agents?: string[];\n /** Specific commands to install (by name) */\n commands?: string[];\n /** Overwrite existing files */\n force?: boolean;\n /** Verbose output */\n verbose?: boolean;\n}\n\nexport interface InstallResult {\n installed: string[];\n skipped: string[];\n errors: string[];\n}\n\nexport async function install(options: InstallOptions = {}): Promise<InstallResult> {\n const {\n global: isGlobal = false,\n projectRoot = process.cwd(),\n target = 'opencode',\n categories = ['skills', 'agents', 'commands'],\n skills: specificSkills,\n agents: specificAgents,\n commands: specificCommands,\n force = false,\n verbose = false,\n } = options;\n \n // If specific components are requested, filter to only those categories\n const hasSpecificComponents = specificSkills?.length || specificAgents?.length || specificCommands?.length;\n const effectiveCategories = hasSpecificComponents \n ? categories.filter(cat => {\n if (cat === 'skills' && specificSkills?.length) return true;\n if (cat === 'agents' && specificAgents?.length) return true;\n if (cat === 'commands' && specificCommands?.length) return true;\n return false;\n })\n : categories;\n\n const result: InstallResult = {\n installed: [],\n skipped: [],\n errors: [],\n };\n\n const packageRoot = getPackageRoot();\n const destinations = getDestinationPaths(isGlobal, projectRoot, target);\n\n const log = (msg: string) => {\n if (verbose) console.log(msg);\n };\n\n if (effectiveCategories.includes('skills')) {\n const skillsDir = join(packageRoot, 'skills');\n if (existsSync(skillsDir)) {\n let skills = readdirSync(skillsDir, { withFileTypes: true })\n .filter((d) => d.isDirectory())\n .map((d) => d.name);\n \n // Filter to specific skills if requested\n if (specificSkills?.length) {\n const requested = new Set(specificSkills.map(s => s.toLowerCase()));\n skills = skills.filter(s => requested.has(s.toLowerCase()));\n }\n\n for (const skill of skills) {\n const src = join(skillsDir, skill);\n const dest = join(destinations.skills, skill);\n\n try {\n if (existsSync(dest) && !force) {\n result.skipped.push(`skill:${skill}`);\n log(`Skipped skill/${skill} (already exists)`);\n continue;\n }\n\n mkdirSync(dirname(dest), { recursive: true });\n cpSync(src, dest, { recursive: true });\n result.installed.push(`skill:${skill}`);\n log(`Installed skill/${skill}`);\n } catch (err) {\n result.errors.push(`skill:${skill}: ${err}`);\n }\n }\n }\n }\n\n if (effectiveCategories.includes('agents')) {\n const agentsDir = join(packageRoot, 'agents');\n if (existsSync(agentsDir)) {\n let agents = readdirSync(agentsDir)\n .filter((f) => f.endsWith('.md'))\n .map((f) => f.replace('.md', ''));\n \n // Filter to specific agents if requested\n if (specificAgents?.length) {\n const requested = new Set(specificAgents.map(a => a.toLowerCase()));\n agents = agents.filter(a => requested.has(a.toLowerCase()));\n }\n\n for (const agent of agents) {\n const src = join(agentsDir, `${agent}.md`);\n const dest = join(destinations.agents, `${agent}.md`);\n\n try {\n if (existsSync(dest) && !force) {\n result.skipped.push(`agent:${agent}`);\n log(`Skipped agents/${agent}.md (already exists)`);\n continue;\n }\n\n mkdirSync(dirname(dest), { recursive: true });\n cpSync(src, dest);\n result.installed.push(`agent:${agent}`);\n log(`Installed agents/${agent}.md`);\n } catch (err) {\n result.errors.push(`agent:${agent}: ${err}`);\n }\n }\n }\n }\n\n if (effectiveCategories.includes('commands')) {\n const commandsDir = join(packageRoot, 'commands');\n if (existsSync(commandsDir)) {\n let commands = readdirSync(commandsDir)\n .filter((f) => f.endsWith('.md'))\n .map((f) => f.replace('.md', ''));\n \n // Filter to specific commands if requested\n if (specificCommands?.length) {\n const requested = new Set(specificCommands.map(c => c.toLowerCase()));\n commands = commands.filter(c => requested.has(c.toLowerCase()));\n }\n\n for (const command of commands) {\n const src = join(commandsDir, `${command}.md`);\n const dest = join(destinations.commands, `${command}.md`);\n\n try {\n if (existsSync(dest) && !force) {\n result.skipped.push(`command:${command}`);\n log(`Skipped commands/${command}.md (already exists)`);\n continue;\n }\n\n mkdirSync(dirname(dest), { recursive: true });\n cpSync(src, dest);\n result.installed.push(`command:${command}`);\n log(`Installed commands/${command}.md`);\n } catch (err) {\n result.errors.push(`command:${command}: ${err}`);\n }\n }\n }\n }\n\n return result;\n}\n\n// ============================================================================\n// Status checking\n// ============================================================================\n\nexport interface ComponentStatus {\n name: string;\n installed: boolean;\n path?: string;\n modifiedAt?: Date;\n}\n\nexport interface CategoryStatus {\n installed: number;\n total: number;\n components: ComponentStatus[];\n}\n\nexport interface TargetStatus {\n target: InstallTarget;\n available: boolean;\n configDir: string;\n skills: CategoryStatus;\n agents: CategoryStatus;\n commands: CategoryStatus;\n}\n\nexport interface StatusOptions {\n /** Check global installation */\n global?: boolean;\n /** Project root for local check */\n projectRoot?: string;\n}\n\nexport interface StatusResult {\n opencode: TargetStatus;\n claude: TargetStatus;\n}\n\nfunction checkComponentStatus(\n componentPath: string,\n name: string\n): ComponentStatus {\n const installed = existsSync(componentPath);\n if (!installed) {\n return { name, installed: false };\n }\n \n try {\n const stats = statSync(componentPath);\n return {\n name,\n installed: true,\n path: componentPath,\n modifiedAt: stats.mtime,\n };\n } catch {\n return { name, installed: true, path: componentPath };\n }\n}\n\nfunction getTargetStatus(\n target: InstallTarget,\n isGlobal: boolean,\n projectRoot?: string\n): TargetStatus {\n const available = target === 'opencode' ? isOpenCodeInstalled() : isClaudeInstalled();\n const destinations = getDestinationPaths(isGlobal, projectRoot, target);\n \n // Check skills\n const skillStatuses = SKILLS.map((s) => \n checkComponentStatus(join(destinations.skills, s.name), s.name)\n );\n \n // Check agents\n const agentStatuses = AGENTS.map((a) =>\n checkComponentStatus(join(destinations.agents, `${a.name}.md`), a.name)\n );\n \n // Check commands\n const commandStatuses = COMMANDS.map((c) =>\n checkComponentStatus(join(destinations.commands, `${c.name}.md`), c.name)\n );\n \n return {\n target,\n available,\n configDir: target === 'opencode' \n ? (isGlobal ? destinations.skills.replace(/[/\\\\]skills$/, '') : destinations.skills.replace(/[/\\\\]skills$/, ''))\n : (isGlobal ? destinations.skills.replace(/[/\\\\]skills$/, '') : destinations.skills.replace(/[/\\\\]skills$/, '')),\n skills: {\n installed: skillStatuses.filter((s) => s.installed).length,\n total: SKILLS.length,\n components: skillStatuses,\n },\n agents: {\n installed: agentStatuses.filter((a) => a.installed).length,\n total: AGENTS.length,\n components: agentStatuses,\n },\n commands: {\n installed: commandStatuses.filter((c) => c.installed).length,\n total: COMMANDS.length,\n components: commandStatuses,\n },\n };\n}\n\nexport async function getStatus(options: StatusOptions = {}): Promise<StatusResult> {\n const { global: isGlobal = true, projectRoot = process.cwd() } = options;\n \n return {\n opencode: getTargetStatus('opencode', isGlobal, projectRoot),\n claude: getTargetStatus('claude', isGlobal, projectRoot),\n };\n}\n\n// ============================================================================\n// Uninstall\n// ============================================================================\n\nexport interface UninstallOptions {\n /** Uninstall from global config directory */\n global?: boolean;\n /** Project root for local uninstallation */\n projectRoot?: string;\n /** Target platform: 'opencode' or 'claude' */\n target?: InstallTarget;\n /** Only uninstall specific categories */\n categories?: ('skills' | 'agents' | 'commands')[];\n /** Verbose output */\n verbose?: boolean;\n}\n\nexport interface UninstallResult {\n removed: string[];\n notFound: string[];\n errors: string[];\n}\n\nexport async function uninstall(options: UninstallOptions = {}): Promise<UninstallResult> {\n const {\n global: isGlobal = false,\n projectRoot = process.cwd(),\n target = 'opencode',\n categories = ['skills', 'agents', 'commands'],\n verbose = false,\n } = options;\n\n const result: UninstallResult = {\n removed: [],\n notFound: [],\n errors: [],\n };\n\n const destinations = getDestinationPaths(isGlobal, projectRoot, target);\n\n const log = (msg: string) => {\n if (verbose) console.log(msg);\n };\n\n // Get list of our components from manifest\n const ourSkills = SKILLS.map((s) => s.name);\n const ourAgents = AGENTS.map((a) => a.name);\n const ourCommands = COMMANDS.map((c) => c.name);\n\n if (categories.includes('skills')) {\n for (const skill of ourSkills) {\n const dest = join(destinations.skills, skill);\n\n try {\n if (!existsSync(dest)) {\n result.notFound.push(`skill:${skill}`);\n log(`Not found: skill/${skill}`);\n continue;\n }\n\n rmSync(dest, { recursive: true, force: true });\n result.removed.push(`skill:${skill}`);\n log(`Removed skill/${skill}`);\n } catch (err) {\n result.errors.push(`skill:${skill}: ${err}`);\n }\n }\n }\n\n if (categories.includes('agents')) {\n for (const agent of ourAgents) {\n const dest = join(destinations.agents, `${agent}.md`);\n\n try {\n if (!existsSync(dest)) {\n result.notFound.push(`agent:${agent}`);\n log(`Not found: agents/${agent}.md`);\n continue;\n }\n\n rmSync(dest, { force: true });\n result.removed.push(`agent:${agent}`);\n log(`Removed agents/${agent}.md`);\n } catch (err) {\n result.errors.push(`agent:${agent}: ${err}`);\n }\n }\n }\n\n if (categories.includes('commands')) {\n for (const command of ourCommands) {\n const dest = join(destinations.commands, `${command}.md`);\n\n try {\n if (!existsSync(dest)) {\n result.notFound.push(`command:${command}`);\n log(`Not found: commands/${command}.md`);\n continue;\n }\n\n rmSync(dest, { force: true });\n result.removed.push(`command:${command}`);\n log(`Removed commands/${command}.md`);\n } catch (err) {\n result.errors.push(`command:${command}: ${err}`);\n }\n }\n }\n\n return result;\n}\n","import { homedir, platform } from 'node:os';\nimport { join, dirname, resolve } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { existsSync } from 'node:fs';\n\n// Get the directory of the current module\n// Works in both ESM and CJS contexts\nfunction getCurrentDirname(): string {\n // Try ESM approach first (import.meta.url)\n try {\n if (import.meta?.url) {\n return dirname(fileURLToPath(import.meta.url));\n }\n } catch {\n // ESM approach failed\n }\n \n // CJS approach: resolve the package from node_modules\n // When bundled, we can find the package root by looking up\n // the package.json location using require.resolve\n try {\n // This works because package.json is always at the package root\n const packageJsonPath = require.resolve('ux-toolkit/package.json');\n // Return the dist directory (to match ESM behavior where import.meta.url points to dist/)\n return join(dirname(packageJsonPath), 'dist');\n } catch {\n // Package not found in node_modules\n }\n \n // Fallback: Use process.cwd() and check if we're in the package directory\n // This handles the case when running from the package source directory\n const cwd = process.cwd();\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const fs = require('node:fs');\n const pkgPath = resolve(cwd, 'package.json');\n if (fs.existsSync(pkgPath)) {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const pkg = require(pkgPath);\n if (pkg.name === 'ux-toolkit') {\n return resolve(cwd, 'dist');\n }\n }\n } catch {\n // Failed to read package.json\n }\n \n // Last resort: assume we're running from dist folder in cwd\n return resolve(cwd, 'dist');\n}\n\nconst currentDirname = getCurrentDirname();\n\nexport function getPackageRoot(): string {\n return join(currentDirname, '..');\n}\n\nexport function getSkillPath(skillName: string): string {\n return join(getPackageRoot(), 'skills', skillName, 'SKILL.md');\n}\n\nexport function getAgentPath(agentName: string): string {\n return join(getPackageRoot(), 'agents', `${agentName}.md`);\n}\n\nexport function getCommandPath(commandName: string): string {\n return join(getPackageRoot(), 'commands', `${commandName}.md`);\n}\n\n/**\n * Get the global OpenCode config directory.\n * \n * Priority:\n * 1. UX_TOOLKIT_CONFIG_DIR env var (explicit override)\n * 2. OPENCODE_CONFIG_DIR env var (OpenCode convention)\n * 3. Platform-specific defaults:\n * - Linux: $XDG_CONFIG_HOME/opencode or ~/.config/opencode\n * - macOS: ~/.config/opencode\n * - Windows: ~/.config/opencode (matches OpenCode behavior)\n */\nexport function getGlobalConfigDir(): string {\n // Allow explicit override\n if (process.env.UX_TOOLKIT_CONFIG_DIR) {\n return resolve(process.env.UX_TOOLKIT_CONFIG_DIR);\n }\n \n // OpenCode's own config dir override\n if (process.env.OPENCODE_CONFIG_DIR) {\n return resolve(process.env.OPENCODE_CONFIG_DIR);\n }\n \n const home = homedir();\n const currentPlatform = platform();\n \n // Linux: Respect XDG Base Directory spec\n if (currentPlatform === 'linux' && process.env.XDG_CONFIG_HOME) {\n return join(process.env.XDG_CONFIG_HOME, 'opencode');\n }\n \n // All platforms default to ~/.config/opencode (matches OpenCode behavior)\n return join(home, '.config', 'opencode');\n}\n\n/**\n * Check if the OpenCode config directory exists.\n * Useful for pre-flight checks before installation.\n */\nexport function isOpenCodeInstalled(): boolean {\n return existsSync(getGlobalConfigDir());\n}\n\n/**\n * Get the Claude Code config directory.\n * Claude Code always uses ~/.claude/ on all platforms.\n */\nexport function getClaudeConfigDir(): string {\n // Allow explicit override\n if (process.env.CLAUDE_CONFIG_DIR) {\n return resolve(process.env.CLAUDE_CONFIG_DIR);\n }\n \n return join(homedir(), '.claude');\n}\n\n/**\n * Check if Claude Code is installed.\n */\nexport function isClaudeInstalled(): boolean {\n return existsSync(getClaudeConfigDir());\n}\n\n/**\n * Supported installation targets\n */\nexport type InstallTarget = 'opencode' | 'claude';\n\n/**\n * Get platform information for diagnostics\n */\nexport function getPlatformInfo(): { \n platform: string; \n opencode: { configDir: string; exists: boolean };\n claude: { configDir: string; exists: boolean };\n} {\n const opencodeDir = getGlobalConfigDir();\n const claudeDir = getClaudeConfigDir();\n return {\n platform: platform(),\n opencode: {\n configDir: opencodeDir,\n exists: existsSync(opencodeDir),\n },\n claude: {\n configDir: claudeDir,\n exists: existsSync(claudeDir),\n },\n };\n}\n\nexport function getProjectConfigDir(projectRoot: string = process.cwd(), target: InstallTarget = 'opencode'): string {\n // Claude Code doesn't have project-level plugins in the same way\n // but we can support .claude/ directory for consistency\n const dirName = target === 'claude' ? '.claude' : '.opencode';\n return join(projectRoot, dirName);\n}\n\nexport interface DestinationPathsOptions {\n global?: boolean;\n projectRoot?: string;\n target?: InstallTarget;\n}\n\nexport function getDestinationPaths(global: boolean, projectRoot?: string, target: InstallTarget = 'opencode') {\n let baseDir: string;\n \n if (global) {\n baseDir = target === 'claude' ? getClaudeConfigDir() : getGlobalConfigDir();\n } else {\n baseDir = getProjectConfigDir(projectRoot, target);\n }\n\n return {\n skills: join(baseDir, 'skills'),\n agents: join(baseDir, 'agents'),\n commands: join(baseDir, 'commands'),\n };\n}\n","export const SKILLS = [\n // Core UX Skills\n {\n name: 'ux-heuristics',\n description: \"Nielsen's 10 usability heuristics with evaluation methodology\",\n category: 'core',\n },\n {\n name: 'wcag-accessibility',\n description: 'WCAG 2.2 compliance checklist and ARIA patterns',\n category: 'core',\n },\n {\n name: 'visual-design-system',\n description: 'Layout, typography, color theory, spacing systems',\n category: 'core',\n },\n {\n name: 'interaction-patterns',\n description: 'Micro-interactions, loading states, feedback mechanisms',\n category: 'core',\n },\n {\n name: 'mobile-responsive-ux',\n description: 'Touch targets, gestures, responsive patterns',\n category: 'core',\n },\n\n // Page Structure Skills\n {\n name: 'page-structure-patterns',\n description: 'Base requirements for page states, layout, and structure',\n category: 'structure',\n },\n {\n name: 'list-page-patterns',\n description: 'Filters, sorting, pagination, and grid/table displays',\n category: 'structure',\n },\n {\n name: 'detail-page-patterns',\n description: 'Headers, tabs, multi-column layouts, related data',\n category: 'structure',\n },\n {\n name: 'navigation-patterns',\n description: 'Sidebar, mobile drawer, breadcrumbs, app shell',\n category: 'structure',\n },\n\n // Component Skills\n {\n name: 'modal-patterns',\n description: 'Confirmation, edit, selector, and wizard modals',\n category: 'component',\n },\n {\n name: 'form-patterns',\n description: 'Validation, field layouts, multi-step wizards',\n category: 'component',\n },\n {\n name: 'data-density-patterns',\n description: 'Dense layouts, z-index, overflow, readability',\n category: 'component',\n },\n {\n name: 'toast-notification-patterns',\n description: 'Toast notifications, alerts, and system feedback',\n category: 'component',\n },\n\n // Interaction Skills\n {\n name: 'keyboard-shortcuts-patterns',\n description: 'Keyboard shortcuts, command palette (Cmd+K), power user navigation',\n category: 'interaction',\n },\n {\n name: 'drag-drop-patterns',\n description: 'Drag and drop interactions, visual feedback, drop zones',\n category: 'interaction',\n },\n\n // Editor/Workspace Skills\n {\n name: 'editor-workspace-patterns',\n description: 'Multi-tab editors, dirty state, real-time validation, workspaces',\n category: 'editor',\n },\n {\n name: 'comparison-patterns',\n description: 'Side-by-side comparison, diff highlighting, multi-item comparison',\n category: 'editor',\n },\n {\n name: 'split-panel-patterns',\n description: 'Resizable panels, dividers, collapsible sidebars, synchronized views',\n category: 'editor',\n },\n\n // Game/Interactive Skills\n {\n name: 'canvas-grid-patterns',\n description: 'Hex grids, tactical maps, pan/zoom, tokens, coordinate systems',\n category: 'game',\n },\n {\n name: 'turn-based-ui-patterns',\n description: 'Phase banners, turn indicators, action bars, game state feedback',\n category: 'game',\n },\n {\n name: 'playback-replay-patterns',\n description: 'VCR controls, timeline scrubbing, speed selection, replay viewers',\n category: 'game',\n },\n {\n name: 'status-visualization-patterns',\n description: 'Health bars, progress meters, heat gauges, pip displays, stat blocks',\n category: 'game',\n },\n\n // Data Display Skills\n {\n name: 'info-card-patterns',\n description: 'Compact/standard/expanded cards, stat blocks, badges, entity displays',\n category: 'data',\n },\n {\n name: 'event-timeline-patterns',\n description: 'Activity feeds, audit logs, chronological events, filtering, infinite scroll',\n category: 'data',\n },\n\n // Framework Skills\n {\n name: 'react-ux-patterns',\n description: 'React/Next.js specific UX patterns',\n category: 'framework',\n },\n] as const;\n\nexport const AGENTS = [\n // General Purpose Agents\n {\n name: 'ux-auditor',\n description: 'Full UX audit against heuristics (read-only)',\n mode: 'analysis',\n },\n {\n name: 'ux-engineer',\n description: 'UX analysis + implements fixes',\n mode: 'fix',\n },\n {\n name: 'accessibility-auditor',\n description: 'WCAG 2.2 compliance review (read-only)',\n mode: 'analysis',\n },\n {\n name: 'accessibility-engineer',\n description: 'Accessibility fixes',\n mode: 'fix',\n },\n {\n name: 'visual-reviewer',\n description: 'Design system consistency check',\n mode: 'analysis',\n },\n {\n name: 'interaction-reviewer',\n description: 'Micro-interactions and feedback review',\n mode: 'analysis',\n },\n\n // Specialized Page Reviewers\n {\n name: 'list-page-reviewer',\n description: 'List/browse page UX review',\n mode: 'analysis',\n },\n {\n name: 'detail-page-reviewer',\n description: 'Detail/entity page UX review',\n mode: 'analysis',\n },\n {\n name: 'navigation-reviewer',\n description: 'Navigation and routing review',\n mode: 'analysis',\n },\n {\n name: 'form-reviewer',\n description: 'Form and input UX review',\n mode: 'analysis',\n },\n {\n name: 'density-reviewer',\n description: 'Data density and layout review',\n mode: 'analysis',\n },\n\n // Advanced Specialized Reviewers\n {\n name: 'editor-reviewer',\n description: 'Editor/workspace UI with multi-tab, drag-drop, validation',\n mode: 'analysis',\n },\n {\n name: 'comparison-reviewer',\n description: 'Side-by-side comparison and diff UIs',\n mode: 'analysis',\n },\n {\n name: 'settings-reviewer',\n description: 'Settings, preferences, and configuration pages',\n mode: 'analysis',\n },\n\n // Game & Interactive Reviewers\n {\n name: 'game-ui-reviewer',\n description: 'Tactical maps, turn-based combat, status displays, hex grids',\n mode: 'analysis',\n },\n {\n name: 'replay-reviewer',\n description: 'Playback controls, timeline scrubbing, event feeds',\n mode: 'analysis',\n },\n {\n name: 'card-reviewer',\n description: 'Info cards, stat blocks, entity displays with density levels',\n mode: 'analysis',\n },\n {\n name: 'panel-reviewer',\n description: 'Resizable panels, collapsible sidebars, split views',\n mode: 'analysis',\n },\n] as const;\n\nexport const COMMANDS = [\n {\n name: 'ux-audit',\n description: 'Comprehensive UX audit',\n },\n {\n name: 'a11y-check',\n description: 'Quick accessibility scan',\n },\n {\n name: 'design-review',\n description: 'Visual consistency check',\n },\n {\n name: 'screenshot-review',\n description: 'Visual review from screenshot',\n },\n] as const;\n\nexport type SkillName = (typeof SKILLS)[number]['name'];\nexport type AgentName = (typeof AGENTS)[number]['name'];\nexport type CommandName = (typeof COMMANDS)[number]['name'];\n"],"mappings":"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","names":["existsSync","join","dirname","join","existsSync","dirname","resolve","existsSync","join"]}