@skillkit/tui 2.0.0 → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/index.d.ts +6 -6
- package/dist/index.js +138 -109
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.tsx","../src/App.tsx","../src/state/types.ts","../src/theme/colors.ts","../src/theme/symbols.ts","../src/utils/helpers.ts","../src/components/Sidebar.tsx","../src/components/Splash.tsx","../src/screens/Home.tsx","../src/state/navigation.ts","../src/state/skills.ts","../src/state/agents.ts","../src/state/marketplace.ts","../src/screens/Browse.tsx","../src/screens/Installed.tsx","../src/screens/Marketplace.tsx","../src/screens/Recommend.tsx","../src/screens/Translate.tsx","../src/components/Header.tsx","../src/screens/Context.tsx","../src/components/Spinner.tsx","../src/screens/Sync.tsx","../src/screens/Memory.tsx","../src/screens/Workflow.tsx","../src/screens/Execute.tsx","../src/components/ProgressBar.tsx","../src/screens/History.tsx","../src/screens/Team.tsx","../src/screens/Plugins.tsx","../src/screens/Methodology.tsx","../src/screens/Plan.tsx","../src/screens/Settings.tsx","../src/screens/Help.tsx","../src/theme/animations.ts","../src/utils/list.ts","../src/components/AgentGrid.tsx","../src/components/StatsCard.tsx","../src/components/StatusBar.tsx","../src/components/SkillList.tsx","../src/components/SearchInput.tsx","../src/components/FeatureList.tsx"],"sourcesContent":["import { createCliRenderer } from '@opentui/core';\nimport { createRoot } from '@opentui/react';\nimport { App } from './App.js';\n\nexport function exitTUI(code = 0): void {\n try {\n process.stdout.write('\\x1b[?1049l\\x1b[?25h\\x1b[0m');\n } catch {\n // Ignore write errors\n }\n process.exit(code);\n}\n\nexport async function startTUI(): Promise<never> {\n const renderer = await createCliRenderer({ exitOnCtrlC: true });\n const root = createRoot(renderer);\n root.render(<App onExit={exitTUI} />);\n return new Promise(() => {});\n}\n\nexport { type Screen } from './state/types.js';\nexport { App } from './App.js';\nexport * from './theme/index.js';\nexport * from './state/index.js';\nexport * from './utils/index.js';\nexport * from './components/index.js';\nexport * from './screens/index.js';\n","import { useState, useCallback, useEffect } from 'react';\nimport { useKeyboard } from '@opentui/react';\nimport { type Screen, NAV_KEYS } from './state/types.js';\nimport { Sidebar } from './components/Sidebar.js';\nimport { Splash } from './components/Splash.js';\nimport {\n Home, Browse, Installed, Marketplace, Settings, Recommend,\n Translate, Context, Memory, Team, Plugins, Methodology,\n Plan, Workflow, Execute, History, Sync, Help,\n} from './screens/index.js';\n\ninterface AppProps {\n onExit?: (code?: number) => void;\n}\n\nexport function App({ onExit }: AppProps = {}) {\n const [showSplash, setShowSplash] = useState(true);\n const [screen, setScreen] = useState<Screen>('home');\n const [dimensions, setDimensions] = useState({\n cols: process.stdout.columns || 80,\n rows: process.stdout.rows || 24,\n });\n\n useEffect(() => {\n const handleResize = () => {\n setDimensions({\n cols: process.stdout.columns || 80,\n rows: process.stdout.rows || 24,\n });\n };\n process.stdout.on('resize', handleResize);\n return () => { process.stdout.off('resize', handleResize); };\n }, []);\n\n const { cols, rows } = dimensions;\n const showSidebar = cols >= 60;\n\n const handleNavigate = useCallback((newScreen: Screen) => {\n setScreen(newScreen);\n }, []);\n\n const handleSplashComplete = useCallback(() => {\n setShowSplash(false);\n }, []);\n\n useKeyboard((key: { name?: string; ctrl?: boolean }) => {\n if (showSplash) {\n setShowSplash(false);\n return;\n }\n\n if (key.name === 'q' || (key.ctrl && key.name === 'c')) {\n onExit ? onExit(0) : process.exit(0);\n return;\n }\n\n const targetScreen = NAV_KEYS[key.name || ''];\n if (targetScreen) {\n setScreen(targetScreen);\n }\n\n if (key.name === 'escape' && screen !== 'home') {\n setScreen('home');\n }\n });\n\n if (showSplash) {\n return <Splash onComplete={handleSplashComplete} duration={3000} />;\n }\n\n const screenProps = {\n onNavigate: handleNavigate,\n cols: cols - (showSidebar ? 20 : 0),\n rows,\n };\n\n const renderScreen = () => {\n switch (screen) {\n case 'home': return <Home {...screenProps} />;\n case 'browse': return <Browse {...screenProps} />;\n case 'installed': return <Installed {...screenProps} />;\n case 'marketplace': return <Marketplace {...screenProps} />;\n case 'settings': return <Settings {...screenProps} />;\n case 'recommend': return <Recommend {...screenProps} />;\n case 'translate': return <Translate {...screenProps} />;\n case 'context': return <Context {...screenProps} />;\n case 'memory': return <Memory {...screenProps} />;\n case 'team': return <Team {...screenProps} />;\n case 'plugins': return <Plugins {...screenProps} />;\n case 'methodology': return <Methodology {...screenProps} />;\n case 'plan': return <Plan {...screenProps} />;\n case 'workflow': return <Workflow {...screenProps} />;\n case 'execute': return <Execute {...screenProps} />;\n case 'history': return <History {...screenProps} />;\n case 'sync': return <Sync {...screenProps} />;\n case 'help': return <Help {...screenProps} />;\n default: return <Home {...screenProps} />;\n }\n };\n\n return (\n <box flexDirection=\"row\" height={rows}>\n {showSidebar && <Sidebar screen={screen} onNavigate={handleNavigate} />}\n <box flexDirection=\"column\" flexGrow={1} marginLeft={showSidebar ? 1 : 0} paddingRight={1}>\n {renderScreen()}\n </box>\n </box>\n );\n}\n\nexport { type Screen };\n","export interface SkillItem {\n name: string;\n description?: string;\n source?: string;\n installs?: number;\n enabled?: boolean;\n}\n\nexport interface RepoInfo {\n source: string;\n name: string;\n}\n\nexport interface FetchedSkill {\n name: string;\n source: string;\n repoName: string;\n description?: string;\n}\n\nexport type Screen =\n | 'home' | 'browse' | 'installed' | 'marketplace' | 'recommend'\n | 'translate' | 'context' | 'memory' | 'team' | 'plugins'\n | 'methodology' | 'plan' | 'workflow' | 'execute' | 'history'\n | 'sync' | 'settings' | 'help';\n\nexport const NAV_KEYS: Record<string, Screen> = {\n h: 'home', m: 'marketplace', b: 'browse', w: 'workflow',\n x: 'execute', y: 'history', r: 'recommend', t: 'translate',\n c: 'context', e: 'memory', i: 'installed', s: 'sync',\n a: 'team', p: 'plugins', o: 'methodology', n: 'plan',\n ',': 'settings', '/': 'help',\n} as const;\n\nexport const STATUS_BAR_SHORTCUTS = 'b browse m market i installed s sync / help q quit';\n\nexport interface ScreenMeta {\n key: string;\n label: string;\n screen: Screen;\n}\n\nexport interface SidebarSection {\n section: string;\n items: ScreenMeta[];\n}\n\nexport const SIDEBAR_NAV: SidebarSection[] = [\n {\n section: 'Discover',\n items: [\n { key: 'h', label: 'Home', screen: 'home' },\n { key: 'b', label: 'Browse', screen: 'browse' },\n { key: 'm', label: 'Market', screen: 'marketplace' },\n { key: 'r', label: 'Recommend', screen: 'recommend' },\n ],\n },\n {\n section: 'Manage',\n items: [\n { key: 'i', label: 'Installed', screen: 'installed' },\n { key: 's', label: 'Sync', screen: 'sync' },\n { key: 't', label: 'Translate', screen: 'translate' },\n ],\n },\n {\n section: 'Execute',\n items: [\n { key: 'w', label: 'Workflows', screen: 'workflow' },\n { key: 'x', label: 'Execute', screen: 'execute' },\n { key: 'n', label: 'Plan', screen: 'plan' },\n ],\n },\n {\n section: 'Team',\n items: [\n { key: 'a', label: 'Team', screen: 'team' },\n { key: 'c', label: 'Context', screen: 'context' },\n { key: 'e', label: 'Memory', screen: 'memory' },\n ],\n },\n {\n section: 'More',\n items: [\n { key: 'p', label: 'Plugins', screen: 'plugins' },\n { key: 'o', label: 'Methods', screen: 'methodology' },\n { key: ',', label: 'Settings', screen: 'settings' },\n ],\n },\n];\n","/**\n * Monochromatic color palette for SkillKit TUI\n * Inspired by OpenSync's elegant dark theme\n */\n\nexport const colors = {\n // Base (monochromatic grays)\n background: '#0d0d0d',\n surface: '#1a1a1a',\n surfaceHover: '#262626',\n border: '#333333',\n borderDim: '#1f1f1f',\n\n // Text hierarchy\n text: '#ffffff',\n textSecondary: '#a0a0a0',\n textMuted: '#666666',\n\n // Accent (single brand color - vibrant green)\n accent: '#00ff88',\n accentDim: '#00cc6a',\n\n // Status colors (subtle variations)\n success: '#22c55e',\n warning: '#eab308',\n error: '#ef4444',\n info: '#3b82f6',\n\n // Feature-specific accent colors (for colored keywords)\n sync: '#00d9ff', // cyan\n browse: '#22c55e', // green\n recommend: '#fbbf24', // yellow/gold\n translate: '#a855f7', // purple\n workflow: '#3b82f6', // blue\n team: '#ffffff', // white\n private: '#ef4444', // red\n tag: '#fbbf24', // yellow\n export: '#22c55e', // green\n delete: '#ef4444', // red\n} as const;\n\nexport type ColorName = keyof typeof colors;\nexport type ColorValue = (typeof colors)[ColorName];\n\n/**\n * Get a color value by name\n */\nexport function getColor(name: ColorName): ColorValue {\n return colors[name];\n}\n\n/**\n * Terminal-safe color names for OpenTUI\n * Maps our design system colors to terminal-compatible values\n */\nexport const terminalColors = {\n background: 'black',\n surface: 'black',\n text: 'white',\n textSecondary: 'gray',\n textMuted: 'gray',\n accent: 'green',\n success: 'green',\n warning: 'yellow',\n error: 'red',\n info: 'blue',\n sync: 'cyan',\n browse: 'green',\n recommend: 'yellow',\n translate: 'magenta',\n workflow: 'blue',\n team: 'white',\n border: 'gray',\n} as const;\n","/**\n * Unicode symbols and agent logos for SkillKit TUI\n * Monochromatic design system for terminal display\n */\n\n/**\n * Agent logo definitions with monochromatic icons\n */\nexport interface AgentLogo {\n icon: string;\n name: string;\n company: string;\n}\n\n/**\n * All 17 supported agents with monochromatic Unicode logos\n */\nexport const AGENT_LOGOS: Record<string, AgentLogo> = {\n 'claude-code': { icon: '⟁', name: 'Claude Code', company: 'Anthropic' },\n 'cursor': { icon: '◫', name: 'Cursor', company: 'Anysphere' },\n 'codex': { icon: '◎', name: 'Codex CLI', company: 'OpenAI' },\n 'gemini-cli': { icon: '✦', name: 'Gemini CLI', company: 'Google' },\n 'opencode': { icon: '⬡', name: 'OpenCode', company: 'SST' },\n 'github-copilot': { icon: '◈', name: 'Copilot', company: 'GitHub' },\n 'windsurf': { icon: '≋', name: 'Windsurf', company: 'Codeium' },\n 'droid': { icon: '▣', name: 'Droid', company: 'Factory' },\n 'goose': { icon: '◇', name: 'Goose', company: 'Block' },\n 'amp': { icon: '△', name: 'Amp', company: 'Sourcegraph' },\n 'kilo': { icon: '◉', name: 'Kilo Code', company: '' },\n 'kiro-cli': { icon: '⬢', name: 'Kiro', company: 'AWS' },\n 'roo': { icon: '⊙', name: 'Roo Code', company: '' },\n 'trae': { icon: '◆', name: 'Trae', company: 'ByteDance' },\n 'antigravity': { icon: '⊛', name: 'Antigravity', company: '' },\n 'clawdbot': { icon: '⟐', name: 'Clawdbot', company: '' },\n 'universal': { icon: '●', name: 'Universal', company: '' },\n} as const;\n\n/**\n * UI symbols for status and navigation\n */\nexport const symbols = {\n // Navigation\n pointer: '▸',\n pointerInactive: ' ',\n bullet: '●',\n bulletEmpty: '○',\n\n // Status\n success: '✓',\n error: '✗',\n warning: '⚠',\n info: 'ℹ',\n pending: '○',\n active: '●',\n synced: '●',\n\n // Progress\n progressFilled: '█',\n progressEmpty: '░',\n\n // Spinner frames\n spinner: ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'] as const,\n\n // Arrows\n arrowUp: '↑',\n arrowDown: '↓',\n arrowLeft: '←',\n arrowRight: '→',\n\n // Decorative\n diamond: '◆',\n diamondEmpty: '◇',\n star: '★',\n starEmpty: '☆',\n\n // Box drawing\n horizontalLine: '─',\n verticalLine: '│',\n topLeft: '┌',\n topRight: '┐',\n bottomLeft: '└',\n bottomRight: '┘',\n\n // Brand\n brandIcon: '◆',\n} as const;\n\nexport type SymbolName = keyof typeof symbols;\n\n/**\n * Get agent logo by agent type ID\n */\nexport function getAgentLogo(agentType: string): AgentLogo | undefined {\n return AGENT_LOGOS[agentType];\n}\n\n/**\n * Get all agent types\n */\nexport function getAgentTypes(): string[] {\n return Object.keys(AGENT_LOGOS);\n}\n\n/**\n * Get formatted agent display string (icon + name)\n */\nexport function formatAgentDisplay(agentType: string): string {\n const logo = AGENT_LOGOS[agentType];\n if (!logo) return agentType;\n return `${logo.icon} ${logo.name}`;\n}\n","/**\n * Helper utilities for agent and skill operations\n */\nimport {\n loadConfig,\n getSearchDirs as coreGetSearchDirs,\n getInstallDir as coreGetInstallDir,\n saveSkillMetadata as coreSaveSkillMetadata,\n} from '@skillkit/core';\nimport { getAdapter } from '@skillkit/agents';\nimport type { AgentType, AgentAdapterInfo, SkillMetadata } from '@skillkit/core';\nimport { readFileSync } from 'node:fs';\nimport { join, dirname } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\n/**\n * Get search directories for skills based on agent type\n * @param agentType - Optional agent type (defaults to configured agent)\n * @returns Array of directories to search for skills\n */\nexport function getSearchDirs(agentType?: AgentType): string[] {\n const type = agentType || loadConfig().agent;\n const adapter = getAdapter(type);\n const adapterInfo: AgentAdapterInfo = {\n type: adapter.type,\n name: adapter.name,\n skillsDir: adapter.skillsDir,\n configFile: adapter.configFile,\n };\n return coreGetSearchDirs(adapterInfo);\n}\n\n/**\n * Get installation directory for skills\n * @param global - Whether to get global or project-local directory\n * @param agentType - Optional agent type (defaults to configured agent)\n * @returns Installation directory path\n */\nexport function getInstallDir(global = false, agentType?: AgentType): string {\n const type = agentType || loadConfig().agent;\n const adapter = getAdapter(type);\n const adapterInfo: AgentAdapterInfo = {\n type: adapter.type,\n name: adapter.name,\n skillsDir: adapter.skillsDir,\n configFile: adapter.configFile,\n };\n return coreGetInstallDir(adapterInfo, global);\n}\n\n/**\n * Save skill metadata to a skill directory\n * @param skillDir - Directory containing the skill\n * @param metadata - Metadata to save\n */\nexport function saveSkillMetadata(\n skillDir: string,\n metadata: SkillMetadata\n): void {\n coreSaveSkillMetadata(skillDir, metadata);\n}\n\n/**\n * Get version from package.json\n * @returns Version string\n */\nexport function getVersion(): string {\n try {\n // Try to read from package.json relative to the built file\n const __filename = fileURLToPath(import.meta.url);\n const __dirname = dirname(__filename);\n const packagePath = join(__dirname, '..', '..', 'package.json');\n const packageJson = JSON.parse(readFileSync(packagePath, 'utf-8'));\n return packageJson.version || '1.0.0';\n } catch {\n return '1.0.0';\n }\n}\n","import { type Screen, SIDEBAR_NAV } from '../state/types.js';\nimport { terminalColors } from '../theme/colors.js';\nimport { symbols } from '../theme/symbols.js';\nimport { getVersion } from '../utils/helpers.js';\n\ninterface SidebarProps {\n screen: Screen;\n onNavigate: (screen: Screen) => void;\n}\n\nexport function Sidebar({ screen }: SidebarProps) {\n const version = getVersion();\n\n return (\n <box flexDirection=\"column\" width={18} paddingRight={1}>\n <text fg={terminalColors.accent}>\n <b>{symbols.brandIcon} skillkit</b>\n </text>\n <text fg={terminalColors.textMuted}>v{version}</text>\n <text> </text>\n\n {SIDEBAR_NAV.map(({ section, items }, idx) => (\n <box key={section} flexDirection=\"column\">\n {idx > 0 && <text> </text>}\n <text fg={terminalColors.textMuted}>\n <i>{section}</i>\n </text>\n {items.map((item) => {\n const active = screen === item.screen;\n return (\n <text key={item.key} fg={active ? terminalColors.accent : terminalColors.text}>\n {active ? <b>{symbols.pointer} {item.label}</b> : <>{symbols.pointerInactive} {item.label}</>}\n </text>\n );\n })}\n </box>\n ))}\n\n <box flexGrow={1} />\n <text fg={terminalColors.textMuted}>{symbols.horizontalLine.repeat(14)}</text>\n <text fg={terminalColors.textMuted}>/ help q quit</text>\n </box>\n );\n}\n","/**\n * Splash Component\n * Cinematic ASCII art intro with elegant animations\n * Premium terminal experience\n */\nimport { useState, useEffect, useMemo, useCallback } from 'react';\nimport { terminalColors } from '../theme/colors.js';\nimport { getVersion } from '../utils/helpers.js';\n\n// Premium ASCII art logo - clean geometric design\nconst LOGO_FRAMES = [\n // Frame 1 - Dots appear\n [\n ' ',\n ' · · · · · · · · · · · · · · · ',\n ' ',\n ],\n // Frame 2 - Lines form\n [\n ' ',\n ' ━━━ ━ ━ ━ ━ ━ ━ ━ ━━━ ',\n ' ',\n ],\n // Frame 3 - Structure emerges\n [\n ' ┌──┐ ┬ ┌─ ┬ ┬ ┬ ┬ ┌─ ┬ ┌─┐ ',\n ' └──┐ │ │ │ │ │ │ │ │ │ ',\n ' └──┘ ┴ └─ ┴ ┴─┘ ┴─┘ ┴ └─ ┴ ┴ ',\n ],\n // Frame 4 - Bold letters\n [\n ' ╔═╗ ╦╔═ ╦ ╦ ╦ ╦╔═ ╦╔╦╗ ',\n ' ╚═╗ ╠╩╗ ║ ║ ║ ╠╩╗ ║ ║ ',\n ' ╚═╝ ╩ ╩ ╩ ╩═╝ ╩═╝ ╩ ╩ ╩ ╩ ',\n ],\n // Frame 5 - Final premium logo\n [\n ' ███████╗██╗ ██╗██╗██╗ ██╗ ██╗ ██╗██╗████████╗',\n ' ██╔════╝██║ ██╔╝██║██║ ██║ ██║ ██╔╝██║╚══██╔══╝',\n ' ███████╗█████╔╝ ██║██║ ██║ █████╔╝ ██║ ██║ ',\n ' ╚════██║██╔═██╗ ██║██║ ██║ ██╔═██╗ ██║ ██║ ',\n ' ███████║██║ ██╗██║███████╗███████╗██║ ██╗██║ ██║ ',\n ' ╚══════╝╚═╝ ╚═╝╚═╝╚══════╝╚══════╝╚═╝ ╚═╝╚═╝ ╚═╝ ',\n ],\n];\n\n// Compact logo for smaller terminals\nconst LOGO_SMALL = [\n ' ╔═╗╦╔═╦╦ ╦ ╦╔═╦╔╦╗ ',\n ' ╚═╗╠╩╗║║ ║ ╠╩╗║ ║ ',\n ' ╚═╝╩ ╩╩╩═╝╩═╝╩ ╩╩ ╩ ',\n];\n\n// Elegant spinner frames\nconst SPINNER = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];\n\n// Progress bar characters\nconst PROGRESS = {\n empty: '░',\n filled: '█',\n head: '▓',\n};\n\n// Loading phases with elegant messaging\nconst PHASES = [\n { message: 'Initializing', detail: 'skill engine' },\n { message: 'Connecting', detail: 'agent network' },\n { message: 'Loading', detail: 'skill manifests' },\n { message: 'Syncing', detail: 'configurations' },\n { message: 'Ready', detail: '' },\n];\n\ninterface SplashProps {\n onComplete: () => void;\n duration?: number;\n}\n\nexport function Splash({ onComplete, duration = 3500 }: SplashProps) {\n const [frame, setFrame] = useState(0);\n const [progress, setProgress] = useState(0);\n const [spinnerFrame, setSpinnerFrame] = useState(0);\n const [phase, setPhase] = useState(0);\n const [fadeIn, setFadeIn] = useState(0);\n const [particles, setParticles] = useState<string[]>([]);\n\n // Cache version to avoid repeated sync file I/O on every render\n const version = useMemo(() => getVersion(), []);\n const cols = process.stdout.columns || 80;\n const rows = process.stdout.rows || 24;\n const useSmallLogo = cols < 70;\n const currentLogo = useSmallLogo ? LOGO_SMALL : (LOGO_FRAMES[Math.min(frame, 4)] || LOGO_FRAMES[4]);\n const maxWidth = Math.max(...currentLogo.map(l => l.length));\n\n // Generate ambient particles - returns fresh randomized string each call\n const generateParticles = useCallback(() => {\n const chars = ['·', '∙', '•', '○', '◦', '◌', '◍', '◎'];\n return Array(cols).fill(0).map(() =>\n Math.random() > 0.97 ? chars[Math.floor(Math.random() * chars.length)] : ' '\n ).join('');\n }, [cols]);\n\n // Logo reveal animation\n useEffect(() => {\n if (frame >= 4) return;\n const timer = setTimeout(() => setFrame(f => f + 1), 200);\n return () => clearTimeout(timer);\n }, [frame]);\n\n // Fade in effect\n useEffect(() => {\n if (fadeIn >= 10) return;\n const timer = setTimeout(() => setFadeIn(f => f + 1), 50);\n return () => clearTimeout(timer);\n }, [fadeIn]);\n\n // Progress animation\n useEffect(() => {\n const interval = setInterval(() => {\n setProgress(p => {\n const newProgress = p + (Math.random() * 3 + 1);\n if (newProgress >= 100) {\n clearInterval(interval);\n return 100;\n }\n return newProgress;\n });\n }, 50);\n return () => clearInterval(interval);\n }, []);\n\n // Phase progression\n useEffect(() => {\n const phaseProgress = progress / 20;\n setPhase(Math.min(Math.floor(phaseProgress), PHASES.length - 1));\n }, [progress]);\n\n // Spinner animation\n useEffect(() => {\n const interval = setInterval(() => {\n setSpinnerFrame(f => (f + 1) % SPINNER.length);\n }, 80);\n return () => clearInterval(interval);\n }, []);\n\n // Particle animation\n useEffect(() => {\n const interval = setInterval(() => {\n setParticles(prev => {\n const newParticles = [...prev];\n if (newParticles.length > 3) newParticles.shift();\n newParticles.push(generateParticles());\n return newParticles;\n });\n }, 150);\n return () => clearInterval(interval);\n }, [generateParticles]);\n\n // Auto-complete\n useEffect(() => {\n const timer = setTimeout(onComplete, duration);\n return () => clearTimeout(timer);\n }, [onComplete, duration]);\n\n const pad = ' '.repeat(Math.max(0, Math.floor((cols - maxWidth) / 2)));\n const progressWidth = Math.max(1, Math.min(40, cols - 20));\n const progressPad = ' '.repeat(Math.max(0, Math.floor((cols - progressWidth) / 2)));\n\n const filledWidth = Math.min(Math.floor((progress / 100) * progressWidth), progressWidth);\n const emptyWidth = Math.max(0, progressWidth - filledWidth - 1);\n const progressBar = PROGRESS.filled.repeat(filledWidth) +\n (filledWidth < progressWidth ? PROGRESS.head : '') +\n PROGRESS.empty.repeat(emptyWidth);\n\n const currentPhase = PHASES[phase];\n\n return (\n <box flexDirection=\"column\" height={rows}>\n {/* Top ambient particles */}\n <text fg={terminalColors.textMuted}>\n {particles[0] || ''}\n </text>\n\n {/* Spacer */}\n <box flexGrow={1} />\n\n {/* Logo */}\n <box flexDirection=\"column\" alignItems=\"center\">\n {currentLogo.map((line, idx) => (\n <text key={idx} fg={frame >= 4 ? terminalColors.accent : terminalColors.textMuted}>\n {frame >= 4 ? <b>{pad}{line}</b> : <>{pad}{line}</>}\n </text>\n ))}\n </box>\n\n {/* Tagline with fade-in */}\n <text> </text>\n {fadeIn > 3 && (\n <text fg={terminalColors.textSecondary}>\n {pad}{' '}universal skills for ai coding agents\n </text>\n )}\n\n {/* Version badge */}\n {fadeIn > 5 && (\n <>\n <text> </text>\n <text fg={terminalColors.textMuted}>\n {pad}{' '}v{version}\n </text>\n </>\n )}\n\n {/* Spacer */}\n <text> </text>\n <text> </text>\n\n {/* Progress section */}\n {fadeIn > 7 && (\n <box flexDirection=\"column\" alignItems=\"center\">\n {/* Status line */}\n <box flexDirection=\"row\">\n <text fg={terminalColors.accent}>\n {progressPad}{SPINNER[spinnerFrame]}{' '}\n </text>\n <text fg={terminalColors.text}>\n <b>{currentPhase.message}</b>\n </text>\n {currentPhase.detail && (\n <text fg={terminalColors.textMuted}>\n {' '}{currentPhase.detail}\n </text>\n )}\n </box>\n\n {/* Progress bar */}\n <text> </text>\n <box flexDirection=\"row\">\n <text fg={terminalColors.textMuted}>{progressPad}[</text>\n <text fg={terminalColors.accent}>{progressBar}</text>\n <text fg={terminalColors.textMuted}>]</text>\n <text fg={terminalColors.textSecondary}>{' '}{Math.floor(progress)}%</text>\n </box>\n </box>\n )}\n\n {/* Spacer */}\n <box flexGrow={1} />\n\n {/* Bottom hint */}\n <box flexDirection=\"column\" alignItems=\"center\">\n <text fg={terminalColors.textMuted}>\n {progressPad}{' '}press any key to skip\n </text>\n <text> </text>\n {/* Bottom particles */}\n <text fg={terminalColors.textMuted}>\n {particles[1] || ''}\n </text>\n </box>\n </box>\n );\n}\n","import { useState, useEffect, useMemo } from 'react';\nimport { type Screen, loadSkills, TOTAL_AGENTS } from '../state/index.js';\nimport { terminalColors } from '../theme/colors.js';\nimport { symbols, AGENT_LOGOS } from '../theme/symbols.js';\nimport { getVersion } from '../utils/helpers.js';\n\ninterface HomeProps {\n onNavigate: (screen: Screen) => void;\n cols?: number;\n rows?: number;\n}\n\nconst FEATURES = [\n { key: 'Sync', color: terminalColors.sync, desc: 'share across agents' },\n { key: 'Browse', color: terminalColors.browse, desc: 'discover skills' },\n { key: 'Recommend', color: terminalColors.recommend, desc: 'AI suggestions' },\n { key: 'Translate', color: terminalColors.translate, desc: 'convert formats' },\n { key: 'Workflow', color: terminalColors.workflow, desc: 'automate chains' },\n { key: 'Team', color: terminalColors.text, desc: 'collaborate' },\n];\n\nexport function Home({ cols = 80 }: HomeProps) {\n const [animPhase, setAnimPhase] = useState(0);\n const [stats, setStats] = useState({ skills: 0, agents: TOTAL_AGENTS, synced: 0 });\n const [detectedAgents, setDetectedAgents] = useState<string[]>([]);\n\n const version = getVersion();\n const isCompact = cols < 70;\n const isNarrow = cols < 50;\n const contentWidth = Math.min(cols - 4, 55);\n const line = '─'.repeat(contentWidth);\n\n useEffect(() => {\n if (animPhase >= 5) return;\n const timer = setTimeout(() => setAnimPhase(p => p + 1), 100);\n return () => clearTimeout(timer);\n }, [animPhase]);\n\n useEffect(() => {\n const skillsData = loadSkills();\n setStats({\n skills: skillsData.skills.length,\n agents: TOTAL_AGENTS,\n synced: Math.min(skillsData.skills.length, 3),\n });\n setDetectedAgents(['claude-code', 'cursor', 'github-copilot']);\n }, []);\n\n const visibleAgents = useMemo(() => {\n const allAgents = Object.entries(AGENT_LOGOS);\n const perRow = isNarrow || isCompact ? 2 : 3;\n const maxAgents = isNarrow ? 4 : isCompact ? 6 : 9;\n return {\n agents: allAgents.slice(0, maxAgents),\n perRow,\n remaining: allAgents.length - maxAgents,\n };\n }, [isCompact, isNarrow]);\n\n const getAgentWidth = () => {\n if (isNarrow) return 22;\n if (isCompact) return 26;\n return 18;\n };\n\n return (\n <box flexDirection=\"column\" padding={1}>\n {animPhase >= 1 && (\n <box flexDirection=\"column\">\n <box flexDirection=\"row\">\n <text fg={terminalColors.text}>{symbols.brandIcon} skillkit</text>\n <text fg={terminalColors.textMuted}> v{version}</text>\n </box>\n <text fg={terminalColors.textMuted}>universal skills for ai coding agents</text>\n <text> </text>\n </box>\n )}\n\n {animPhase >= 2 && (\n <box flexDirection=\"column\">\n <text fg={terminalColors.textMuted}>{line}</text>\n <text> </text>\n <box flexDirection=\"row\">\n <box width={14}><text fg={terminalColors.accent}>{stats.skills}</text></box>\n <box width={14}><text fg={terminalColors.text}>{stats.agents}</text></box>\n <box width={14}><text fg={terminalColors.text}>{stats.synced}</text></box>\n </box>\n <box flexDirection=\"row\">\n <text fg={terminalColors.textMuted} width={14}>skills</text>\n <text fg={terminalColors.textMuted} width={14}>agents</text>\n <text fg={terminalColors.textMuted} width={14}>synced</text>\n </box>\n <text> </text>\n <text fg={terminalColors.textMuted}>{line}</text>\n <text> </text>\n </box>\n )}\n\n {animPhase >= 3 && (\n <box flexDirection=\"column\">\n <text fg={terminalColors.text}>Works with</text>\n <text> </text>\n {Array(Math.ceil(visibleAgents.agents.length / visibleAgents.perRow))\n .fill(0)\n .map((_, rowIdx) => (\n <box key={rowIdx} flexDirection=\"row\">\n {visibleAgents.agents\n .slice(rowIdx * visibleAgents.perRow, (rowIdx + 1) * visibleAgents.perRow)\n .map(([type, agent]) => {\n const isDetected = detectedAgents.includes(type);\n return (\n <box key={type} width={getAgentWidth()} flexDirection=\"row\">\n <text fg={terminalColors.text}>{agent.icon} {agent.name} </text>\n <text fg={isDetected ? terminalColors.accent : terminalColors.textMuted}>\n {isDetected ? '●' : '○'}\n </text>\n </box>\n );\n })}\n </box>\n ))}\n {visibleAgents.remaining > 0 && (\n <text fg={terminalColors.textMuted}>+{visibleAgents.remaining} more</text>\n )}\n <text> </text>\n <text fg={terminalColors.textMuted}>{line}</text>\n <text> </text>\n </box>\n )}\n\n {animPhase >= 4 && (\n <box flexDirection=\"column\">\n <text fg={terminalColors.text}>Features</text>\n <text> </text>\n {FEATURES.map((feat) => (\n <box key={feat.key} flexDirection=\"row\">\n <text fg={feat.color} width={12}> {feat.key}</text>\n <text fg={terminalColors.textMuted}>{feat.desc}</text>\n </box>\n ))}\n <text> </text>\n </box>\n )}\n\n {animPhase >= 5 && (\n <box flexDirection=\"column\">\n <text fg={terminalColors.textMuted}>{line}</text>\n <text fg={terminalColors.textMuted}>\n {isCompact ? 'b browse m market / help q quit' : 'b browse m market i installed / help q quit'}\n </text>\n </box>\n )}\n </box>\n );\n}\n","/**\n * Navigation state management for SkillKit TUI\n */\nimport type { Screen } from './types.js';\nimport { NAV_KEYS } from './types.js';\n\n/**\n * Navigation state\n */\nexport interface NavigationState {\n currentScreen: Screen;\n previousScreen: Screen | null;\n history: Screen[];\n}\n\n/**\n * Create initial navigation state\n */\nexport function createNavigationState(): NavigationState {\n return {\n currentScreen: 'home',\n previousScreen: null,\n history: ['home'],\n };\n}\n\n/**\n * Navigate to a new screen\n */\nexport function navigateTo(state: NavigationState, screen: Screen): NavigationState {\n if (state.currentScreen === screen) return state;\n\n return {\n currentScreen: screen,\n previousScreen: state.currentScreen,\n history: [...state.history, screen],\n };\n}\n\n/**\n * Go back to previous screen (or home)\n */\nexport function goBack(state: NavigationState): NavigationState {\n const previousScreen = state.previousScreen || 'home';\n return {\n currentScreen: previousScreen,\n previousScreen: state.history[state.history.length - 3] || null,\n history: state.history.slice(0, -1),\n };\n}\n\n/**\n * Get screen from key press\n */\nexport function getScreenFromKey(key: string): Screen | undefined {\n return NAV_KEYS[key];\n}\n\n/**\n * Check if a key is a navigation key\n */\nexport function isNavKey(key: string): boolean {\n return key in NAV_KEYS;\n}\n\nexport { NAV_KEYS };\n","/**\n * Skills state management for SkillKit TUI\n */\nimport { findAllSkills } from '@skillkit/core';\nimport { rmSync } from 'node:fs';\nimport { resolve, normalize } from 'node:path';\nimport { getSearchDirs } from '../utils/helpers.js';\nimport type { SkillItem } from './types.js';\nimport type { AgentType } from '@skillkit/core';\n\n/**\n * Skills store state\n */\nexport interface SkillsState {\n skills: SkillItem[];\n loading: boolean;\n error: string | null;\n}\n\n/**\n * Create initial skills state\n */\nexport function createSkillsState(): SkillsState {\n return {\n skills: [],\n loading: true,\n error: null,\n };\n}\n\n/**\n * Load installed skills\n * @param agentType - Optional agent type to load skills for\n * @returns Updated skills state\n */\nexport function loadSkills(agentType?: AgentType): SkillsState {\n try {\n const searchDirs = getSearchDirs(agentType);\n const foundSkills = findAllSkills(searchDirs);\n\n const skillItems: SkillItem[] = foundSkills.map((s) => ({\n name: s.name,\n description: s.description,\n source: s.metadata?.source,\n enabled: s.enabled,\n }));\n\n return {\n skills: skillItems,\n loading: false,\n error: null,\n };\n } catch (err) {\n return {\n skills: [],\n loading: false,\n error: err instanceof Error ? err.message : 'Failed to load skills',\n };\n }\n}\n\n/**\n * Remove a skill by name\n * @param skillName - Name of the skill to remove\n * @param agentType - Optional agent type\n * @returns true if removed, false otherwise\n */\nexport function removeSkill(skillName: string, agentType?: AgentType): boolean {\n try {\n const searchDirs = getSearchDirs(agentType);\n const allSkills = findAllSkills(searchDirs);\n const skill = allSkills.find((s) => s.name === skillName);\n\n if (skill) {\n const normalizedPath = normalize(resolve(skill.path));\n const isWithinSearchDirs = searchDirs.some((dir) => {\n const normalizedDir = normalize(resolve(dir));\n return normalizedPath.startsWith(normalizedDir + '/') || normalizedPath === normalizedDir;\n });\n\n if (!isWithinSearchDirs) {\n return false;\n }\n\n rmSync(skill.path, { recursive: true, force: true });\n return true;\n }\n return false;\n } catch {\n return false;\n }\n}\n\n/**\n * Filter skills by search query\n */\nexport function filterSkills(skills: SkillItem[], query: string): SkillItem[] {\n if (!query.trim()) return skills;\n\n const lowerQuery = query.toLowerCase();\n return skills.filter(\n (s) =>\n s.name.toLowerCase().includes(lowerQuery) ||\n s.description?.toLowerCase().includes(lowerQuery) ||\n s.source?.toLowerCase().includes(lowerQuery)\n );\n}\n","/**\n * Agent state management for SkillKit TUI\n */\nimport { loadConfig } from '@skillkit/core';\nimport { detectAgent, getAdapter, getAllAdapters } from '@skillkit/agents';\nimport type { AgentType } from '@skillkit/core';\n\n/**\n * Agent status information\n */\nexport interface AgentStatus {\n type: AgentType;\n name: string;\n detected: boolean;\n configured: boolean;\n}\n\n/**\n * Agents state\n */\nexport interface AgentsState {\n agents: AgentStatus[];\n currentAgent: AgentType;\n loading: boolean;\n error: string | null;\n}\n\n/**\n * Create initial agents state\n */\nexport function createAgentsState(): AgentsState {\n return {\n agents: [],\n currentAgent: 'universal',\n loading: true,\n error: null,\n };\n}\n\n/**\n * Load all agents with their detection status\n */\nexport async function loadAgents(): Promise<AgentsState> {\n try {\n const config = loadConfig();\n const currentAgent = config.agent || 'universal';\n const detectedAgent = await detectAgent();\n const allAdapters = getAllAdapters();\n\n const agents: AgentStatus[] = allAdapters.map((adapter) => ({\n type: adapter.type,\n name: adapter.name,\n detected: adapter.type === detectedAgent,\n configured: adapter.type === currentAgent,\n }));\n\n return {\n agents,\n currentAgent,\n loading: false,\n error: null,\n };\n } catch (err) {\n return {\n agents: [],\n currentAgent: 'universal',\n loading: false,\n error: err instanceof Error ? err.message : 'Failed to load agents',\n };\n }\n}\n\n/**\n * Get count of detected agents\n */\nexport function getDetectedAgentCount(state: AgentsState): number {\n return state.agents.filter((a) => a.detected).length;\n}\n\n/**\n * Get list of detected agents\n */\nexport function getDetectedAgents(state: AgentsState): AgentStatus[] {\n return state.agents.filter((a) => a.detected);\n}\n\n/**\n * Get agent adapter by type\n */\nexport function getAgentAdapter(type: AgentType) {\n return getAdapter(type);\n}\n\n/**\n * Total number of supported agents\n */\nexport const TOTAL_AGENTS = 17;\n","/**\n * Marketplace state management for SkillKit TUI\n */\nimport { detectProvider, loadConfig, extractFrontmatter } from '@skillkit/core';\nimport { readFileSync, existsSync, rmSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { SkillItem, RepoInfo, FetchedSkill } from './types.js';\n\n/**\n * Default popular repos - can be extended via config.marketplaceSources\n */\nexport const DEFAULT_REPOS: RepoInfo[] = [\n { source: 'anthropics/skills', name: 'Anthropic Official' },\n { source: 'vercel-labs/agent-skills', name: 'Vercel Labs' },\n { source: 'expo/skills', name: 'Expo / React Native' },\n { source: 'remotion-dev/skills', name: 'Remotion Video' },\n { source: 'ComposioHQ/awesome-claude-skills', name: 'Composio Awesome' },\n { source: 'travisvn/awesome-claude-skills', name: 'Travis Awesome' },\n { source: 'mhattingpete/claude-skills-marketplace', name: 'Skills Marketplace' },\n { source: 'coreyhaines31/marketingskills', name: 'Marketing Skills' },\n { source: 'obra/superpowers', name: 'Superpowers TDD' },\n { source: 'softaworks/agent-toolkit', name: 'Softaworks Toolkit' },\n { source: 'wshobson/agents', name: 'Dev Patterns' },\n { source: 'langgenius/dify', name: 'Dify Frontend' },\n { source: 'trailofbits/skills', name: 'Trail of Bits Security' },\n { source: 'better-auth/skills', name: 'Better Auth' },\n { source: 'onmax/nuxt-skills', name: 'Nuxt / Vue' },\n { source: 'hyf0/vue-skills', name: 'Vue Best Practices' },\n { source: 'jezweb/claude-skills', name: 'Cloudflare / TanStack' },\n { source: 'elysiajs/skills', name: 'ElysiaJS / Bun' },\n { source: 'kadajett/agent-nestjs-skills', name: 'NestJS' },\n { source: 'callstackincubator/agent-skills', name: 'React Native' },\n { source: 'cloudai-x/threejs-skills', name: 'Three.js' },\n { source: 'emalorenzo/three-agent-skills', name: 'Three.js Advanced' },\n { source: 'dimillian/skills', name: 'SwiftUI iOS' },\n { source: 'stripe/ai', name: 'Stripe Payments' },\n { source: 'waynesutton/convexskills', name: 'Convex Backend' },\n { source: 'kepano/obsidian-skills', name: 'Obsidian Notes' },\n { source: 'jimliu/baoyu-skills', name: 'Baoyu Tools' },\n { source: 'giuseppe-trisciuoglio/developer-kit', name: 'Shadcn / Radix' },\n { source: 'openrouterteam/agent-skills', name: 'OpenRouter SDK' },\n { source: 'intellectronica/agent-skills', name: 'Context7' },\n];\n\n/**\n * Marketplace state\n */\nexport interface MarketplaceState {\n allSkills: FetchedSkill[];\n filteredSkills: FetchedSkill[];\n loading: boolean;\n error: string | null;\n currentRepo: string | null;\n fetchedRepos: Set<string>;\n failedRepos: string[];\n repos: RepoInfo[];\n}\n\n/**\n * Get marketplace repos from config or use defaults\n */\nexport function getMarketplaceRepos(): RepoInfo[] {\n try {\n const config = loadConfig();\n if (config.marketplaceSources?.length) {\n const configRepos: RepoInfo[] = config.marketplaceSources.map((source) => ({\n source,\n name: source.split('/').pop() || source,\n }));\n const existingSources = new Set(configRepos.map((r) => r.source));\n for (const repo of DEFAULT_REPOS) {\n if (!existingSources.has(repo.source)) {\n configRepos.push(repo);\n }\n }\n return configRepos;\n }\n } catch {\n // Config load failed, use defaults\n }\n return DEFAULT_REPOS;\n}\n\n/**\n * Create initial marketplace state\n */\nexport function createMarketplaceState(): MarketplaceState {\n return {\n allSkills: [],\n filteredSkills: [],\n loading: false,\n error: null,\n currentRepo: null,\n fetchedRepos: new Set(),\n failedRepos: [],\n repos: getMarketplaceRepos(),\n };\n}\n\n/**\n * Try to read skill description from frontmatter\n */\nexport function readSkillDescription(skillPath: string): string | undefined {\n const skillMdPath = join(skillPath, 'SKILL.md');\n if (!existsSync(skillMdPath)) {\n return undefined;\n }\n try {\n const content = readFileSync(skillMdPath, 'utf-8');\n const frontmatter = extractFrontmatter(content);\n if (frontmatter && typeof frontmatter.description === 'string') {\n return frontmatter.description;\n }\n } catch {\n // Failed to read, return undefined\n }\n return undefined;\n}\n\n/**\n * Fetch skills from a single repository\n */\nexport async function fetchRepoSkills(\n source: string,\n repos: RepoInfo[]\n): Promise<{\n skills: FetchedSkill[];\n tempRoot?: string;\n error?: string;\n}> {\n try {\n const provider = detectProvider(source);\n if (!provider) {\n return { skills: [], error: `Could not detect provider for: ${source}` };\n }\n\n const result = await provider.clone(source, '', { depth: 1 });\n\n if (!result.success || !result.discoveredSkills) {\n return { skills: [], error: result.error || 'Failed to fetch skills' };\n }\n\n const repoName = repos.find((r) => r.source === source)?.name || source;\n const skills: FetchedSkill[] = result.discoveredSkills.map((skill) => ({\n name: skill.name,\n source: source,\n repoName: repoName,\n description: readSkillDescription(skill.path),\n }));\n\n return { skills, tempRoot: result.tempRoot };\n } catch (err) {\n return {\n skills: [],\n error: err instanceof Error ? err.message : 'Failed to fetch repository',\n };\n }\n}\n\n/**\n * Clean up temp directory from fetch\n */\nexport function cleanupTempRoot(tempRoot: string): void {\n try {\n rmSync(tempRoot, { recursive: true, force: true });\n } catch {\n // Ignore cleanup errors\n }\n}\n\n/**\n * Filter skills by search query\n */\nexport function filterMarketplaceSkills(\n skills: FetchedSkill[],\n query: string\n): FetchedSkill[] {\n if (!query.trim()) return skills;\n\n const lowerQuery = query.toLowerCase();\n return skills.filter(\n (s) =>\n s.name.toLowerCase().includes(lowerQuery) ||\n s.source.toLowerCase().includes(lowerQuery) ||\n s.repoName.toLowerCase().includes(lowerQuery) ||\n s.description?.toLowerCase().includes(lowerQuery)\n );\n}\n\n/**\n * Convert fetched skills to skill items for display\n */\nexport function toSkillItems(skills: FetchedSkill[]): SkillItem[] {\n return skills.map((s) => ({\n name: s.name,\n description: s.description || s.repoName,\n source: s.source,\n }));\n}\n\n/**\n * Sort skills alphabetically by name\n */\nexport function sortSkillsByName(skills: FetchedSkill[]): FetchedSkill[] {\n return [...skills].sort((a, b) => a.name.localeCompare(b.name));\n}\n","import { useState, useEffect, useMemo, useCallback } from 'react';\nimport { useKeyboard } from '@opentui/react';\nimport { type Screen, DEFAULT_REPOS } from '../state/index.js';\nimport { terminalColors } from '../theme/colors.js';\n\ninterface BrowseProps {\n onNavigate: (screen: Screen) => void;\n cols?: number;\n rows?: number;\n}\n\nexport function Browse({ onNavigate, cols = 80, rows = 24 }: BrowseProps) {\n const [selectedIndex, setSelectedIndex] = useState(0);\n const [searchQuery, setSearchQuery] = useState('');\n const [searchMode, setSearchMode] = useState(false);\n const [animPhase, setAnimPhase] = useState(0);\n\n const isCompact = cols < 60;\n const contentWidth = Math.max(1, Math.min(cols - 4, 60));\n\n // Entrance animation\n useEffect(() => {\n if (animPhase >= 2) return;\n const timer = setTimeout(() => setAnimPhase(p => p + 1), 100);\n return () => clearTimeout(timer);\n }, [animPhase]);\n\n const repos = useMemo(() =>\n DEFAULT_REPOS.map((r) => ({\n name: r.name,\n source: r.source,\n })),\n []\n );\n\n const filteredRepos = useMemo(() =>\n searchQuery\n ? repos.filter(\n (r) =>\n r.name.toLowerCase().includes(searchQuery.toLowerCase()) ||\n r.source.toLowerCase().includes(searchQuery.toLowerCase())\n )\n : repos,\n [repos, searchQuery]\n );\n\n const handleKeyNav = useCallback((delta: number) => {\n setSelectedIndex(prev => Math.max(0, Math.min(prev + delta, filteredRepos.length - 1)));\n }, [filteredRepos.length]);\n\n useKeyboard((key: { name?: string; sequence?: string }) => {\n if (searchMode) {\n if (key.name === 'escape') {\n setSearchMode(false);\n } else if (key.name === 'backspace') {\n setSearchQuery(prev => prev.slice(0, -1));\n } else if (key.name === 'return') {\n setSearchMode(false);\n } else if (key.sequence && key.sequence.length === 1 && /[a-zA-Z0-9\\-_.]/.test(key.sequence)) {\n setSearchQuery(prev => prev + key.sequence);\n setSelectedIndex(0);\n }\n return;\n }\n\n if (key.name === 'j' || key.name === 'down') handleKeyNav(1);\n else if (key.name === 'k' || key.name === 'up') handleKeyNav(-1);\n else if (key.sequence === '/') setSearchMode(true);\n else if (key.name === 'return') {\n const repo = filteredRepos[selectedIndex];\n if (repo) {\n // Open/view the selected repo (navigate to installed to see skills from this repo)\n onNavigate('installed');\n }\n }\n else if (key.name === 'escape') onNavigate('home');\n });\n\n useEffect(() => {\n if (selectedIndex >= filteredRepos.length && filteredRepos.length > 0) {\n setSelectedIndex(filteredRepos.length - 1);\n }\n }, [filteredRepos.length, selectedIndex]);\n\n // Calculate visible repos\n const maxVisible = Math.max(5, rows - 10);\n const startIdx = Math.max(0, Math.min(selectedIndex - Math.floor(maxVisible / 2), filteredRepos.length - maxVisible));\n const visibleRepos = filteredRepos.slice(startIdx, startIdx + maxVisible);\n\n const divider = useMemo(() =>\n <text fg={terminalColors.textMuted}>{'─'.repeat(contentWidth)}</text>,\n [contentWidth]\n );\n\n const shortcuts = isCompact\n ? 'j/k nav enter open / search esc back'\n : 'j/k navigate enter open / search esc back';\n\n return (\n <box flexDirection=\"column\" padding={1}>\n {/* Header */}\n {animPhase >= 1 && (\n <box flexDirection=\"column\">\n <box flexDirection=\"row\" justifyContent=\"space-between\" width={contentWidth}>\n <text fg={terminalColors.browse}>⌕ Browse</text>\n <text fg={terminalColors.textMuted}>{filteredRepos.length} repos</text>\n </box>\n <text fg={terminalColors.textMuted}>explore skill repositories</text>\n <text> </text>\n </box>\n )}\n\n {/* Search */}\n {animPhase >= 2 && (\n <box flexDirection=\"column\">\n {divider}\n <text> </text>\n <box flexDirection=\"row\">\n <text fg={terminalColors.textMuted}>/ </text>\n <text fg={searchQuery ? terminalColors.text : terminalColors.textMuted}>\n {searchQuery || 'type to filter...'}\n </text>\n </box>\n <text> </text>\n {divider}\n <text> </text>\n </box>\n )}\n\n {/* Repository list */}\n {animPhase >= 2 && (\n <box flexDirection=\"column\">\n <text fg={terminalColors.text}>Repositories</text>\n <text> </text>\n\n {filteredRepos.length === 0 ? (\n <text fg={terminalColors.textMuted}>No repositories match your search</text>\n ) : (\n <box flexDirection=\"column\">\n {visibleRepos.map((repo, idx) => {\n const actualIdx = startIdx + idx;\n const selected = actualIdx === selectedIndex;\n const indicator = selected ? '▸' : ' ';\n // Truncate source if needed - clamp to avoid negative slicing\n const available = Math.max(0, contentWidth - repo.name.length - 6);\n const safeSlice = Math.max(0, available - 3);\n const displaySource = available > 0 && repo.source.length > available\n ? repo.source.slice(0, safeSlice) + '...'\n : repo.source;\n return (\n <box key={repo.source} flexDirection=\"row\">\n <text fg={terminalColors.text}>{indicator}</text>\n <text fg={selected ? terminalColors.accent : terminalColors.text}>\n {repo.name}\n </text>\n <text fg={terminalColors.textMuted}> · {displaySource}</text>\n </box>\n );\n })}\n </box>\n )}\n\n {/* Scroll indicator */}\n {filteredRepos.length > maxVisible && (\n <text fg={terminalColors.textMuted}>\n {'\\n'}showing {startIdx + 1}-{Math.min(startIdx + maxVisible, filteredRepos.length)} of {filteredRepos.length}\n </text>\n )}\n <text> </text>\n </box>\n )}\n\n {/* Footer */}\n {animPhase >= 2 && (\n <box flexDirection=\"column\">\n {divider}\n <text fg={terminalColors.textMuted}>{shortcuts}</text>\n </box>\n )}\n </box>\n );\n}\n","import { useState, useEffect, useMemo, useCallback } from 'react';\nimport { useKeyboard } from '@opentui/react';\nimport { type Screen, loadSkills, filterSkills } from '../state/index.js';\nimport { terminalColors } from '../theme/colors.js';\n\ninterface InstalledProps {\n onNavigate: (screen: Screen) => void;\n cols?: number;\n rows?: number;\n}\n\nconst SPINNER = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];\n\nexport function Installed({ onNavigate, cols = 80, rows = 24 }: InstalledProps) {\n const [selectedIndex, setSelectedIndex] = useState(0);\n const [searchQuery, setSearchQuery] = useState('');\n const [searchMode, setSearchMode] = useState(false);\n const [animPhase, setAnimPhase] = useState(0);\n const [spinnerFrame, setSpinnerFrame] = useState(0);\n const [skills, setSkills] = useState<ReturnType<typeof loadSkills>>({\n skills: [],\n loading: true,\n error: null,\n });\n\n const isCompact = cols < 60;\n const contentWidth = Math.max(1, Math.min(cols - 4, 60));\n\n // Entrance animation\n useEffect(() => {\n if (animPhase >= 2) return;\n const timer = setTimeout(() => setAnimPhase(p => p + 1), 100);\n return () => clearTimeout(timer);\n }, [animPhase]);\n\n // Loading spinner\n useEffect(() => {\n if (!skills.loading) return;\n const interval = setInterval(() => {\n setSpinnerFrame(f => (f + 1) % SPINNER.length);\n }, 80);\n return () => clearInterval(interval);\n }, [skills.loading]);\n\n // Load skills\n useEffect(() => {\n const data = loadSkills();\n setSkills(data);\n }, []);\n\n const filteredSkills = useMemo(() =>\n filterSkills(skills.skills, searchQuery),\n [skills.skills, searchQuery]\n );\n\n const handleKeyNav = useCallback((delta: number) => {\n setSelectedIndex(prev => Math.max(0, Math.min(prev + delta, filteredSkills.length - 1)));\n }, [filteredSkills.length]);\n\n const handleToggle = useCallback(() => {\n if (filteredSkills.length === 0) return;\n const skill = filteredSkills[selectedIndex];\n if (skill) {\n setSkills(prev => ({\n ...prev,\n skills: prev.skills.map(s =>\n s.name === skill.name ? { ...s, enabled: s.enabled === false } : s\n ),\n }));\n }\n }, [filteredSkills, selectedIndex]);\n\n const handleKeyboard = useCallback((key: { name?: string; sequence?: string }) => {\n if (searchMode) {\n if (key.name === 'escape') {\n setSearchMode(false);\n } else if (key.name === 'backspace') {\n setSearchQuery(prev => prev.slice(0, -1));\n } else if (key.name === 'return') {\n setSearchMode(false);\n } else if (key.sequence && key.sequence.length === 1 && /[a-zA-Z0-9\\-_.]/.test(key.sequence)) {\n setSearchQuery(prev => prev + key.sequence);\n setSelectedIndex(0);\n }\n return;\n }\n\n if (key.name === 'j' || key.name === 'down') handleKeyNav(1);\n else if (key.name === 'k' || key.name === 'up') handleKeyNav(-1);\n else if (key.sequence === '/') setSearchMode(true);\n else if (key.name === 'return') handleToggle();\n else if (key.name === 'd') handleToggle();\n else if (key.name === 'escape') onNavigate('home');\n }, [searchMode, handleKeyNav, handleToggle, onNavigate]);\n\n useKeyboard(handleKeyboard);\n\n useEffect(() => {\n if (selectedIndex >= filteredSkills.length && filteredSkills.length > 0) {\n setSelectedIndex(filteredSkills.length - 1);\n }\n }, [filteredSkills.length, selectedIndex]);\n\n // Calculate visible items\n const maxVisible = Math.max(5, rows - 10);\n const startIdx = Math.max(0, Math.min(selectedIndex - Math.floor(maxVisible / 2), filteredSkills.length - maxVisible));\n const visibleSkills = filteredSkills.slice(startIdx, startIdx + maxVisible);\n\n const divider = useMemo(() =>\n <text fg={terminalColors.textMuted}>{'─'.repeat(contentWidth)}</text>,\n [contentWidth]\n );\n\n // Stats\n const enabledCount = skills.skills.filter(s => s.enabled !== false).length;\n const totalCount = skills.skills.length;\n\n const shortcuts = isCompact\n ? 'j/k nav enter toggle d disable esc back'\n : 'j/k navigate enter toggle d disable esc back';\n\n return (\n <box flexDirection=\"column\" padding={1}>\n {/* Header */}\n {animPhase >= 1 && (\n <box flexDirection=\"column\">\n <box flexDirection=\"row\" justifyContent=\"space-between\" width={contentWidth}>\n <text fg={terminalColors.success}>✓ Installed</text>\n <text fg={terminalColors.textMuted}>{enabledCount}/{totalCount} active</text>\n </box>\n <text fg={terminalColors.textMuted}>manage your skills</text>\n <text> </text>\n </box>\n )}\n\n {/* Search */}\n {animPhase >= 2 && (\n <box flexDirection=\"column\">\n {divider}\n <text> </text>\n <box flexDirection=\"row\">\n <text fg={terminalColors.textMuted}>/ </text>\n <text fg={searchQuery ? terminalColors.text : terminalColors.textMuted}>\n {searchQuery || 'type to filter...'}\n </text>\n </box>\n <text> </text>\n {divider}\n <text> </text>\n </box>\n )}\n\n {/* Skills list */}\n {animPhase >= 2 && (\n <box flexDirection=\"column\">\n {skills.loading ? (\n <box flexDirection=\"row\">\n <text fg={terminalColors.accent}>{SPINNER[spinnerFrame]} </text>\n <text fg={terminalColors.text}>Loading skills...</text>\n </box>\n ) : skills.error ? (\n <box flexDirection=\"column\">\n <text fg={terminalColors.error}>✗ Error loading skills</text>\n <text fg={terminalColors.textMuted}>{skills.error}</text>\n </box>\n ) : filteredSkills.length === 0 ? (\n <box flexDirection=\"column\">\n <text fg={terminalColors.textMuted}>\n {skills.skills.length === 0\n ? 'No skills installed yet'\n : 'No skills match your search'}\n </text>\n {skills.skills.length === 0 && (\n <>\n <text> </text>\n <text fg={terminalColors.textMuted}>\n Press 'b' to browse or 'm' for marketplace\n </text>\n </>\n )}\n </box>\n ) : (\n <box flexDirection=\"column\">\n <text fg={terminalColors.text}>Skills</text>\n <text> </text>\n {visibleSkills.map((skill, idx) => {\n const actualIdx = startIdx + idx;\n const selected = actualIdx === selectedIndex;\n const indicator = selected ? '▸' : ' ';\n const statusIcon = skill.enabled !== false ? '●' : '○';\n const statusColor = skill.enabled !== false ? terminalColors.success : terminalColors.textMuted;\n return (\n <box key={skill.name} flexDirection=\"row\">\n <text fg={terminalColors.text}>{indicator}</text>\n <text fg={statusColor}>{statusIcon} </text>\n <text fg={selected ? terminalColors.accent : terminalColors.text}>\n {skill.name}\n </text>\n </box>\n );\n })}\n\n {/* Scroll indicator */}\n {filteredSkills.length > maxVisible && (\n <text fg={terminalColors.textMuted}>\n {'\\n'}showing {startIdx + 1}-{Math.min(startIdx + maxVisible, filteredSkills.length)} of {filteredSkills.length}\n </text>\n )}\n </box>\n )}\n <text> </text>\n </box>\n )}\n\n {/* Footer */}\n {animPhase >= 2 && (\n <box flexDirection=\"column\">\n {divider}\n <text fg={terminalColors.textMuted}>{shortcuts}</text>\n </box>\n )}\n </box>\n );\n}\n","import { useState, useEffect, useMemo, useCallback } from 'react';\nimport { useKeyboard } from '@opentui/react';\nimport { type Screen, DEFAULT_REPOS } from '../state/index.js';\nimport { terminalColors } from '../theme/colors.js';\n\ninterface MarketplaceProps {\n onNavigate: (screen: Screen) => void;\n cols?: number;\n rows?: number;\n}\n\nconst CATEGORIES = [\n { name: 'Development', count: 24 },\n { name: 'Testing', count: 18 },\n { name: 'DevOps', count: 15 },\n { name: 'Security', count: 12 },\n];\n\nexport function Marketplace({ onNavigate, cols = 80, rows = 24 }: MarketplaceProps) {\n const [selectedIndex, setSelectedIndex] = useState(0);\n const [animPhase, setAnimPhase] = useState(0);\n\n const isCompact = cols < 60;\n const contentWidth = Math.max(1, Math.min(cols - 4, 60));\n\n // Entrance animation\n useEffect(() => {\n if (animPhase >= 3) return;\n const timer = setTimeout(() => setAnimPhase(p => p + 1), 100);\n return () => clearTimeout(timer);\n }, [animPhase]);\n\n // Featured repos\n const featured = useMemo(() =>\n DEFAULT_REPOS.slice(0, 5).map((r, i) => ({\n name: r.name,\n stars: Math.floor(100 - i * 15),\n source: r.source,\n })),\n []\n );\n\n const maxVisible = Math.max(3, Math.floor((rows - 14) / 1));\n const visibleFeatured = featured.slice(0, maxVisible);\n\n const handleKeyNav = useCallback((delta: number) => {\n setSelectedIndex(prev => Math.max(0, Math.min(prev + delta, visibleFeatured.length - 1)));\n }, [visibleFeatured.length]);\n\n const handleInstall = useCallback(() => {\n const item = visibleFeatured[selectedIndex];\n if (item) {\n // Navigate to installed after \"installing\"\n onNavigate('installed');\n }\n }, [selectedIndex, visibleFeatured, onNavigate]);\n\n useKeyboard((key: { name?: string }) => {\n if (key.name === 'j' || key.name === 'down') handleKeyNav(1);\n else if (key.name === 'k' || key.name === 'up') handleKeyNav(-1);\n else if (key.name === 'return') handleInstall();\n else if (key.name === 'b') onNavigate('browse');\n else if (key.name === 'escape') onNavigate('home');\n });\n\n const divider = useMemo(() =>\n <text fg={terminalColors.textMuted}>{'─'.repeat(contentWidth)}</text>,\n [contentWidth]\n );\n\n const shortcuts = isCompact\n ? 'j/k nav enter install b browse esc back'\n : 'j/k navigate enter install b full browse esc back';\n\n return (\n <box flexDirection=\"column\" padding={1}>\n {/* Header */}\n {animPhase >= 1 && (\n <box flexDirection=\"column\">\n <box flexDirection=\"row\" justifyContent=\"space-between\" width={contentWidth}>\n <text fg={terminalColors.recommend}>★ Marketplace</text>\n <text fg={terminalColors.textMuted}>{DEFAULT_REPOS.length} available</text>\n </box>\n <text fg={terminalColors.textMuted}>discover featured skills</text>\n <text> </text>\n </box>\n )}\n\n {/* Categories */}\n {animPhase >= 2 && (\n <box flexDirection=\"column\">\n {divider}\n <text> </text>\n <text fg={terminalColors.text}>Categories</text>\n <text> </text>\n <box flexDirection=\"row\" gap={2}>\n {CATEGORIES.map(cat => (\n <text key={cat.name} fg={terminalColors.textMuted}>\n {cat.name} ({cat.count})\n </text>\n ))}\n </box>\n <text> </text>\n {divider}\n <text> </text>\n </box>\n )}\n\n {/* Featured section */}\n {animPhase >= 3 && (\n <box flexDirection=\"column\">\n <box flexDirection=\"row\">\n <text fg={terminalColors.text}>Featured</text>\n <text fg={terminalColors.textMuted}> · trending</text>\n </box>\n <text> </text>\n\n {visibleFeatured.map((item, idx) => {\n const selected = idx === selectedIndex;\n const indicator = selected ? '▸' : ' ';\n return (\n <box key={item.source} flexDirection=\"row\">\n <text fg={terminalColors.text}>{indicator}</text>\n <text fg={selected ? terminalColors.accent : terminalColors.text}>\n {item.name}\n </text>\n <text fg={terminalColors.recommend}> ★{item.stars}</text>\n </box>\n );\n })}\n\n {featured.length > maxVisible && (\n <text fg={terminalColors.textMuted}>\n {'\\n'}+{featured.length - maxVisible} more\n </text>\n )}\n <text> </text>\n </box>\n )}\n\n {/* Footer */}\n {animPhase >= 3 && (\n <box flexDirection=\"column\">\n {divider}\n <text fg={terminalColors.textMuted}>{shortcuts}</text>\n </box>\n )}\n </box>\n );\n}\n","import { useState, useEffect, useMemo, useCallback } from 'react';\nimport { useKeyboard } from '@opentui/react';\nimport { type Screen } from '../state/index.js';\nimport { terminalColors } from '../theme/colors.js';\n\ninterface RecommendProps {\n onNavigate: (screen: Screen) => void;\n cols?: number;\n rows?: number;\n}\n\nconst SPINNER = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];\n\nexport function Recommend({ onNavigate, cols = 80, rows = 24 }: RecommendProps) {\n const [selectedIndex, setSelectedIndex] = useState(0);\n const [analyzing, setAnalyzing] = useState(true);\n const [spinnerFrame, setSpinnerFrame] = useState(0);\n const [animPhase, setAnimPhase] = useState(0);\n const [analysisProgress, setAnalysisProgress] = useState(0);\n\n const isCompact = cols < 60;\n const contentWidth = Math.max(1, Math.min(cols - 4, 60));\n\n useEffect(() => {\n if (animPhase >= 3) return;\n const timer = setTimeout(() => setAnimPhase(p => p + 1), 100);\n return () => clearTimeout(timer);\n }, [animPhase]);\n\n useEffect(() => {\n if (!analyzing) return;\n const interval = setInterval(() => {\n setSpinnerFrame(f => (f + 1) % SPINNER.length);\n }, 80);\n return () => clearInterval(interval);\n }, [analyzing]);\n\n // Simulate analysis\n useEffect(() => {\n if (!analyzing) return;\n const interval = setInterval(() => {\n setAnalysisProgress(p => {\n if (p >= 100) {\n setAnalyzing(false);\n return 100;\n }\n return p + Math.random() * 15 + 5;\n });\n }, 200);\n return () => clearInterval(interval);\n }, [analyzing]);\n\n // Recommendations data\n const recommendations = useMemo(() => [\n { name: 'tdd-workflow', reason: 'Based on your test files and coverage patterns', confidence: 95 },\n { name: 'react-patterns', reason: 'Detected React in package.json with hooks usage', confidence: 88 },\n { name: 'typescript-strict', reason: 'tsconfig.json found with strict mode disabled', confidence: 82 },\n { name: 'git-workflow', reason: '.git directory with complex branching detected', confidence: 75 },\n { name: 'api-design', reason: 'REST endpoints found in your codebase', confidence: 68 },\n { name: 'docker-compose', reason: 'docker-compose.yml detected for orchestration', confidence: 62 },\n ], []);\n\n const maxVisible = Math.max(3, Math.floor((rows - 10) / 2));\n const visibleRecs = recommendations.slice(0, maxVisible);\n\n const handleKeyNav = useCallback((delta: number) => {\n setSelectedIndex(prev => Math.max(0, Math.min(prev + delta, visibleRecs.length - 1)));\n }, [visibleRecs.length]);\n\n const handleRefresh = useCallback(() => {\n setAnalyzing(true);\n setAnalysisProgress(0);\n setSelectedIndex(0);\n }, []);\n\n const handleInstall = useCallback(() => {\n if (analyzing) return;\n const rec = visibleRecs[selectedIndex];\n if (rec) {\n // Navigate to installed after \"installing\"\n onNavigate('installed');\n }\n }, [analyzing, selectedIndex, visibleRecs, onNavigate]);\n\n useKeyboard((key: { name?: string }) => {\n if (key.name === 'j' || key.name === 'down') handleKeyNav(1);\n else if (key.name === 'k' || key.name === 'up') handleKeyNav(-1);\n else if (key.name === 'return') handleInstall();\n else if (key.name === 'r') handleRefresh();\n else if (key.name === 'escape') onNavigate('home');\n });\n\n const divider = useMemo(() =>\n <text fg={terminalColors.textMuted}>{'─'.repeat(contentWidth)}</text>,\n [contentWidth]\n );\n\n // Confidence color\n const getConfColor = (conf: number) => {\n if (conf >= 80) return terminalColors.success;\n if (conf >= 60) return terminalColors.recommend;\n return terminalColors.textMuted;\n };\n\n const shortcuts = isCompact\n ? 'j/k nav enter install r refresh esc back'\n : 'j/k navigate enter install r refresh esc back';\n\n return (\n <box flexDirection=\"column\" padding={1}>\n {/* Header */}\n {animPhase >= 1 && (\n <box flexDirection=\"column\">\n <box flexDirection=\"row\" justifyContent=\"space-between\" width={contentWidth}>\n <text fg={terminalColors.recommend}>◎ Recommendations</text>\n <text fg={terminalColors.textMuted}>\n {analyzing ? 'analyzing...' : `${recommendations.length} found`}\n </text>\n </box>\n <text fg={terminalColors.textMuted}>AI skill suggestions</text>\n <text> </text>\n </box>\n )}\n\n {/* Analysis progress */}\n {animPhase >= 2 && analyzing && (\n <box flexDirection=\"column\">\n {divider}\n <text> </text>\n <box flexDirection=\"row\">\n <text fg={terminalColors.accent}>{SPINNER[spinnerFrame]} </text>\n <text fg={terminalColors.text}>Analyzing</text>\n <text fg={terminalColors.textMuted}> your project...</text>\n </box>\n <text> </text>\n {divider}\n <text> </text>\n </box>\n )}\n\n {/* Results summary */}\n {animPhase >= 2 && !analyzing && (\n <box flexDirection=\"column\">\n {divider}\n <text> </text>\n <box flexDirection=\"row\">\n <text fg={terminalColors.success}>✓ </text>\n <text fg={terminalColors.text}>Analysis complete</text>\n <text fg={terminalColors.textMuted}> · found {recommendations.length} matching skills</text>\n </box>\n <text> </text>\n {divider}\n <text> </text>\n </box>\n )}\n\n {/* Recommendations list */}\n {animPhase >= 3 && !analyzing && (\n <box flexDirection=\"column\">\n <text fg={terminalColors.text}>Suggested Skills</text>\n <text> </text>\n\n {visibleRecs.map((rec, idx) => {\n const selected = idx === selectedIndex;\n const indicator = selected ? '▸' : ' ';\n return (\n <box key={rec.name} flexDirection=\"column\">\n <box flexDirection=\"row\">\n <text fg={terminalColors.text}>{indicator}</text>\n <text fg={selected ? terminalColors.accent : terminalColors.text}>\n {rec.name}\n </text>\n <text fg={getConfColor(rec.confidence)}> {rec.confidence}%</text>\n </box>\n <text fg={terminalColors.textMuted}> {rec.reason}</text>\n <text> </text>\n </box>\n );\n })}\n\n {recommendations.length > maxVisible && (\n <text fg={terminalColors.textMuted}>\n +{recommendations.length - maxVisible} more\n </text>\n )}\n <text> </text>\n </box>\n )}\n\n {/* Footer */}\n {animPhase >= 3 && (\n <box flexDirection=\"column\">\n {divider}\n <text fg={terminalColors.textMuted}>{shortcuts}</text>\n </box>\n )}\n </box>\n );\n}\n","/**\n * Translate Screen\n * Skill format conversion with diff view\n */\nimport { useState } from 'react';\nimport { type Screen } from '../state/index.js';\nimport { terminalColors } from '../theme/colors.js';\nimport { AGENT_LOGOS } from '../theme/symbols.js';\nimport { Header } from '../components/Header.js';\n\ninterface TranslateProps {\n onNavigate: (screen: Screen) => void;\n cols?: number;\n rows?: number;\n}\n\nexport function Translate(_props: TranslateProps) {\n const [sourceAgent] = useState('claude-code');\n const [targetAgent] = useState('cursor');\n\n const sourceInfo = AGENT_LOGOS[sourceAgent];\n const targetInfo = AGENT_LOGOS[targetAgent];\n\n return (\n <box flexDirection=\"column\" paddingLeft={1}>\n <Header\n title=\"Translate Skills\"\n subtitle=\"Convert skills between agent formats\"\n icon=\"⇄\"\n />\n\n <box flexDirection=\"row\" marginTop={1} marginBottom={1}>\n <box flexDirection=\"column\" width={25}>\n <text fg={terminalColors.textMuted}>Source Agent</text>\n <text fg={terminalColors.accent}>\n <b>{sourceInfo?.icon} {sourceInfo?.name}</b>\n </text>\n </box>\n <text fg={terminalColors.textMuted}> → </text>\n <box flexDirection=\"column\" width={25}>\n <text fg={terminalColors.textMuted}>Target Agent</text>\n <text fg={terminalColors.text}>\n <b>{targetInfo?.icon} {targetInfo?.name}</b>\n </text>\n </box>\n </box>\n\n <text fg={terminalColors.textMuted}>\n {'\\u2500'.repeat(50)}\n </text>\n <text> </text>\n\n <text fg={terminalColors.text}><b>Select a skill to translate:</b></text>\n <text> </text>\n <text fg={terminalColors.textMuted}>\n No skills selected. Press 'i' to view installed skills.\n </text>\n <text> </text>\n <text fg={terminalColors.textMuted}>\n Use Tab to switch agents, Enter to translate\n </text>\n </box>\n );\n}\n","/**\n * Header Component\n * Screen header with title and optional badge/count\n */\nimport { terminalColors } from '../theme/colors.js';\nimport { symbols } from '../theme/symbols.js';\n\ninterface HeaderProps {\n title: string;\n subtitle?: string;\n count?: number;\n badge?: string;\n icon?: string;\n}\n\nexport function Header({ title, subtitle, count, badge, icon }: HeaderProps) {\n return (\n <box flexDirection=\"column\" marginBottom={1}>\n <box flexDirection=\"row\" gap={2}>\n <text fg={terminalColors.text}>\n <b>{icon && `${icon} `}{title}</b>\n </text>\n {count !== undefined && (\n <text fg={terminalColors.textMuted}>({count})</text>\n )}\n {badge && (\n <text fg={terminalColors.accent}>[{badge}]</text>\n )}\n </box>\n {subtitle && (\n <text fg={terminalColors.textSecondary}>{subtitle}</text>\n )}\n </box>\n );\n}\n","/**\n * Context Screen\n * Project context analysis\n */\nimport { useState, useEffect } from 'react';\nimport { type Screen } from '../state/index.js';\nimport { terminalColors } from '../theme/colors.js';\nimport { Header } from '../components/Header.js';\nimport { Spinner } from '../components/Spinner.js';\n\ninterface ContextProps {\n onNavigate: (screen: Screen) => void;\n cols?: number;\n rows?: number;\n}\n\nexport function Context({ onNavigate, cols = 80, rows = 24 }: ContextProps) {\n const [loading, setLoading] = useState(true);\n\n useEffect(() => {\n const timer = setTimeout(() => setLoading(false), 500);\n return () => clearTimeout(timer);\n }, []);\n\n const contextInfo = [\n { label: 'Working Directory', value: process.cwd() },\n { label: 'Node Version', value: process.version },\n { label: 'Platform', value: process.platform },\n { label: 'Architecture', value: process.arch },\n ];\n\n return (\n <box flexDirection=\"column\" paddingLeft={1}>\n <Header\n title=\"Project Context\"\n subtitle=\"Analyze your project environment\"\n icon=\"◉\"\n />\n\n {loading ? (\n <Spinner label=\"Analyzing project context...\" />\n ) : (\n <box flexDirection=\"column\">\n {contextInfo.map((info) => (\n <box key={info.label} flexDirection=\"row\" marginBottom={1}>\n <text fg={terminalColors.textMuted} width={20}>\n {info.label}:\n </text>\n <text fg={terminalColors.text}>{info.value}</text>\n </box>\n ))}\n </box>\n )}\n </box>\n );\n}\n","/**\n * Spinner Component\n * Loading indicator with animated frames\n */\nimport { useState, useEffect } from 'react';\nimport { terminalColors } from '../theme/colors.js';\nimport { symbols } from '../theme/symbols.js';\n\ninterface SpinnerProps {\n label?: string;\n color?: keyof typeof terminalColors;\n}\n\nexport function Spinner({ label, color = 'accent' }: SpinnerProps) {\n const [frame, setFrame] = useState(0);\n\n useEffect(() => {\n const interval = setInterval(() => {\n setFrame((f) => (f + 1) % symbols.spinner.length);\n }, 80);\n return () => clearInterval(interval);\n }, []);\n\n return (\n <box flexDirection=\"row\" gap={1}>\n <text fg={terminalColors[color]}>{symbols.spinner[frame]}</text>\n {label && <text fg={terminalColors.text}>{label}</text>}\n </box>\n );\n}\n","/**\n * Sync Screen - Cross-Agent Synchronization\n * Clean monochromatic design\n */\nimport { useState, useEffect, useMemo, useCallback, useRef } from 'react';\nimport { useKeyboard } from '@opentui/react';\nimport { type Screen } from '../state/index.js';\nimport { terminalColors } from '../theme/colors.js';\nimport { AGENT_LOGOS } from '../theme/symbols.js';\n\ninterface SyncProps {\n onNavigate: (screen: Screen) => void;\n cols?: number;\n rows?: number;\n}\n\nconst SPINNER = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];\n\nexport function Sync({ onNavigate, cols = 80, rows = 24 }: SyncProps) {\n const [selectedIndex, setSelectedIndex] = useState(0);\n const [syncStatus, setSyncStatus] = useState<'idle' | 'syncing' | 'done'>('idle');\n const [spinnerFrame, setSpinnerFrame] = useState(0);\n const [animPhase, setAnimPhase] = useState(0);\n const syncTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const isCompact = cols < 60;\n const contentWidth = Math.max(1, Math.min(cols - 4, 60));\n\n // Cleanup timeout on unmount\n useEffect(() => {\n return () => {\n if (syncTimeoutRef.current) {\n clearTimeout(syncTimeoutRef.current);\n }\n };\n }, []);\n\n // Entrance animation\n useEffect(() => {\n if (animPhase >= 2) return;\n const timer = setTimeout(() => setAnimPhase(p => p + 1), 100);\n return () => clearTimeout(timer);\n }, [animPhase]);\n\n // Spinner animation\n useEffect(() => {\n if (syncStatus !== 'syncing') return;\n const interval = setInterval(() => {\n setSpinnerFrame(f => (f + 1) % SPINNER.length);\n }, 80);\n return () => clearInterval(interval);\n }, [syncStatus]);\n\n // Agents with sync data\n const agents = useMemo(() => {\n const agentTypes = ['claude-code', 'cursor', 'github-copilot', 'codex', 'gemini-cli', 'windsurf'];\n return agentTypes.slice(0, isCompact ? 4 : 6).map((type) => ({\n type,\n ...(AGENT_LOGOS[type] || { name: type, icon: '◇' }),\n synced: type === 'claude-code' || type === 'cursor',\n skillCount: type === 'claude-code' ? 12 : type === 'cursor' ? 8 : 0,\n }));\n }, [isCompact]);\n\n const syncedCount = agents.filter(a => a.synced).length;\n const totalSkills = agents.reduce((sum, a) => sum + a.skillCount, 0);\n\n const handleKeyNav = useCallback((delta: number) => {\n setSelectedIndex(prev => Math.max(0, Math.min(prev + delta, agents.length - 1)));\n }, [agents.length]);\n\n const handleSync = useCallback(() => {\n if (syncStatus === 'syncing') return;\n if (syncTimeoutRef.current) clearTimeout(syncTimeoutRef.current);\n setSyncStatus('syncing');\n syncTimeoutRef.current = setTimeout(() => setSyncStatus('done'), 1500);\n }, [syncStatus]);\n\n const handleSyncAll = useCallback(() => {\n if (syncStatus === 'syncing') return;\n if (syncTimeoutRef.current) clearTimeout(syncTimeoutRef.current);\n setSyncStatus('syncing');\n syncTimeoutRef.current = setTimeout(() => setSyncStatus('done'), 2000);\n }, [syncStatus]);\n\n // Clamp selectedIndex when agents list shrinks\n useEffect(() => {\n setSelectedIndex(prev => Math.max(0, Math.min(prev, agents.length - 1)));\n }, [agents.length]);\n\n useKeyboard((key: { name?: string }) => {\n if (key.name === 'j' || key.name === 'down') handleKeyNav(1);\n else if (key.name === 'k' || key.name === 'up') handleKeyNav(-1);\n else if (key.name === 'return') handleSync();\n else if (key.name === 'a') handleSyncAll();\n else if (key.name === 'escape') onNavigate('home');\n });\n\n const divider = useMemo(() =>\n <text fg={terminalColors.textMuted}>{'─'.repeat(contentWidth)}</text>,\n [contentWidth]\n );\n\n const shortcuts = isCompact\n ? 'j/k nav enter sync a sync all esc back'\n : 'j/k navigate enter sync selected a sync all esc back';\n\n return (\n <box flexDirection=\"column\" padding={1}>\n {/* Header */}\n {animPhase >= 1 && (\n <box flexDirection=\"column\">\n <box flexDirection=\"row\" justifyContent=\"space-between\" width={contentWidth}>\n <text fg={terminalColors.sync}>⇄ Sync</text>\n <text fg={terminalColors.textMuted}>{syncedCount}/{agents.length} synced</text>\n </box>\n <text fg={terminalColors.textMuted}>share skills across agents</text>\n <text> </text>\n </box>\n )}\n\n {/* Status */}\n {animPhase >= 2 && (\n <box flexDirection=\"column\">\n {divider}\n <text> </text>\n {syncStatus === 'syncing' ? (\n <box flexDirection=\"row\">\n <text fg={terminalColors.accent}>{SPINNER[spinnerFrame]} </text>\n <text fg={terminalColors.text}>Syncing skills...</text>\n </box>\n ) : syncStatus === 'done' ? (\n <box flexDirection=\"row\">\n <text fg={terminalColors.success}>✓ </text>\n <text fg={terminalColors.text}>Sync complete</text>\n <text fg={terminalColors.textMuted}> · {totalSkills} skills synced</text>\n </box>\n ) : (\n <box flexDirection=\"row\" gap={3}>\n <text fg={terminalColors.success}>● {syncedCount} synced</text>\n <text fg={terminalColors.textMuted}>○ {agents.length - syncedCount} pending</text>\n </box>\n )}\n <text> </text>\n {divider}\n <text> </text>\n </box>\n )}\n\n {/* Agents list */}\n {animPhase >= 2 && (\n <box flexDirection=\"column\">\n <text fg={terminalColors.text}>Agents</text>\n <text> </text>\n\n {agents.map((agent, idx) => {\n const selected = idx === selectedIndex;\n const indicator = selected ? '▸' : ' ';\n const statusIcon = agent.synced ? '●' : '○';\n const statusColor = agent.synced ? terminalColors.success : terminalColors.textMuted;\n return (\n <box key={agent.type} flexDirection=\"row\">\n <text fg={terminalColors.text}>{indicator}</text>\n <text fg={selected ? terminalColors.accent : terminalColors.text}>\n {agent.icon} {agent.name}\n </text>\n <text fg={statusColor}> {statusIcon}</text>\n <text fg={terminalColors.textMuted}> {agent.skillCount} skills</text>\n </box>\n );\n })}\n <text> </text>\n </box>\n )}\n\n {/* Footer */}\n {animPhase >= 2 && (\n <box flexDirection=\"column\">\n {divider}\n <text fg={terminalColors.textMuted}>{shortcuts}</text>\n </box>\n )}\n </box>\n );\n}\n","/**\n * Memory Screen\n * Session memory management\n */\nimport { type Screen } from '../state/index.js';\nimport { terminalColors } from '../theme/colors.js';\nimport { Header } from '../components/Header.js';\n\ninterface MemoryProps {\n onNavigate: (screen: Screen) => void;\n cols?: number;\n rows?: number;\n}\n\nexport function Memory({ onNavigate, cols = 80, rows = 24 }: MemoryProps) {\n const memories = [\n { key: 'project-context', size: '2.4 KB', updated: '2 min ago' },\n { key: 'user-preferences', size: '1.1 KB', updated: '5 min ago' },\n { key: 'session-history', size: '4.7 KB', updated: '1 min ago' },\n ];\n\n return (\n <box flexDirection=\"column\" paddingLeft={1}>\n <Header\n title=\"Memory\"\n subtitle=\"Manage persistent session memory\"\n count={memories.length}\n icon=\"◎\"\n />\n\n <text fg={terminalColors.text}><b>Stored Memories</b></text>\n <text> </text>\n\n {memories.map((mem, idx) => (\n <box key={mem.key} flexDirection=\"row\" marginBottom={1}>\n <text fg={idx === 0 ? terminalColors.accent : terminalColors.text} width={25}>\n {idx === 0 ? '\\u25B8 ' : ' '}{mem.key}\n </text>\n <text fg={terminalColors.textMuted} width={12}>{mem.size}</text>\n <text fg={terminalColors.textMuted}>{mem.updated}</text>\n </box>\n ))}\n\n <text> </text>\n <text fg={terminalColors.textMuted}>\n Press Enter to view, 'd' to delete, 'c' to clear all\n </text>\n </box>\n );\n}\n","/**\n * Workflow Screen - Automation Builder\n * Clean monochromatic design\n */\nimport { useState, useEffect, useMemo, useCallback } from 'react';\nimport { useKeyboard } from '@opentui/react';\nimport { type Screen } from '../state/index.js';\nimport { terminalColors } from '../theme/colors.js';\n\ninterface WorkflowProps {\n onNavigate: (screen: Screen) => void;\n cols?: number;\n rows?: number;\n}\n\nconst WORKFLOWS = [\n { name: 'test-and-commit', steps: 3, lastRun: '1 hour ago', status: 'success' as const },\n { name: 'deploy-preview', steps: 5, lastRun: '2 hours ago', status: 'success' as const },\n { name: 'full-ci', steps: 8, lastRun: '1 day ago', status: 'failed' as const },\n { name: 'quick-fix', steps: 2, lastRun: '3 days ago', status: 'pending' as const },\n];\n\nexport function Workflow({ onNavigate, cols = 80, rows = 24 }: WorkflowProps) {\n const [selectedIndex, setSelectedIndex] = useState(0);\n const [animPhase, setAnimPhase] = useState(0);\n\n const isCompact = cols < 60;\n const contentWidth = Math.max(1, Math.min(cols - 4, 60));\n\n // Entrance animation\n useEffect(() => {\n if (animPhase >= 2) return;\n const timer = setTimeout(() => setAnimPhase(p => p + 1), 100);\n return () => clearTimeout(timer);\n }, [animPhase]);\n\n const successCount = WORKFLOWS.filter(w => w.status === 'success').length;\n const failedCount = WORKFLOWS.filter(w => w.status === 'failed').length;\n\n const handleKeyNav = useCallback((delta: number) => {\n setSelectedIndex(prev => Math.max(0, Math.min(prev + delta, WORKFLOWS.length - 1)));\n }, []);\n\n useKeyboard((key: { name?: string }) => {\n if (key.name === 'j' || key.name === 'down') handleKeyNav(1);\n else if (key.name === 'k' || key.name === 'up') handleKeyNav(-1);\n else if (key.name === 'escape') onNavigate('home');\n });\n\n const divider = useMemo(() =>\n <text fg={terminalColors.textMuted}>{'─'.repeat(contentWidth)}</text>,\n [contentWidth]\n );\n\n const shortcuts = isCompact\n ? 'j/k nav esc back'\n : 'j/k navigate esc back';\n\n return (\n <box flexDirection=\"column\" padding={1}>\n {/* Header */}\n {animPhase >= 1 && (\n <box flexDirection=\"column\">\n <box flexDirection=\"row\" justifyContent=\"space-between\" width={contentWidth}>\n <text fg={terminalColors.workflow}>⟳ Workflows</text>\n <text fg={terminalColors.textMuted}>{WORKFLOWS.length} workflows</text>\n </box>\n <text fg={terminalColors.textMuted}>automate skill chains</text>\n <text> </text>\n </box>\n )}\n\n {/* Stats */}\n {animPhase >= 2 && (\n <box flexDirection=\"column\">\n {divider}\n <text> </text>\n <box flexDirection=\"row\" gap={3}>\n <text fg={terminalColors.success}>✓ {successCount} passed</text>\n {failedCount > 0 && (\n <text fg={terminalColors.error}>✗ {failedCount} failed</text>\n )}\n </box>\n <text> </text>\n {divider}\n <text> </text>\n </box>\n )}\n\n {/* Workflows list */}\n {animPhase >= 2 && (\n <box flexDirection=\"column\">\n <text fg={terminalColors.text}>Workflows</text>\n <text> </text>\n\n {WORKFLOWS.length === 0 ? (\n <box flexDirection=\"column\">\n <text fg={terminalColors.textMuted}>No workflows yet</text>\n </box>\n ) : (\n WORKFLOWS.map((wf, idx) => {\n const selected = idx === selectedIndex;\n const indicator = selected ? '▸' : ' ';\n const statusIcon = wf.status === 'success' ? '✓'\n : wf.status === 'failed' ? '✗' : '○';\n const statusColor = wf.status === 'success' ? terminalColors.success\n : wf.status === 'failed' ? terminalColors.error : terminalColors.textMuted;\n return (\n <box key={wf.name} flexDirection=\"row\">\n <text fg={terminalColors.text}>{indicator}</text>\n <text fg={selected ? terminalColors.accent : terminalColors.text} width={18}>\n {wf.name}\n </text>\n <text fg={statusColor}>{statusIcon} </text>\n <text fg={terminalColors.textMuted}>{wf.steps}s · {wf.lastRun}</text>\n </box>\n );\n })\n )}\n <text> </text>\n </box>\n )}\n\n {/* Footer */}\n {animPhase >= 2 && (\n <box flexDirection=\"column\">\n {divider}\n <text fg={terminalColors.textMuted}>{shortcuts}</text>\n </box>\n )}\n </box>\n );\n}\n","/**\n * Execute Screen\n * Live skill execution\n */\nimport { useState } from 'react';\nimport { type Screen } from '../state/index.js';\nimport { terminalColors } from '../theme/colors.js';\nimport { Header } from '../components/Header.js';\nimport { Spinner } from '../components/Spinner.js';\nimport { ProgressBar } from '../components/ProgressBar.js';\n\ninterface ExecuteProps {\n onNavigate: (screen: Screen) => void;\n cols?: number;\n rows?: number;\n}\n\nexport function Execute({ onNavigate, cols = 80, rows = 24 }: ExecuteProps) {\n const [executing, setExecuting] = useState(false);\n const [progress, setProgress] = useState(0);\n\n return (\n <box flexDirection=\"column\" paddingLeft={1}>\n <Header\n title=\"Execute\"\n subtitle=\"Run skills in real-time\"\n icon=\"▶\"\n />\n\n {executing ? (\n <box flexDirection=\"column\">\n <Spinner label=\"Executing skill...\" />\n <text> </text>\n <ProgressBar progress={progress} width={40} />\n <text> </text>\n <text fg={terminalColors.textMuted}>Press Esc to cancel</text>\n </box>\n ) : (\n <box flexDirection=\"column\">\n <text fg={terminalColors.text}>Select a skill to execute:</text>\n <text> </text>\n <text fg={terminalColors.textMuted}>\n No skills available. Install skills first using 'b' (browse) or 'm' (marketplace).\n </text>\n <text> </text>\n <text fg={terminalColors.textMuted}>\n Press Enter to execute, 'i' to view installed skills\n </text>\n </box>\n )}\n </box>\n );\n}\n","/**\n * ProgressBar Component\n * Animated progress bar display\n */\nimport { terminalColors } from '../theme/colors.js';\nimport { symbols } from '../theme/symbols.js';\n\ninterface ProgressBarProps {\n progress: number; // 0-100\n width?: number;\n showPercentage?: boolean;\n color?: keyof typeof terminalColors;\n}\n\nexport function ProgressBar({\n progress,\n width = 20,\n showPercentage = true,\n color = 'accent',\n}: ProgressBarProps) {\n const clampedProgress = Math.max(0, Math.min(100, progress));\n const filledWidth = Math.round((clampedProgress / 100) * width);\n const emptyWidth = width - filledWidth;\n\n const filled = symbols.progressFilled.repeat(filledWidth);\n const empty = symbols.progressEmpty.repeat(emptyWidth);\n\n return (\n <box flexDirection=\"row\" gap={1}>\n <text>\n <span fg={terminalColors[color]}>{filled}</span>\n <span fg={terminalColors.textMuted}>{empty}</span>\n </text>\n {showPercentage && (\n <text fg={terminalColors.textSecondary}>\n {Math.round(clampedProgress)}%\n </text>\n )}\n </box>\n );\n}\n","/**\n * History Screen\n * Execution history\n */\nimport { type Screen } from '../state/index.js';\nimport { terminalColors } from '../theme/colors.js';\nimport { Header } from '../components/Header.js';\n\ninterface HistoryProps {\n onNavigate: (screen: Screen) => void;\n cols?: number;\n rows?: number;\n}\n\nexport function History({ onNavigate, cols = 80, rows = 24 }: HistoryProps) {\n const history = [\n { skill: 'tdd-workflow', time: '10:32 AM', duration: '2.3s', status: 'success' },\n { skill: 'code-review', time: '10:15 AM', duration: '5.1s', status: 'success' },\n { skill: 'deploy-check', time: '09:45 AM', duration: '8.7s', status: 'failed' },\n { skill: 'lint-fix', time: '09:30 AM', duration: '1.2s', status: 'success' },\n ];\n\n return (\n <box flexDirection=\"column\" paddingLeft={1}>\n <Header\n title=\"History\"\n subtitle=\"View execution history\"\n count={history.length}\n icon=\"◷\"\n />\n\n <text fg={terminalColors.text}><b>Recent Executions</b></text>\n <text> </text>\n\n {history.map((item, idx) => (\n <box key={`${item.skill}-${item.time}`} flexDirection=\"row\" marginBottom={1}>\n <text\n fg={idx === 0 ? terminalColors.accent : terminalColors.text}\n width={18}\n >\n {idx === 0 ? '\\u25B8 ' : ' '}{item.skill}\n </text>\n <text fg={terminalColors.textMuted} width={12}>{item.time}</text>\n <text fg={terminalColors.textMuted} width={10}>{item.duration}</text>\n <text\n fg={item.status === 'success' ? terminalColors.success : terminalColors.error}\n >\n {item.status === 'success' ? '\\u2713 success' : '\\u2717 failed'}\n </text>\n </box>\n ))}\n\n <text> </text>\n <text fg={terminalColors.textMuted}>\n Press Enter to view details, 'r' to re-run, 'c' to clear\n </text>\n </box>\n );\n}\n","/**\n * Team Screen\n * Team collaboration\n */\nimport { type Screen } from '../state/index.js';\nimport { terminalColors } from '../theme/colors.js';\nimport { Header } from '../components/Header.js';\n\ninterface TeamProps {\n onNavigate: (screen: Screen) => void;\n cols?: number;\n rows?: number;\n}\n\nexport function Team({ onNavigate, cols = 80, rows = 24 }: TeamProps) {\n const members = [\n { name: 'You', role: 'Owner', status: 'online', skills: 12 },\n { name: 'Alice', role: 'Admin', status: 'online', skills: 8 },\n { name: 'Bob', role: 'Member', status: 'offline', skills: 5 },\n ];\n\n return (\n <box flexDirection=\"column\" paddingLeft={1}>\n <Header\n title=\"Team\"\n subtitle=\"Collaborate with your development team\"\n count={members.length}\n icon=\"◉\"\n />\n\n <text fg={terminalColors.text}><b>Team Members</b></text>\n <text> </text>\n\n {members.map((member, idx) => (\n <box key={member.name} flexDirection=\"row\" marginBottom={1}>\n <text\n fg={idx === 0 ? terminalColors.accent : terminalColors.text}\n width={15}\n >\n {idx === 0 ? '\\u25B8 ' : ' '}{member.name}\n </text>\n <text fg={terminalColors.textMuted} width={10}>{member.role}</text>\n <text\n fg={member.status === 'online' ? terminalColors.success : terminalColors.textMuted}\n width={10}\n >\n {member.status === 'online' ? '\\u25CF online' : '\\u25CB offline'}\n </text>\n <text fg={terminalColors.textMuted}>{member.skills} skills</text>\n </box>\n ))}\n\n <text> </text>\n <text fg={terminalColors.textMuted}>\n Press 'i' to invite, 's' to share skills\n </text>\n </box>\n );\n}\n","/**\n * Plugins Screen\n * Plugin management\n */\nimport { type Screen } from '../state/index.js';\nimport { terminalColors } from '../theme/colors.js';\nimport { Header } from '../components/Header.js';\n\ninterface PluginsProps {\n onNavigate: (screen: Screen) => void;\n cols?: number;\n rows?: number;\n}\n\nexport function Plugins({ onNavigate, cols = 80, rows = 24 }: PluginsProps) {\n const plugins = [\n { name: 'git-hooks', enabled: true, version: '1.2.0' },\n { name: 'ai-suggest', enabled: true, version: '0.9.1' },\n { name: 'metrics', enabled: false, version: '2.0.0' },\n ];\n\n return (\n <box flexDirection=\"column\" paddingLeft={1}>\n <Header\n title=\"Plugins\"\n subtitle=\"Extend SkillKit with plugins\"\n count={plugins.length}\n icon=\"◈\"\n />\n\n <text fg={terminalColors.text}><b>Installed Plugins</b></text>\n <text> </text>\n\n {plugins.map((plugin, idx) => (\n <box key={plugin.name} flexDirection=\"row\" marginBottom={1}>\n <text\n fg={idx === 0 ? terminalColors.accent : terminalColors.text}\n width={18}\n >\n {idx === 0 ? '\\u25B8 ' : ' '}{plugin.name}\n </text>\n <text fg={terminalColors.textMuted} width={10}>v{plugin.version}</text>\n <text\n fg={plugin.enabled ? terminalColors.success : terminalColors.textMuted}\n >\n {plugin.enabled ? '\\u25CF enabled' : '\\u25CB disabled'}\n </text>\n </box>\n ))}\n\n <text> </text>\n <text fg={terminalColors.textMuted}>\n Press Enter to toggle, 'a' to add new, 'u' to update\n </text>\n </box>\n );\n}\n","/**\n * Methodology Screen\n * Development methodology packs\n */\nimport { type Screen } from '../state/index.js';\nimport { terminalColors } from '../theme/colors.js';\nimport { Header } from '../components/Header.js';\n\ninterface MethodologyProps {\n onNavigate: (screen: Screen) => void;\n cols?: number;\n rows?: number;\n}\n\nexport function Methodology({ onNavigate, cols = 80, rows = 24 }: MethodologyProps) {\n const methodologies = [\n { name: 'TDD', description: 'Test-Driven Development', skills: 5, active: true },\n { name: 'BDD', description: 'Behavior-Driven Development', skills: 4, active: false },\n { name: 'Clean Code', description: 'SOLID principles', skills: 6, active: false },\n { name: 'Security First', description: 'OWASP guidelines', skills: 8, active: false },\n ];\n\n return (\n <box flexDirection=\"column\" paddingLeft={1}>\n <Header\n title=\"Methodologies\"\n subtitle=\"Development methodology skill packs\"\n count={methodologies.length}\n icon=\"◎\"\n />\n\n <text fg={terminalColors.text}><b>Available Packs</b></text>\n <text> </text>\n\n {methodologies.map((meth, idx) => (\n <box key={meth.name} flexDirection=\"column\" marginBottom={1}>\n <box flexDirection=\"row\">\n <text\n fg={idx === 0 ? terminalColors.accent : terminalColors.text}\n width={15}\n >\n {idx === 0 ? <b>{'\\u25B8 '}{meth.name}</b> : <>{'\\u25B8 '}{meth.name}</>}\n </text>\n <text fg={terminalColors.textMuted}>{meth.skills} skills</text>\n {meth.active && (\n <text fg={terminalColors.success}> [active]</text>\n )}\n </box>\n <text fg={terminalColors.textMuted}> {meth.description}</text>\n </box>\n ))}\n\n <text> </text>\n <text fg={terminalColors.textMuted}>\n Press Enter to activate, 'v' to view skills\n </text>\n </box>\n );\n}\n","/**\n * Plan Screen\n * Structured plan execution\n */\nimport { type Screen } from '../state/index.js';\nimport { terminalColors } from '../theme/colors.js';\nimport { Header } from '../components/Header.js';\nimport { ProgressBar } from '../components/ProgressBar.js';\n\ninterface PlanProps {\n onNavigate: (screen: Screen) => void;\n cols?: number;\n rows?: number;\n}\n\nexport function Plan({ onNavigate, cols = 80, rows = 24 }: PlanProps) {\n const steps = [\n { name: 'Analyze codebase', status: 'done', duration: '2.3s' },\n { name: 'Generate tests', status: 'done', duration: '5.1s' },\n { name: 'Run linter', status: 'running', duration: '-' },\n { name: 'Apply fixes', status: 'pending', duration: '-' },\n { name: 'Verify changes', status: 'pending', duration: '-' },\n ];\n\n const completedSteps = steps.filter((s) => s.status === 'done').length;\n const progress = (completedSteps / steps.length) * 100;\n\n return (\n <box flexDirection=\"column\" paddingLeft={1}>\n <Header\n title=\"Plan Execution\"\n subtitle=\"Structured multi-step execution\"\n icon=\"▣\"\n />\n\n <box flexDirection=\"row\" marginBottom={1}>\n <text fg={terminalColors.text}>Progress: </text>\n <ProgressBar progress={progress} width={30} />\n </box>\n\n <text fg={terminalColors.text}><b>Steps</b></text>\n <text> </text>\n\n {steps.map((step, idx) => {\n const statusIcon = step.status === 'done' ? '\\u2713' : step.status === 'running' ? '\\u27F3' : '\\u25CB';\n const statusColor =\n step.status === 'done'\n ? terminalColors.success\n : step.status === 'running'\n ? terminalColors.accent\n : terminalColors.textMuted;\n\n return (\n <box key={step.name} flexDirection=\"row\" marginBottom={1}>\n <text fg={statusColor} width={3}>{statusIcon}</text>\n <text fg={step.status === 'pending' ? terminalColors.textMuted : terminalColors.text} width={25}>\n {step.name}\n </text>\n <text fg={terminalColors.textMuted}>{step.duration}</text>\n </box>\n );\n })}\n\n <text> </text>\n <text fg={terminalColors.textMuted}>\n Press Enter to continue, Esc to cancel\n </text>\n </box>\n );\n}\n","import { useState, useEffect, useMemo, useCallback } from 'react';\nimport { useKeyboard } from '@opentui/react';\nimport { type Screen } from '../state/index.js';\nimport { terminalColors } from '../theme/colors.js';\n\ninterface SettingsProps {\n onNavigate: (screen: Screen) => void;\n cols?: number;\n rows?: number;\n}\n\ninterface SettingItem {\n key: string;\n label: string;\n value: string;\n type: 'select' | 'path' | 'toggle';\n}\n\nconst DEFAULT_SETTINGS: SettingItem[] = [\n { key: 'defaultAgent', label: 'Default Agent', value: 'claude-code', type: 'select' },\n { key: 'skillsDir', label: 'Skills Directory', value: '.claude/skills', type: 'path' },\n { key: 'autoSync', label: 'Auto Sync', value: 'enabled', type: 'toggle' },\n { key: 'theme', label: 'Theme', value: 'dark', type: 'select' },\n { key: 'telemetry', label: 'Telemetry', value: 'disabled', type: 'toggle' },\n];\n\nexport function Settings({ onNavigate, cols = 80 }: SettingsProps) {\n const [selectedIndex, setSelectedIndex] = useState(0);\n const [settings, setSettings] = useState<SettingItem[]>(DEFAULT_SETTINGS);\n const [animPhase, setAnimPhase] = useState(0);\n\n const isCompact = cols < 60;\n const contentWidth = Math.max(1, Math.min(cols - 4, 60));\n\n useEffect(() => {\n if (animPhase >= 2) return;\n const timer = setTimeout(() => setAnimPhase(p => p + 1), 100);\n return () => clearTimeout(timer);\n }, [animPhase]);\n\n const handleKeyNav = useCallback((delta: number) => {\n setSelectedIndex(prev => Math.max(0, Math.min(prev + delta, settings.length - 1)));\n }, [settings.length]);\n\n const handleToggle = useCallback(() => {\n const setting = settings[selectedIndex];\n if (setting?.type === 'toggle') {\n setSettings(prev => prev.map((s, i) =>\n i === selectedIndex ? { ...s, value: s.value === 'enabled' ? 'disabled' : 'enabled' } : s\n ));\n }\n }, [selectedIndex, settings]);\n\n const handleReset = useCallback(() => {\n setSettings(DEFAULT_SETTINGS);\n }, []);\n\n const handleKeyboard = useCallback((key: { name?: string }) => {\n if (key.name === 'j' || key.name === 'down') handleKeyNav(1);\n else if (key.name === 'k' || key.name === 'up') handleKeyNav(-1);\n else if (key.name === 'return') handleToggle();\n else if (key.name === 'r') handleReset();\n else if (key.name === 'escape') onNavigate('home');\n }, [handleKeyNav, handleToggle, handleReset, onNavigate]);\n\n useKeyboard(handleKeyboard);\n\n const divider = useMemo(() =>\n <text fg={terminalColors.textMuted}>{'─'.repeat(contentWidth)}</text>,\n [contentWidth]\n );\n\n const shortcuts = isCompact\n ? 'j/k nav enter toggle r reset esc back'\n : 'j/k navigate enter toggle r reset defaults esc back';\n\n return (\n <box flexDirection=\"column\" padding={1}>\n {/* Header */}\n {animPhase >= 1 && (\n <box flexDirection=\"column\">\n <box flexDirection=\"row\" justifyContent=\"space-between\" width={contentWidth}>\n <text fg={terminalColors.text}>⚙ Settings</text>\n <text fg={terminalColors.textMuted}>{settings.length} options</text>\n </box>\n <text fg={terminalColors.textMuted}>configure skillkit</text>\n <text> </text>\n </box>\n )}\n\n {/* Settings list */}\n {animPhase >= 2 && (\n <box flexDirection=\"column\">\n {divider}\n <text> </text>\n <text fg={terminalColors.text}>Configuration</text>\n <text> </text>\n\n {settings.map((setting, idx) => {\n const selected = idx === selectedIndex;\n const indicator = selected ? '▸' : ' ';\n const valueColor = setting.type === 'toggle'\n ? (setting.value === 'enabled' ? terminalColors.success : terminalColors.textMuted)\n : terminalColors.textMuted;\n const toggleIcon = setting.type === 'toggle'\n ? (setting.value === 'enabled' ? '● ' : '○ ')\n : '';\n return (\n <box key={setting.key} flexDirection=\"row\">\n <text fg={terminalColors.text}>{indicator}</text>\n <text fg={selected ? terminalColors.accent : terminalColors.text} width={18}>\n {setting.label}\n </text>\n <text fg={valueColor}>{toggleIcon}{setting.value}</text>\n </box>\n );\n })}\n <text> </text>\n </box>\n )}\n\n {/* Config location */}\n {animPhase >= 2 && !isCompact && (\n <box flexDirection=\"column\">\n {divider}\n <text fg={terminalColors.textMuted}>config: ~/.config/skillkit/config.json</text>\n <text> </text>\n </box>\n )}\n\n {/* Footer */}\n {animPhase >= 2 && (\n <box flexDirection=\"column\">\n {divider}\n <text fg={terminalColors.textMuted}>{shortcuts}</text>\n </box>\n )}\n </box>\n );\n}\n","import { useState, useEffect, useMemo } from 'react';\nimport { type Screen } from '../state/index.js';\nimport { terminalColors } from '../theme/colors.js';\nimport { getVersion } from '../utils/helpers.js';\n\ninterface HelpProps {\n onNavigate: (screen: Screen) => void;\n cols?: number;\n rows?: number;\n}\n\nconst SHORTCUTS = [\n { section: 'Navigation', items: [\n { key: 'h', desc: 'Home screen' },\n { key: 'b', desc: 'Browse skills' },\n { key: 'm', desc: 'Marketplace' },\n { key: 'r', desc: 'Recommendations' },\n { key: 'i', desc: 'Installed skills' },\n { key: 's', desc: 'Sync settings' },\n ]},\n { section: 'Actions', items: [\n { key: 't', desc: 'Translate skills' },\n { key: 'w', desc: 'Workflows' },\n { key: 'x', desc: 'Execute' },\n { key: 'n', desc: 'Plan' },\n { key: 'y', desc: 'History' },\n ]},\n { section: 'Team & Config', items: [\n { key: 'a', desc: 'Team settings' },\n { key: 'c', desc: 'Context' },\n { key: 'e', desc: 'Memory' },\n { key: 'p', desc: 'Plugins' },\n { key: 'o', desc: 'Methodology' },\n { key: ',', desc: 'Settings' },\n ]},\n { section: 'Global', items: [\n { key: '/', desc: 'This help screen' },\n { key: 'esc', desc: 'Go back / Home' },\n { key: 'q', desc: 'Quit application' },\n { key: 'j/k', desc: 'Navigate lists' },\n { key: 'enter', desc: 'Select item' },\n ]},\n];\n\nfunction ShortcutSection({ section, items, isLast }: { section: string; items: { key: string; desc: string }[]; isLast: boolean }) {\n return (\n <box flexDirection=\"column\">\n <text fg={terminalColors.text}>{section}</text>\n {items.map((item) => (\n <box key={item.key} flexDirection=\"row\">\n <text fg={terminalColors.accent} width={8}> {item.key}</text>\n <text fg={terminalColors.textMuted}>{item.desc}</text>\n </box>\n ))}\n {!isLast && <text> </text>}\n </box>\n );\n}\n\nexport function Help({ cols = 80 }: HelpProps) {\n const [animPhase, setAnimPhase] = useState(0);\n const isCompact = cols < 60;\n const rawWidth = cols - 4;\n const contentWidth = Math.max(1, Math.min(rawWidth, 60));\n const version = getVersion();\n\n useEffect(() => {\n if (animPhase >= 2) return;\n const timer = setTimeout(() => setAnimPhase(p => p + 1), 100);\n return () => clearTimeout(timer);\n }, [animPhase]);\n\n const divider = useMemo(() =>\n <text fg={terminalColors.textMuted}>{'─'.repeat(contentWidth)}</text>,\n [contentWidth]\n );\n\n return (\n <box flexDirection=\"column\" padding={1}>\n {animPhase >= 1 && (\n <box flexDirection=\"column\">\n <box flexDirection=\"row\" justifyContent=\"space-between\" width={contentWidth}>\n <text fg={terminalColors.text}>/ Help</text>\n <text fg={terminalColors.textMuted}>skillkit v{version}</text>\n </box>\n <text fg={terminalColors.textMuted}>keyboard shortcuts and navigation</text>\n <text> </text>\n </box>\n )}\n\n {animPhase >= 2 && (\n <box flexDirection=\"column\">\n {divider}\n <text> </text>\n {isCompact ? (\n SHORTCUTS.map((s, idx) => (\n <ShortcutSection key={s.section} section={s.section} items={s.items} isLast={idx === SHORTCUTS.length - 1} />\n ))\n ) : (\n <box flexDirection=\"row\">\n <box flexDirection=\"column\" width={Math.floor(contentWidth / 2)}>\n {SHORTCUTS.slice(0, 2).map((s, idx) => (\n <ShortcutSection key={s.section} section={s.section} items={s.items} isLast={idx === 1} />\n ))}\n </box>\n <box flexDirection=\"column\" width={Math.floor(contentWidth / 2)}>\n {SHORTCUTS.slice(2).map((s, idx) => (\n <ShortcutSection key={s.section} section={s.section} items={s.items} isLast={idx === 1} />\n ))}\n </box>\n </box>\n )}\n <text> </text>\n </box>\n )}\n\n {animPhase >= 2 && (\n <box flexDirection=\"column\">\n {divider}\n <text fg={terminalColors.textMuted}>esc back h home q quit</text>\n </box>\n )}\n </box>\n );\n}\n","/**\n * Animation presets for SkillKit TUI\n * Uses OpenTUI's useTimeline for smooth 60fps animations\n */\n\n/**\n * Animation easing functions available in OpenTUI\n */\nexport type EasingFunction =\n | 'linear'\n | 'easeInQuad'\n | 'easeOutQuad'\n | 'easeInOutQuad'\n | 'easeInCubic'\n | 'easeOutCubic'\n | 'easeInOutCubic'\n | 'easeInQuart'\n | 'easeOutQuart'\n | 'easeInOutQuart';\n\n/**\n * Animation preset configuration\n */\nexport interface AnimationPreset {\n duration: number;\n ease: EasingFunction;\n stagger?: number;\n}\n\n/**\n * Predefined animation presets\n */\nexport const animations = {\n /**\n * Staggered fade-in for entrance animations\n * Used on home screen for progressive content reveal\n */\n staggeredFadeIn: {\n duration: 800,\n ease: 'easeOutCubic' as EasingFunction,\n stagger: 100,\n },\n\n /**\n * Logo reveal with scramble effect\n * Used for branding animation on startup\n */\n logoReveal: {\n duration: 600,\n ease: 'easeOutCubic' as EasingFunction,\n },\n\n /**\n * Count-up animation for stats\n * Used in StatsCard component\n */\n countUp: {\n duration: 1200,\n ease: 'easeOutQuart' as EasingFunction,\n },\n\n /**\n * Screen transition animation\n * Used when navigating between screens\n */\n screenTransition: {\n duration: 200,\n ease: 'easeInOutCubic' as EasingFunction,\n },\n\n /**\n * Quick fade for tooltips and hints\n */\n quickFade: {\n duration: 150,\n ease: 'easeOutQuad' as EasingFunction,\n },\n\n /**\n * Pulse animation for active states\n */\n pulse: {\n duration: 1000,\n ease: 'easeInOutQuad' as EasingFunction,\n },\n} as const;\n\n/**\n * Scramble effect characters\n * Used for text reveal animations\n */\nexport const SCRAMBLE_CHARS = '█▓▒░◆◇◈⟁◎✦⬡▣';\n\n/**\n * Scramble animation configuration\n */\nexport interface ScrambleConfig {\n /** Animation duration in ms */\n duration: number;\n /** Progress increment per frame */\n increment: number;\n /** Frame interval in ms */\n interval: number;\n}\n\n/**\n * Default scramble animation config\n */\nexport const DEFAULT_SCRAMBLE_CONFIG: ScrambleConfig = {\n duration: 420,\n increment: 12,\n interval: 35,\n};\n\n/**\n * Generate scrambled text with progressive reveal\n * @param target - The target text to reveal\n * @param progress - Progress percentage (0-100)\n * @param chars - Characters to use for scrambling\n */\nexport function scrambleText(\n target: string,\n progress: number,\n chars: string = SCRAMBLE_CHARS\n): string {\n return target\n .split('\\n')\n .map((line) => {\n return line\n .split('')\n .map((char, i) => {\n if (char === ' ') return char;\n if (progress > (i / line.length) * 100) return char;\n return chars[Math.floor(Math.random() * chars.length)];\n })\n .join('');\n })\n .join('\\n');\n}\n\n/**\n * Calculate staggered delay for an item in a list\n * @param index - Item index\n * @param stagger - Delay between items in ms\n * @returns Delay in ms for this item\n */\nexport function getStaggerDelay(index: number, stagger: number = 100): number {\n return index * stagger;\n}\n","/**\n * List navigation and pagination utilities\n */\n\n/**\n * Calculate visible items for paginated list display\n * Centers the selected item in the visible window\n */\nexport interface PaginationResult {\n /** Starting index in the full list */\n start: number;\n /** Ending index (exclusive) in the full list */\n end: number;\n /** Number of items above the visible window */\n itemsAbove: number;\n /** Number of items below the visible window */\n itemsBelow: number;\n}\n\n/**\n * Calculate pagination for a list with a selected index\n * @param totalItems - Total number of items in the list\n * @param selectedIndex - Currently selected item index\n * @param maxVisible - Maximum number of items to show at once\n * @returns Pagination information\n */\nexport function calculatePagination(\n totalItems: number,\n selectedIndex: number,\n maxVisible: number\n): PaginationResult {\n if (totalItems <= maxVisible) {\n return {\n start: 0,\n end: totalItems,\n itemsAbove: 0,\n itemsBelow: 0,\n };\n }\n\n // Center the selected item in the visible window\n const halfVisible = Math.floor(maxVisible / 2);\n let start = Math.max(0, selectedIndex - halfVisible);\n\n // Ensure we don't go past the end\n if (start + maxVisible > totalItems) {\n start = totalItems - maxVisible;\n }\n\n const end = start + maxVisible;\n\n return {\n start,\n end,\n itemsAbove: start,\n itemsBelow: totalItems - end,\n };\n}\n\n/**\n * Move selection up in a list\n * @param currentIndex - Current selected index\n * @param minIndex - Minimum allowed index (default: 0)\n * @returns New index after moving up\n */\nexport function moveUp(currentIndex: number, minIndex = 0): number {\n return Math.max(minIndex, currentIndex - 1);\n}\n\n/**\n * Move selection down in a list\n * @param currentIndex - Current selected index\n * @param maxIndex - Maximum allowed index\n * @returns New index after moving down\n */\nexport function moveDown(currentIndex: number, maxIndex: number): number {\n return Math.min(maxIndex, currentIndex + 1);\n}\n\n/**\n * Clamp an index within valid bounds\n * @param index - Index to clamp\n * @param listLength - Length of the list\n * @returns Clamped index\n */\nexport function clampIndex(index: number, listLength: number): number {\n if (listLength === 0) return 0;\n return Math.max(0, Math.min(index, listLength - 1));\n}\n\n/**\n * Calculate max visible items based on available rows\n * @param availableRows - Total available rows\n * @param reservedRows - Rows reserved for headers, footers, etc.\n * @param minVisible - Minimum visible items (default: 5)\n * @returns Maximum visible items\n */\nexport function calculateMaxVisible(\n availableRows: number,\n reservedRows: number,\n minVisible = 5\n): number {\n return Math.max(minVisible, availableRows - reservedRows);\n}\n","/**\n * AgentGrid Component\n * Displays monochromatic agent logos in a grid layout\n */\nimport { AGENT_LOGOS, type AgentLogo } from '../theme/symbols.js';\nimport { terminalColors } from '../theme/colors.js';\n\ninterface AgentGridProps {\n /** Maximum number of agents to display */\n maxVisible?: number;\n /** Show status indicators for detected agents */\n showStatus?: boolean;\n /** Agent types that are detected/active */\n detectedAgents?: string[];\n /** Number of columns in the grid */\n columns?: number;\n}\n\nexport function AgentGrid({\n maxVisible = 12,\n showStatus = true,\n detectedAgents = [],\n columns = 4,\n}: AgentGridProps) {\n const safeColumns = Math.max(1, columns);\n const allAgents = Object.entries(AGENT_LOGOS);\n const visibleAgents = allAgents.slice(0, maxVisible);\n const hiddenCount = allAgents.length - maxVisible;\n\n const rows: [string, AgentLogo][][] = [];\n for (let i = 0; i < visibleAgents.length; i += safeColumns) {\n rows.push(visibleAgents.slice(i, i + safeColumns));\n }\n\n return (\n <box flexDirection=\"column\">\n <text fg={terminalColors.text}>\n <b>Works with</b>\n </text>\n <text> </text>\n {rows.map((row, rowIndex) => (\n <box key={`row-${rowIndex}`} flexDirection=\"row\">\n {row.map(([agentType, agent]) => {\n const isDetected = detectedAgents.includes(agentType);\n const statusIcon = showStatus ? (isDetected ? '●' : '○') : '';\n const fg = isDetected ? terminalColors.accent : terminalColors.text;\n\n return (\n <box key={agentType} width={18}>\n <text fg={fg}>\n {agent.icon} {agent.name}\n {showStatus && (\n <span fg={isDetected ? terminalColors.success : terminalColors.textMuted}>\n {' '}{statusIcon}\n </span>\n )}\n </text>\n </box>\n );\n })}\n </box>\n ))}\n {hiddenCount > 0 && (\n <text fg={terminalColors.textMuted}>+{hiddenCount} more agents</text>\n )}\n </box>\n );\n}\n","/**\n * StatsCard Component\n * OpenSync-style stats display with optional animations\n */\nimport { useState, useEffect } from 'react';\nimport { terminalColors } from '../theme/colors.js';\nimport { animations } from '../theme/animations.js';\n\ninterface StatItem {\n label: string;\n value: number;\n color?: keyof typeof terminalColors;\n}\n\ninterface StatsCardProps {\n items: StatItem[];\n animated?: boolean;\n}\n\nexport function StatsCard({ items, animated = true }: StatsCardProps) {\n const [displayValues, setDisplayValues] = useState<number[]>(() =>\n animated ? items.map(() => 0) : items.map((item) => item.value)\n );\n const [animComplete, setAnimComplete] = useState(!animated);\n const [prevItemsLength, setPrevItemsLength] = useState(items.length);\n\n useEffect(() => {\n if (items.length !== prevItemsLength) {\n setPrevItemsLength(items.length);\n setDisplayValues(animated ? items.map(() => 0) : items.map((item) => item.value));\n setAnimComplete(!animated);\n }\n }, [items, prevItemsLength, animated]);\n\n useEffect(() => {\n if (!animated || animComplete) return;\n\n const duration = animations.countUp.duration;\n const startTime = Date.now();\n const targetValues = items.map((item) => item.value);\n const frameInterval = 16;\n\n const intervalId = setInterval(() => {\n const elapsed = Date.now() - startTime;\n const progress = Math.min(elapsed / duration, 1);\n const eased = 1 - Math.pow(1 - progress, 4);\n\n const newValues = targetValues.map((target) =>\n Math.round(target * eased)\n );\n\n setDisplayValues(newValues);\n\n if (progress >= 1) {\n clearInterval(intervalId);\n setAnimComplete(true);\n }\n }, frameInterval);\n\n return () => clearInterval(intervalId);\n }, [animated, animComplete, items]);\n\n return (\n <box flexDirection=\"row\" gap={2}>\n {items.map((item, index) => {\n const fg = item.color\n ? terminalColors[item.color]\n : terminalColors.text;\n\n return (\n <box\n key={item.label}\n flexDirection=\"column\"\n alignItems=\"center\"\n padding={2}\n borderStyle=\"single\"\n borderColor={terminalColors.border}\n >\n <text fg={fg}>\n <b>{String(displayValues[index])}</b>\n </text>\n <text fg={terminalColors.textMuted}>{item.label}</text>\n </box>\n );\n })}\n </box>\n );\n}\n","/**\n * StatusBar Component\n * Bottom status bar with keyboard shortcuts\n */\nimport { terminalColors } from '../theme/colors.js';\nimport { STATUS_BAR_SHORTCUTS } from '../state/types.js';\n\ninterface StatusBarProps {\n message?: string;\n messageType?: 'info' | 'success' | 'error' | 'warning';\n shortcuts?: string;\n}\n\nexport function StatusBar({\n message,\n messageType = 'info',\n shortcuts = STATUS_BAR_SHORTCUTS,\n}: StatusBarProps) {\n const messageColors = {\n info: terminalColors.info,\n success: terminalColors.success,\n error: terminalColors.error,\n warning: terminalColors.warning,\n };\n\n return (\n <box flexDirection=\"column\">\n <text fg={terminalColors.textMuted}>\n {'\\u2500'.repeat(70)}\n </text>\n {message ? (\n <text fg={messageColors[messageType]}>{message}</text>\n ) : (\n <text fg={terminalColors.textMuted}>{shortcuts}</text>\n )}\n </box>\n );\n}\n","/**\n * SkillList Component\n * Paginated list of skills with selection\n */\nimport { terminalColors } from '../theme/colors.js';\nimport { symbols } from '../theme/symbols.js';\nimport { calculatePagination, type PaginationResult } from '../utils/list.js';\nimport type { SkillItem } from '../state/types.js';\n\ninterface SkillListProps {\n skills: SkillItem[];\n selectedIndex: number;\n maxVisible?: number;\n onSelect?: (skill: SkillItem) => void;\n}\n\nexport function SkillList({\n skills,\n selectedIndex,\n maxVisible = 10,\n onSelect,\n}: SkillListProps) {\n if (skills.length === 0) {\n return (\n <text fg={terminalColors.textMuted}>No skills found</text>\n );\n }\n\n const pagination = calculatePagination(skills.length, selectedIndex, maxVisible);\n const visibleSkills = skills.slice(pagination.start, pagination.end);\n\n return (\n <box flexDirection=\"column\">\n {/* Items above indicator */}\n {pagination.itemsAbove > 0 && (\n <text fg={terminalColors.textMuted}>\n {symbols.arrowUp} {pagination.itemsAbove} more above\n </text>\n )}\n\n {/* Skill list */}\n {visibleSkills.map((skill, idx) => {\n const actualIndex = pagination.start + idx;\n const isSelected = actualIndex === selectedIndex;\n const pointer = isSelected ? symbols.pointer : symbols.pointerInactive;\n const fg = isSelected ? terminalColors.accent : terminalColors.text;\n const statusIcon = skill.enabled ? symbols.active : symbols.pending;\n const statusColor = skill.enabled\n ? terminalColors.success\n : terminalColors.textMuted;\n\n return (\n <box key={skill.name} flexDirection=\"row\">\n <text fg={fg}>\n {isSelected ? <b>{pointer} {skill.name}</b> : <>{pointer} {skill.name}</>}\n </text>\n <text fg={terminalColors.textMuted}>\n {' '}{statusIcon}\n </text>\n {skill.description && (\n <text fg={terminalColors.textMuted}>\n {' '}- {skill.description.slice(0, 40)}\n {skill.description.length > 40 ? '...' : ''}\n </text>\n )}\n </box>\n );\n })}\n\n {/* Items below indicator */}\n {pagination.itemsBelow > 0 && (\n <text fg={terminalColors.textMuted}>\n {symbols.arrowDown} {pagination.itemsBelow} more below\n </text>\n )}\n </box>\n );\n}\n","/**\n * SearchInput Component\n * Rounded search input with icon\n */\nimport { terminalColors } from '../theme/colors.js';\n\ninterface SearchInputProps {\n value: string;\n placeholder?: string;\n focused?: boolean;\n onChange?: (value: string) => void;\n}\n\nexport function SearchInput({\n value,\n placeholder = 'Search...',\n focused = false,\n}: SearchInputProps) {\n const display = value || placeholder;\n const textColor = value ? terminalColors.text : terminalColors.textMuted;\n\n return (\n <box flexDirection=\"row\" marginBottom={1}>\n <text fg={terminalColors.textMuted}>⌕ </text>\n <text fg={textColor}>{display}</text>\n {focused && <text fg={terminalColors.accent}>▏</text>}\n </box>\n );\n}\n","/**\n * FeatureList Component\n * Colored feature keywords with descriptions\n */\nimport { terminalColors } from '../theme/colors.js';\n\ninterface Feature {\n key: string;\n label: string;\n description: string;\n color: keyof typeof terminalColors;\n}\n\nconst FEATURES: Feature[] = [\n { key: 'sync', label: 'Sync', color: 'sync', description: 'share skills across all your coding agents' },\n { key: 'browse', label: 'Browse', color: 'browse', description: 'discover skills from the marketplace' },\n { key: 'recommend', label: 'Recommend', color: 'recommend', description: 'AI-powered skill suggestions for your project' },\n { key: 'translate', label: 'Translate', color: 'translate', description: 'convert skills between agent formats' },\n { key: 'workflow', label: 'Workflow', color: 'workflow', description: 'automate skill execution chains' },\n { key: 'team', label: 'Team', color: 'team', description: 'collaborate with your development team' },\n];\n\ninterface FeatureListProps {\n features?: Feature[];\n}\n\nexport function FeatureList({ features = FEATURES }: FeatureListProps) {\n return (\n <box flexDirection=\"column\">\n <text fg={terminalColors.text}><b>Features</b></text>\n <text> </text>\n {features.map((feat) => (\n <box key={feat.key} flexDirection=\"row\">\n <text fg={terminalColors[feat.color]}>\n <b>{' '}{feat.label.padEnd(12)}</b>\n </text>\n <text fg={terminalColors.textMuted}>{feat.description}</text>\n </box>\n ))}\n </box>\n );\n}\n\nexport { FEATURES, type Feature };\n"],"mappings":"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","names":["useState","useCallback","useEffect","useKeyboard","Fragment","jsx","jsxs","useState","useEffect","useMemo","loadConfig","getAdapter","loadConfig","readFileSync","rmSync","join","jsx","jsxs","useState","useEffect","useMemo","useState","useEffect","useMemo","useCallback","jsx","jsxs","useState","useEffect","useMemo","useCallback","useState","useEffect","useMemo","useCallback","useKeyboard","Fragment","jsx","jsxs","SPINNER","useState","useEffect","useMemo","useCallback","useKeyboard","useState","useEffect","useMemo","useCallback","useKeyboard","jsx","jsxs","useState","useEffect","useMemo","useCallback","useKeyboard","useState","useEffect","useMemo","useCallback","useKeyboard","jsx","jsxs","SPINNER","useState","useEffect","useMemo","useCallback","useKeyboard","useState","jsx","jsxs","jsx","jsxs","useState","useState","useEffect","useState","useEffect","jsx","jsxs","useState","useEffect","jsx","jsxs","useState","useEffect","useState","useEffect","useMemo","useCallback","useKeyboard","jsx","jsxs","SPINNER","useState","useEffect","useMemo","useCallback","useKeyboard","jsx","jsxs","useState","useEffect","useMemo","useCallback","useKeyboard","jsx","jsxs","useState","useEffect","useCallback","useKeyboard","useMemo","useState","jsx","jsxs","jsx","jsxs","useState","jsx","jsxs","jsx","jsxs","jsx","jsxs","Fragment","jsx","jsxs","jsx","jsxs","useState","useEffect","useMemo","useCallback","useKeyboard","jsx","jsxs","useState","useEffect","useCallback","useKeyboard","useMemo","useState","useEffect","useMemo","jsx","jsxs","useState","useEffect","useMemo","jsx","jsxs","useState","useEffect","useCallback","useKeyboard","jsx","jsxs","useState","useEffect","jsx","jsxs","useState","useEffect","jsx","jsxs","Fragment","jsx","jsxs","jsx","jsxs","jsx","jsxs","FEATURES","jsx"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.tsx","../src/App.tsx","../src/state/types.ts","../src/theme/colors.ts","../src/theme/symbols.ts","../src/utils/helpers.ts","../src/components/Sidebar.tsx","../src/components/Splash.tsx","../src/screens/Home.tsx","../src/state/navigation.ts","../src/state/skills.ts","../src/state/agents.ts","../src/state/marketplace.ts","../../../marketplace/sources.json","../src/screens/Browse.tsx","../src/screens/Installed.tsx","../src/screens/Marketplace.tsx","../src/screens/Recommend.tsx","../src/screens/Translate.tsx","../src/components/Header.tsx","../src/screens/Context.tsx","../src/components/Spinner.tsx","../src/screens/Sync.tsx","../src/screens/Memory.tsx","../src/screens/Workflow.tsx","../src/screens/Execute.tsx","../src/components/ProgressBar.tsx","../src/screens/History.tsx","../src/screens/Team.tsx","../src/screens/Plugins.tsx","../src/screens/Methodology.tsx","../src/screens/Plan.tsx","../src/screens/Settings.tsx","../src/screens/Help.tsx","../src/theme/animations.ts","../src/utils/list.ts","../src/components/AgentGrid.tsx","../src/components/StatsCard.tsx","../src/components/StatusBar.tsx","../src/components/SkillList.tsx","../src/components/SearchInput.tsx","../src/components/FeatureList.tsx"],"sourcesContent":["import { createCliRenderer } from '@opentui/core';\nimport { createRoot } from '@opentui/react';\nimport { App } from './App.js';\n\nlet rootInstance: ReturnType<typeof createRoot> | null = null;\n\nexport function exitTUI(code = 0): void {\n try {\n // Unmount React tree first\n if (rootInstance) {\n try {\n rootInstance.unmount();\n } catch {\n // Ignore unmount errors\n }\n rootInstance = null;\n }\n\n // Restore terminal state: exit alt screen, show cursor, reset attributes, clear\n process.stdout.write('\\x1b[?1049l\\x1b[?25h\\x1b[0m\\x1b[H\\x1b[2J');\n } catch {\n // Ignore write errors\n }\n\n // Use setImmediate to allow any pending operations to complete\n setImmediate(() => process.exit(code));\n}\n\nexport async function startTUI(): Promise<never> {\n // Setup signal handlers for clean exit\n const handleSignal = () => exitTUI(0);\n process.on('SIGINT', handleSignal);\n process.on('SIGTERM', handleSignal);\n\n const renderer = await createCliRenderer({ exitOnCtrlC: false });\n rootInstance = createRoot(renderer);\n rootInstance.render(<App onExit={exitTUI} />);\n return new Promise(() => {});\n}\n\nexport { type Screen } from './state/types.js';\nexport { App } from './App.js';\nexport * from './theme/index.js';\nexport * from './state/index.js';\nexport * from './utils/index.js';\nexport * from './components/index.js';\nexport * from './screens/index.js';\n","import { useState, useCallback, useEffect } from 'react';\nimport { useKeyboard } from '@opentui/react';\nimport { exec } from 'node:child_process';\nimport { type Screen, NAV_KEYS } from './state/types.js';\nimport { Sidebar } from './components/Sidebar.js';\nimport { Splash } from './components/Splash.js';\nimport {\n Home, Browse, Installed, Marketplace, Settings, Recommend,\n Translate, Context, Memory, Team, Plugins, Methodology,\n Plan, Workflow, Execute, History, Sync, Help,\n} from './screens/index.js';\n\nconst DOCS_URL = 'https://agenstskills.com/docs';\n\nfunction openUrl(url: string): void {\n const cmd = process.platform === 'darwin' ? 'open' : process.platform === 'win32' ? 'start' : 'xdg-open';\n exec(`${cmd} ${url}`);\n}\n\ninterface AppProps {\n onExit?: (code?: number) => void;\n}\n\nexport function App({ onExit }: AppProps = {}) {\n const [showSplash, setShowSplash] = useState(true);\n const [screen, setScreen] = useState<Screen>('home');\n const [dimensions, setDimensions] = useState({\n cols: process.stdout.columns || 80,\n rows: process.stdout.rows || 24,\n });\n\n useEffect(() => {\n const handleResize = () => {\n setDimensions({\n cols: process.stdout.columns || 80,\n rows: process.stdout.rows || 24,\n });\n };\n process.stdout.on('resize', handleResize);\n return () => { process.stdout.off('resize', handleResize); };\n }, []);\n\n const { cols, rows } = dimensions;\n const showSidebar = cols >= 60;\n\n const handleNavigate = useCallback((newScreen: Screen) => {\n setScreen(newScreen);\n }, []);\n\n const handleSplashComplete = useCallback(() => {\n setShowSplash(false);\n }, []);\n\n useKeyboard((key: { name?: string; ctrl?: boolean }) => {\n if (showSplash) {\n setShowSplash(false);\n return;\n }\n\n if (key.name === 'q' || (key.ctrl && key.name === 'c')) {\n onExit ? onExit(0) : process.exit(0);\n return;\n }\n\n if (key.name === 'd') {\n openUrl(DOCS_URL);\n return;\n }\n\n const targetScreen = NAV_KEYS[key.name || ''];\n if (targetScreen) {\n setScreen(targetScreen);\n }\n\n if (key.name === 'escape' && screen !== 'home') {\n setScreen('home');\n }\n });\n\n if (showSplash) {\n return <Splash onComplete={handleSplashComplete} duration={3000} />;\n }\n\n const screenProps = {\n onNavigate: handleNavigate,\n cols: cols - (showSidebar ? 20 : 0),\n rows,\n };\n\n const renderScreen = () => {\n switch (screen) {\n case 'home': return <Home {...screenProps} />;\n case 'browse': return <Browse {...screenProps} />;\n case 'installed': return <Installed {...screenProps} />;\n case 'marketplace': return <Marketplace {...screenProps} />;\n case 'settings': return <Settings {...screenProps} />;\n case 'recommend': return <Recommend {...screenProps} />;\n case 'translate': return <Translate {...screenProps} />;\n case 'context': return <Context {...screenProps} />;\n case 'memory': return <Memory {...screenProps} />;\n case 'team': return <Team {...screenProps} />;\n case 'plugins': return <Plugins {...screenProps} />;\n case 'methodology': return <Methodology {...screenProps} />;\n case 'plan': return <Plan {...screenProps} />;\n case 'workflow': return <Workflow {...screenProps} />;\n case 'execute': return <Execute {...screenProps} />;\n case 'history': return <History {...screenProps} />;\n case 'sync': return <Sync {...screenProps} />;\n case 'help': return <Help {...screenProps} />;\n default: return <Home {...screenProps} />;\n }\n };\n\n return (\n <box flexDirection=\"row\" height={rows}>\n {showSidebar && <Sidebar screen={screen} onNavigate={handleNavigate} />}\n <box flexDirection=\"column\" flexGrow={1} marginLeft={showSidebar ? 1 : 0} paddingRight={1}>\n {renderScreen()}\n </box>\n </box>\n );\n}\n\nexport { type Screen };\n","export interface SkillItem {\n name: string;\n description?: string;\n source?: string;\n installs?: number;\n enabled?: boolean;\n quality?: number;\n grade?: string;\n warnings?: number;\n}\n\nexport interface RepoInfo {\n source: string;\n name: string;\n}\n\nexport interface FetchedSkill {\n name: string;\n source: string;\n repoName: string;\n description?: string;\n}\n\nexport type Screen =\n | 'home' | 'browse' | 'installed' | 'marketplace' | 'recommend'\n | 'translate' | 'context' | 'memory' | 'team' | 'plugins'\n | 'methodology' | 'plan' | 'workflow' | 'execute' | 'history'\n | 'sync' | 'settings' | 'help';\n\nexport const NAV_KEYS: Record<string, Screen> = {\n h: 'home', m: 'marketplace', b: 'browse', w: 'workflow',\n x: 'execute', y: 'history', r: 'recommend', t: 'translate',\n c: 'context', e: 'memory', i: 'installed', s: 'sync',\n a: 'team', p: 'plugins', o: 'methodology', n: 'plan',\n ',': 'settings', '/': 'help',\n} as const;\n\nexport const STATUS_BAR_SHORTCUTS = 'b browse m market i installed s sync / help q quit';\n\nexport interface ScreenMeta {\n key: string;\n label: string;\n screen: Screen;\n}\n\nexport interface SidebarSection {\n section: string;\n items: ScreenMeta[];\n}\n\nexport const SIDEBAR_NAV: SidebarSection[] = [\n {\n section: 'Discover',\n items: [\n { key: 'h', label: 'Home', screen: 'home' },\n { key: 'b', label: 'Browse', screen: 'browse' },\n { key: 'm', label: 'Market', screen: 'marketplace' },\n { key: 'r', label: 'Recommend', screen: 'recommend' },\n ],\n },\n {\n section: 'Manage',\n items: [\n { key: 'i', label: 'Installed', screen: 'installed' },\n { key: 's', label: 'Sync', screen: 'sync' },\n { key: 't', label: 'Translate', screen: 'translate' },\n ],\n },\n {\n section: 'Execute',\n items: [\n { key: 'w', label: 'Workflows', screen: 'workflow' },\n { key: 'x', label: 'Execute', screen: 'execute' },\n { key: 'n', label: 'Plan', screen: 'plan' },\n ],\n },\n {\n section: 'Team',\n items: [\n { key: 'a', label: 'Team', screen: 'team' },\n { key: 'c', label: 'Context', screen: 'context' },\n { key: 'e', label: 'Memory', screen: 'memory' },\n ],\n },\n {\n section: 'More',\n items: [\n { key: 'p', label: 'Plugins', screen: 'plugins' },\n { key: 'o', label: 'Methods', screen: 'methodology' },\n { key: ',', label: 'Settings', screen: 'settings' },\n ],\n },\n];\n","/**\n * Monochromatic color palette for SkillKit TUI\n * Inspired by OpenSync's elegant dark theme\n */\n\nexport const colors = {\n // Base (monochromatic grays)\n background: '#0d0d0d',\n surface: '#1a1a1a',\n surfaceHover: '#262626',\n border: '#333333',\n borderDim: '#1f1f1f',\n\n // Text hierarchy\n text: '#ffffff',\n textSecondary: '#a0a0a0',\n textMuted: '#666666',\n\n // Accent (single brand color - vibrant green)\n accent: '#00ff88',\n accentDim: '#00cc6a',\n\n // Status colors (subtle variations)\n success: '#22c55e',\n warning: '#eab308',\n error: '#ef4444',\n info: '#3b82f6',\n\n // Feature-specific accent colors (for colored keywords)\n sync: '#00d9ff', // cyan\n browse: '#22c55e', // green\n recommend: '#fbbf24', // yellow/gold\n translate: '#a855f7', // purple\n workflow: '#3b82f6', // blue\n team: '#ffffff', // white\n private: '#ef4444', // red\n tag: '#fbbf24', // yellow\n export: '#22c55e', // green\n delete: '#ef4444', // red\n} as const;\n\nexport type ColorName = keyof typeof colors;\nexport type ColorValue = (typeof colors)[ColorName];\n\n/**\n * Get a color value by name\n */\nexport function getColor(name: ColorName): ColorValue {\n return colors[name];\n}\n\n/**\n * Terminal-safe color names for OpenTUI\n * Maps our design system colors to terminal-compatible values\n */\nexport const terminalColors = {\n background: 'black',\n surface: 'black',\n text: 'white',\n textSecondary: 'gray',\n textMuted: 'gray',\n accent: 'green',\n success: 'green',\n warning: 'yellow',\n error: 'red',\n info: 'blue',\n sync: 'cyan',\n browse: 'green',\n recommend: 'yellow',\n translate: 'magenta',\n workflow: 'blue',\n team: 'white',\n border: 'gray',\n} as const;\n","/**\n * Unicode symbols and agent logos for SkillKit TUI\n * Monochromatic design system for terminal display\n */\n\n/**\n * Agent logo definitions with monochromatic icons\n */\nexport interface AgentLogo {\n icon: string;\n name: string;\n company: string;\n}\n\n/**\n * All 32 supported agents with monochromatic Unicode logos\n */\nexport const AGENT_LOGOS: Record<string, AgentLogo> = {\n 'claude-code': { icon: '⟁', name: 'Claude Code', company: 'Anthropic' },\n 'cursor': { icon: '◫', name: 'Cursor', company: 'Anysphere' },\n 'codex': { icon: '◎', name: 'Codex CLI', company: 'OpenAI' },\n 'gemini-cli': { icon: '✦', name: 'Gemini CLI', company: 'Google' },\n 'opencode': { icon: '⬡', name: 'OpenCode', company: 'SST' },\n 'github-copilot': { icon: '◈', name: 'Copilot', company: 'GitHub' },\n 'windsurf': { icon: '≋', name: 'Windsurf', company: 'Codeium' },\n 'droid': { icon: '▣', name: 'Droid', company: 'Factory' },\n 'goose': { icon: '◇', name: 'Goose', company: 'Block' },\n 'amp': { icon: '△', name: 'Amp', company: 'Sourcegraph' },\n 'kilo': { icon: '◉', name: 'Kilo Code', company: '' },\n 'kiro-cli': { icon: '⬢', name: 'Kiro', company: 'AWS' },\n 'roo': { icon: '⊙', name: 'Roo Code', company: '' },\n 'trae': { icon: '◆', name: 'Trae', company: 'ByteDance' },\n 'antigravity': { icon: '⊛', name: 'Antigravity', company: '' },\n 'clawdbot': { icon: '⟐', name: 'Clawdbot', company: '' },\n 'cline': { icon: '⊕', name: 'Cline', company: '' },\n 'codebuddy': { icon: '⊗', name: 'CodeBuddy', company: '' },\n 'commandcode': { icon: '⊘', name: 'CommandCode', company: '' },\n 'continue': { icon: '⊞', name: 'Continue', company: '' },\n 'crush': { icon: '⊟', name: 'Crush', company: '' },\n 'factory': { icon: '⊠', name: 'Factory', company: '' },\n 'mcpjam': { icon: '⊡', name: 'MCPJam', company: '' },\n 'mux': { icon: '⊢', name: 'Mux', company: '' },\n 'neovate': { icon: '⊣', name: 'Neovate', company: '' },\n 'openhands': { icon: '⊤', name: 'OpenHands', company: '' },\n 'pi': { icon: '⊥', name: 'Pi', company: '' },\n 'qoder': { icon: '⊦', name: 'Qoder', company: '' },\n 'qwen': { icon: '⊧', name: 'Qwen', company: 'Alibaba' },\n 'vercel': { icon: '▲', name: 'Vercel', company: 'Vercel' },\n 'zencoder': { icon: '⊩', name: 'Zencoder', company: '' },\n 'universal': { icon: '●', name: 'Universal', company: '' },\n} as const;\n\n/**\n * UI symbols for status and navigation\n */\nexport const symbols = {\n // Navigation\n pointer: '▸',\n pointerInactive: ' ',\n bullet: '●',\n bulletEmpty: '○',\n\n // Status\n success: '✓',\n error: '✗',\n warning: '⚠',\n info: 'ℹ',\n pending: '○',\n active: '●',\n synced: '●',\n\n // Progress\n progressFilled: '█',\n progressEmpty: '░',\n\n // Spinner frames\n spinner: ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'] as const,\n\n // Arrows\n arrowUp: '↑',\n arrowDown: '↓',\n arrowLeft: '←',\n arrowRight: '→',\n\n // Decorative\n diamond: '◆',\n diamondEmpty: '◇',\n star: '★',\n starEmpty: '☆',\n\n // Box drawing\n horizontalLine: '─',\n verticalLine: '│',\n topLeft: '┌',\n topRight: '┐',\n bottomLeft: '└',\n bottomRight: '┘',\n\n // Brand\n brandIcon: '◆',\n} as const;\n\nexport type SymbolName = keyof typeof symbols;\n\n/**\n * Get agent logo by agent type ID\n */\nexport function getAgentLogo(agentType: string): AgentLogo | undefined {\n return AGENT_LOGOS[agentType];\n}\n\n/**\n * Get all agent types\n */\nexport function getAgentTypes(): string[] {\n return Object.keys(AGENT_LOGOS);\n}\n\n/**\n * Get formatted agent display string (icon + name)\n */\nexport function formatAgentDisplay(agentType: string): string {\n const logo = AGENT_LOGOS[agentType];\n if (!logo) return agentType;\n return `${logo.icon} ${logo.name}`;\n}\n","/**\n * Helper utilities for agent and skill operations\n */\nimport {\n loadConfig,\n getSearchDirs as coreGetSearchDirs,\n getInstallDir as coreGetInstallDir,\n saveSkillMetadata as coreSaveSkillMetadata,\n} from '@skillkit/core';\nimport { getAdapter } from '@skillkit/agents';\nimport type { AgentType, AgentAdapterInfo, SkillMetadata } from '@skillkit/core';\nimport { readFileSync } from 'node:fs';\nimport { join, dirname } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\n/**\n * Get search directories for skills based on agent type\n * @param agentType - Optional agent type (defaults to configured agent)\n * @returns Array of directories to search for skills\n */\nexport function getSearchDirs(agentType?: AgentType): string[] {\n const type = agentType || loadConfig().agent;\n const adapter = getAdapter(type);\n const adapterInfo: AgentAdapterInfo = {\n type: adapter.type,\n name: adapter.name,\n skillsDir: adapter.skillsDir,\n configFile: adapter.configFile,\n };\n return coreGetSearchDirs(adapterInfo);\n}\n\n/**\n * Get installation directory for skills\n * @param global - Whether to get global or project-local directory\n * @param agentType - Optional agent type (defaults to configured agent)\n * @returns Installation directory path\n */\nexport function getInstallDir(global = false, agentType?: AgentType): string {\n const type = agentType || loadConfig().agent;\n const adapter = getAdapter(type);\n const adapterInfo: AgentAdapterInfo = {\n type: adapter.type,\n name: adapter.name,\n skillsDir: adapter.skillsDir,\n configFile: adapter.configFile,\n };\n return coreGetInstallDir(adapterInfo, global);\n}\n\n/**\n * Save skill metadata to a skill directory\n * @param skillDir - Directory containing the skill\n * @param metadata - Metadata to save\n */\nexport function saveSkillMetadata(\n skillDir: string,\n metadata: SkillMetadata\n): void {\n coreSaveSkillMetadata(skillDir, metadata);\n}\n\n/**\n * Get version from package.json\n * @returns Version string\n */\nexport function getVersion(): string {\n try {\n // Try to read from package.json relative to the built file\n const __filename = fileURLToPath(import.meta.url);\n const __dirname = dirname(__filename);\n const packagePath = join(__dirname, '..', '..', 'package.json');\n const packageJson = JSON.parse(readFileSync(packagePath, 'utf-8'));\n return packageJson.version || '1.0.0';\n } catch {\n return '1.0.0';\n }\n}\n","import { type Screen, SIDEBAR_NAV } from '../state/types.js';\nimport { terminalColors } from '../theme/colors.js';\nimport { symbols } from '../theme/symbols.js';\nimport { getVersion } from '../utils/helpers.js';\n\ninterface SidebarProps {\n screen: Screen;\n onNavigate: (screen: Screen) => void;\n}\n\nexport function Sidebar({ screen }: SidebarProps) {\n const version = getVersion();\n\n return (\n <box flexDirection=\"column\" width={18} paddingRight={1}>\n <text fg={terminalColors.accent}>\n <b>{symbols.brandIcon} skillkit</b>\n </text>\n <text fg={terminalColors.textMuted}>v{version}</text>\n <text> </text>\n\n {SIDEBAR_NAV.map(({ section, items }, idx) => (\n <box key={section} flexDirection=\"column\">\n {idx > 0 && <text> </text>}\n <text fg={terminalColors.textMuted}>\n <i>{section}</i>\n </text>\n {items.map((item) => {\n const active = screen === item.screen;\n return (\n <text key={item.key} fg={active ? terminalColors.accent : terminalColors.text}>\n {active ? <b>{symbols.pointer} {item.label}</b> : <>{symbols.pointerInactive} {item.label}</>}\n </text>\n );\n })}\n </box>\n ))}\n\n <box flexGrow={1} />\n <text fg={terminalColors.textMuted}>{symbols.horizontalLine.repeat(14)}</text>\n <text fg={terminalColors.textMuted}>/ help q quit</text>\n </box>\n );\n}\n","/**\n * Splash Component\n * Cinematic ASCII art intro with elegant animations\n * Premium terminal experience\n */\nimport { useState, useEffect, useMemo, useCallback } from 'react';\nimport { terminalColors } from '../theme/colors.js';\nimport { getVersion } from '../utils/helpers.js';\n\n// Premium ASCII art logo - clean geometric design\nconst LOGO_FRAMES = [\n // Frame 1 - Dots appear\n [\n ' ',\n ' · · · · · · · · · · · · · · · ',\n ' ',\n ],\n // Frame 2 - Lines form\n [\n ' ',\n ' ━━━ ━ ━ ━ ━ ━ ━ ━ ━━━ ',\n ' ',\n ],\n // Frame 3 - Structure emerges\n [\n ' ┌──┐ ┬ ┌─ ┬ ┬ ┬ ┬ ┌─ ┬ ┌─┐ ',\n ' └──┐ │ │ │ │ │ │ │ │ │ ',\n ' └──┘ ┴ └─ ┴ ┴─┘ ┴─┘ ┴ └─ ┴ ┴ ',\n ],\n // Frame 4 - Bold letters\n [\n ' ╔═╗ ╦╔═ ╦ ╦ ╦ ╦╔═ ╦╔╦╗ ',\n ' ╚═╗ ╠╩╗ ║ ║ ║ ╠╩╗ ║ ║ ',\n ' ╚═╝ ╩ ╩ ╩ ╩═╝ ╩═╝ ╩ ╩ ╩ ╩ ',\n ],\n // Frame 5 - Final premium logo\n [\n ' ███████╗██╗ ██╗██╗██╗ ██╗ ██╗ ██╗██╗████████╗',\n ' ██╔════╝██║ ██╔╝██║██║ ██║ ██║ ██╔╝██║╚══██╔══╝',\n ' ███████╗█████╔╝ ██║██║ ██║ █████╔╝ ██║ ██║ ',\n ' ╚════██║██╔═██╗ ██║██║ ██║ ██╔═██╗ ██║ ██║ ',\n ' ███████║██║ ██╗██║███████╗███████╗██║ ██╗██║ ██║ ',\n ' ╚══════╝╚═╝ ╚═╝╚═╝╚══════╝╚══════╝╚═╝ ╚═╝╚═╝ ╚═╝ ',\n ],\n];\n\n// Compact logo for smaller terminals\nconst LOGO_SMALL = [\n ' ╔═╗╦╔═╦╦ ╦ ╦╔═╦╔╦╗ ',\n ' ╚═╗╠╩╗║║ ║ ╠╩╗║ ║ ',\n ' ╚═╝╩ ╩╩╩═╝╩═╝╩ ╩╩ ╩ ',\n];\n\n// Elegant spinner frames\nconst SPINNER = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];\n\n// Progress bar characters\nconst PROGRESS = {\n empty: '░',\n filled: '█',\n head: '▓',\n};\n\n// Loading phases with elegant messaging\nconst PHASES = [\n { message: 'Initializing', detail: 'skill engine' },\n { message: 'Connecting', detail: 'agent network' },\n { message: 'Loading', detail: 'skill manifests' },\n { message: 'Syncing', detail: 'configurations' },\n { message: 'Ready', detail: '' },\n];\n\ninterface SplashProps {\n onComplete: () => void;\n duration?: number;\n}\n\nexport function Splash({ onComplete, duration = 3500 }: SplashProps) {\n const [frame, setFrame] = useState(0);\n const [progress, setProgress] = useState(0);\n const [spinnerFrame, setSpinnerFrame] = useState(0);\n const [phase, setPhase] = useState(0);\n const [fadeIn, setFadeIn] = useState(0);\n const [particles, setParticles] = useState<string[]>([]);\n\n // Cache version to avoid repeated sync file I/O on every render\n const version = useMemo(() => getVersion(), []);\n const cols = process.stdout.columns || 80;\n const rows = process.stdout.rows || 24;\n const useSmallLogo = cols < 70;\n const currentLogo = useSmallLogo ? LOGO_SMALL : (LOGO_FRAMES[Math.min(frame, 4)] || LOGO_FRAMES[4]);\n const maxWidth = Math.max(...currentLogo.map(l => l.length));\n\n // Generate ambient particles - returns fresh randomized string each call\n const generateParticles = useCallback(() => {\n const chars = ['·', '∙', '•', '○', '◦', '◌', '◍', '◎'];\n return Array(cols).fill(0).map(() =>\n Math.random() > 0.97 ? chars[Math.floor(Math.random() * chars.length)] : ' '\n ).join('');\n }, [cols]);\n\n // Logo reveal animation\n useEffect(() => {\n if (frame >= 4) return;\n const timer = setTimeout(() => setFrame(f => f + 1), 200);\n return () => clearTimeout(timer);\n }, [frame]);\n\n // Fade in effect\n useEffect(() => {\n if (fadeIn >= 10) return;\n const timer = setTimeout(() => setFadeIn(f => f + 1), 50);\n return () => clearTimeout(timer);\n }, [fadeIn]);\n\n // Progress animation\n useEffect(() => {\n const interval = setInterval(() => {\n setProgress(p => {\n const newProgress = p + (Math.random() * 3 + 1);\n if (newProgress >= 100) {\n clearInterval(interval);\n return 100;\n }\n return newProgress;\n });\n }, 50);\n return () => clearInterval(interval);\n }, []);\n\n // Phase progression\n useEffect(() => {\n const phaseProgress = progress / 20;\n setPhase(Math.min(Math.floor(phaseProgress), PHASES.length - 1));\n }, [progress]);\n\n // Spinner animation\n useEffect(() => {\n const interval = setInterval(() => {\n setSpinnerFrame(f => (f + 1) % SPINNER.length);\n }, 80);\n return () => clearInterval(interval);\n }, []);\n\n // Particle animation\n useEffect(() => {\n const interval = setInterval(() => {\n setParticles(prev => {\n const newParticles = [...prev];\n if (newParticles.length > 3) newParticles.shift();\n newParticles.push(generateParticles());\n return newParticles;\n });\n }, 150);\n return () => clearInterval(interval);\n }, [generateParticles]);\n\n // Auto-complete\n useEffect(() => {\n const timer = setTimeout(onComplete, duration);\n return () => clearTimeout(timer);\n }, [onComplete, duration]);\n\n const pad = ' '.repeat(Math.max(0, Math.floor((cols - maxWidth) / 2)));\n const progressWidth = Math.max(1, Math.min(40, cols - 20));\n const progressPad = ' '.repeat(Math.max(0, Math.floor((cols - progressWidth) / 2)));\n\n const filledWidth = Math.min(Math.floor((progress / 100) * progressWidth), progressWidth);\n const emptyWidth = Math.max(0, progressWidth - filledWidth - 1);\n const progressBar = PROGRESS.filled.repeat(filledWidth) +\n (filledWidth < progressWidth ? PROGRESS.head : '') +\n PROGRESS.empty.repeat(emptyWidth);\n\n const currentPhase = PHASES[phase];\n\n return (\n <box flexDirection=\"column\" height={rows}>\n {/* Top ambient particles */}\n <text fg={terminalColors.textMuted}>\n {particles[0] || ''}\n </text>\n\n {/* Spacer */}\n <box flexGrow={1} />\n\n {/* Logo */}\n <box flexDirection=\"column\" alignItems=\"center\">\n {currentLogo.map((line, idx) => (\n <text key={idx} fg={frame >= 4 ? terminalColors.accent : terminalColors.textMuted}>\n {frame >= 4 ? <b>{pad}{line}</b> : <>{pad}{line}</>}\n </text>\n ))}\n </box>\n\n {/* Tagline with fade-in */}\n <text> </text>\n {fadeIn > 3 && (\n <text fg={terminalColors.textSecondary}>\n {pad}{' '}universal skills for ai coding agents\n </text>\n )}\n\n {/* Version badge */}\n {fadeIn > 5 && (\n <>\n <text> </text>\n <text fg={terminalColors.textMuted}>\n {pad}{' '}v{version}\n </text>\n </>\n )}\n\n {/* Spacer */}\n <text> </text>\n <text> </text>\n\n {/* Progress section */}\n {fadeIn > 7 && (\n <box flexDirection=\"column\" alignItems=\"center\">\n {/* Status line */}\n <box flexDirection=\"row\">\n <text fg={terminalColors.accent}>\n {progressPad}{SPINNER[spinnerFrame]}{' '}\n </text>\n <text fg={terminalColors.text}>\n <b>{currentPhase.message}</b>\n </text>\n {currentPhase.detail && (\n <text fg={terminalColors.textMuted}>\n {' '}{currentPhase.detail}\n </text>\n )}\n </box>\n\n {/* Progress bar */}\n <text> </text>\n <box flexDirection=\"row\">\n <text fg={terminalColors.textMuted}>{progressPad}[</text>\n <text fg={terminalColors.accent}>{progressBar}</text>\n <text fg={terminalColors.textMuted}>]</text>\n <text fg={terminalColors.textSecondary}>{' '}{Math.floor(progress)}%</text>\n </box>\n </box>\n )}\n\n {/* Spacer */}\n <box flexGrow={1} />\n\n {/* Bottom hint */}\n <box flexDirection=\"column\" alignItems=\"center\">\n <text fg={terminalColors.textMuted}>\n {progressPad}{' '}press any key to skip\n </text>\n <text> </text>\n {/* Bottom particles */}\n <text fg={terminalColors.textMuted}>\n {particles[1] || ''}\n </text>\n </box>\n </box>\n );\n}\n","import { useState, useEffect, useMemo } from 'react';\nimport { type Screen, loadSkills, TOTAL_AGENTS } from '../state/index.js';\nimport { terminalColors } from '../theme/colors.js';\nimport { symbols, AGENT_LOGOS } from '../theme/symbols.js';\nimport { getVersion } from '../utils/helpers.js';\n\ninterface HomeProps {\n onNavigate: (screen: Screen) => void;\n cols?: number;\n rows?: number;\n}\n\nconst FEATURES = [\n { key: 'Sync', color: terminalColors.sync, desc: 'share across agents' },\n { key: 'Browse', color: terminalColors.browse, desc: 'discover skills' },\n { key: 'Recommend', color: terminalColors.recommend, desc: 'AI suggestions' },\n { key: 'Translate', color: terminalColors.translate, desc: 'convert formats' },\n { key: 'Workflow', color: terminalColors.workflow, desc: 'automate chains' },\n { key: 'Team', color: terminalColors.text, desc: 'collaborate' },\n];\n\nexport function Home({ cols = 80 }: HomeProps) {\n const [animPhase, setAnimPhase] = useState(0);\n const [stats, setStats] = useState({ skills: 0, agents: TOTAL_AGENTS, synced: 0 });\n const [detectedAgents, setDetectedAgents] = useState<string[]>([]);\n\n const version = getVersion();\n const isCompact = cols < 70;\n const isNarrow = cols < 50;\n const contentWidth = Math.min(cols - 4, 55);\n const line = '─'.repeat(contentWidth);\n\n useEffect(() => {\n if (animPhase >= 5) return;\n const timer = setTimeout(() => setAnimPhase(p => p + 1), 100);\n return () => clearTimeout(timer);\n }, [animPhase]);\n\n useEffect(() => {\n const skillsData = loadSkills();\n setStats({\n skills: skillsData.skills.length,\n agents: TOTAL_AGENTS,\n synced: Math.min(skillsData.skills.length, 3),\n });\n setDetectedAgents(['claude-code', 'cursor', 'github-copilot']);\n }, []);\n\n const visibleAgents = useMemo(() => {\n const allAgents = Object.entries(AGENT_LOGOS);\n const perRow = isNarrow || isCompact ? 2 : 3;\n const maxAgents = isNarrow ? 4 : isCompact ? 6 : 9;\n return {\n agents: allAgents.slice(0, maxAgents),\n perRow,\n remaining: allAgents.length - maxAgents,\n };\n }, [isCompact, isNarrow]);\n\n const getAgentWidth = () => {\n if (isNarrow) return 22;\n if (isCompact) return 26;\n return 18;\n };\n\n return (\n <box flexDirection=\"column\" padding={1}>\n {animPhase >= 1 && (\n <box flexDirection=\"column\">\n <box flexDirection=\"row\">\n <text fg={terminalColors.text}>{symbols.brandIcon} skillkit</text>\n <text fg={terminalColors.textMuted}> v{version}</text>\n </box>\n <text fg={terminalColors.textMuted}>universal skills for ai coding agents</text>\n <text> </text>\n </box>\n )}\n\n {animPhase >= 2 && (\n <box flexDirection=\"column\">\n <text fg={terminalColors.textMuted}>{line}</text>\n <text> </text>\n <box flexDirection=\"row\">\n <box width={14}><text fg={terminalColors.accent}>{stats.skills}</text></box>\n <box width={14}><text fg={terminalColors.text}>{stats.agents}</text></box>\n <box width={14}><text fg={terminalColors.text}>{stats.synced}</text></box>\n </box>\n <box flexDirection=\"row\">\n <text fg={terminalColors.textMuted} width={14}>skills</text>\n <text fg={terminalColors.textMuted} width={14}>agents</text>\n <text fg={terminalColors.textMuted} width={14}>synced</text>\n </box>\n <text> </text>\n <text fg={terminalColors.textMuted}>{line}</text>\n <text> </text>\n </box>\n )}\n\n {animPhase >= 3 && (\n <box flexDirection=\"column\">\n <text fg={terminalColors.text}>Works with</text>\n <text> </text>\n {Array(Math.ceil(visibleAgents.agents.length / visibleAgents.perRow))\n .fill(0)\n .map((_, rowIdx) => (\n <box key={rowIdx} flexDirection=\"row\">\n {visibleAgents.agents\n .slice(rowIdx * visibleAgents.perRow, (rowIdx + 1) * visibleAgents.perRow)\n .map(([type, agent]) => {\n const isDetected = detectedAgents.includes(type);\n return (\n <box key={type} width={getAgentWidth()} flexDirection=\"row\">\n <text fg={terminalColors.text}>{agent.icon} {agent.name} </text>\n <text fg={isDetected ? terminalColors.accent : terminalColors.textMuted}>\n {isDetected ? '●' : '○'}\n </text>\n </box>\n );\n })}\n </box>\n ))}\n {visibleAgents.remaining > 0 && (\n <text fg={terminalColors.textMuted}>+{visibleAgents.remaining} more</text>\n )}\n <text> </text>\n <text fg={terminalColors.textMuted}>{line}</text>\n <text> </text>\n </box>\n )}\n\n {animPhase >= 4 && (\n <box flexDirection=\"column\">\n <text fg={terminalColors.text}>Features</text>\n <text> </text>\n {FEATURES.map((feat) => (\n <box key={feat.key} flexDirection=\"row\">\n <text fg={feat.color} width={12}> {feat.key}</text>\n <text fg={terminalColors.textMuted}>{feat.desc}</text>\n </box>\n ))}\n <text> </text>\n </box>\n )}\n\n {animPhase >= 5 && (\n <box flexDirection=\"column\">\n <text fg={terminalColors.textMuted}>{line}</text>\n <text fg={terminalColors.textMuted}>\n {isCompact ? 'b browse m market / help q quit' : 'b browse m market i installed / help q quit'}\n </text>\n </box>\n )}\n </box>\n );\n}\n","/**\n * Navigation state management for SkillKit TUI\n */\nimport type { Screen } from './types.js';\nimport { NAV_KEYS } from './types.js';\n\n/**\n * Navigation state\n */\nexport interface NavigationState {\n currentScreen: Screen;\n previousScreen: Screen | null;\n history: Screen[];\n}\n\n/**\n * Create initial navigation state\n */\nexport function createNavigationState(): NavigationState {\n return {\n currentScreen: 'home',\n previousScreen: null,\n history: ['home'],\n };\n}\n\n/**\n * Navigate to a new screen\n */\nexport function navigateTo(state: NavigationState, screen: Screen): NavigationState {\n if (state.currentScreen === screen) return state;\n\n return {\n currentScreen: screen,\n previousScreen: state.currentScreen,\n history: [...state.history, screen],\n };\n}\n\n/**\n * Go back to previous screen (or home)\n */\nexport function goBack(state: NavigationState): NavigationState {\n const previousScreen = state.previousScreen || 'home';\n return {\n currentScreen: previousScreen,\n previousScreen: state.history[state.history.length - 3] || null,\n history: state.history.slice(0, -1),\n };\n}\n\n/**\n * Get screen from key press\n */\nexport function getScreenFromKey(key: string): Screen | undefined {\n return NAV_KEYS[key];\n}\n\n/**\n * Check if a key is a navigation key\n */\nexport function isNavKey(key: string): boolean {\n return key in NAV_KEYS;\n}\n\nexport { NAV_KEYS };\n","/**\n * Skills state management for SkillKit TUI\n */\nimport { findAllSkills, evaluateSkillDirectory, getQualityGrade } from '@skillkit/core';\nimport { rmSync } from 'node:fs';\nimport { resolve, normalize } from 'node:path';\nimport { getSearchDirs } from '../utils/helpers.js';\nimport type { SkillItem } from './types.js';\nimport type { AgentType } from '@skillkit/core';\n\n/**\n * Skills store state\n */\nexport interface SkillsState {\n skills: SkillItem[];\n loading: boolean;\n error: string | null;\n}\n\n/**\n * Create initial skills state\n */\nexport function createSkillsState(): SkillsState {\n return {\n skills: [],\n loading: true,\n error: null,\n };\n}\n\n/**\n * Load installed skills\n * @param agentType - Optional agent type to load skills for\n * @returns Updated skills state\n */\nexport function loadSkills(agentType?: AgentType): SkillsState {\n try {\n const searchDirs = getSearchDirs(agentType);\n const foundSkills = findAllSkills(searchDirs);\n\n const skillItems: SkillItem[] = foundSkills.map((s) => {\n const quality = evaluateSkillDirectory(s.path);\n return {\n name: s.name,\n description: s.description,\n source: s.metadata?.source,\n enabled: s.enabled,\n quality: quality?.overall,\n grade: quality ? getQualityGrade(quality.overall) : undefined,\n warnings: quality?.warnings.length,\n };\n });\n\n return {\n skills: skillItems,\n loading: false,\n error: null,\n };\n } catch (err) {\n return {\n skills: [],\n loading: false,\n error: err instanceof Error ? err.message : 'Failed to load skills',\n };\n }\n}\n\n/**\n * Remove a skill by name\n * @param skillName - Name of the skill to remove\n * @param agentType - Optional agent type\n * @returns true if removed, false otherwise\n */\nexport function removeSkill(skillName: string, agentType?: AgentType): boolean {\n try {\n const searchDirs = getSearchDirs(agentType);\n const allSkills = findAllSkills(searchDirs);\n const skill = allSkills.find((s) => s.name === skillName);\n\n if (skill) {\n const normalizedPath = normalize(resolve(skill.path));\n const isWithinSearchDirs = searchDirs.some((dir) => {\n const normalizedDir = normalize(resolve(dir));\n return normalizedPath.startsWith(normalizedDir + '/') || normalizedPath === normalizedDir;\n });\n\n if (!isWithinSearchDirs) {\n return false;\n }\n\n rmSync(skill.path, { recursive: true, force: true });\n return true;\n }\n return false;\n } catch {\n return false;\n }\n}\n\n/**\n * Filter skills by search query\n */\nexport function filterSkills(skills: SkillItem[], query: string): SkillItem[] {\n if (!query.trim()) return skills;\n\n const lowerQuery = query.toLowerCase();\n return skills.filter(\n (s) =>\n s.name.toLowerCase().includes(lowerQuery) ||\n s.description?.toLowerCase().includes(lowerQuery) ||\n s.source?.toLowerCase().includes(lowerQuery)\n );\n}\n","/**\n * Agent state management for SkillKit TUI\n */\nimport { loadConfig } from '@skillkit/core';\nimport { detectAgent, getAdapter, getAllAdapters } from '@skillkit/agents';\nimport type { AgentType } from '@skillkit/core';\n\n/**\n * Agent status information\n */\nexport interface AgentStatus {\n type: AgentType;\n name: string;\n detected: boolean;\n configured: boolean;\n}\n\n/**\n * Agents state\n */\nexport interface AgentsState {\n agents: AgentStatus[];\n currentAgent: AgentType;\n loading: boolean;\n error: string | null;\n}\n\n/**\n * Create initial agents state\n */\nexport function createAgentsState(): AgentsState {\n return {\n agents: [],\n currentAgent: 'universal',\n loading: true,\n error: null,\n };\n}\n\n/**\n * Load all agents with their detection status\n */\nexport async function loadAgents(): Promise<AgentsState> {\n try {\n const config = loadConfig();\n const currentAgent = config.agent || 'universal';\n const detectedAgent = await detectAgent();\n const allAdapters = getAllAdapters();\n\n const agents: AgentStatus[] = allAdapters.map((adapter) => ({\n type: adapter.type,\n name: adapter.name,\n detected: adapter.type === detectedAgent,\n configured: adapter.type === currentAgent,\n }));\n\n return {\n agents,\n currentAgent,\n loading: false,\n error: null,\n };\n } catch (err) {\n return {\n agents: [],\n currentAgent: 'universal',\n loading: false,\n error: err instanceof Error ? err.message : 'Failed to load agents',\n };\n }\n}\n\n/**\n * Get count of detected agents\n */\nexport function getDetectedAgentCount(state: AgentsState): number {\n return state.agents.filter((a) => a.detected).length;\n}\n\n/**\n * Get list of detected agents\n */\nexport function getDetectedAgents(state: AgentsState): AgentStatus[] {\n return state.agents.filter((a) => a.detected);\n}\n\n/**\n * Get agent adapter by type\n */\nexport function getAgentAdapter(type: AgentType) {\n return getAdapter(type);\n}\n\n/**\n * Total number of supported agents (derived from adapters)\n */\nexport const TOTAL_AGENTS = getAllAdapters().length;\n","/**\n * Marketplace state management for SkillKit TUI\n */\nimport { detectProvider, loadConfig, extractFrontmatter } from '@skillkit/core';\nimport { readFileSync, existsSync, rmSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { SkillItem, RepoInfo, FetchedSkill } from './types.js';\n\n/**\n * Default repos loaded from marketplace/sources.json (single source of truth)\n * Import at runtime to allow updates without code changes\n */\nimport sourcesData from '../../../../marketplace/sources.json' with { type: 'json' };\n\nexport const DEFAULT_REPOS: RepoInfo[] = sourcesData.sources.map((s: { source: string; name: string }) => ({\n source: s.source,\n name: s.name,\n}));\n\n/**\n * Marketplace state\n */\nexport interface MarketplaceState {\n allSkills: FetchedSkill[];\n filteredSkills: FetchedSkill[];\n loading: boolean;\n error: string | null;\n currentRepo: string | null;\n fetchedRepos: Set<string>;\n failedRepos: string[];\n repos: RepoInfo[];\n}\n\n/**\n * Get marketplace repos from config or use defaults\n */\nexport function getMarketplaceRepos(): RepoInfo[] {\n try {\n const config = loadConfig();\n if (config.marketplaceSources?.length) {\n const configRepos: RepoInfo[] = config.marketplaceSources.map((source) => ({\n source,\n name: source.split('/').pop() || source,\n }));\n const existingSources = new Set(configRepos.map((r) => r.source));\n for (const repo of DEFAULT_REPOS) {\n if (!existingSources.has(repo.source)) {\n configRepos.push(repo);\n }\n }\n return configRepos;\n }\n } catch {\n // Config load failed, use defaults\n }\n return DEFAULT_REPOS;\n}\n\n/**\n * Create initial marketplace state\n */\nexport function createMarketplaceState(): MarketplaceState {\n return {\n allSkills: [],\n filteredSkills: [],\n loading: false,\n error: null,\n currentRepo: null,\n fetchedRepos: new Set(),\n failedRepos: [],\n repos: getMarketplaceRepos(),\n };\n}\n\n/**\n * Try to read skill description from frontmatter\n */\nexport function readSkillDescription(skillPath: string): string | undefined {\n const skillMdPath = join(skillPath, 'SKILL.md');\n if (!existsSync(skillMdPath)) {\n return undefined;\n }\n try {\n const content = readFileSync(skillMdPath, 'utf-8');\n const frontmatter = extractFrontmatter(content);\n if (frontmatter && typeof frontmatter.description === 'string') {\n return frontmatter.description;\n }\n } catch {\n // Failed to read, return undefined\n }\n return undefined;\n}\n\n/**\n * Fetch skills from a single repository\n */\nexport async function fetchRepoSkills(\n source: string,\n repos: RepoInfo[]\n): Promise<{\n skills: FetchedSkill[];\n tempRoot?: string;\n error?: string;\n}> {\n try {\n const provider = detectProvider(source);\n if (!provider) {\n return { skills: [], error: `Could not detect provider for: ${source}` };\n }\n\n const result = await provider.clone(source, '', { depth: 1 });\n\n if (!result.success || !result.discoveredSkills) {\n return { skills: [], error: result.error || 'Failed to fetch skills' };\n }\n\n const repoName = repos.find((r) => r.source === source)?.name || source;\n const skills: FetchedSkill[] = result.discoveredSkills.map((skill) => ({\n name: skill.name,\n source: source,\n repoName: repoName,\n description: readSkillDescription(skill.path),\n }));\n\n return { skills, tempRoot: result.tempRoot };\n } catch (err) {\n return {\n skills: [],\n error: err instanceof Error ? err.message : 'Failed to fetch repository',\n };\n }\n}\n\n/**\n * Clean up temp directory from fetch\n */\nexport function cleanupTempRoot(tempRoot: string): void {\n try {\n rmSync(tempRoot, { recursive: true, force: true });\n } catch {\n // Ignore cleanup errors\n }\n}\n\n/**\n * Filter skills by search query\n */\nexport function filterMarketplaceSkills(\n skills: FetchedSkill[],\n query: string\n): FetchedSkill[] {\n if (!query.trim()) return skills;\n\n const lowerQuery = query.toLowerCase();\n return skills.filter(\n (s) =>\n s.name.toLowerCase().includes(lowerQuery) ||\n s.source.toLowerCase().includes(lowerQuery) ||\n s.repoName.toLowerCase().includes(lowerQuery) ||\n s.description?.toLowerCase().includes(lowerQuery)\n );\n}\n\n/**\n * Convert fetched skills to skill items for display\n */\nexport function toSkillItems(skills: FetchedSkill[]): SkillItem[] {\n return skills.map((s) => ({\n name: s.name,\n description: s.description || s.repoName,\n source: s.source,\n }));\n}\n\n/**\n * Sort skills alphabetically by name\n */\nexport function sortSkillsByName(skills: FetchedSkill[]): FetchedSkill[] {\n return [...skills].sort((a, b) => a.name.localeCompare(b.name));\n}\n","{\n \"$schema\": \"./sources-schema.json\",\n \"version\": 1,\n \"updatedAt\": \"2026-01-26\",\n \"description\": \"Curated skill repository sources - THE SINGLE SOURCE OF TRUTH\",\n \"sources\": [\n { \"source\": \"anthropics/skills\", \"name\": \"Anthropic Official\", \"official\": true },\n { \"source\": \"vercel-labs/agent-skills\", \"name\": \"Vercel Labs\", \"official\": true },\n { \"source\": \"expo/skills\", \"name\": \"Expo / React Native\", \"official\": true },\n { \"source\": \"remotion-dev/skills\", \"name\": \"Remotion Video\", \"official\": true },\n { \"source\": \"supabase/agent-skills\", \"name\": \"Supabase\", \"official\": true },\n { \"source\": \"stripe/ai\", \"name\": \"Stripe Payments\", \"official\": true },\n { \"source\": \"ComposioHQ/awesome-claude-skills\", \"name\": \"Composio Awesome\" },\n { \"source\": \"travisvn/awesome-claude-skills\", \"name\": \"Travis Awesome\" },\n { \"source\": \"mhattingpete/claude-skills-marketplace\", \"name\": \"Skills Marketplace\" },\n { \"source\": \"coreyhaines31/marketingskills\", \"name\": \"Marketing Skills\" },\n { \"source\": \"obra/superpowers\", \"name\": \"Superpowers TDD\" },\n { \"source\": \"softaworks/agent-toolkit\", \"name\": \"Softaworks Toolkit\" },\n { \"source\": \"wshobson/agents\", \"name\": \"Dev Patterns\" },\n { \"source\": \"langgenius/dify\", \"name\": \"Dify Frontend\" },\n { \"source\": \"trailofbits/skills\", \"name\": \"Trail of Bits Security\" },\n { \"source\": \"better-auth/skills\", \"name\": \"Better Auth\" },\n { \"source\": \"onmax/nuxt-skills\", \"name\": \"Nuxt / Vue\" },\n { \"source\": \"hyf0/vue-skills\", \"name\": \"Vue Best Practices\" },\n { \"source\": \"jezweb/claude-skills\", \"name\": \"Cloudflare / TanStack\" },\n { \"source\": \"elysiajs/skills\", \"name\": \"ElysiaJS / Bun\" },\n { \"source\": \"kadajett/agent-nestjs-skills\", \"name\": \"NestJS\" },\n { \"source\": \"callstackincubator/agent-skills\", \"name\": \"React Native\" },\n { \"source\": \"cloudai-x/threejs-skills\", \"name\": \"Three.js\" },\n { \"source\": \"emalorenzo/three-agent-skills\", \"name\": \"Three.js Advanced\" },\n { \"source\": \"dimillian/skills\", \"name\": \"SwiftUI iOS\" },\n { \"source\": \"waynesutton/convexskills\", \"name\": \"Convex Backend\" },\n { \"source\": \"kepano/obsidian-skills\", \"name\": \"Obsidian Notes\" },\n { \"source\": \"jimliu/baoyu-skills\", \"name\": \"Baoyu Tools\" },\n { \"source\": \"giuseppe-trisciuoglio/developer-kit\", \"name\": \"Shadcn / Radix\" },\n { \"source\": \"openrouterteam/agent-skills\", \"name\": \"OpenRouter SDK\" },\n { \"source\": \"intellectronica/agent-skills\", \"name\": \"Context7\" }\n ]\n}\n","import { useState, useEffect, useMemo, useCallback } from 'react';\nimport { useKeyboard } from '@opentui/react';\nimport { type Screen, DEFAULT_REPOS } from '../state/index.js';\nimport { terminalColors } from '../theme/colors.js';\n\ninterface BrowseProps {\n onNavigate: (screen: Screen) => void;\n cols?: number;\n rows?: number;\n}\n\nexport function Browse({ onNavigate, cols = 80, rows = 24 }: BrowseProps) {\n const [selectedIndex, setSelectedIndex] = useState(0);\n const [searchQuery, setSearchQuery] = useState('');\n const [searchMode, setSearchMode] = useState(false);\n const [animPhase, setAnimPhase] = useState(0);\n\n const isCompact = cols < 60;\n const contentWidth = Math.max(1, Math.min(cols - 4, 60));\n\n // Entrance animation\n useEffect(() => {\n if (animPhase >= 2) return;\n const timer = setTimeout(() => setAnimPhase(p => p + 1), 100);\n return () => clearTimeout(timer);\n }, [animPhase]);\n\n const repos = useMemo(() =>\n DEFAULT_REPOS.map((r) => ({\n name: r.name,\n source: r.source,\n })),\n []\n );\n\n const filteredRepos = useMemo(() =>\n searchQuery\n ? repos.filter(\n (r) =>\n r.name.toLowerCase().includes(searchQuery.toLowerCase()) ||\n r.source.toLowerCase().includes(searchQuery.toLowerCase())\n )\n : repos,\n [repos, searchQuery]\n );\n\n const handleKeyNav = useCallback((delta: number) => {\n setSelectedIndex(prev => Math.max(0, Math.min(prev + delta, filteredRepos.length - 1)));\n }, [filteredRepos.length]);\n\n useKeyboard((key: { name?: string; sequence?: string }) => {\n if (searchMode) {\n if (key.name === 'escape') {\n setSearchMode(false);\n } else if (key.name === 'backspace') {\n setSearchQuery(prev => prev.slice(0, -1));\n } else if (key.name === 'return') {\n setSearchMode(false);\n } else if (key.sequence && key.sequence.length === 1 && /[a-zA-Z0-9\\-_.]/.test(key.sequence)) {\n setSearchQuery(prev => prev + key.sequence);\n setSelectedIndex(0);\n }\n return;\n }\n\n if (key.name === 'j' || key.name === 'down') handleKeyNav(1);\n else if (key.name === 'k' || key.name === 'up') handleKeyNav(-1);\n else if (key.sequence === '/') setSearchMode(true);\n else if (key.name === 'return') {\n const repo = filteredRepos[selectedIndex];\n if (repo) {\n // Open/view the selected repo (navigate to installed to see skills from this repo)\n onNavigate('installed');\n }\n }\n else if (key.name === 'escape') onNavigate('home');\n });\n\n useEffect(() => {\n if (selectedIndex >= filteredRepos.length && filteredRepos.length > 0) {\n setSelectedIndex(filteredRepos.length - 1);\n }\n }, [filteredRepos.length, selectedIndex]);\n\n // Calculate visible repos\n const maxVisible = Math.max(5, rows - 10);\n const startIdx = Math.max(0, Math.min(selectedIndex - Math.floor(maxVisible / 2), filteredRepos.length - maxVisible));\n const visibleRepos = filteredRepos.slice(startIdx, startIdx + maxVisible);\n\n const divider = useMemo(() =>\n <text fg={terminalColors.textMuted}>{'─'.repeat(contentWidth)}</text>,\n [contentWidth]\n );\n\n const shortcuts = isCompact\n ? 'j/k nav enter open / search esc back'\n : 'j/k navigate enter open / search esc back';\n\n return (\n <box flexDirection=\"column\" padding={1}>\n {/* Header */}\n {animPhase >= 1 && (\n <box flexDirection=\"column\">\n <box flexDirection=\"row\" justifyContent=\"space-between\" width={contentWidth}>\n <text fg={terminalColors.browse}>⌕ Browse</text>\n <text fg={terminalColors.textMuted}>{filteredRepos.length} repos</text>\n </box>\n <text fg={terminalColors.textMuted}>explore skill repositories</text>\n <text> </text>\n </box>\n )}\n\n {/* Search */}\n {animPhase >= 2 && (\n <box flexDirection=\"column\">\n {divider}\n <text> </text>\n <box flexDirection=\"row\">\n <text fg={terminalColors.textMuted}>/ </text>\n <text fg={searchQuery ? terminalColors.text : terminalColors.textMuted}>\n {searchQuery || 'type to filter...'}\n </text>\n </box>\n <text> </text>\n {divider}\n <text> </text>\n </box>\n )}\n\n {/* Repository list */}\n {animPhase >= 2 && (\n <box flexDirection=\"column\">\n <text fg={terminalColors.text}>Repositories</text>\n <text> </text>\n\n {filteredRepos.length === 0 ? (\n <text fg={terminalColors.textMuted}>No repositories match your search</text>\n ) : (\n <box flexDirection=\"column\">\n {visibleRepos.map((repo, idx) => {\n const actualIdx = startIdx + idx;\n const selected = actualIdx === selectedIndex;\n const indicator = selected ? '▸' : ' ';\n // Truncate source if needed - clamp to avoid negative slicing\n const maxSourceLen = Math.max(0, contentWidth - repo.name.length - 6);\n const displaySource = maxSourceLen > 3 && repo.source.length > maxSourceLen\n ? repo.source.slice(0, maxSourceLen - 3) + '...'\n : repo.source;\n // Use single text element to avoid rendering overlap issues\n const line = `${indicator}${repo.name} · ${displaySource}`;\n return (\n <text key={repo.source} fg={selected ? terminalColors.accent : terminalColors.text}>\n {line}\n </text>\n );\n })}\n </box>\n )}\n\n {/* Scroll indicator */}\n {filteredRepos.length > maxVisible && (\n <text fg={terminalColors.textMuted}>\n {'\\n'}showing {startIdx + 1}-{Math.min(startIdx + maxVisible, filteredRepos.length)} of {filteredRepos.length}\n </text>\n )}\n <text> </text>\n </box>\n )}\n\n {/* Footer */}\n {animPhase >= 2 && (\n <box flexDirection=\"column\">\n {divider}\n <text fg={terminalColors.textMuted}>{shortcuts}</text>\n </box>\n )}\n </box>\n );\n}\n","import { useState, useEffect, useMemo, useCallback } from 'react';\nimport { useKeyboard } from '@opentui/react';\nimport { type Screen, loadSkills, filterSkills } from '../state/index.js';\nimport { terminalColors } from '../theme/colors.js';\n\ninterface InstalledProps {\n onNavigate: (screen: Screen) => void;\n cols?: number;\n rows?: number;\n}\n\nconst SPINNER = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];\n\nexport function Installed({ onNavigate, cols = 80, rows = 24 }: InstalledProps) {\n const [selectedIndex, setSelectedIndex] = useState(0);\n const [searchQuery, setSearchQuery] = useState('');\n const [searchMode, setSearchMode] = useState(false);\n const [animPhase, setAnimPhase] = useState(0);\n const [spinnerFrame, setSpinnerFrame] = useState(0);\n const [skills, setSkills] = useState<ReturnType<typeof loadSkills>>({\n skills: [],\n loading: true,\n error: null,\n });\n\n const isCompact = cols < 60;\n const contentWidth = Math.max(1, Math.min(cols - 4, 60));\n\n // Entrance animation\n useEffect(() => {\n if (animPhase >= 2) return;\n const timer = setTimeout(() => setAnimPhase(p => p + 1), 100);\n return () => clearTimeout(timer);\n }, [animPhase]);\n\n // Loading spinner\n useEffect(() => {\n if (!skills.loading) return;\n const interval = setInterval(() => {\n setSpinnerFrame(f => (f + 1) % SPINNER.length);\n }, 80);\n return () => clearInterval(interval);\n }, [skills.loading]);\n\n // Load skills\n useEffect(() => {\n const data = loadSkills();\n setSkills(data);\n }, []);\n\n const filteredSkills = useMemo(() =>\n filterSkills(skills.skills, searchQuery),\n [skills.skills, searchQuery]\n );\n\n const handleKeyNav = useCallback((delta: number) => {\n setSelectedIndex(prev => Math.max(0, Math.min(prev + delta, filteredSkills.length - 1)));\n }, [filteredSkills.length]);\n\n const handleToggle = useCallback(() => {\n if (filteredSkills.length === 0) return;\n const skill = filteredSkills[selectedIndex];\n if (skill) {\n setSkills(prev => ({\n ...prev,\n skills: prev.skills.map(s =>\n s.name === skill.name ? { ...s, enabled: s.enabled === false } : s\n ),\n }));\n }\n }, [filteredSkills, selectedIndex]);\n\n const handleKeyboard = useCallback((key: { name?: string; sequence?: string }) => {\n if (searchMode) {\n if (key.name === 'escape') {\n setSearchMode(false);\n } else if (key.name === 'backspace') {\n setSearchQuery(prev => prev.slice(0, -1));\n } else if (key.name === 'return') {\n setSearchMode(false);\n } else if (key.sequence && key.sequence.length === 1 && /[a-zA-Z0-9\\-_.]/.test(key.sequence)) {\n setSearchQuery(prev => prev + key.sequence);\n setSelectedIndex(0);\n }\n return;\n }\n\n if (key.name === 'j' || key.name === 'down') handleKeyNav(1);\n else if (key.name === 'k' || key.name === 'up') handleKeyNav(-1);\n else if (key.sequence === '/') setSearchMode(true);\n else if (key.name === 'return') handleToggle();\n else if (key.name === 'd') handleToggle();\n else if (key.name === 'escape') onNavigate('home');\n }, [searchMode, handleKeyNav, handleToggle, onNavigate]);\n\n useKeyboard(handleKeyboard);\n\n useEffect(() => {\n if (selectedIndex >= filteredSkills.length && filteredSkills.length > 0) {\n setSelectedIndex(filteredSkills.length - 1);\n }\n }, [filteredSkills.length, selectedIndex]);\n\n // Calculate visible items\n const maxVisible = Math.max(5, rows - 10);\n const startIdx = Math.max(0, Math.min(selectedIndex - Math.floor(maxVisible / 2), filteredSkills.length - maxVisible));\n const visibleSkills = filteredSkills.slice(startIdx, startIdx + maxVisible);\n\n const divider = useMemo(() =>\n <text fg={terminalColors.textMuted}>{'─'.repeat(contentWidth)}</text>,\n [contentWidth]\n );\n\n // Stats\n const enabledCount = skills.skills.filter(s => s.enabled !== false).length;\n const totalCount = skills.skills.length;\n\n const shortcuts = isCompact\n ? 'j/k nav enter toggle d disable esc back'\n : 'j/k navigate enter toggle d disable esc back';\n\n return (\n <box flexDirection=\"column\" padding={1}>\n {/* Header */}\n {animPhase >= 1 && (\n <box flexDirection=\"column\">\n <box flexDirection=\"row\" justifyContent=\"space-between\" width={contentWidth}>\n <text fg={terminalColors.success}>✓ Installed</text>\n <text fg={terminalColors.textMuted}>{enabledCount}/{totalCount} active</text>\n </box>\n <text fg={terminalColors.textMuted}>manage your skills</text>\n <text> </text>\n </box>\n )}\n\n {/* Search */}\n {animPhase >= 2 && (\n <box flexDirection=\"column\">\n {divider}\n <text> </text>\n <box flexDirection=\"row\">\n <text fg={terminalColors.textMuted}>/ </text>\n <text fg={searchQuery ? terminalColors.text : terminalColors.textMuted}>\n {searchQuery || 'type to filter...'}\n </text>\n </box>\n <text> </text>\n {divider}\n <text> </text>\n </box>\n )}\n\n {/* Skills list */}\n {animPhase >= 2 && (\n <box flexDirection=\"column\">\n {skills.loading ? (\n <box flexDirection=\"row\">\n <text fg={terminalColors.accent}>{SPINNER[spinnerFrame]} </text>\n <text fg={terminalColors.text}>Loading skills...</text>\n </box>\n ) : skills.error ? (\n <box flexDirection=\"column\">\n <text fg={terminalColors.error}>✗ Error loading skills</text>\n <text fg={terminalColors.textMuted}>{skills.error}</text>\n </box>\n ) : filteredSkills.length === 0 ? (\n <box flexDirection=\"column\">\n <text fg={terminalColors.textMuted}>\n {skills.skills.length === 0\n ? 'No skills installed yet'\n : 'No skills match your search'}\n </text>\n {skills.skills.length === 0 && (\n <>\n <text> </text>\n <text fg={terminalColors.textMuted}>\n Press 'b' to browse or 'm' for marketplace\n </text>\n </>\n )}\n </box>\n ) : (\n <box flexDirection=\"column\">\n <text fg={terminalColors.text}>Skills</text>\n <text> </text>\n {visibleSkills.map((skill, idx) => {\n const actualIdx = startIdx + idx;\n const selected = actualIdx === selectedIndex;\n const indicator = selected ? '▸' : ' ';\n const statusIcon = skill.enabled !== false ? '●' : '○';\n const qualityBadge = skill.grade ? ` [${skill.grade}]` : '';\n const warningIndicator = skill.warnings && skill.warnings > 2 ? ' ⚠' : '';\n const line = `${indicator}${statusIcon} ${skill.name}${qualityBadge}${warningIndicator}`;\n const badgeColor = skill.quality !== undefined\n ? (skill.quality >= 80 ? terminalColors.success : skill.quality >= 60 ? terminalColors.warning : terminalColors.error)\n : terminalColors.text;\n return (\n <text key={skill.name} fg={selected ? terminalColors.accent : badgeColor}>\n {line}\n </text>\n );\n })}\n\n {/* Scroll indicator */}\n {filteredSkills.length > maxVisible && (\n <text fg={terminalColors.textMuted}>\n {'\\n'}showing {startIdx + 1}-{Math.min(startIdx + maxVisible, filteredSkills.length)} of {filteredSkills.length}\n </text>\n )}\n </box>\n )}\n <text> </text>\n </box>\n )}\n\n {/* Footer */}\n {animPhase >= 2 && (\n <box flexDirection=\"column\">\n {divider}\n <text fg={terminalColors.textMuted}>{shortcuts}</text>\n </box>\n )}\n </box>\n );\n}\n","import { useState, useEffect, useMemo, useCallback } from 'react';\nimport { useKeyboard } from '@opentui/react';\nimport { type Screen, DEFAULT_REPOS } from '../state/index.js';\nimport { terminalColors } from '../theme/colors.js';\n\ninterface MarketplaceProps {\n onNavigate: (screen: Screen) => void;\n cols?: number;\n rows?: number;\n}\n\nconst CATEGORIES = [\n { name: 'Development', count: 24 },\n { name: 'Testing', count: 18 },\n { name: 'DevOps', count: 15 },\n { name: 'Security', count: 12 },\n];\n\nexport function Marketplace({ onNavigate, cols = 80, rows = 24 }: MarketplaceProps) {\n const [selectedIndex, setSelectedIndex] = useState(0);\n const [animPhase, setAnimPhase] = useState(0);\n\n const isCompact = cols < 60;\n const contentWidth = Math.max(1, Math.min(cols - 4, 60));\n\n // Entrance animation\n useEffect(() => {\n if (animPhase >= 3) return;\n const timer = setTimeout(() => setAnimPhase(p => p + 1), 100);\n return () => clearTimeout(timer);\n }, [animPhase]);\n\n // Featured repos\n const featured = useMemo(() =>\n DEFAULT_REPOS.slice(0, 5).map((r, i) => ({\n name: r.name,\n stars: Math.floor(100 - i * 15),\n source: r.source,\n })),\n []\n );\n\n const maxVisible = Math.max(3, Math.floor((rows - 14) / 1));\n const visibleFeatured = featured.slice(0, maxVisible);\n\n const handleKeyNav = useCallback((delta: number) => {\n setSelectedIndex(prev => Math.max(0, Math.min(prev + delta, visibleFeatured.length - 1)));\n }, [visibleFeatured.length]);\n\n const handleInstall = useCallback(() => {\n const item = visibleFeatured[selectedIndex];\n if (item) {\n // Navigate to installed after \"installing\"\n onNavigate('installed');\n }\n }, [selectedIndex, visibleFeatured, onNavigate]);\n\n useKeyboard((key: { name?: string }) => {\n if (key.name === 'j' || key.name === 'down') handleKeyNav(1);\n else if (key.name === 'k' || key.name === 'up') handleKeyNav(-1);\n else if (key.name === 'return') handleInstall();\n else if (key.name === 'b') onNavigate('browse');\n else if (key.name === 'escape') onNavigate('home');\n });\n\n const divider = useMemo(() =>\n <text fg={terminalColors.textMuted}>{'─'.repeat(contentWidth)}</text>,\n [contentWidth]\n );\n\n const shortcuts = isCompact\n ? 'j/k nav enter install b browse esc back'\n : 'j/k navigate enter install b full browse esc back';\n\n return (\n <box flexDirection=\"column\" padding={1}>\n {/* Header */}\n {animPhase >= 1 && (\n <box flexDirection=\"column\">\n <box flexDirection=\"row\" justifyContent=\"space-between\" width={contentWidth}>\n <text fg={terminalColors.recommend}>★ Marketplace</text>\n <text fg={terminalColors.textMuted}>{DEFAULT_REPOS.length} available</text>\n </box>\n <text fg={terminalColors.textMuted}>discover featured skills</text>\n <text> </text>\n </box>\n )}\n\n {/* Categories */}\n {animPhase >= 2 && (\n <box flexDirection=\"column\">\n {divider}\n <text> </text>\n <text fg={terminalColors.text}>Categories</text>\n <text> </text>\n <box flexDirection=\"row\" gap={2}>\n {CATEGORIES.map(cat => (\n <text key={cat.name} fg={terminalColors.textMuted}>\n {cat.name} ({cat.count})\n </text>\n ))}\n </box>\n <text> </text>\n {divider}\n <text> </text>\n </box>\n )}\n\n {/* Featured section */}\n {animPhase >= 3 && (\n <box flexDirection=\"column\">\n <text fg={terminalColors.text}>Featured · <text fg={terminalColors.textMuted}>trending</text></text>\n <text> </text>\n\n {visibleFeatured.map((item, idx) => {\n const selected = idx === selectedIndex;\n const indicator = selected ? '▸' : ' ';\n // Use single text element to avoid rendering overlap\n const line = `${indicator}${item.name} ★${item.stars}`;\n return (\n <text key={item.source} fg={selected ? terminalColors.accent : terminalColors.text}>\n {line}\n </text>\n );\n })}\n\n {featured.length > maxVisible && (\n <text fg={terminalColors.textMuted}>\n {'\\n'}+{featured.length - maxVisible} more\n </text>\n )}\n <text> </text>\n </box>\n )}\n\n {/* Footer */}\n {animPhase >= 3 && (\n <box flexDirection=\"column\">\n {divider}\n <text fg={terminalColors.textMuted}>{shortcuts}</text>\n </box>\n )}\n </box>\n );\n}\n","import { useState, useEffect, useMemo, useCallback } from 'react';\nimport { useKeyboard } from '@opentui/react';\nimport { type Screen } from '../state/index.js';\nimport { terminalColors } from '../theme/colors.js';\n\ninterface RecommendProps {\n onNavigate: (screen: Screen) => void;\n cols?: number;\n rows?: number;\n}\n\nconst SPINNER = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];\n\nexport function Recommend({ onNavigate, cols = 80, rows = 24 }: RecommendProps) {\n const [selectedIndex, setSelectedIndex] = useState(0);\n const [analyzing, setAnalyzing] = useState(true);\n const [spinnerFrame, setSpinnerFrame] = useState(0);\n const [animPhase, setAnimPhase] = useState(0);\n const [analysisProgress, setAnalysisProgress] = useState(0);\n\n const isCompact = cols < 60;\n const contentWidth = Math.max(1, Math.min(cols - 4, 60));\n\n useEffect(() => {\n if (animPhase >= 3) return;\n const timer = setTimeout(() => setAnimPhase(p => p + 1), 100);\n return () => clearTimeout(timer);\n }, [animPhase]);\n\n useEffect(() => {\n if (!analyzing) return;\n const interval = setInterval(() => {\n setSpinnerFrame(f => (f + 1) % SPINNER.length);\n }, 80);\n return () => clearInterval(interval);\n }, [analyzing]);\n\n // Simulate analysis\n useEffect(() => {\n if (!analyzing) return;\n const interval = setInterval(() => {\n setAnalysisProgress(p => {\n if (p >= 100) {\n setAnalyzing(false);\n return 100;\n }\n return p + Math.random() * 15 + 5;\n });\n }, 200);\n return () => clearInterval(interval);\n }, [analyzing]);\n\n // Recommendations data (with quality scores)\n const recommendations = useMemo(() => [\n { name: 'tdd-workflow', reason: 'Based on your test files and coverage patterns', confidence: 95, quality: 92, grade: 'A' },\n { name: 'react-patterns', reason: 'Detected React in package.json with hooks usage', confidence: 88, quality: 85, grade: 'B' },\n { name: 'typescript-strict', reason: 'tsconfig.json found with strict mode disabled', confidence: 82, quality: 78, grade: 'C' },\n { name: 'git-workflow', reason: '.git directory with complex branching detected', confidence: 75, quality: 82, grade: 'B' },\n { name: 'api-design', reason: 'REST endpoints found in your codebase', confidence: 68, quality: 71, grade: 'C' },\n { name: 'docker-compose', reason: 'docker-compose.yml detected for orchestration', confidence: 62, quality: 65, grade: 'D' },\n ], []);\n\n const maxVisible = Math.max(3, Math.floor((rows - 10) / 2));\n const visibleRecs = recommendations.slice(0, maxVisible);\n\n const handleKeyNav = useCallback((delta: number) => {\n setSelectedIndex(prev => Math.max(0, Math.min(prev + delta, visibleRecs.length - 1)));\n }, [visibleRecs.length]);\n\n const handleRefresh = useCallback(() => {\n setAnalyzing(true);\n setAnalysisProgress(0);\n setSelectedIndex(0);\n }, []);\n\n const handleInstall = useCallback(() => {\n if (analyzing) return;\n const rec = visibleRecs[selectedIndex];\n if (rec) {\n // Navigate to installed after \"installing\"\n onNavigate('installed');\n }\n }, [analyzing, selectedIndex, visibleRecs, onNavigate]);\n\n useKeyboard((key: { name?: string }) => {\n if (key.name === 'j' || key.name === 'down') handleKeyNav(1);\n else if (key.name === 'k' || key.name === 'up') handleKeyNav(-1);\n else if (key.name === 'return') handleInstall();\n else if (key.name === 'r') handleRefresh();\n else if (key.name === 'escape') onNavigate('home');\n });\n\n const divider = useMemo(() =>\n <text fg={terminalColors.textMuted}>{'─'.repeat(contentWidth)}</text>,\n [contentWidth]\n );\n\n // Confidence color\n const getConfColor = (conf: number) => {\n if (conf >= 80) return terminalColors.success;\n if (conf >= 60) return terminalColors.recommend;\n return terminalColors.textMuted;\n };\n\n const shortcuts = isCompact\n ? 'j/k nav enter install r refresh esc back'\n : 'j/k navigate enter install r refresh esc back';\n\n return (\n <box flexDirection=\"column\" padding={1}>\n {/* Header */}\n {animPhase >= 1 && (\n <box flexDirection=\"column\">\n <box flexDirection=\"row\" justifyContent=\"space-between\" width={contentWidth}>\n <text fg={terminalColors.recommend}>◎ Recommendations</text>\n <text fg={terminalColors.textMuted}>\n {analyzing ? 'analyzing...' : `${recommendations.length} found`}\n </text>\n </box>\n <text fg={terminalColors.textMuted}>AI skill suggestions</text>\n <text> </text>\n </box>\n )}\n\n {/* Analysis progress */}\n {animPhase >= 2 && analyzing && (\n <box flexDirection=\"column\">\n {divider}\n <text> </text>\n <box flexDirection=\"row\">\n <text fg={terminalColors.accent}>{SPINNER[spinnerFrame]} </text>\n <text fg={terminalColors.text}>Analyzing</text>\n <text fg={terminalColors.textMuted}> your project...</text>\n </box>\n <text> </text>\n {divider}\n <text> </text>\n </box>\n )}\n\n {/* Results summary */}\n {animPhase >= 2 && !analyzing && (\n <box flexDirection=\"column\">\n {divider}\n <text> </text>\n <box flexDirection=\"row\">\n <text fg={terminalColors.success}>✓ </text>\n <text fg={terminalColors.text}>Analysis complete</text>\n <text fg={terminalColors.textMuted}> · found {recommendations.length} matching skills</text>\n </box>\n <text> </text>\n {divider}\n <text> </text>\n </box>\n )}\n\n {/* Recommendations list */}\n {animPhase >= 3 && !analyzing && (\n <box flexDirection=\"column\">\n <text fg={terminalColors.text}>Suggested Skills</text>\n <text> </text>\n\n {visibleRecs.map((rec, idx) => {\n const selected = idx === selectedIndex;\n const indicator = selected ? '▸' : ' ';\n const qualityColor = rec.quality >= 80 ? terminalColors.success : rec.quality >= 60 ? terminalColors.warning : terminalColors.error;\n return (\n <box key={rec.name} flexDirection=\"column\">\n <box flexDirection=\"row\">\n <text fg={terminalColors.text}>{indicator}</text>\n <text fg={selected ? terminalColors.accent : terminalColors.text}>\n {rec.name}\n </text>\n <text fg={getConfColor(rec.confidence)}> {rec.confidence}%</text>\n <text fg={qualityColor}> [{rec.grade}]</text>\n </box>\n <text fg={terminalColors.textMuted}> {rec.reason}</text>\n <text> </text>\n </box>\n );\n })}\n\n {recommendations.length > maxVisible && (\n <text fg={terminalColors.textMuted}>\n +{recommendations.length - maxVisible} more\n </text>\n )}\n <text> </text>\n </box>\n )}\n\n {/* Footer */}\n {animPhase >= 3 && (\n <box flexDirection=\"column\">\n {divider}\n <text fg={terminalColors.textMuted}>{shortcuts}</text>\n </box>\n )}\n </box>\n );\n}\n","/**\n * Translate Screen\n * Skill format conversion with diff view\n */\nimport { useState } from 'react';\nimport { type Screen } from '../state/index.js';\nimport { terminalColors } from '../theme/colors.js';\nimport { AGENT_LOGOS } from '../theme/symbols.js';\nimport { Header } from '../components/Header.js';\n\ninterface TranslateProps {\n onNavigate: (screen: Screen) => void;\n cols?: number;\n rows?: number;\n}\n\nexport function Translate(_props: TranslateProps) {\n const [sourceAgent] = useState('claude-code');\n const [targetAgent] = useState('cursor');\n\n const sourceInfo = AGENT_LOGOS[sourceAgent];\n const targetInfo = AGENT_LOGOS[targetAgent];\n\n return (\n <box flexDirection=\"column\" paddingLeft={1}>\n <Header\n title=\"Translate Skills\"\n subtitle=\"Convert skills between agent formats\"\n icon=\"⇄\"\n />\n\n <box flexDirection=\"row\" marginTop={1} marginBottom={1}>\n <box flexDirection=\"column\" width={25}>\n <text fg={terminalColors.textMuted}>Source Agent</text>\n <text fg={terminalColors.accent}>\n <b>{sourceInfo?.icon} {sourceInfo?.name}</b>\n </text>\n </box>\n <text fg={terminalColors.textMuted}> → </text>\n <box flexDirection=\"column\" width={25}>\n <text fg={terminalColors.textMuted}>Target Agent</text>\n <text fg={terminalColors.text}>\n <b>{targetInfo?.icon} {targetInfo?.name}</b>\n </text>\n </box>\n </box>\n\n <text fg={terminalColors.textMuted}>\n {'\\u2500'.repeat(50)}\n </text>\n <text> </text>\n\n <text fg={terminalColors.text}><b>Select a skill to translate:</b></text>\n <text> </text>\n <text fg={terminalColors.textMuted}>\n No skills selected. Press 'i' to view installed skills.\n </text>\n <text> </text>\n <text fg={terminalColors.textMuted}>\n Use Tab to switch agents, Enter to translate\n </text>\n </box>\n );\n}\n","/**\n * Header Component\n * Screen header with title and optional badge/count\n */\nimport { terminalColors } from '../theme/colors.js';\nimport { symbols } from '../theme/symbols.js';\n\ninterface HeaderProps {\n title: string;\n subtitle?: string;\n count?: number;\n badge?: string;\n icon?: string;\n}\n\nexport function Header({ title, subtitle, count, badge, icon }: HeaderProps) {\n return (\n <box flexDirection=\"column\" marginBottom={1}>\n <box flexDirection=\"row\" gap={2}>\n <text fg={terminalColors.text}>\n <b>{icon && `${icon} `}{title}</b>\n </text>\n {count !== undefined && (\n <text fg={terminalColors.textMuted}>({count})</text>\n )}\n {badge && (\n <text fg={terminalColors.accent}>[{badge}]</text>\n )}\n </box>\n {subtitle && (\n <text fg={terminalColors.textSecondary}>{subtitle}</text>\n )}\n </box>\n );\n}\n","/**\n * Context Screen\n * Project context analysis\n */\nimport { useState, useEffect } from 'react';\nimport { type Screen } from '../state/index.js';\nimport { terminalColors } from '../theme/colors.js';\nimport { Header } from '../components/Header.js';\nimport { Spinner } from '../components/Spinner.js';\n\ninterface ContextProps {\n onNavigate: (screen: Screen) => void;\n cols?: number;\n rows?: number;\n}\n\nexport function Context({ onNavigate, cols = 80, rows = 24 }: ContextProps) {\n const [loading, setLoading] = useState(true);\n\n useEffect(() => {\n const timer = setTimeout(() => setLoading(false), 500);\n return () => clearTimeout(timer);\n }, []);\n\n const contextInfo = [\n { label: 'Working Directory', value: process.cwd() },\n { label: 'Node Version', value: process.version },\n { label: 'Platform', value: process.platform },\n { label: 'Architecture', value: process.arch },\n ];\n\n return (\n <box flexDirection=\"column\" paddingLeft={1}>\n <Header\n title=\"Project Context\"\n subtitle=\"Analyze your project environment\"\n icon=\"◉\"\n />\n\n {loading ? (\n <Spinner label=\"Analyzing project context...\" />\n ) : (\n <box flexDirection=\"column\">\n {contextInfo.map((info) => (\n <box key={info.label} flexDirection=\"row\" marginBottom={1}>\n <text fg={terminalColors.textMuted} width={20}>\n {info.label}:\n </text>\n <text fg={terminalColors.text}>{info.value}</text>\n </box>\n ))}\n </box>\n )}\n </box>\n );\n}\n","/**\n * Spinner Component\n * Loading indicator with animated frames\n */\nimport { useState, useEffect } from 'react';\nimport { terminalColors } from '../theme/colors.js';\nimport { symbols } from '../theme/symbols.js';\n\ninterface SpinnerProps {\n label?: string;\n color?: keyof typeof terminalColors;\n}\n\nexport function Spinner({ label, color = 'accent' }: SpinnerProps) {\n const [frame, setFrame] = useState(0);\n\n useEffect(() => {\n const interval = setInterval(() => {\n setFrame((f) => (f + 1) % symbols.spinner.length);\n }, 80);\n return () => clearInterval(interval);\n }, []);\n\n return (\n <box flexDirection=\"row\" gap={1}>\n <text fg={terminalColors[color]}>{symbols.spinner[frame]}</text>\n {label && <text fg={terminalColors.text}>{label}</text>}\n </box>\n );\n}\n","/**\n * Sync Screen - Cross-Agent Synchronization\n * Clean monochromatic design\n */\nimport { useState, useEffect, useMemo, useCallback, useRef } from 'react';\nimport { useKeyboard } from '@opentui/react';\nimport { type Screen } from '../state/index.js';\nimport { terminalColors } from '../theme/colors.js';\nimport { AGENT_LOGOS } from '../theme/symbols.js';\n\ninterface SyncProps {\n onNavigate: (screen: Screen) => void;\n cols?: number;\n rows?: number;\n}\n\nconst SPINNER = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];\n\nexport function Sync({ onNavigate, cols = 80, rows = 24 }: SyncProps) {\n const [selectedIndex, setSelectedIndex] = useState(0);\n const [syncStatus, setSyncStatus] = useState<'idle' | 'syncing' | 'done'>('idle');\n const [spinnerFrame, setSpinnerFrame] = useState(0);\n const [animPhase, setAnimPhase] = useState(0);\n const syncTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const isCompact = cols < 60;\n const contentWidth = Math.max(1, Math.min(cols - 4, 60));\n\n // Cleanup timeout on unmount\n useEffect(() => {\n return () => {\n if (syncTimeoutRef.current) {\n clearTimeout(syncTimeoutRef.current);\n }\n };\n }, []);\n\n // Entrance animation\n useEffect(() => {\n if (animPhase >= 2) return;\n const timer = setTimeout(() => setAnimPhase(p => p + 1), 100);\n return () => clearTimeout(timer);\n }, [animPhase]);\n\n // Spinner animation\n useEffect(() => {\n if (syncStatus !== 'syncing') return;\n const interval = setInterval(() => {\n setSpinnerFrame(f => (f + 1) % SPINNER.length);\n }, 80);\n return () => clearInterval(interval);\n }, [syncStatus]);\n\n // Agents with sync data\n const agents = useMemo(() => {\n const agentTypes = ['claude-code', 'cursor', 'github-copilot', 'codex', 'gemini-cli', 'windsurf'];\n return agentTypes.slice(0, isCompact ? 4 : 6).map((type) => ({\n type,\n ...(AGENT_LOGOS[type] || { name: type, icon: '◇' }),\n synced: type === 'claude-code' || type === 'cursor',\n skillCount: type === 'claude-code' ? 12 : type === 'cursor' ? 8 : 0,\n }));\n }, [isCompact]);\n\n const syncedCount = agents.filter(a => a.synced).length;\n const totalSkills = agents.reduce((sum, a) => sum + a.skillCount, 0);\n\n const handleKeyNav = useCallback((delta: number) => {\n setSelectedIndex(prev => Math.max(0, Math.min(prev + delta, agents.length - 1)));\n }, [agents.length]);\n\n const handleSync = useCallback(() => {\n if (syncStatus === 'syncing') return;\n if (syncTimeoutRef.current) clearTimeout(syncTimeoutRef.current);\n setSyncStatus('syncing');\n syncTimeoutRef.current = setTimeout(() => setSyncStatus('done'), 1500);\n }, [syncStatus]);\n\n const handleSyncAll = useCallback(() => {\n if (syncStatus === 'syncing') return;\n if (syncTimeoutRef.current) clearTimeout(syncTimeoutRef.current);\n setSyncStatus('syncing');\n syncTimeoutRef.current = setTimeout(() => setSyncStatus('done'), 2000);\n }, [syncStatus]);\n\n // Clamp selectedIndex when agents list shrinks\n useEffect(() => {\n setSelectedIndex(prev => Math.max(0, Math.min(prev, agents.length - 1)));\n }, [agents.length]);\n\n useKeyboard((key: { name?: string }) => {\n if (key.name === 'j' || key.name === 'down') handleKeyNav(1);\n else if (key.name === 'k' || key.name === 'up') handleKeyNav(-1);\n else if (key.name === 'return') handleSync();\n else if (key.name === 'a') handleSyncAll();\n else if (key.name === 'escape') onNavigate('home');\n });\n\n const divider = useMemo(() =>\n <text fg={terminalColors.textMuted}>{'─'.repeat(contentWidth)}</text>,\n [contentWidth]\n );\n\n const shortcuts = isCompact\n ? 'j/k nav enter sync a sync all esc back'\n : 'j/k navigate enter sync selected a sync all esc back';\n\n return (\n <box flexDirection=\"column\" padding={1}>\n {/* Header */}\n {animPhase >= 1 && (\n <box flexDirection=\"column\">\n <box flexDirection=\"row\" justifyContent=\"space-between\" width={contentWidth}>\n <text fg={terminalColors.sync}>⇄ Sync</text>\n <text fg={terminalColors.textMuted}>{syncedCount}/{agents.length} synced</text>\n </box>\n <text fg={terminalColors.textMuted}>share skills across agents</text>\n <text> </text>\n </box>\n )}\n\n {/* Status */}\n {animPhase >= 2 && (\n <box flexDirection=\"column\">\n {divider}\n <text> </text>\n {syncStatus === 'syncing' ? (\n <box flexDirection=\"row\">\n <text fg={terminalColors.accent}>{SPINNER[spinnerFrame]} </text>\n <text fg={terminalColors.text}>Syncing skills...</text>\n </box>\n ) : syncStatus === 'done' ? (\n <box flexDirection=\"row\">\n <text fg={terminalColors.success}>✓ </text>\n <text fg={terminalColors.text}>Sync complete</text>\n <text fg={terminalColors.textMuted}> · {totalSkills} skills synced</text>\n </box>\n ) : (\n <box flexDirection=\"row\" gap={3}>\n <text fg={terminalColors.success}>● {syncedCount} synced</text>\n <text fg={terminalColors.textMuted}>○ {agents.length - syncedCount} pending</text>\n </box>\n )}\n <text> </text>\n {divider}\n <text> </text>\n </box>\n )}\n\n {/* Agents list */}\n {animPhase >= 2 && (\n <box flexDirection=\"column\">\n <text fg={terminalColors.text}>Agents</text>\n <text> </text>\n\n {agents.map((agent, idx) => {\n const selected = idx === selectedIndex;\n const indicator = selected ? '▸' : ' ';\n const statusIcon = agent.synced ? '●' : '○';\n const statusColor = agent.synced ? terminalColors.success : terminalColors.textMuted;\n return (\n <box key={agent.type} flexDirection=\"row\">\n <text fg={terminalColors.text}>{indicator}</text>\n <text fg={selected ? terminalColors.accent : terminalColors.text}>\n {agent.icon} {agent.name}\n </text>\n <text fg={statusColor}> {statusIcon}</text>\n <text fg={terminalColors.textMuted}> {agent.skillCount} skills</text>\n </box>\n );\n })}\n <text> </text>\n </box>\n )}\n\n {/* Footer */}\n {animPhase >= 2 && (\n <box flexDirection=\"column\">\n {divider}\n <text fg={terminalColors.textMuted}>{shortcuts}</text>\n </box>\n )}\n </box>\n );\n}\n","/**\n * Memory Screen\n * Session memory management\n */\nimport { type Screen } from '../state/index.js';\nimport { terminalColors } from '../theme/colors.js';\nimport { Header } from '../components/Header.js';\n\ninterface MemoryProps {\n onNavigate: (screen: Screen) => void;\n cols?: number;\n rows?: number;\n}\n\nexport function Memory({ onNavigate, cols = 80, rows = 24 }: MemoryProps) {\n const memories = [\n { key: 'project-context', size: '2.4 KB', updated: '2 min ago' },\n { key: 'user-preferences', size: '1.1 KB', updated: '5 min ago' },\n { key: 'session-history', size: '4.7 KB', updated: '1 min ago' },\n ];\n\n return (\n <box flexDirection=\"column\" paddingLeft={1}>\n <Header\n title=\"Memory\"\n subtitle=\"Manage persistent session memory\"\n count={memories.length}\n icon=\"◎\"\n />\n\n <text fg={terminalColors.text}><b>Stored Memories</b></text>\n <text> </text>\n\n {memories.map((mem, idx) => (\n <box key={mem.key} flexDirection=\"row\" marginBottom={1}>\n <text fg={idx === 0 ? terminalColors.accent : terminalColors.text} width={25}>\n {idx === 0 ? '\\u25B8 ' : ' '}{mem.key}\n </text>\n <text fg={terminalColors.textMuted} width={12}>{mem.size}</text>\n <text fg={terminalColors.textMuted}>{mem.updated}</text>\n </box>\n ))}\n\n <text> </text>\n <text fg={terminalColors.textMuted}>\n Press Enter to view, 'd' to delete, 'c' to clear all\n </text>\n </box>\n );\n}\n","/**\n * Workflow Screen - Automation Builder\n * Clean monochromatic design\n */\nimport { useState, useEffect, useMemo, useCallback } from 'react';\nimport { useKeyboard } from '@opentui/react';\nimport { type Screen } from '../state/index.js';\nimport { terminalColors } from '../theme/colors.js';\n\ninterface WorkflowProps {\n onNavigate: (screen: Screen) => void;\n cols?: number;\n rows?: number;\n}\n\nconst WORKFLOWS = [\n { name: 'test-and-commit', steps: 3, lastRun: '1 hour ago', status: 'success' as const },\n { name: 'deploy-preview', steps: 5, lastRun: '2 hours ago', status: 'success' as const },\n { name: 'full-ci', steps: 8, lastRun: '1 day ago', status: 'failed' as const },\n { name: 'quick-fix', steps: 2, lastRun: '3 days ago', status: 'pending' as const },\n];\n\nexport function Workflow({ onNavigate, cols = 80, rows = 24 }: WorkflowProps) {\n const [selectedIndex, setSelectedIndex] = useState(0);\n const [animPhase, setAnimPhase] = useState(0);\n\n const isCompact = cols < 60;\n const contentWidth = Math.max(1, Math.min(cols - 4, 60));\n\n // Entrance animation\n useEffect(() => {\n if (animPhase >= 2) return;\n const timer = setTimeout(() => setAnimPhase(p => p + 1), 100);\n return () => clearTimeout(timer);\n }, [animPhase]);\n\n const successCount = WORKFLOWS.filter(w => w.status === 'success').length;\n const failedCount = WORKFLOWS.filter(w => w.status === 'failed').length;\n\n const handleKeyNav = useCallback((delta: number) => {\n setSelectedIndex(prev => Math.max(0, Math.min(prev + delta, WORKFLOWS.length - 1)));\n }, []);\n\n useKeyboard((key: { name?: string }) => {\n if (key.name === 'j' || key.name === 'down') handleKeyNav(1);\n else if (key.name === 'k' || key.name === 'up') handleKeyNav(-1);\n else if (key.name === 'escape') onNavigate('home');\n });\n\n const divider = useMemo(() =>\n <text fg={terminalColors.textMuted}>{'─'.repeat(contentWidth)}</text>,\n [contentWidth]\n );\n\n const shortcuts = isCompact\n ? 'j/k nav esc back'\n : 'j/k navigate esc back';\n\n return (\n <box flexDirection=\"column\" padding={1}>\n {/* Header */}\n {animPhase >= 1 && (\n <box flexDirection=\"column\">\n <box flexDirection=\"row\" justifyContent=\"space-between\" width={contentWidth}>\n <text fg={terminalColors.workflow}>⟳ Workflows</text>\n <text fg={terminalColors.textMuted}>{WORKFLOWS.length} workflows</text>\n </box>\n <text fg={terminalColors.textMuted}>automate skill chains</text>\n <text> </text>\n </box>\n )}\n\n {/* Stats */}\n {animPhase >= 2 && (\n <box flexDirection=\"column\">\n {divider}\n <text> </text>\n <box flexDirection=\"row\" gap={3}>\n <text fg={terminalColors.success}>✓ {successCount} passed</text>\n {failedCount > 0 && (\n <text fg={terminalColors.error}>✗ {failedCount} failed</text>\n )}\n </box>\n <text> </text>\n {divider}\n <text> </text>\n </box>\n )}\n\n {/* Workflows list */}\n {animPhase >= 2 && (\n <box flexDirection=\"column\">\n <text fg={terminalColors.text}>Workflows</text>\n <text> </text>\n\n {WORKFLOWS.length === 0 ? (\n <box flexDirection=\"column\">\n <text fg={terminalColors.textMuted}>No workflows yet</text>\n </box>\n ) : (\n WORKFLOWS.map((wf, idx) => {\n const selected = idx === selectedIndex;\n const indicator = selected ? '▸' : ' ';\n const statusIcon = wf.status === 'success' ? '✓'\n : wf.status === 'failed' ? '✗' : '○';\n const statusColor = wf.status === 'success' ? terminalColors.success\n : wf.status === 'failed' ? terminalColors.error : terminalColors.textMuted;\n return (\n <box key={wf.name} flexDirection=\"row\">\n <text fg={terminalColors.text}>{indicator}</text>\n <text fg={selected ? terminalColors.accent : terminalColors.text} width={18}>\n {wf.name}\n </text>\n <text fg={statusColor}>{statusIcon} </text>\n <text fg={terminalColors.textMuted}>{wf.steps}s · {wf.lastRun}</text>\n </box>\n );\n })\n )}\n <text> </text>\n </box>\n )}\n\n {/* Footer */}\n {animPhase >= 2 && (\n <box flexDirection=\"column\">\n {divider}\n <text fg={terminalColors.textMuted}>{shortcuts}</text>\n </box>\n )}\n </box>\n );\n}\n","/**\n * Execute Screen\n * Live skill execution\n */\nimport { useState } from 'react';\nimport { type Screen } from '../state/index.js';\nimport { terminalColors } from '../theme/colors.js';\nimport { Header } from '../components/Header.js';\nimport { Spinner } from '../components/Spinner.js';\nimport { ProgressBar } from '../components/ProgressBar.js';\n\ninterface ExecuteProps {\n onNavigate: (screen: Screen) => void;\n cols?: number;\n rows?: number;\n}\n\nexport function Execute({ onNavigate, cols = 80, rows = 24 }: ExecuteProps) {\n const [executing, setExecuting] = useState(false);\n const [progress, setProgress] = useState(0);\n\n return (\n <box flexDirection=\"column\" paddingLeft={1}>\n <Header\n title=\"Execute\"\n subtitle=\"Run skills in real-time\"\n icon=\"▶\"\n />\n\n {executing ? (\n <box flexDirection=\"column\">\n <Spinner label=\"Executing skill...\" />\n <text> </text>\n <ProgressBar progress={progress} width={40} />\n <text> </text>\n <text fg={terminalColors.textMuted}>Press Esc to cancel</text>\n </box>\n ) : (\n <box flexDirection=\"column\">\n <text fg={terminalColors.text}>Select a skill to execute:</text>\n <text> </text>\n <text fg={terminalColors.textMuted}>\n No skills available. Install skills first using 'b' (browse) or 'm' (marketplace).\n </text>\n <text> </text>\n <text fg={terminalColors.textMuted}>\n Press Enter to execute, 'i' to view installed skills\n </text>\n </box>\n )}\n </box>\n );\n}\n","/**\n * ProgressBar Component\n * Animated progress bar display\n */\nimport { terminalColors } from '../theme/colors.js';\nimport { symbols } from '../theme/symbols.js';\n\ninterface ProgressBarProps {\n progress: number; // 0-100\n width?: number;\n showPercentage?: boolean;\n color?: keyof typeof terminalColors;\n}\n\nexport function ProgressBar({\n progress,\n width = 20,\n showPercentage = true,\n color = 'accent',\n}: ProgressBarProps) {\n const clampedProgress = Math.max(0, Math.min(100, progress));\n const filledWidth = Math.round((clampedProgress / 100) * width);\n const emptyWidth = width - filledWidth;\n\n const filled = symbols.progressFilled.repeat(filledWidth);\n const empty = symbols.progressEmpty.repeat(emptyWidth);\n\n return (\n <box flexDirection=\"row\" gap={1}>\n <text>\n <span fg={terminalColors[color]}>{filled}</span>\n <span fg={terminalColors.textMuted}>{empty}</span>\n </text>\n {showPercentage && (\n <text fg={terminalColors.textSecondary}>\n {Math.round(clampedProgress)}%\n </text>\n )}\n </box>\n );\n}\n","/**\n * History Screen\n * Execution history\n */\nimport { type Screen } from '../state/index.js';\nimport { terminalColors } from '../theme/colors.js';\nimport { Header } from '../components/Header.js';\n\ninterface HistoryProps {\n onNavigate: (screen: Screen) => void;\n cols?: number;\n rows?: number;\n}\n\nexport function History({ onNavigate, cols = 80, rows = 24 }: HistoryProps) {\n const history = [\n { skill: 'tdd-workflow', time: '10:32 AM', duration: '2.3s', status: 'success' },\n { skill: 'code-review', time: '10:15 AM', duration: '5.1s', status: 'success' },\n { skill: 'deploy-check', time: '09:45 AM', duration: '8.7s', status: 'failed' },\n { skill: 'lint-fix', time: '09:30 AM', duration: '1.2s', status: 'success' },\n ];\n\n return (\n <box flexDirection=\"column\" paddingLeft={1}>\n <Header\n title=\"History\"\n subtitle=\"View execution history\"\n count={history.length}\n icon=\"◷\"\n />\n\n <text fg={terminalColors.text}><b>Recent Executions</b></text>\n <text> </text>\n\n {history.map((item, idx) => (\n <box key={`${item.skill}-${item.time}`} flexDirection=\"row\" marginBottom={1}>\n <text\n fg={idx === 0 ? terminalColors.accent : terminalColors.text}\n width={18}\n >\n {idx === 0 ? '\\u25B8 ' : ' '}{item.skill}\n </text>\n <text fg={terminalColors.textMuted} width={12}>{item.time}</text>\n <text fg={terminalColors.textMuted} width={10}>{item.duration}</text>\n <text\n fg={item.status === 'success' ? terminalColors.success : terminalColors.error}\n >\n {item.status === 'success' ? '\\u2713 success' : '\\u2717 failed'}\n </text>\n </box>\n ))}\n\n <text> </text>\n <text fg={terminalColors.textMuted}>\n Press Enter to view details, 'r' to re-run, 'c' to clear\n </text>\n </box>\n );\n}\n","/**\n * Team Screen\n * Team collaboration\n */\nimport { type Screen } from '../state/index.js';\nimport { terminalColors } from '../theme/colors.js';\nimport { Header } from '../components/Header.js';\n\ninterface TeamProps {\n onNavigate: (screen: Screen) => void;\n cols?: number;\n rows?: number;\n}\n\nexport function Team({ onNavigate, cols = 80, rows = 24 }: TeamProps) {\n const members = [\n { name: 'You', role: 'Owner', status: 'online', skills: 12 },\n { name: 'Alice', role: 'Admin', status: 'online', skills: 8 },\n { name: 'Bob', role: 'Member', status: 'offline', skills: 5 },\n ];\n\n return (\n <box flexDirection=\"column\" paddingLeft={1}>\n <Header\n title=\"Team\"\n subtitle=\"Collaborate with your development team\"\n count={members.length}\n icon=\"◉\"\n />\n\n <text fg={terminalColors.text}><b>Team Members</b></text>\n <text> </text>\n\n {members.map((member, idx) => (\n <box key={member.name} flexDirection=\"row\" marginBottom={1}>\n <text\n fg={idx === 0 ? terminalColors.accent : terminalColors.text}\n width={15}\n >\n {idx === 0 ? '\\u25B8 ' : ' '}{member.name}\n </text>\n <text fg={terminalColors.textMuted} width={10}>{member.role}</text>\n <text\n fg={member.status === 'online' ? terminalColors.success : terminalColors.textMuted}\n width={10}\n >\n {member.status === 'online' ? '\\u25CF online' : '\\u25CB offline'}\n </text>\n <text fg={terminalColors.textMuted}>{member.skills} skills</text>\n </box>\n ))}\n\n <text> </text>\n <text fg={terminalColors.textMuted}>\n Press 'i' to invite, 's' to share skills\n </text>\n </box>\n );\n}\n","/**\n * Plugins Screen\n * Plugin management\n */\nimport { type Screen } from '../state/index.js';\nimport { terminalColors } from '../theme/colors.js';\nimport { Header } from '../components/Header.js';\n\ninterface PluginsProps {\n onNavigate: (screen: Screen) => void;\n cols?: number;\n rows?: number;\n}\n\nexport function Plugins({ onNavigate, cols = 80, rows = 24 }: PluginsProps) {\n const plugins = [\n { name: 'git-hooks', enabled: true, version: '1.2.0' },\n { name: 'ai-suggest', enabled: true, version: '0.9.1' },\n { name: 'metrics', enabled: false, version: '2.0.0' },\n ];\n\n return (\n <box flexDirection=\"column\" paddingLeft={1}>\n <Header\n title=\"Plugins\"\n subtitle=\"Extend SkillKit with plugins\"\n count={plugins.length}\n icon=\"◈\"\n />\n\n <text fg={terminalColors.text}><b>Installed Plugins</b></text>\n <text> </text>\n\n {plugins.map((plugin, idx) => (\n <box key={plugin.name} flexDirection=\"row\" marginBottom={1}>\n <text\n fg={idx === 0 ? terminalColors.accent : terminalColors.text}\n width={18}\n >\n {idx === 0 ? '\\u25B8 ' : ' '}{plugin.name}\n </text>\n <text fg={terminalColors.textMuted} width={10}>v{plugin.version}</text>\n <text\n fg={plugin.enabled ? terminalColors.success : terminalColors.textMuted}\n >\n {plugin.enabled ? '\\u25CF enabled' : '\\u25CB disabled'}\n </text>\n </box>\n ))}\n\n <text> </text>\n <text fg={terminalColors.textMuted}>\n Press Enter to toggle, 'a' to add new, 'u' to update\n </text>\n </box>\n );\n}\n","/**\n * Methodology Screen\n * Development methodology packs\n */\nimport { type Screen } from '../state/index.js';\nimport { terminalColors } from '../theme/colors.js';\nimport { Header } from '../components/Header.js';\n\ninterface MethodologyProps {\n onNavigate: (screen: Screen) => void;\n cols?: number;\n rows?: number;\n}\n\nexport function Methodology({ onNavigate, cols = 80, rows = 24 }: MethodologyProps) {\n const methodologies = [\n { name: 'TDD', description: 'Test-Driven Development', skills: 5, active: true },\n { name: 'BDD', description: 'Behavior-Driven Development', skills: 4, active: false },\n { name: 'Clean Code', description: 'SOLID principles', skills: 6, active: false },\n { name: 'Security First', description: 'OWASP guidelines', skills: 8, active: false },\n ];\n\n return (\n <box flexDirection=\"column\" paddingLeft={1}>\n <Header\n title=\"Methodologies\"\n subtitle=\"Development methodology skill packs\"\n count={methodologies.length}\n icon=\"◎\"\n />\n\n <text fg={terminalColors.text}><b>Available Packs</b></text>\n <text> </text>\n\n {methodologies.map((meth, idx) => (\n <box key={meth.name} flexDirection=\"column\" marginBottom={1}>\n <box flexDirection=\"row\">\n <text\n fg={idx === 0 ? terminalColors.accent : terminalColors.text}\n width={15}\n >\n {idx === 0 ? <b>{'\\u25B8 '}{meth.name}</b> : <>{'\\u25B8 '}{meth.name}</>}\n </text>\n <text fg={terminalColors.textMuted}>{meth.skills} skills</text>\n {meth.active && (\n <text fg={terminalColors.success}> [active]</text>\n )}\n </box>\n <text fg={terminalColors.textMuted}> {meth.description}</text>\n </box>\n ))}\n\n <text> </text>\n <text fg={terminalColors.textMuted}>\n Press Enter to activate, 'v' to view skills\n </text>\n </box>\n );\n}\n","/**\n * Plan Screen\n * Structured plan execution\n */\nimport { type Screen } from '../state/index.js';\nimport { terminalColors } from '../theme/colors.js';\nimport { Header } from '../components/Header.js';\nimport { ProgressBar } from '../components/ProgressBar.js';\n\ninterface PlanProps {\n onNavigate: (screen: Screen) => void;\n cols?: number;\n rows?: number;\n}\n\nexport function Plan({ onNavigate, cols = 80, rows = 24 }: PlanProps) {\n const steps = [\n { name: 'Analyze codebase', status: 'done', duration: '2.3s' },\n { name: 'Generate tests', status: 'done', duration: '5.1s' },\n { name: 'Run linter', status: 'running', duration: '-' },\n { name: 'Apply fixes', status: 'pending', duration: '-' },\n { name: 'Verify changes', status: 'pending', duration: '-' },\n ];\n\n const completedSteps = steps.filter((s) => s.status === 'done').length;\n const progress = (completedSteps / steps.length) * 100;\n\n return (\n <box flexDirection=\"column\" paddingLeft={1}>\n <Header\n title=\"Plan Execution\"\n subtitle=\"Structured multi-step execution\"\n icon=\"▣\"\n />\n\n <box flexDirection=\"row\" marginBottom={1}>\n <text fg={terminalColors.text}>Progress: </text>\n <ProgressBar progress={progress} width={30} />\n </box>\n\n <text fg={terminalColors.text}><b>Steps</b></text>\n <text> </text>\n\n {steps.map((step, idx) => {\n const statusIcon = step.status === 'done' ? '\\u2713' : step.status === 'running' ? '\\u27F3' : '\\u25CB';\n const statusColor =\n step.status === 'done'\n ? terminalColors.success\n : step.status === 'running'\n ? terminalColors.accent\n : terminalColors.textMuted;\n\n return (\n <box key={step.name} flexDirection=\"row\" marginBottom={1}>\n <text fg={statusColor} width={3}>{statusIcon}</text>\n <text fg={step.status === 'pending' ? terminalColors.textMuted : terminalColors.text} width={25}>\n {step.name}\n </text>\n <text fg={terminalColors.textMuted}>{step.duration}</text>\n </box>\n );\n })}\n\n <text> </text>\n <text fg={terminalColors.textMuted}>\n Press Enter to continue, Esc to cancel\n </text>\n </box>\n );\n}\n","import { useState, useEffect, useMemo, useCallback } from 'react';\nimport { useKeyboard } from '@opentui/react';\nimport { type Screen } from '../state/index.js';\nimport { terminalColors } from '../theme/colors.js';\n\ninterface SettingsProps {\n onNavigate: (screen: Screen) => void;\n cols?: number;\n rows?: number;\n}\n\ninterface SettingItem {\n key: string;\n label: string;\n value: string;\n type: 'select' | 'path' | 'toggle';\n}\n\nconst DEFAULT_SETTINGS: SettingItem[] = [\n { key: 'defaultAgent', label: 'Default Agent', value: 'claude-code', type: 'select' },\n { key: 'skillsDir', label: 'Skills Directory', value: '.claude/skills', type: 'path' },\n { key: 'autoSync', label: 'Auto Sync', value: 'enabled', type: 'toggle' },\n { key: 'theme', label: 'Theme', value: 'dark', type: 'select' },\n { key: 'telemetry', label: 'Telemetry', value: 'disabled', type: 'toggle' },\n];\n\nexport function Settings({ onNavigate, cols = 80 }: SettingsProps) {\n const [selectedIndex, setSelectedIndex] = useState(0);\n const [settings, setSettings] = useState<SettingItem[]>(DEFAULT_SETTINGS);\n const [animPhase, setAnimPhase] = useState(0);\n\n const isCompact = cols < 60;\n const contentWidth = Math.max(1, Math.min(cols - 4, 60));\n\n useEffect(() => {\n if (animPhase >= 2) return;\n const timer = setTimeout(() => setAnimPhase(p => p + 1), 100);\n return () => clearTimeout(timer);\n }, [animPhase]);\n\n const handleKeyNav = useCallback((delta: number) => {\n setSelectedIndex(prev => Math.max(0, Math.min(prev + delta, settings.length - 1)));\n }, [settings.length]);\n\n const handleToggle = useCallback(() => {\n const setting = settings[selectedIndex];\n if (setting?.type === 'toggle') {\n setSettings(prev => prev.map((s, i) =>\n i === selectedIndex ? { ...s, value: s.value === 'enabled' ? 'disabled' : 'enabled' } : s\n ));\n }\n }, [selectedIndex, settings]);\n\n const handleReset = useCallback(() => {\n setSettings(DEFAULT_SETTINGS);\n }, []);\n\n const handleKeyboard = useCallback((key: { name?: string }) => {\n if (key.name === 'j' || key.name === 'down') handleKeyNav(1);\n else if (key.name === 'k' || key.name === 'up') handleKeyNav(-1);\n else if (key.name === 'return') handleToggle();\n else if (key.name === 'r') handleReset();\n else if (key.name === 'escape') onNavigate('home');\n }, [handleKeyNav, handleToggle, handleReset, onNavigate]);\n\n useKeyboard(handleKeyboard);\n\n const divider = useMemo(() =>\n <text fg={terminalColors.textMuted}>{'─'.repeat(contentWidth)}</text>,\n [contentWidth]\n );\n\n const shortcuts = isCompact\n ? 'j/k nav enter toggle r reset esc back'\n : 'j/k navigate enter toggle r reset defaults esc back';\n\n return (\n <box flexDirection=\"column\" padding={1}>\n {/* Header */}\n {animPhase >= 1 && (\n <box flexDirection=\"column\">\n <box flexDirection=\"row\" justifyContent=\"space-between\" width={contentWidth}>\n <text fg={terminalColors.text}>⚙ Settings</text>\n <text fg={terminalColors.textMuted}>{settings.length} options</text>\n </box>\n <text fg={terminalColors.textMuted}>configure skillkit</text>\n <text> </text>\n </box>\n )}\n\n {/* Settings list */}\n {animPhase >= 2 && (\n <box flexDirection=\"column\">\n {divider}\n <text> </text>\n <text fg={terminalColors.text}>Configuration</text>\n <text> </text>\n\n {settings.map((setting, idx) => {\n const selected = idx === selectedIndex;\n const indicator = selected ? '▸' : ' ';\n const valueColor = setting.type === 'toggle'\n ? (setting.value === 'enabled' ? terminalColors.success : terminalColors.textMuted)\n : terminalColors.textMuted;\n const toggleIcon = setting.type === 'toggle'\n ? (setting.value === 'enabled' ? '● ' : '○ ')\n : '';\n return (\n <box key={setting.key} flexDirection=\"row\">\n <text fg={terminalColors.text}>{indicator}</text>\n <text fg={selected ? terminalColors.accent : terminalColors.text} width={18}>\n {setting.label}\n </text>\n <text fg={valueColor}>{toggleIcon}{setting.value}</text>\n </box>\n );\n })}\n <text> </text>\n </box>\n )}\n\n {/* Config location */}\n {animPhase >= 2 && !isCompact && (\n <box flexDirection=\"column\">\n {divider}\n <text fg={terminalColors.textMuted}>config: ~/.config/skillkit/config.json</text>\n <text> </text>\n </box>\n )}\n\n {/* Footer */}\n {animPhase >= 2 && (\n <box flexDirection=\"column\">\n {divider}\n <text fg={terminalColors.textMuted}>{shortcuts}</text>\n </box>\n )}\n </box>\n );\n}\n","import { useState, useEffect, useMemo } from 'react';\nimport { type Screen } from '../state/index.js';\nimport { terminalColors } from '../theme/colors.js';\nimport { getVersion } from '../utils/helpers.js';\n\ninterface HelpProps {\n onNavigate: (screen: Screen) => void;\n cols?: number;\n rows?: number;\n}\n\nconst SHORTCUTS = [\n { section: 'Navigation', items: [\n { key: 'h', desc: 'Home screen' },\n { key: 'b', desc: 'Browse skills' },\n { key: 'm', desc: 'Marketplace' },\n { key: 'r', desc: 'Recommendations' },\n { key: 'i', desc: 'Installed skills' },\n { key: 's', desc: 'Sync settings' },\n { key: 'f', desc: 'Find skills' },\n ]},\n { section: 'Actions', items: [\n { key: 't', desc: 'Translate skills' },\n { key: 'w', desc: 'Workflows' },\n { key: 'x', desc: 'Execute' },\n { key: 'n', desc: 'Plan' },\n { key: 'v', desc: 'Validate' },\n { key: 'u', desc: 'Publish' },\n ]},\n { section: 'Team & Config', items: [\n { key: 'a', desc: 'Team settings' },\n { key: 'c', desc: 'Context' },\n { key: 'e', desc: 'Memory' },\n { key: 'p', desc: 'Plugins' },\n { key: 'o', desc: 'Methodology' },\n { key: ',', desc: 'Settings' },\n ]},\n { section: 'Global', items: [\n { key: '/', desc: 'This help screen' },\n { key: 'd', desc: 'Open docs' },\n { key: 'esc', desc: 'Go back / Home' },\n { key: 'q', desc: 'Quit application' },\n { key: 'j/k', desc: 'Navigate lists' },\n ]},\n];\n\nfunction ShortcutSection({ section, items, isLast }: { section: string; items: { key: string; desc: string }[]; isLast: boolean }) {\n return (\n <box flexDirection=\"column\">\n <text fg={terminalColors.text}>{section}</text>\n {items.map((item) => (\n <box key={item.key} flexDirection=\"row\">\n <text fg={terminalColors.accent} width={8}> {item.key}</text>\n <text fg={terminalColors.textMuted}>{item.desc}</text>\n </box>\n ))}\n {!isLast && <text> </text>}\n </box>\n );\n}\n\nexport function Help({ cols = 80 }: HelpProps) {\n const [animPhase, setAnimPhase] = useState(0);\n const isCompact = cols < 60;\n const rawWidth = cols - 4;\n const contentWidth = Math.max(1, Math.min(rawWidth, 60));\n const version = getVersion();\n\n useEffect(() => {\n if (animPhase >= 2) return;\n const timer = setTimeout(() => setAnimPhase(p => p + 1), 100);\n return () => clearTimeout(timer);\n }, [animPhase]);\n\n const divider = useMemo(() =>\n <text fg={terminalColors.textMuted}>{'─'.repeat(contentWidth)}</text>,\n [contentWidth]\n );\n\n return (\n <box flexDirection=\"column\" padding={1}>\n {animPhase >= 1 && (\n <box flexDirection=\"column\">\n <box flexDirection=\"row\" justifyContent=\"space-between\" width={contentWidth}>\n <text fg={terminalColors.text}>/ Help</text>\n <text fg={terminalColors.textMuted}>skillkit v{version}</text>\n </box>\n <text fg={terminalColors.textMuted}>keyboard shortcuts and navigation</text>\n <text> </text>\n </box>\n )}\n\n {animPhase >= 2 && (\n <box flexDirection=\"column\">\n {divider}\n <text> </text>\n {isCompact ? (\n SHORTCUTS.map((s, idx) => (\n <ShortcutSection key={s.section} section={s.section} items={s.items} isLast={idx === SHORTCUTS.length - 1} />\n ))\n ) : (\n <box flexDirection=\"row\">\n <box flexDirection=\"column\" width={Math.floor(contentWidth / 2)}>\n {SHORTCUTS.slice(0, 2).map((s, idx) => (\n <ShortcutSection key={s.section} section={s.section} items={s.items} isLast={idx === 1} />\n ))}\n </box>\n <box flexDirection=\"column\" width={Math.floor(contentWidth / 2)}>\n {SHORTCUTS.slice(2).map((s, idx) => (\n <ShortcutSection key={s.section} section={s.section} items={s.items} isLast={idx === 1} />\n ))}\n </box>\n </box>\n )}\n <text> </text>\n </box>\n )}\n\n {animPhase >= 2 && (\n <box flexDirection=\"column\">\n {divider}\n <text fg={terminalColors.textMuted}>esc back h home q quit</text>\n </box>\n )}\n </box>\n );\n}\n","/**\n * Animation presets for SkillKit TUI\n * Uses OpenTUI's useTimeline for smooth 60fps animations\n */\n\n/**\n * Animation easing functions available in OpenTUI\n */\nexport type EasingFunction =\n | 'linear'\n | 'easeInQuad'\n | 'easeOutQuad'\n | 'easeInOutQuad'\n | 'easeInCubic'\n | 'easeOutCubic'\n | 'easeInOutCubic'\n | 'easeInQuart'\n | 'easeOutQuart'\n | 'easeInOutQuart';\n\n/**\n * Animation preset configuration\n */\nexport interface AnimationPreset {\n duration: number;\n ease: EasingFunction;\n stagger?: number;\n}\n\n/**\n * Predefined animation presets\n */\nexport const animations = {\n /**\n * Staggered fade-in for entrance animations\n * Used on home screen for progressive content reveal\n */\n staggeredFadeIn: {\n duration: 800,\n ease: 'easeOutCubic' as EasingFunction,\n stagger: 100,\n },\n\n /**\n * Logo reveal with scramble effect\n * Used for branding animation on startup\n */\n logoReveal: {\n duration: 600,\n ease: 'easeOutCubic' as EasingFunction,\n },\n\n /**\n * Count-up animation for stats\n * Used in StatsCard component\n */\n countUp: {\n duration: 1200,\n ease: 'easeOutQuart' as EasingFunction,\n },\n\n /**\n * Screen transition animation\n * Used when navigating between screens\n */\n screenTransition: {\n duration: 200,\n ease: 'easeInOutCubic' as EasingFunction,\n },\n\n /**\n * Quick fade for tooltips and hints\n */\n quickFade: {\n duration: 150,\n ease: 'easeOutQuad' as EasingFunction,\n },\n\n /**\n * Pulse animation for active states\n */\n pulse: {\n duration: 1000,\n ease: 'easeInOutQuad' as EasingFunction,\n },\n} as const;\n\n/**\n * Scramble effect characters\n * Used for text reveal animations\n */\nexport const SCRAMBLE_CHARS = '█▓▒░◆◇◈⟁◎✦⬡▣';\n\n/**\n * Scramble animation configuration\n */\nexport interface ScrambleConfig {\n /** Animation duration in ms */\n duration: number;\n /** Progress increment per frame */\n increment: number;\n /** Frame interval in ms */\n interval: number;\n}\n\n/**\n * Default scramble animation config\n */\nexport const DEFAULT_SCRAMBLE_CONFIG: ScrambleConfig = {\n duration: 420,\n increment: 12,\n interval: 35,\n};\n\n/**\n * Generate scrambled text with progressive reveal\n * @param target - The target text to reveal\n * @param progress - Progress percentage (0-100)\n * @param chars - Characters to use for scrambling\n */\nexport function scrambleText(\n target: string,\n progress: number,\n chars: string = SCRAMBLE_CHARS\n): string {\n return target\n .split('\\n')\n .map((line) => {\n return line\n .split('')\n .map((char, i) => {\n if (char === ' ') return char;\n if (progress > (i / line.length) * 100) return char;\n return chars[Math.floor(Math.random() * chars.length)];\n })\n .join('');\n })\n .join('\\n');\n}\n\n/**\n * Calculate staggered delay for an item in a list\n * @param index - Item index\n * @param stagger - Delay between items in ms\n * @returns Delay in ms for this item\n */\nexport function getStaggerDelay(index: number, stagger: number = 100): number {\n return index * stagger;\n}\n","/**\n * List navigation and pagination utilities\n */\n\n/**\n * Calculate visible items for paginated list display\n * Centers the selected item in the visible window\n */\nexport interface PaginationResult {\n /** Starting index in the full list */\n start: number;\n /** Ending index (exclusive) in the full list */\n end: number;\n /** Number of items above the visible window */\n itemsAbove: number;\n /** Number of items below the visible window */\n itemsBelow: number;\n}\n\n/**\n * Calculate pagination for a list with a selected index\n * @param totalItems - Total number of items in the list\n * @param selectedIndex - Currently selected item index\n * @param maxVisible - Maximum number of items to show at once\n * @returns Pagination information\n */\nexport function calculatePagination(\n totalItems: number,\n selectedIndex: number,\n maxVisible: number\n): PaginationResult {\n if (totalItems <= maxVisible) {\n return {\n start: 0,\n end: totalItems,\n itemsAbove: 0,\n itemsBelow: 0,\n };\n }\n\n // Center the selected item in the visible window\n const halfVisible = Math.floor(maxVisible / 2);\n let start = Math.max(0, selectedIndex - halfVisible);\n\n // Ensure we don't go past the end\n if (start + maxVisible > totalItems) {\n start = totalItems - maxVisible;\n }\n\n const end = start + maxVisible;\n\n return {\n start,\n end,\n itemsAbove: start,\n itemsBelow: totalItems - end,\n };\n}\n\n/**\n * Move selection up in a list\n * @param currentIndex - Current selected index\n * @param minIndex - Minimum allowed index (default: 0)\n * @returns New index after moving up\n */\nexport function moveUp(currentIndex: number, minIndex = 0): number {\n return Math.max(minIndex, currentIndex - 1);\n}\n\n/**\n * Move selection down in a list\n * @param currentIndex - Current selected index\n * @param maxIndex - Maximum allowed index\n * @returns New index after moving down\n */\nexport function moveDown(currentIndex: number, maxIndex: number): number {\n return Math.min(maxIndex, currentIndex + 1);\n}\n\n/**\n * Clamp an index within valid bounds\n * @param index - Index to clamp\n * @param listLength - Length of the list\n * @returns Clamped index\n */\nexport function clampIndex(index: number, listLength: number): number {\n if (listLength === 0) return 0;\n return Math.max(0, Math.min(index, listLength - 1));\n}\n\n/**\n * Calculate max visible items based on available rows\n * @param availableRows - Total available rows\n * @param reservedRows - Rows reserved for headers, footers, etc.\n * @param minVisible - Minimum visible items (default: 5)\n * @returns Maximum visible items\n */\nexport function calculateMaxVisible(\n availableRows: number,\n reservedRows: number,\n minVisible = 5\n): number {\n return Math.max(minVisible, availableRows - reservedRows);\n}\n","/**\n * AgentGrid Component\n * Displays monochromatic agent logos in a grid layout\n */\nimport { AGENT_LOGOS, type AgentLogo } from '../theme/symbols.js';\nimport { terminalColors } from '../theme/colors.js';\n\ninterface AgentGridProps {\n /** Maximum number of agents to display */\n maxVisible?: number;\n /** Show status indicators for detected agents */\n showStatus?: boolean;\n /** Agent types that are detected/active */\n detectedAgents?: string[];\n /** Number of columns in the grid */\n columns?: number;\n}\n\nexport function AgentGrid({\n maxVisible = 12,\n showStatus = true,\n detectedAgents = [],\n columns = 4,\n}: AgentGridProps) {\n const safeColumns = Math.max(1, columns);\n const allAgents = Object.entries(AGENT_LOGOS);\n const visibleAgents = allAgents.slice(0, maxVisible);\n const hiddenCount = allAgents.length - maxVisible;\n\n const rows: [string, AgentLogo][][] = [];\n for (let i = 0; i < visibleAgents.length; i += safeColumns) {\n rows.push(visibleAgents.slice(i, i + safeColumns));\n }\n\n return (\n <box flexDirection=\"column\">\n <text fg={terminalColors.text}>\n <b>Works with</b>\n </text>\n <text> </text>\n {rows.map((row, rowIndex) => (\n <box key={`row-${rowIndex}`} flexDirection=\"row\">\n {row.map(([agentType, agent]) => {\n const isDetected = detectedAgents.includes(agentType);\n const statusIcon = showStatus ? (isDetected ? '●' : '○') : '';\n const fg = isDetected ? terminalColors.accent : terminalColors.text;\n\n return (\n <box key={agentType} width={18}>\n <text fg={fg}>\n {agent.icon} {agent.name}\n {showStatus && (\n <span fg={isDetected ? terminalColors.success : terminalColors.textMuted}>\n {' '}{statusIcon}\n </span>\n )}\n </text>\n </box>\n );\n })}\n </box>\n ))}\n {hiddenCount > 0 && (\n <text fg={terminalColors.textMuted}>+{hiddenCount} more agents</text>\n )}\n </box>\n );\n}\n","/**\n * StatsCard Component\n * OpenSync-style stats display with optional animations\n */\nimport { useState, useEffect } from 'react';\nimport { terminalColors } from '../theme/colors.js';\nimport { animations } from '../theme/animations.js';\n\ninterface StatItem {\n label: string;\n value: number;\n color?: keyof typeof terminalColors;\n}\n\ninterface StatsCardProps {\n items: StatItem[];\n animated?: boolean;\n}\n\nexport function StatsCard({ items, animated = true }: StatsCardProps) {\n const [displayValues, setDisplayValues] = useState<number[]>(() =>\n animated ? items.map(() => 0) : items.map((item) => item.value)\n );\n const [animComplete, setAnimComplete] = useState(!animated);\n const [prevItemsLength, setPrevItemsLength] = useState(items.length);\n\n useEffect(() => {\n if (items.length !== prevItemsLength) {\n setPrevItemsLength(items.length);\n setDisplayValues(animated ? items.map(() => 0) : items.map((item) => item.value));\n setAnimComplete(!animated);\n }\n }, [items, prevItemsLength, animated]);\n\n useEffect(() => {\n if (!animated || animComplete) return;\n\n const duration = animations.countUp.duration;\n const startTime = Date.now();\n const targetValues = items.map((item) => item.value);\n const frameInterval = 16;\n\n const intervalId = setInterval(() => {\n const elapsed = Date.now() - startTime;\n const progress = Math.min(elapsed / duration, 1);\n const eased = 1 - Math.pow(1 - progress, 4);\n\n const newValues = targetValues.map((target) =>\n Math.round(target * eased)\n );\n\n setDisplayValues(newValues);\n\n if (progress >= 1) {\n clearInterval(intervalId);\n setAnimComplete(true);\n }\n }, frameInterval);\n\n return () => clearInterval(intervalId);\n }, [animated, animComplete, items]);\n\n return (\n <box flexDirection=\"row\" gap={2}>\n {items.map((item, index) => {\n const fg = item.color\n ? terminalColors[item.color]\n : terminalColors.text;\n\n return (\n <box\n key={item.label}\n flexDirection=\"column\"\n alignItems=\"center\"\n padding={2}\n borderStyle=\"single\"\n borderColor={terminalColors.border}\n >\n <text fg={fg}>\n <b>{String(displayValues[index])}</b>\n </text>\n <text fg={terminalColors.textMuted}>{item.label}</text>\n </box>\n );\n })}\n </box>\n );\n}\n","/**\n * StatusBar Component\n * Bottom status bar with keyboard shortcuts\n */\nimport { terminalColors } from '../theme/colors.js';\nimport { STATUS_BAR_SHORTCUTS } from '../state/types.js';\n\ninterface StatusBarProps {\n message?: string;\n messageType?: 'info' | 'success' | 'error' | 'warning';\n shortcuts?: string;\n}\n\nexport function StatusBar({\n message,\n messageType = 'info',\n shortcuts = STATUS_BAR_SHORTCUTS,\n}: StatusBarProps) {\n const messageColors = {\n info: terminalColors.info,\n success: terminalColors.success,\n error: terminalColors.error,\n warning: terminalColors.warning,\n };\n\n return (\n <box flexDirection=\"column\">\n <text fg={terminalColors.textMuted}>\n {'\\u2500'.repeat(70)}\n </text>\n {message ? (\n <text fg={messageColors[messageType]}>{message}</text>\n ) : (\n <text fg={terminalColors.textMuted}>{shortcuts}</text>\n )}\n </box>\n );\n}\n","/**\n * SkillList Component\n * Paginated list of skills with selection\n */\nimport { terminalColors } from '../theme/colors.js';\nimport { symbols } from '../theme/symbols.js';\nimport { calculatePagination, type PaginationResult } from '../utils/list.js';\nimport type { SkillItem } from '../state/types.js';\n\ninterface SkillListProps {\n skills: SkillItem[];\n selectedIndex: number;\n maxVisible?: number;\n onSelect?: (skill: SkillItem) => void;\n}\n\nexport function SkillList({\n skills,\n selectedIndex,\n maxVisible = 10,\n onSelect,\n}: SkillListProps) {\n if (skills.length === 0) {\n return (\n <text fg={terminalColors.textMuted}>No skills found</text>\n );\n }\n\n const pagination = calculatePagination(skills.length, selectedIndex, maxVisible);\n const visibleSkills = skills.slice(pagination.start, pagination.end);\n\n return (\n <box flexDirection=\"column\">\n {/* Items above indicator */}\n {pagination.itemsAbove > 0 && (\n <text fg={terminalColors.textMuted}>\n {symbols.arrowUp} {pagination.itemsAbove} more above\n </text>\n )}\n\n {/* Skill list */}\n {visibleSkills.map((skill, idx) => {\n const actualIndex = pagination.start + idx;\n const isSelected = actualIndex === selectedIndex;\n const pointer = isSelected ? symbols.pointer : symbols.pointerInactive;\n const fg = isSelected ? terminalColors.accent : terminalColors.text;\n const statusIcon = skill.enabled ? symbols.active : symbols.pending;\n const descPart = skill.description\n ? ` - ${skill.description.slice(0, 40)}${skill.description.length > 40 ? '...' : ''}`\n : '';\n // Use single text element to avoid rendering overlap\n const line = `${pointer} ${skill.name} ${statusIcon}${descPart}`;\n\n return (\n <text key={skill.name} fg={fg}>\n {isSelected ? <b>{line}</b> : line}\n </text>\n );\n })}\n\n {/* Items below indicator */}\n {pagination.itemsBelow > 0 && (\n <text fg={terminalColors.textMuted}>\n {symbols.arrowDown} {pagination.itemsBelow} more below\n </text>\n )}\n </box>\n );\n}\n","/**\n * SearchInput Component\n * Rounded search input with icon\n */\nimport { terminalColors } from '../theme/colors.js';\n\ninterface SearchInputProps {\n value: string;\n placeholder?: string;\n focused?: boolean;\n onChange?: (value: string) => void;\n}\n\nexport function SearchInput({\n value,\n placeholder = 'Search...',\n focused = false,\n}: SearchInputProps) {\n const display = value || placeholder;\n const textColor = value ? terminalColors.text : terminalColors.textMuted;\n\n return (\n <box flexDirection=\"row\" marginBottom={1}>\n <text fg={terminalColors.textMuted}>⌕ </text>\n <text fg={textColor}>{display}</text>\n {focused && <text fg={terminalColors.accent}>▏</text>}\n </box>\n );\n}\n","/**\n * FeatureList Component\n * Colored feature keywords with descriptions\n */\nimport { terminalColors } from '../theme/colors.js';\n\ninterface Feature {\n key: string;\n label: string;\n description: string;\n color: keyof typeof terminalColors;\n}\n\nconst FEATURES: Feature[] = [\n { key: 'sync', label: 'Sync', color: 'sync', description: 'share skills across all your coding agents' },\n { key: 'browse', label: 'Browse', color: 'browse', description: 'discover skills from the marketplace' },\n { key: 'recommend', label: 'Recommend', color: 'recommend', description: 'AI-powered skill suggestions for your project' },\n { key: 'translate', label: 'Translate', color: 'translate', description: 'convert skills between agent formats' },\n { key: 'workflow', label: 'Workflow', color: 'workflow', description: 'automate skill execution chains' },\n { key: 'team', label: 'Team', color: 'team', description: 'collaborate with your development team' },\n];\n\ninterface FeatureListProps {\n features?: Feature[];\n}\n\nexport function FeatureList({ features = FEATURES }: FeatureListProps) {\n return (\n <box flexDirection=\"column\">\n <text fg={terminalColors.text}><b>Features</b></text>\n <text> </text>\n {features.map((feat) => (\n <box key={feat.key} flexDirection=\"row\">\n <text fg={terminalColors[feat.color]}>\n <b>{' '}{feat.label.padEnd(12)}</b>\n </text>\n <text fg={terminalColors.textMuted}>{feat.description}</text>\n </box>\n ))}\n </box>\n );\n}\n\nexport { FEATURES, type Feature };\n"],"mappings":"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","names":["useState","useCallback","useEffect","useKeyboard","Fragment","jsx","jsxs","useState","useEffect","useMemo","loadConfig","getAdapter","loadConfig","readFileSync","rmSync","join","loadConfig","join","readFileSync","rmSync","jsx","jsxs","useState","useEffect","useMemo","useState","useEffect","useMemo","useCallback","jsx","jsxs","useState","useEffect","useMemo","useCallback","useState","useEffect","useMemo","useCallback","useKeyboard","Fragment","jsx","jsxs","SPINNER","useState","useEffect","useMemo","useCallback","useKeyboard","useState","useEffect","useMemo","useCallback","useKeyboard","jsx","jsxs","useState","useEffect","useMemo","useCallback","useKeyboard","useState","useEffect","useMemo","useCallback","useKeyboard","jsx","jsxs","SPINNER","useState","useEffect","useMemo","useCallback","useKeyboard","useState","jsx","jsxs","jsx","jsxs","useState","useState","useEffect","useState","useEffect","jsx","jsxs","useState","useEffect","jsx","jsxs","useState","useEffect","useState","useEffect","useMemo","useCallback","useKeyboard","jsx","jsxs","SPINNER","useState","useEffect","useMemo","useCallback","useKeyboard","jsx","jsxs","useState","useEffect","useMemo","useCallback","useKeyboard","jsx","jsxs","useState","useEffect","useCallback","useKeyboard","useMemo","useState","jsx","jsxs","jsx","jsxs","useState","jsx","jsxs","jsx","jsxs","jsx","jsxs","Fragment","jsx","jsxs","jsx","jsxs","useState","useEffect","useMemo","useCallback","useKeyboard","jsx","jsxs","useState","useEffect","useCallback","useKeyboard","useMemo","useState","useEffect","useMemo","jsx","jsxs","useState","useEffect","useMemo","jsx","jsxs","useState","useEffect","useCallback","useKeyboard","jsx","jsxs","useState","useEffect","jsx","jsxs","useState","useEffect","jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsxs","FEATURES","jsx"]}
|