@gustavobrunodev/ai-tools 1.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/LICENSE +26 -0
- package/README.md +257 -0
- package/assets/chiptune.mp3 +0 -0
- package/index.js +12 -0
- package/index.js.map +7 -0
- package/package.json +60 -0
package/index.js.map
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/services/project-root.ts", "../src/services/agents.ts", "../src/utils/constants.ts", "../src/services/audit-log.ts", "../src/services/global-path.ts", "../../../libs/core/src/lib/constants.ts", "../../../libs/core/src/lib/types.ts", "../../../libs/core/src/lib/utils.ts", "../../../libs/core/src/index.ts", "../src/services/lockfile.ts", "../src/services/registry.ts", "../src/services/installer.ts", "../src/cli/install.ts", "../src/cli/remove.ts", "../src/cli/update.ts", "../src/cli/cache.ts", "../src/components/AuditLogViewer.tsx", "../src/cli/audit.ts", "../src/index.ts", "../src/app.tsx", "../src/hooks/useAgents.ts", "../src/hooks/useConfig.ts", "../src/services/config.ts", "../src/hooks/useFilter.ts", "../src/hooks/useInstaller.ts", "../src/services/skills-provider.ts", "../src/utils/paths.ts", "../src/hooks/useKonamiCode.ts", "../src/hooks/useRemover.ts", "../src/hooks/useSkillContent.ts", "../src/hooks/useSkills.ts", "../src/services/categories.ts", "../src/hooks/useWizardStep.ts", "../src/views/arcade/ArcadeMenu.tsx", "../src/components/FooterBar.tsx", "../src/theme/colors.ts", "../src/theme/symbols.ts", "../src/components/SelectPrompt.tsx", "../src/views/arcade/VibeInvaders.tsx", "../src/views/ActionSelector.tsx", "../src/components/Header.tsx", "../src/atoms/environmentCheck.ts", "../src/services/update-cache.ts", "../src/services/update-check.ts", "../src/services/package-info.ts", "../src/views/AgentSelector.tsx", "../src/components/KeyboardShortcutsOverlay.tsx", "../src/components/AnimatedTransition.tsx", "../src/components/MultiSelectPrompt.tsx", "../src/views/CreditsView.tsx", "../src/services/audio-player.ts", "../src/services/github-contributors.ts", "../src/views/InstallConfig.tsx", "../src/views/InstallWizard.tsx", "../src/atoms/installedSkills.ts", "../src/atoms/wizard.ts", "../src/components/InstallResults.tsx", "../src/views/RemoveWizard.tsx", "../src/atoms/deprecatedSkills.ts", "../src/views/SkillBrowser.tsx", "../src/components/CategoryHeader.tsx", "../src/services/badge-format.ts", "../src/components/ConfirmPrompt.tsx", "../src/components/SearchInput.tsx", "../src/components/SkillCard.tsx", "../src/components/StatusBadge.tsx", "../src/components/SkillDetailPanel.tsx", "../src/services/category-colors.ts", "../src/services/markdown-parser.ts", "../src/services/terminal-dimensions.ts", "../src/views/UpdateView.tsx", "../src/views/ListView.tsx"],
|
|
4
|
+
"sourcesContent": ["import { existsSync } from 'node:fs'\nimport { dirname, join, parse, resolve } from 'node:path'\n\nexport function findProjectRoot(startDir: string = process.cwd()): string {\n let currentDir = resolve(startDir)\n const root = parse(currentDir).root\n\n while (currentDir !== root) {\n if (existsSync(join(currentDir, 'package.json')) || existsSync(join(currentDir, '.git'))) {\n const isCliPackage = currentDir.endsWith('packages/cli')\n if (!isCliPackage) return currentDir\n }\n\n currentDir = dirname(currentDir)\n }\n\n return startDir\n}\n", "import { existsSync, readdirSync } from 'node:fs'\nimport { homedir } from 'node:os'\nimport { join } from 'node:path'\n\nimport type { AgentConfig, AgentType } from '../types'\nimport { findProjectRoot } from './project-root'\n\nconst home = homedir()\nconst projectRoot = findProjectRoot()\n\nexport const agents: Record<AgentType, AgentConfig> = {\n // Tier 1: Most popular AI coding agents\n cursor: {\n name: 'cursor',\n displayName: 'Cursor',\n description: 'AI-first code editor built on VS Code',\n skillsDir: '.cursor/skills',\n globalSkillsDir: join(home, '.cursor/skills'),\n detectInstalled: () => existsSync(join(home, '.cursor')) || existsSync(join(projectRoot, '.cursor')),\n },\n 'claude-code': {\n name: 'claude-code',\n displayName: 'Claude Code',\n description: \"Anthropic's agentic coding tool\",\n skillsDir: '.claude/skills',\n globalSkillsDir: join(home, '.claude/skills'),\n detectInstalled: () => existsSync(join(home, '.claude')) || existsSync(join(projectRoot, '.claude')),\n },\n 'github-copilot': {\n name: 'github-copilot',\n displayName: 'GitHub Copilot',\n description: 'AI pair programmer by GitHub/Microsoft',\n skillsDir: '.github/skills',\n globalSkillsDir: join(home, '.copilot/skills'),\n detectInstalled: () => existsSync(join(home, '.copilot')) || existsSync(join(projectRoot, '.github')),\n },\n windsurf: {\n name: 'windsurf',\n displayName: 'Windsurf',\n description: 'AI IDE with Cascade flow (Codeium)',\n skillsDir: '.windsurf/skills',\n globalSkillsDir: join(home, '.codeium/windsurf/skills'),\n detectInstalled: () => existsSync(join(home, '.codeium/windsurf')) || existsSync(join(projectRoot, '.windsurf')),\n },\n cline: {\n name: 'cline',\n displayName: 'Cline',\n description: 'Autonomous AI coding agent for VS Code',\n skillsDir: '.cline/skills',\n globalSkillsDir: join(home, '.cline/skills'),\n detectInstalled: () =>\n existsSync(join(home, '.cline')) ||\n existsSync(join(projectRoot, '.cline')) ||\n isExtensionInstalled('saoudrizwan', 'claude-dev'),\n },\n\n // Tier 2: Rising stars\n aider: {\n name: 'aider',\n displayName: 'Aider',\n description: 'AI pair programming in terminal',\n skillsDir: '.aider/skills',\n globalSkillsDir: join(home, '.aider/skills'),\n detectInstalled: () => existsSync(join(home, '.aider')) || existsSync(join(projectRoot, '.aider')),\n },\n codex: {\n name: 'codex',\n displayName: 'OpenAI Codex',\n description: \"OpenAI's coding agent\",\n skillsDir: '.codex/skills',\n globalSkillsDir: join(home, '.codex/skills'),\n detectInstalled: () => existsSync(join(home, '.codex')) || existsSync(join(projectRoot, '.codex')),\n },\n gemini: {\n name: 'gemini',\n displayName: 'Gemini CLI',\n description: \"Google's AI coding assistant\",\n skillsDir: '.gemini/skills',\n globalSkillsDir: join(home, '.gemini/skills'),\n detectInstalled: () => existsSync(join(home, '.gemini')) || existsSync(join(projectRoot, '.gemini')),\n },\n antigravity: {\n name: 'antigravity',\n displayName: 'Antigravity',\n description: \"Google's agentic coding (VS Code)\",\n skillsDir: '.agent/skills',\n globalSkillsDir: join(home, '.gemini/antigravity/skills'),\n detectInstalled: () => existsSync(join(home, '.gemini/antigravity')) || existsSync(join(projectRoot, '.agent')),\n },\n roo: {\n name: 'roo',\n displayName: 'Roo Code',\n description: 'AI coding assistant for VS Code',\n skillsDir: '.roo/skills',\n globalSkillsDir: join(home, '.roo/skills'),\n detectInstalled: () =>\n existsSync(join(home, '.roo')) ||\n existsSync(join(projectRoot, '.roo')) ||\n isExtensionInstalled('RooVetGit', 'roo-cline'),\n },\n kilocode: {\n name: 'kilocode',\n displayName: 'Kilo Code',\n description: 'AI coding agent with auto-launch',\n skillsDir: '.kilocode/skills',\n globalSkillsDir: join(home, '.kilocode/skills'),\n detectInstalled: () => existsSync(join(home, '.kilocode')) || existsSync(join(projectRoot, '.kilocode')),\n },\n trae: {\n name: 'trae',\n displayName: 'TRAE',\n description: 'AI IDE with SOLO mode and custom agents',\n skillsDir: '.trae/skills',\n globalSkillsDir: join(home, '.trae/skills'),\n detectInstalled: () => existsSync(join(home, '.trae')) || existsSync(join(projectRoot, '.trae')),\n },\n kiro: {\n name: 'kiro',\n displayName: 'Kiro',\n description: 'AI Agent with workspace and global skill scopes',\n skillsDir: '.kiro/skills',\n globalSkillsDir: join(home, '.kiro/skills'),\n detectInstalled: () => existsSync(join(home, '.kiro')) || existsSync(join(projectRoot, '.kiro')),\n },\n\n // Tier 3: Enterprise & specialized\n 'amazon-q': {\n name: 'amazon-q',\n displayName: 'Amazon Q',\n description: 'AWS AI coding assistant',\n skillsDir: '.amazonq/skills',\n globalSkillsDir: join(home, '.amazonq/skills'),\n detectInstalled: () => existsSync(join(home, '.amazonq')) || existsSync(join(projectRoot, '.amazonq')),\n },\n augment: {\n name: 'augment',\n displayName: 'Augment',\n description: 'AI code assistant with context engine',\n skillsDir: '.augment/skills',\n globalSkillsDir: join(home, '.augment/skills'),\n detectInstalled: () => existsSync(join(home, '.augment')) || existsSync(join(projectRoot, '.augment')),\n },\n tabnine: {\n name: 'tabnine',\n displayName: 'Tabnine',\n description: 'AI code completions with privacy focus',\n skillsDir: '.tabnine/skills',\n globalSkillsDir: join(home, '.tabnine/skills'),\n detectInstalled: () => existsSync(join(home, '.tabnine')) || existsSync(join(projectRoot, '.tabnine')),\n },\n opencode: {\n name: 'opencode',\n displayName: 'OpenCode',\n description: 'Open-source AI coding terminal',\n skillsDir: '.opencode/skills',\n globalSkillsDir: join(home, '.config/opencode/skills'),\n detectInstalled: () =>\n existsSync(join(home, '.config/opencode')) ||\n existsSync(join(projectRoot, '.opencode')) ||\n existsSync(join(projectRoot, '.config/opencode')),\n },\n sourcegraph: {\n name: 'sourcegraph',\n displayName: 'Sourcegraph Cody',\n description: 'AI assistant with codebase context',\n skillsDir: '.sourcegraph/skills',\n globalSkillsDir: join(home, '.sourcegraph/skills'),\n detectInstalled: () => existsSync(join(home, '.sourcegraph')) || existsSync(join(projectRoot, '.sourcegraph')),\n },\n droid: {\n name: 'droid',\n displayName: 'Droid (Factory.ai)',\n description: 'AI software engineer by Factory.ai',\n skillsDir: '.factory/skills',\n globalSkillsDir: join(home, '.factory/skills'),\n detectInstalled: () => existsSync(join(home, '.factory')) || existsSync(join(projectRoot, '.factory')),\n },\n}\n\nexport function detectInstalledAgents(): AgentType[] {\n return (Object.entries(agents) as [AgentType, AgentConfig][])\n .filter(([, config]) => config.detectInstalled())\n .map(([type]) => type)\n}\n\nexport function getAgentConfig(type: AgentType): AgentConfig {\n return agents[type]\n}\n\nexport function getAllAgentTypes(): AgentType[] {\n return (Object.keys(agents) as AgentType[]).sort((a, b) => agents[a].displayName.localeCompare(agents[b].displayName))\n}\n\nconst isExtensionInstalled = (publisher: string, name: string): boolean => {\n const extensionsDirs = [\n join(home, '.vscode/extensions'),\n join(home, '.vscode-server/extensions'),\n join(home, '.vscode-oss/extensions'),\n ]\n\n for (const dir of extensionsDirs) {\n if (existsSync(dir)) {\n try {\n const entries = readdirSync(dir)\n if (entries.some((e) => e.startsWith(`${publisher}.${name}-`))) {\n return true\n }\n } catch {\n // Ignore errors accessing extension dirs\n }\n }\n }\n\n return false\n}\n", "// Package metadata\nexport const PACKAGE_NAME = '@gustavobrunodev/ai-tools'\nexport const SKILLS_CATALOG_PACKAGE = '@gustavobrunodev/skills-catalog'\n\n// Directory and file paths\nexport const CONFIG_DIR = '.ai-tools'\nexport const CACHE_FILE = 'cache.json'\nexport const CONFIG_FILE = 'config.json'\nexport const SKILL_META_FILE = '.skill-meta.json'\n\n// Project structure\nexport const AGENTS_DIR = '.agents'\nexport const CANONICAL_SKILLS_DIR = 'skills'\nexport const LOCK_FILE = '.skill-lock.json'\nexport const LOCK_FILE_BACKUP = '.skill-lock.json.backup'\n\n// Global configuration\nexport const GLOBAL_CONFIG_DIR = '.ai-tools'\nexport const AUDIT_LOG_FILE = 'audit.log'\n\n// Cache directory structure\nexport const CACHE_BASE_DIR = '.cache'\nexport const CACHE_NAMESPACE = 'ai-tools'\nexport const SKILLS_SUBDIR = 'skills'\nexport const REGISTRY_CACHE_FILENAME = 'registry.json'\n\n// Cache settings\nexport const UPDATE_CHECK_CACHE_TTL_MS = 24 * 60 * 60 * 1000 // 24 hours\nexport const UPDATE_CHECK_TIMEOUT_MS = 3_000 // 3 seconds\n\n// Registry/CDN settings\nexport const REGISTRY_CACHE_TTL_MS = 24 * 60 * 60 * 1000 // 24 hours\nexport const FETCH_TIMEOUT_MS = 15_000\nexport const MAX_RETRIES = 3\nexport const RETRY_BASE_DELAY_MS = 500\nexport const MAX_CONCURRENT_DOWNLOADS = 10\n\n// Versioning\nexport const CURRENT_CONFIG_VERSION = '1.0.0'\n\n// UI Messages\nexport const MESSAGES = {\n UPDATE_AVAILABLE: (current: string, update: string) => `Update available: ${current} \u2192 ${update}`,\n TIP_INSTALL_UPDATE: 'Tip: Install globally to update:',\n TIP_INSTALL_ACCESS: 'Tip: Install globally for easier access:',\n UPDATE_COMMAND: `npm update -g ${PACKAGE_NAME}`,\n INSTALL_COMMAND: `npm install -g ${PACKAGE_NAME}`,\n DESCRIPTION: 'Curated skills to power up your coding agents',\n} as const\n", "import { appendFile, mkdir, readFile } from 'node:fs/promises'\nimport { homedir } from 'node:os'\nimport { join } from 'node:path'\n\nimport { AUDIT_LOG_FILE, GLOBAL_CONFIG_DIR } from '../utils/constants'\n\ninterface AuditResultDetail {\n skill: string\n agent: string\n success: boolean\n error?: string\n path?: string\n}\n\ninterface AuditEntry {\n action: 'install' | 'remove' | 'update'\n skillName: string\n agents: string[]\n success: number\n failed: number\n forced?: boolean\n timestamp?: string\n details?: AuditResultDetail[]\n}\n\nexport function getAuditLogPath(baseDir: string = homedir()): string {\n return join(baseDir, GLOBAL_CONFIG_DIR, AUDIT_LOG_FILE)\n}\n\nexport async function logAudit(entry: AuditEntry, baseDir: string = homedir()): Promise<void> {\n try {\n const logPath = getAuditLogPath(baseDir)\n const logDir = join(baseDir, GLOBAL_CONFIG_DIR)\n await mkdir(logDir, { recursive: true })\n\n const logLine =\n JSON.stringify({\n ...entry,\n timestamp: new Date().toISOString(),\n }) + '\\n'\n\n await appendFile(logPath, logLine, 'utf-8')\n } catch {\n // Fail silently\n }\n}\n\nexport async function readAuditLog(limit?: number, baseDir: string = homedir()): Promise<AuditEntry[]> {\n try {\n const logPath = getAuditLogPath(baseDir)\n const content = await readFile(logPath, 'utf-8')\n const lines = content.trim().split('\\n').filter(Boolean)\n\n const entries = lines\n .map((line) => {\n try {\n return JSON.parse(line) as AuditEntry\n } catch {\n return null\n }\n })\n .filter((entry): entry is AuditEntry => entry !== null)\n .reverse()\n\n return limit ? entries.slice(0, limit) : entries\n } catch {\n return []\n }\n}\n", "import { execSync } from 'node:child_process'\nimport { existsSync } from 'node:fs'\nimport { join } from 'node:path'\n\nimport { PACKAGE_NAME } from '../utils/constants'\n\nexport function getNpmGlobalRoot(): string | null {\n try {\n return execSync('npm root -g', { encoding: 'utf-8' }).trim()\n } catch {\n return null\n }\n}\n\nexport function isGloballyInstalled(): boolean {\n const npmGlobalRoot = getNpmGlobalRoot()\n if (!npmGlobalRoot) return false\n const packagePath = join(npmGlobalRoot, PACKAGE_NAME)\n return existsSync(packagePath)\n}\n", "import type { CategoryInfo } from './types'\n\nexport const SKILLS_CATALOG_DIR = 'packages/skills-catalog/skills'\nexport const DEFAULT_CATEGORY_ID = 'uncategorized'\nexport const CATEGORY_FOLDER_PATTERN = /^\\(([a-z][a-z0-9-]*)\\)$/\nexport const CATEGORY_METADATA_FILE = '_category.json'\n\nexport const DEFAULT_CATEGORY: CategoryInfo = {\n id: DEFAULT_CATEGORY_ID,\n name: 'Uncategorized',\n description: 'Skills without a specific category',\n priority: 999,\n}\n", "export interface CategoryInfo {\n id: string\n name: string\n description?: string\n priority?: number\n}\n\nexport interface CategoryMetadata {\n [categoryFolder: string]: {\n name?: string\n description?: string\n priority?: number\n }\n}\n\nexport const AGENT_TYPES = [\n 'cursor',\n 'claude-code',\n 'github-copilot',\n 'windsurf',\n 'cline',\n 'aider',\n 'codex',\n 'gemini',\n 'antigravity',\n 'roo',\n 'kilocode',\n 'amazon-q',\n 'augment',\n 'tabnine',\n 'opencode',\n 'sourcegraph',\n 'droid',\n 'trae',\n 'kiro',\n] as const\n\nexport type AgentType = (typeof AGENT_TYPES)[number]\n\nexport interface AgentConfig {\n name: string\n displayName: string\n description: string\n skillsDir: string\n globalSkillsDir: string\n detectInstalled: () => boolean\n}\n\nexport interface SkillInfo {\n name: string\n description: string\n path: string\n category?: string\n}\n\nexport interface DeprecatedEntry {\n name: string\n message: string\n alternatives?: string[]\n}\n", "export function formatCategoryName(categoryId: string): string {\n return categoryId\n .split('-')\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(' ')\n}\n", "export * from './lib/constants'\nexport * from './lib/types'\nexport * from './lib/utils'\n", "import { AGENT_TYPES } from '@gustavobrunodev/core'\nimport { mkdir, readFile, rename, unlink, writeFile } from 'node:fs/promises'\nimport { homedir } from 'node:os'\nimport { dirname, join } from 'node:path'\nimport { z } from 'zod'\n\nimport type { AgentType } from '../types'\nimport { AGENTS_DIR, LOCK_FILE, LOCK_FILE_BACKUP } from '../utils/constants'\nimport { findProjectRoot } from './project-root'\n\nconst CURRENT_VERSION = 2\n\nconst AgentTypeSchema = z.enum(AGENT_TYPES as unknown as [string, ...string[]])\n\nconst SkillLockEntrySchema = z.object({\n name: z.string(),\n source: z.string(),\n contentHash: z.string().optional(),\n installedAt: z.string(),\n updatedAt: z.string(),\n agents: z.array(AgentTypeSchema).optional(),\n method: z.enum(['copy', 'symlink']).optional(),\n global: z.boolean().optional(),\n version: z.string().optional(),\n})\n\nconst SkillLockFileSchema = z.object({\n version: z.number(),\n skills: z.record(z.string(), SkillLockEntrySchema),\n})\n\nexport interface SkillLockEntry {\n name: string\n source: string\n contentHash?: string\n installedAt: string\n updatedAt: string\n agents?: AgentType[]\n method?: 'copy' | 'symlink'\n global?: boolean\n version?: string\n}\n\nexport interface SkillLockFile {\n version: number\n skills: Record<string, SkillLockEntry>\n}\n\nfunction getSkillLockPath(global: boolean): string {\n if (global) return join(homedir(), AGENTS_DIR, LOCK_FILE)\n const projectRoot = findProjectRoot()\n return join(projectRoot, AGENTS_DIR, LOCK_FILE)\n}\n\nfunction getBackupPath(global: boolean): string {\n if (global) return join(homedir(), AGENTS_DIR, LOCK_FILE_BACKUP)\n const projectRoot = findProjectRoot()\n return join(projectRoot, AGENTS_DIR, LOCK_FILE_BACKUP)\n}\n\nfunction createEmptyLockFile(): SkillLockFile {\n return { version: CURRENT_VERSION, skills: {} }\n}\n\n// Migrate old lockfile format to new format\nfunction migrateLockFile(data: unknown): SkillLockFile {\n try {\n const parsed = SkillLockFileSchema.parse(data)\n\n if (parsed.version === 1) {\n return {\n version: CURRENT_VERSION,\n skills: Object.fromEntries(\n Object.entries(parsed.skills).map(([key, entry]) => [\n key,\n {\n ...entry,\n agents: (entry.agents || []) as AgentType[],\n method: entry.method || 'copy',\n global: entry.global ?? false,\n },\n ]),\n ),\n } as SkillLockFile\n }\n\n return parsed as SkillLockFile\n } catch {\n return createEmptyLockFile()\n }\n}\n\nexport async function readSkillLock(global = false): Promise<SkillLockFile> {\n const lockPath = getSkillLockPath(global)\n\n try {\n const content = await readFile(lockPath, 'utf-8')\n const parsed = JSON.parse(content)\n return migrateLockFile(parsed)\n } catch {\n return createEmptyLockFile()\n }\n}\n\nexport async function writeSkillLock(lock: SkillLockFile, global = false): Promise<void> {\n const lockPath = getSkillLockPath(global)\n const backupPath = getBackupPath(global)\n const tempPath = `${lockPath}.tmp`\n\n try {\n try {\n const existing = await readFile(lockPath, 'utf-8')\n await writeFile(backupPath, existing, 'utf-8')\n } catch {\n // No existing file to backup\n }\n\n await mkdir(dirname(lockPath), { recursive: true })\n await writeFile(tempPath, JSON.stringify(lock, null, 2), 'utf-8')\n await rename(tempPath, lockPath)\n } catch (error) {\n try {\n await unlink(tempPath)\n } catch {\n // Ignore cleanup errors\n }\n throw error\n }\n}\n\nexport async function addSkillToLock(\n skillName: string,\n agents: AgentType[],\n options: {\n source?: string\n contentHash?: string\n method?: 'copy' | 'symlink'\n global?: boolean\n version?: string\n } = {},\n): Promise<void> {\n const lock = await readSkillLock(options.global)\n const now = new Date().toISOString()\n const existingEntry = lock.skills[skillName]\n\n lock.skills[skillName] = {\n name: skillName,\n source: options.source || 'local',\n contentHash: options.contentHash ?? existingEntry?.contentHash,\n installedAt: existingEntry?.installedAt ?? now,\n updatedAt: now,\n agents: agents,\n method: options.method || 'copy',\n global: options.global ?? false,\n version: options.version,\n }\n\n await writeSkillLock(lock, options.global)\n}\n\nexport async function removeSkillFromLock(skillName: string, global = false): Promise<boolean> {\n const lock = await readSkillLock(global)\n if (!(skillName in lock.skills)) return false\n delete lock.skills[skillName]\n await writeSkillLock(lock, global)\n return true\n}\n\nexport async function getSkillFromLock(skillName: string, global = false): Promise<SkillLockEntry | null> {\n const lock = await readSkillLock(global)\n return lock.skills[skillName] ?? null\n}\n\nexport async function getAllLockedSkills(global = false): Promise<Record<string, SkillLockEntry>> {\n const lock = await readSkillLock(global)\n return lock.skills\n}\n", "import ky from 'ky'\nimport { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs'\nimport { homedir } from 'node:os'\nimport { join } from 'node:path'\nimport packageJson from 'package-json'\n\nimport type { CategoryInfo, DeprecatedEntry, SkillInfo } from '../types'\nimport {\n CACHE_BASE_DIR,\n CACHE_NAMESPACE,\n FETCH_TIMEOUT_MS,\n MAX_CONCURRENT_DOWNLOADS,\n MAX_RETRIES,\n REGISTRY_CACHE_FILENAME,\n REGISTRY_CACHE_TTL_MS,\n RETRY_BASE_DELAY_MS,\n SKILL_META_FILE,\n SKILLS_CATALOG_PACKAGE,\n SKILLS_SUBDIR,\n} from '../utils/constants'\n\nexport interface SkillMetadata {\n name: string\n description: string\n category: string\n path: string\n files: string[]\n author?: string\n version?: string\n contentHash?: string\n}\n\ninterface CachedSkillMeta {\n contentHash: string\n downloadedAt: number\n}\n\nexport interface CategoryMetadata {\n name: string\n description?: string\n}\n\nexport interface SkillsRegistry {\n version: string\n generatedAt: string\n baseUrl: string\n categories: Record<string, CategoryMetadata>\n skills: SkillMetadata[]\n deprecated?: DeprecatedEntry[]\n}\n\ninterface CachedRegistry {\n fetchedAt: number\n registry: SkillsRegistry\n}\n\nconst CONFIG = {\n cacheTtlMs: REGISTRY_CACHE_TTL_MS,\n fetchTimeoutMs: FETCH_TIMEOUT_MS,\n maxRetries: MAX_RETRIES,\n retryBaseDelayMs: RETRY_BASE_DELAY_MS,\n maxConcurrentDownloads: MAX_CONCURRENT_DOWNLOADS,\n} as const\n\nconst PATHS = {\n cacheDir: join(homedir(), CACHE_BASE_DIR, CACHE_NAMESPACE),\n get registryCacheFile() {\n return join(this.cacheDir, REGISTRY_CACHE_FILENAME)\n },\n get skillsCacheDir() {\n return join(this.cacheDir, SKILLS_SUBDIR)\n },\n} as const\n\nconst UNSAFE_PATH_PATTERNS = [/[/\\\\]/g, /\\.\\./g, /[<>:\"|?*]/g] as const\n\nfunction ensureCacheDir(): void {\n if (!existsSync(PATHS.cacheDir)) mkdirSync(PATHS.cacheDir, { recursive: true })\n if (!existsSync(PATHS.skillsCacheDir)) mkdirSync(PATHS.skillsCacheDir, { recursive: true })\n}\n\nfunction isCacheValid(fetchedAt: number): boolean {\n return Date.now() - fetchedAt < CONFIG.cacheTtlMs\n}\n\nfunction tryReadCachedRegistry(): CachedRegistry | null {\n if (!existsSync(PATHS.registryCacheFile)) return null\n try {\n const content = readFileSync(PATHS.registryCacheFile, 'utf-8')\n return JSON.parse(content) as CachedRegistry\n } catch {\n return null\n }\n}\n\nfunction saveRegistryToCache(registry: SkillsRegistry): void {\n const cached: CachedRegistry = { fetchedAt: Date.now(), registry }\n writeFileSync(PATHS.registryCacheFile, JSON.stringify(cached, null, 2))\n}\n\nconst httpClient = ky.create({\n timeout: CONFIG.fetchTimeoutMs,\n retry: {\n limit: CONFIG.maxRetries,\n methods: ['get'],\n statusCodes: [408, 429, 500, 502, 503, 504],\n backoffLimit: 10_000,\n delay: (attemptCount) => CONFIG.retryBaseDelayMs * Math.pow(2, attemptCount - 1),\n jitter: true,\n retryOnTimeout: true,\n },\n})\n\nasync function fetchWithFallback(url: string, fallbackUrl?: string): Promise<Response> {\n try {\n return await httpClient.get(url)\n } catch (error) {\n if (fallbackUrl) {\n try {\n return await httpClient.get(fallbackUrl)\n } catch {\n // Fallback also failed, ignore and throw original error\n }\n }\n\n throw error\n }\n}\n\nlet cachedCdnRef: string | null = null\n\nasync function getResolvedCdnRef(): Promise<string> {\n if (process.env.SKILLS_CDN_REF) return process.env.SKILLS_CDN_REF\n if (cachedCdnRef) return cachedCdnRef\n\n try {\n const pkg = await packageJson(SKILLS_CATALOG_PACKAGE, { version: 'latest' })\n cachedCdnRef = pkg.version as string\n return cachedCdnRef\n } catch {\n return 'latest'\n }\n}\n\nfunction buildUrls(cdnRef: string) {\n const cdnBase = `https://cdn.jsdelivr.net/npm/${SKILLS_CATALOG_PACKAGE}@${cdnRef}`\n const fallbackCdnBase = `https://unpkg.com/${SKILLS_CATALOG_PACKAGE}@${cdnRef}`\n return {\n registry: `${cdnBase}/skills-registry.json`,\n fallbackRegistry: `${fallbackCdnBase}/skills-registry.json`,\n skillsBase: `${cdnBase}/skills`,\n fallbackSkillsBase: `${fallbackCdnBase}/skills`,\n }\n}\n\nexport async function fetchRegistry(forceRefresh = false): Promise<SkillsRegistry | null> {\n ensureCacheDir()\n\n const resolvedRef = await getResolvedCdnRef()\n\n if (!forceRefresh) {\n const cached = tryReadCachedRegistry()\n const versionChanged = cached && resolvedRef !== 'latest' && cached.registry.version !== resolvedRef\n if (cached && isCacheValid(cached.fetchedAt) && !versionChanged) return cached.registry\n }\n\n try {\n const urls = buildUrls(resolvedRef)\n const response = await fetchWithFallback(urls.registry, urls.fallbackRegistry)\n const registry = (await response.json()) as SkillsRegistry\n saveRegistryToCache(registry)\n return registry\n } catch (error) {\n const cached = tryReadCachedRegistry()\n if (cached) return cached.registry\n console.error(`Failed to fetch registry: ${error instanceof Error ? error.message : error}`)\n return null\n }\n}\n\nfunction sanitizeName(name: string): string {\n return UNSAFE_PATH_PATTERNS.reduce((result, pattern) => result.replace(pattern, ''), name).trim()\n}\n\nfunction isPathSafe(basePath: string, targetPath: string): boolean {\n const resolvedBase = join(basePath, '.')\n const resolvedTarget = join(targetPath, '.')\n return resolvedTarget.startsWith(resolvedBase)\n}\n\nexport function getSkillCachePath(skillName: string): string {\n const safeName = sanitizeName(skillName)\n if (!safeName) throw new Error('Invalid skill name')\n return join(PATHS.skillsCacheDir, safeName)\n}\n\nexport function isSkillCached(skillName: string): boolean {\n try {\n const skillPath = getSkillCachePath(skillName)\n return existsSync(join(skillPath, 'SKILL.md'))\n } catch {\n return false\n }\n}\n\nfunction saveCachedSkillMeta(skillName: string, meta: CachedSkillMeta): void {\n try {\n const metaPath = join(getSkillCachePath(skillName), SKILL_META_FILE)\n writeFileSync(metaPath, JSON.stringify(meta, null, 2))\n } catch {\n // Non-critical: skill works without metadata\n }\n}\n\nfunction readCachedSkillMeta(skillName: string): CachedSkillMeta | null {\n try {\n const metaPath = join(getSkillCachePath(skillName), SKILL_META_FILE)\n if (!existsSync(metaPath)) return null\n return JSON.parse(readFileSync(metaPath, 'utf-8')) as CachedSkillMeta\n } catch {\n return null\n }\n}\n\nexport async function needsUpdate(skillName: string): Promise<boolean> {\n if (!isSkillCached(skillName)) return true\n const metadata = await getSkillMetadata(skillName)\n if (!metadata?.contentHash) return false\n const cached = readCachedSkillMeta(skillName)\n if (!cached?.contentHash) return true\n return cached.contentHash !== metadata.contentHash\n}\n\nexport function getCachedContentHash(skillName: string): string | undefined {\n return readCachedSkillMeta(skillName)?.contentHash\n}\n\nexport async function getUpdatableSkills(skillNames: string[]): Promise<{ toUpdate: string[]; upToDate: string[] }> {\n const toUpdate: string[] = []\n const upToDate: string[] = []\n\n for (const name of skillNames) {\n if (await needsUpdate(name)) {\n toUpdate.push(name)\n } else {\n upToDate.push(name)\n }\n }\n\n return { toUpdate, upToDate }\n}\n\nasync function downloadSkillFile(skill: SkillMetadata, file: string, skillCachePath: string): Promise<boolean> {\n const filePath = join(skillCachePath, file)\n\n if (!isPathSafe(skillCachePath, filePath)) {\n console.error(`Security: Skipping suspicious file path: ${file}`)\n return false\n }\n\n const parentDir = join(filePath, '..')\n if (!existsSync(parentDir)) mkdirSync(parentDir, { recursive: true })\n\n const urls = buildUrls(await getResolvedCdnRef())\n const fileUrl = `${urls.skillsBase}/${skill.path}/${file}`\n const fallbackUrl = `${urls.fallbackSkillsBase}/${skill.path}/${file}`\n const response = await fetchWithFallback(fileUrl, fallbackUrl)\n if (!response.ok) throw new Error(`Failed to download ${file}: HTTP ${response.status}`)\n writeFileSync(filePath, await response.text())\n return true\n}\n\nexport async function downloadSkill(skill: SkillMetadata): Promise<string | null> {\n const skillCachePath = getSkillCachePath(skill.name)\n ensureCacheDir()\n\n if (!existsSync(skillCachePath)) mkdirSync(skillCachePath, { recursive: true })\n\n try {\n const files = [...skill.files]\n let downloadedCount = 0\n\n for (let i = 0; i < files.length; i += CONFIG.maxConcurrentDownloads) {\n const batch = files.slice(i, i + CONFIG.maxConcurrentDownloads)\n const results = await Promise.all(batch.map((file) => downloadSkillFile(skill, file, skillCachePath)))\n downloadedCount += results.filter(Boolean).length\n }\n\n if (downloadedCount < files.length) {\n throw new Error(`Only ${downloadedCount}/${files.length} files downloaded successfully`)\n }\n\n if (skill.contentHash) {\n saveCachedSkillMeta(skill.name, { contentHash: skill.contentHash, downloadedAt: Date.now() })\n }\n\n return skillCachePath\n } catch (error) {\n console.error(`Failed to download skill ${skill.name}: ${error instanceof Error ? error.message : error}`)\n return null\n }\n}\n\nexport async function getRemoteSkills(): Promise<SkillInfo[]> {\n const registry = await fetchRegistry()\n if (!registry) return []\n\n return registry.skills.map((skill) => ({\n name: skill.name,\n description: skill.description,\n path: isSkillCached(skill.name) ? getSkillCachePath(skill.name) : '',\n category: skill.category,\n }))\n}\n\nexport async function getRemoteCategories(): Promise<CategoryInfo[]> {\n const registry = await fetchRegistry()\n if (!registry) return []\n\n return Object.entries(registry.categories)\n .map(([id, meta]) => ({\n id,\n name: meta.name,\n description: meta.description,\n }))\n .sort((a, b) => a.name.localeCompare(b.name))\n}\n\nexport async function getSkillMetadata(skillName: string): Promise<SkillMetadata | null> {\n const registry = await fetchRegistry()\n return registry?.skills.find((s) => s.name === skillName) ?? null\n}\n\nexport async function getDeprecatedSkills(): Promise<DeprecatedEntry[]> {\n const registry = await fetchRegistry()\n return registry?.deprecated ?? []\n}\n\nexport async function getDeprecatedMap(): Promise<Map<string, DeprecatedEntry>> {\n const deprecated = await getDeprecatedSkills()\n return new Map(deprecated.map((d) => [d.name, d]))\n}\n\nexport async function ensureSkillDownloaded(skillName: string): Promise<string | null> {\n if (isSkillCached(skillName)) return getSkillCachePath(skillName)\n const metadata = await getSkillMetadata(skillName)\n if (!metadata) return null\n return downloadSkill(metadata)\n}\n\nexport function clearCache(): void {\n try {\n rmSync(PATHS.cacheDir, { recursive: true, force: true })\n } catch {\n /* ignore */\n }\n}\n\nexport function clearSkillCache(skillName: string): void {\n try {\n rmSync(join(PATHS.skillsCacheDir, skillName), { recursive: true, force: true })\n } catch {\n /* ignore */\n }\n}\n\nexport function clearRegistryCache(): void {\n try {\n rmSync(PATHS.registryCacheFile, { force: true })\n } catch {\n /* ignore */\n }\n}\n\nexport async function forceDownloadSkill(skillName: string): Promise<string | null> {\n clearSkillCache(skillName)\n return ensureSkillDownloaded(skillName)\n}\n\nexport function getCacheDir(): string {\n return PATHS.cacheDir\n}\n", "import { cp, lstat, mkdir, readdir, readlink, rm, symlink } from 'node:fs/promises'\nimport { homedir, platform } from 'node:os'\nimport { join, normalize, relative, resolve, sep } from 'node:path'\n\nimport type { AgentType, InstallOptions, InstallResult, SkillInfo } from '../types'\nimport { AGENTS_DIR, CANONICAL_SKILLS_DIR } from '../utils/constants'\nimport { getAgentConfig } from './agents'\nimport { logAudit } from './audit-log'\nimport { isGloballyInstalled } from './global-path'\nimport { addSkillToLock, getSkillFromLock, removeSkillFromLock } from './lockfile'\nimport { findProjectRoot } from './project-root'\nimport { getCachedContentHash } from './registry'\n\nconst CANONICAL_SKILLS_PATH = join(AGENTS_DIR, CANONICAL_SKILLS_DIR)\n\ntype InstallMode = 'symlink-global' | 'symlink-local' | 'copy-global' | 'copy-local'\n\ninterface InstallContext {\n skill: SkillInfo\n config: ReturnType<typeof getAgentConfig>\n safeSkillName: string\n skillTargetPath: string\n projectRoot: string\n}\n\nconst sanitizeName = (name: string): string => {\n const sanitized = name\n .replace(/[/\\\\]/g, '')\n .replace(/[\\0:*?\"<>|]/g, '')\n .replace(/^[.\\s]+|[.\\s]+$/g, '')\n .replace(/\\.{2,}/g, '')\n .replace(/^\\.+/, '')\n\n return (sanitized || 'unnamed-skill').substring(0, 255)\n}\n\nconst isPathSafe = (basePath: string, targetPath: string): boolean => {\n const normalizedBase = normalize(resolve(basePath))\n const normalizedTarget = normalize(resolve(targetPath))\n return normalizedTarget.startsWith(normalizedBase + sep) || normalizedTarget === normalizedBase\n}\n\nconst createSymlink = async (target: string, linkPath: string): Promise<boolean> => {\n try {\n await cleanExistingPath(linkPath, target)\n await mkdir(join(linkPath, '..'), { recursive: true })\n const relativePath = relative(join(linkPath, '..'), target)\n const type = platform() === 'win32' ? 'junction' : undefined\n await symlink(relativePath, linkPath, type)\n return true\n } catch {\n return false\n }\n}\n\nconst cleanExistingPath = async (linkPath: string, target: string): Promise<void> => {\n try {\n const stats = await lstat(linkPath)\n if (stats.isSymbolicLink()) {\n const existingTarget = await readlink(linkPath)\n if (resolve(existingTarget) === resolve(target)) return\n await rm(linkPath)\n } else {\n await rm(linkPath, { recursive: true })\n }\n } catch (err: unknown) {\n if ((err as { code?: string })?.code === 'ELOOP') await rm(linkPath, { force: true }).catch(() => {})\n }\n}\n\nconst validateSymlinkTarget = async (linkPath: string, baseDir: string): Promise<boolean> => {\n try {\n const stats = await lstat(linkPath)\n if (stats.isSymbolicLink()) {\n const target = await readlink(linkPath)\n const resolvedTarget = resolve(join(linkPath, '..'), target)\n return isPathSafe(baseDir, resolvedTarget)\n }\n return true\n } catch {\n return true\n }\n}\n\nconst copySkillDirectory = async (src: string, dest: string): Promise<void> => {\n await rm(dest, { recursive: true, force: true })\n await mkdir(join(dest, '..'), { recursive: true })\n await cp(src, dest, { recursive: true })\n}\n\nconst getInstallMode = (method: 'symlink' | 'copy', global: boolean): InstallMode =>\n `${method}-${global ? 'global' : 'local'}` as InstallMode\n\nconst createSuccessResult = (\n ctx: InstallContext,\n method: 'symlink' | 'copy',\n extras: Partial<InstallResult> = {},\n): InstallResult => ({\n agent: ctx.config.displayName,\n skill: ctx.skill.name,\n path: ctx.skillTargetPath,\n method,\n success: true,\n ...extras,\n})\n\nconst createErrorResult = (ctx: InstallContext, method: 'symlink' | 'copy', error: unknown): InstallResult => ({\n agent: ctx.config.displayName,\n skill: ctx.skill.name,\n path: ctx.skillTargetPath,\n method,\n success: false,\n error: error instanceof Error ? error.message : String(error),\n})\n\nconst installHandlers: Record<InstallMode, (ctx: InstallContext) => Promise<InstallResult>> = {\n 'symlink-global': async (ctx) => {\n if (await createSymlink(ctx.skill.path, ctx.skillTargetPath)) return createSuccessResult(ctx, 'symlink')\n await copySkillDirectory(ctx.skill.path, ctx.skillTargetPath)\n return createSuccessResult(ctx, 'copy', { symlinkFailed: true })\n },\n\n 'symlink-local': async (ctx) => {\n const canonicalDir = join(ctx.projectRoot, CANONICAL_SKILLS_DIR, ctx.safeSkillName)\n await copySkillDirectory(ctx.skill.path, canonicalDir)\n\n if (await createSymlink(canonicalDir, ctx.skillTargetPath)) {\n return createSuccessResult(ctx, 'symlink', { usedGlobalSymlink: false })\n }\n\n await copySkillDirectory(ctx.skill.path, ctx.skillTargetPath)\n return createSuccessResult(ctx, 'copy', { symlinkFailed: true })\n },\n\n 'copy-global': async (ctx) => {\n await copySkillDirectory(ctx.skill.path, ctx.skillTargetPath)\n return createSuccessResult(ctx, 'copy')\n },\n\n 'copy-local': async (ctx) => {\n await copySkillDirectory(ctx.skill.path, ctx.skillTargetPath)\n return createSuccessResult(ctx, 'copy')\n },\n}\n\nconst validatePath = (\n targetDir: string,\n skillTargetPath: string,\n projectRoot: string,\n global: boolean,\n): string | null => {\n if (global) return null\n if (isPathSafe(targetDir, skillTargetPath)) return null\n if (isPathSafe(projectRoot, skillTargetPath)) return null\n return 'Security: Invalid skill destination path'\n}\n\nconst installSkillForAgent = async (\n skill: SkillInfo,\n agent: AgentType,\n targetDir: string,\n method: 'symlink' | 'copy',\n projectRoot: string,\n global: boolean,\n): Promise<InstallResult> => {\n const config = getAgentConfig(agent)\n const safeSkillName = sanitizeName(skill.name)\n const skillTargetPath = join(targetDir, safeSkillName)\n const ctx: InstallContext = { skill, config, safeSkillName, skillTargetPath, projectRoot }\n const validationError = validatePath(targetDir, skillTargetPath, projectRoot, global)\n\n if (validationError) return createErrorResult(ctx, method, validationError)\n\n try {\n const mode = getInstallMode(method, global)\n return await installHandlers[mode](ctx)\n } catch (error) {\n return createErrorResult(ctx, method, error)\n }\n}\n\nexport const installSkills = async (skills: SkillInfo[], options: InstallOptions): Promise<InstallResult[]> => {\n const projectRoot = findProjectRoot()\n const results: InstallResult[] = []\n\n for (const agent of options.agents) {\n const config = getAgentConfig(agent)\n const targetDir = options.global ? config.globalSkillsDir : join(projectRoot, config.skillsDir)\n\n for (const skill of skills) {\n const result = await installSkillForAgent(skill, agent, targetDir, options.method, projectRoot, options.global)\n results.push(result)\n if (result.success) {\n await addSkillToLock(skill.name, [agent], {\n source: 'local',\n contentHash: getCachedContentHash(skill.name),\n method: options.method,\n global: options.global,\n })\n }\n }\n }\n\n // Audit log\n await logAudit({\n action: 'install',\n skillName: skills.map((s) => s.name).join(', '),\n agents: options.agents.map((a) => getAgentConfig(a).displayName),\n success: results.filter((r) => r.success).length,\n failed: results.filter((r) => !r.success).length,\n details: results.map((r) => ({\n skill: r.skill,\n agent: r.agent,\n success: r.success,\n error: r.error,\n path: r.path,\n })),\n })\n\n return results\n}\n\nexport const listInstalledSkills = async (agent: AgentType, global: boolean): Promise<string[]> => {\n const config = getAgentConfig(agent)\n const targetDir = global ? config.globalSkillsDir : join(findProjectRoot(), config.skillsDir)\n\n try {\n const entries = await readdir(targetDir, { withFileTypes: true })\n return entries.filter((e) => e.isDirectory() || e.isSymbolicLink()).map((e) => e.name)\n } catch {\n return []\n }\n}\n\nexport const isSkillInstalled = async (\n skillName: string,\n agent: AgentType,\n options: { global?: boolean } = {},\n): Promise<boolean> => {\n const config = getAgentConfig(agent)\n const safeSkillName = sanitizeName(skillName)\n const targetBase = options.global ? config.globalSkillsDir : join(findProjectRoot(), config.skillsDir)\n const skillDir = join(targetBase, safeSkillName)\n if (!isPathSafe(targetBase, skillDir)) return false\n\n try {\n await lstat(skillDir)\n return true\n } catch {\n return false\n }\n}\n\nexport const getInstallPath = (skillName: string, agent: AgentType, options: { global?: boolean } = {}): string => {\n const config = getAgentConfig(agent)\n const safeSkillName = sanitizeName(skillName)\n const targetBase = options.global ? config.globalSkillsDir : join(findProjectRoot(), config.skillsDir)\n const installPath = join(targetBase, safeSkillName)\n\n if (!isPathSafe(targetBase, installPath)) {\n throw new Error('Invalid skill name: potential path traversal detected')\n }\n\n return installPath\n}\n\nexport const getCanonicalPath = (skillName: string, options: { global?: boolean } = {}): string => {\n const safeSkillName = sanitizeName(skillName)\n const baseDir = options.global ? homedir() : findProjectRoot()\n const canonicalPath = join(baseDir, CANONICAL_SKILLS_PATH, safeSkillName)\n\n if (!isPathSafe(join(baseDir, CANONICAL_SKILLS_PATH), canonicalPath)) {\n throw new Error('Invalid skill name: potential path traversal detected')\n }\n\n return canonicalPath\n}\n\nexport const removeSkill = async (\n skillName: string,\n agents: AgentType[],\n options: { global?: boolean; force?: boolean } = {},\n): Promise<{ skill: string; agent: string; success: boolean; error?: string }[]> => {\n const safeSkillName = sanitizeName(skillName)\n const projectRoot = findProjectRoot()\n let lockEntry = await getSkillFromLock(skillName, true)\n if (!lockEntry) lockEntry = await getSkillFromLock(skillName, false)\n\n if (!lockEntry && !options.force) {\n return agents.map((agent) => ({\n skill: skillName,\n agent: getAgentConfig(agent).displayName,\n success: false,\n error: 'Skill not found in lockfile',\n }))\n }\n\n const canonicalPath = getCanonicalPath(skillName, options)\n await rm(canonicalPath, { recursive: true, force: true }).catch(() => {})\n\n const results = await Promise.all(\n agents.map(async (agent) => {\n const config = getAgentConfig(agent)\n const localPath = join(projectRoot, config.skillsDir, safeSkillName)\n const globalPath = join(config.globalSkillsDir, safeSkillName)\n\n const pathsToTry =\n options.global === undefined ? [localPath, globalPath] : options.global ? [globalPath] : [localPath]\n\n let removed = false\n let lastError: string | undefined\n\n for (const path of pathsToTry) {\n const baseDir = path.startsWith(config.globalSkillsDir)\n ? config.globalSkillsDir\n : join(projectRoot, config.skillsDir)\n\n if (!isPathSafe(baseDir, path)) {\n lastError = 'Security: Invalid removal path'\n continue\n }\n\n if (!(await validateSymlinkTarget(path, baseDir))) {\n lastError = 'Security: Symlink points outside allowed directory'\n continue\n }\n\n try {\n await lstat(path)\n await rm(path, { recursive: true, force: true })\n removed = true\n } catch (error) {\n const err = error as { code?: string; message?: string }\n if (err.code !== 'ENOENT' && !lastError) lastError = error instanceof Error ? error.message : String(error)\n }\n }\n\n return {\n skill: skillName,\n agent: config.displayName,\n success: removed,\n error: removed ? undefined : lastError || 'Skill not found',\n }\n }),\n )\n\n if (results.some((r) => r.success)) {\n await removeSkillFromLock(skillName, true).catch(() => {})\n await removeSkillFromLock(skillName, false).catch(() => {})\n }\n\n // Audit log\n await logAudit({\n action: 'remove',\n skillName,\n agents: agents.map((a) => getAgentConfig(a).displayName),\n success: results.filter((r) => r.success).length,\n failed: results.filter((r) => !r.success).length,\n forced: options.force,\n details: results.map((r) => ({\n skill: r.skill,\n agent: r.agent,\n success: r.success,\n error: r.error,\n })),\n })\n\n return results\n}\n\nexport { isGloballyInstalled }\n", "import chalk from 'chalk'\n\nimport { installSkills } from '../services/installer'\nimport { ensureSkillDownloaded, forceDownloadSkill, getRemoteSkills } from '../services/registry'\nimport type { AgentType, InstallOptions, SkillInfo } from '../types'\n\ninterface InstallCliOptions {\n skill?: string[]\n agent?: string[]\n global?: boolean\n symlink?: boolean\n force?: boolean\n}\n\nasync function downloadSkills(skillNames: string[], forceDownload: boolean): Promise<SkillInfo[]> {\n const allSkills = await getRemoteSkills()\n const selectedSkills: SkillInfo[] = []\n\n for (const skillName of skillNames) {\n const skill = allSkills.find((s) => s.name === skillName)\n if (!skill) {\n console.error(chalk.red(`\u274C Skill \"${skillName}\" not found`))\n continue\n }\n\n const path = forceDownload ? await forceDownloadSkill(skillName) : await ensureSkillDownloaded(skillName)\n if (path) {\n selectedSkills.push({ ...skill, path })\n } else {\n console.error(chalk.red(`\u274C Failed to download skill \"${skillName}\"`))\n }\n }\n\n return selectedSkills\n}\n\nfunction showInstallResults(results: Awaited<ReturnType<typeof installSkills>>): void {\n const successful = results.filter((r) => r.success)\n const failed = results.filter((r) => !r.success)\n\n if (successful.length > 0) {\n console.log(chalk.green(`\\n\u2705 Successfully installed ${successful.length} skill(s):`))\n successful.forEach((r) => {\n console.log(chalk.dim(` \u2022 ${r.skill} \u2192 ${r.agent} (${r.method})`))\n })\n }\n\n if (failed.length > 0) {\n console.log(chalk.red(`\\n\u274C Failed to install ${failed.length} skill(s):`))\n failed.forEach((r) => {\n console.log(chalk.dim(` \u2022 ${r.skill} \u2192 ${r.agent}: ${r.error}`))\n })\n }\n}\n\nexport async function runCliInstall(options: InstallCliOptions): Promise<void> {\n if (!options.skill || options.skill.length === 0) {\n console.error(chalk.red('\u274C --skill is required in CLI mode'))\n console.error(\n chalk.dim('Usage: ai-tools skills install --skill <name1> [name2...] [--agent <agents...>] [--global] [--symlink]'),\n )\n process.exit(1)\n }\n\n const skillNames = Array.isArray(options.skill) ? options.skill : [options.skill]\n\n console.log(chalk.blue(`\u23F3 Loading ${skillNames.length} skill(s) from catalog...`))\n const skills = await downloadSkills(skillNames, options.force || false)\n\n if (skills.length === 0) {\n console.error(chalk.red('\u274C No skills were successfully downloaded'))\n process.exit(1)\n }\n\n const agents = (options.agent || ['cursor', 'claude-code', 'windsurf']) as AgentType[]\n const method = options.symlink ? 'symlink' : 'copy'\n\n console.log(chalk.blue(`\u23F3 Installing ${skills.length} skill(s) to ${agents.length} agent(s)...`))\n\n const installOptions: InstallOptions = {\n agents,\n skills: skills.map((s) => s.name),\n method,\n global: options.global || false,\n }\n\n const results = await installSkills(skills, installOptions)\n showInstallResults(results)\n\n if (results.some((r) => !r.success)) {\n process.exit(1)\n }\n}\n", "import chalk from 'chalk'\n\nimport { removeSkill } from '../services/installer'\nimport type { AgentType } from '../types'\n\ninterface RemoveCliOptions {\n skill?: string[]\n agent?: string[]\n global?: boolean\n force?: boolean\n}\n\nexport async function runCliRemove(options: RemoveCliOptions): Promise<void> {\n if (!options.skill || options.skill.length === 0) {\n console.error(chalk.red('\u274C --skill is required in CLI mode'))\n console.error(\n chalk.dim('Usage: ai-tools skills remove --skill <name1> [name2...] [--agent <agents...>] [--global] [--force]'),\n )\n process.exit(1)\n }\n\n const skillNames = Array.isArray(options.skill) ? options.skill : [options.skill]\n const agents = (options.agent || ['cursor', 'claude-code', 'windsurf']) as AgentType[]\n\n if (options.force) {\n console.log(chalk.yellow('\u26A0\uFE0F Force mode enabled - bypassing lockfile check'))\n }\n\n console.log(chalk.blue(`\u23F3 Removing ${skillNames.length} skill(s) from ${agents.length} agent(s)...`))\n\n let totalSuccess = 0\n let totalFailed = 0\n let hasLockfileError = false\n\n for (const skillName of skillNames) {\n const results = await removeSkill(skillName, agents, {\n global: options.global,\n force: options.force,\n })\n\n const successful = results.filter((r) => r.success)\n const failed = results.filter((r) => !r.success)\n\n if (successful.length > 0) {\n console.log(chalk.green(`\u2705 ${skillName}: Removed from ${successful.length} agent(s)`))\n successful.forEach((r) => console.log(chalk.dim(` \u2022 ${r.agent}`)))\n totalSuccess += successful.length\n }\n\n if (failed.length > 0) {\n console.log(chalk.red(`\u274C ${skillName}: Failed to remove from ${failed.length} agent(s)`))\n failed.forEach((r) => console.log(chalk.dim(` \u2022 ${r.agent}: ${r.error}`)))\n totalFailed += failed.length\n\n if (failed.some((r) => r.error?.includes('lockfile'))) {\n hasLockfileError = true\n }\n }\n }\n\n console.log(chalk.dim(`\\n${totalSuccess} succeeded, ${totalFailed} failed`))\n\n if (hasLockfileError && !options.force) {\n console.log(chalk.yellow('\\n\uD83D\uDCA1 Tip: Use --force to bypass lockfile check'))\n }\n\n if (totalFailed > 0) {\n process.exit(1)\n }\n}\n", "import chalk from 'chalk'\nimport {\n fetchRegistry,\n forceDownloadSkill,\n getDeprecatedMap,\n getRemoteSkills,\n getUpdatableSkills,\n needsUpdate,\n} from '../services/registry'\n\ninterface UpdateCliOptions {\n skill?: string\n}\n\nexport async function runCliUpdate(options: UpdateCliOptions): Promise<void> {\n console.log(chalk.blue('\u23F3 Fetching latest registry...'))\n await fetchRegistry(true)\n\n if (options.skill) {\n const outdated = await needsUpdate(options.skill)\n if (!outdated) {\n console.log(chalk.green(`\u2705 ${options.skill} is already up to date`))\n return\n }\n\n console.log(chalk.blue(`\u23F3 Updating ${options.skill}...`))\n const path = await forceDownloadSkill(options.skill)\n\n if (path) {\n console.log(chalk.green(`\u2705 Updated ${options.skill}`))\n } else {\n console.error(chalk.red(`\u274C Failed to update ${options.skill}`))\n process.exit(1)\n }\n } else {\n const { readSkillLock } = await import('../services/lockfile')\n const lock = await readSkillLock()\n const installedNames = Object.keys(lock.skills)\n\n if (installedNames.length === 0) {\n console.log(chalk.yellow('No installed skills found. Run ai-tools skills install first.'))\n return\n }\n\n const { toUpdate, upToDate } = await getUpdatableSkills(installedNames)\n\n if (toUpdate.length === 0) {\n console.log(chalk.green(`\u2705 All ${upToDate.length} installed skills are up to date`))\n return\n }\n\n console.log(chalk.blue(`\u23F3 Updating ${toUpdate.length} of ${installedNames.length} skills...`))\n let updated = 0\n let failed = 0\n\n for (const name of toUpdate) {\n const path = await forceDownloadSkill(name)\n if (path) {\n updated++\n } else {\n failed++\n console.error(chalk.red(` \u274C Failed to update ${name}`))\n }\n }\n\n console.log(\n chalk.green(\n `\u2705 ${updated} updated, ${upToDate.length} already up to date${failed > 0 ? chalk.red(`, ${failed} failed`) : ''}`,\n ),\n )\n\n // Check for deprecated/orphaned skills\n const deprecatedMap = await getDeprecatedMap()\n const remoteSkills = await getRemoteSkills()\n const registryNames = new Set(remoteSkills.map((s) => s.name))\n\n const deprecated = installedNames.filter((name) => deprecatedMap.has(name) || !registryNames.has(name))\n\n if (deprecated.length > 0) {\n console.log('')\n console.log(chalk.yellow(`\u26A0 ${deprecated.length} deprecated skill${deprecated.length > 1 ? 's' : ''} detected:`))\n\n const renderers: Record<\n 'withEntry' | 'noEntry',\n (name: string, entry?: { message: string; alternatives?: string[] }) => void\n > = {\n withEntry: (name, entry) => {\n console.log(chalk.yellow(` \u203A ${name} \u2014 ${entry!.message}`))\n if (entry!.alternatives?.length) {\n console.log(chalk.dim(` Try: ai-tools skills install --skill ${entry!.alternatives.join(', ')}`))\n }\n },\n noEntry: (name) => {\n console.log(chalk.yellow(` \u203A ${name} \u2014 no longer available in the registry`))\n },\n }\n\n deprecated.forEach((name) => {\n const entry = deprecatedMap.get(name)\n const rendererKey = entry ? 'withEntry' : 'noEntry'\n renderers[rendererKey](name, entry)\n })\n\n console.log(chalk.dim(` Run: ai-tools skills remove --skill <name> to clean up`))\n }\n }\n}\n", "import chalk from 'chalk'\n\nimport { clearCache, clearRegistryCache, getCacheDir } from '../services/registry'\n\ninterface CacheCliOptions {\n clear?: boolean\n clearRegistry?: boolean\n path?: boolean\n}\n\nexport function runCliCache(options: CacheCliOptions): void {\n if (options.clear) {\n clearCache()\n console.log(chalk.green('\u2705 Cache cleared'))\n } else if (options.clearRegistry) {\n clearRegistryCache()\n console.log(chalk.green('\u2705 Registry cache cleared'))\n } else if (options.path) {\n console.log(getCacheDir())\n } else {\n console.log(chalk.bold('Cache management:'))\n console.log(` ${chalk.blue('--clear')} Clear all cached skills and registry`)\n console.log(` ${chalk.blue('--clear-registry')} Clear only the registry cache`)\n console.log(` ${chalk.blue('--path')} Show cache directory path`)\n console.log()\n console.log(chalk.dim(`Cache location: ${getCacheDir()}`))\n }\n}\n", "import { Box, Text } from 'ink'\n\ninterface AuditEntry {\n action: 'install' | 'remove' | 'update'\n skillName: string\n agents: string[]\n success: number\n failed: number\n timestamp?: string\n forced?: boolean\n}\n\ninterface Props {\n entries: AuditEntry[]\n limit?: number\n}\n\nexport function AuditLogViewer({ entries, limit = 10 }: Props) {\n const displayEntries = entries.slice(0, limit)\n\n if (displayEntries.length === 0) {\n return (\n <Box flexDirection=\"column\" paddingY={1}>\n <Text dimColor>No audit log entries found</Text>\n </Box>\n )\n }\n\n return (\n <Box flexDirection=\"column\" paddingY={1}>\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">\n \uD83D\uDCCB Audit Log\n </Text>\n <Text dimColor> (showing {displayEntries.length} most recent)</Text>\n </Box>\n\n {displayEntries.map((entry, idx) => {\n const date = entry.timestamp ? new Date(entry.timestamp) : new Date()\n const timeAgo = entry.timestamp ? getTimeAgo(date) : 'unknown time'\n const actionColor = entry.action === 'install' ? 'green' : entry.action === 'remove' ? 'red' : 'yellow'\n const statusIcon = entry.failed === 0 ? '\u2713' : entry.success > 0 ? '\u26A0' : '\u2717'\n\n return (\n <Box key={idx} flexDirection=\"column\" marginBottom={1} paddingLeft={2}>\n <Box>\n <Text color={actionColor} bold>\n {statusIcon} {entry.action.toUpperCase()}\n </Text>\n <Text dimColor> \u2022 {timeAgo}</Text>\n </Box>\n <Box paddingLeft={2}>\n <Text>Skills: </Text>\n <Text color=\"cyan\">{entry.skillName}</Text>\n </Box>\n <Box paddingLeft={2}>\n <Text>Agents: </Text>\n <Text dimColor>{entry.agents.join(', ')}</Text>\n </Box>\n <Box paddingLeft={2}>\n <Text color=\"green\">\u2713 {entry.success}</Text>\n {entry.failed > 0 && (\n <>\n <Text> \u2022 </Text>\n <Text color=\"red\">\u2717 {entry.failed}</Text>\n </>\n )}\n </Box>\n </Box>\n )\n })}\n </Box>\n )\n}\n\nfunction getTimeAgo(date: Date): string {\n const seconds = Math.floor((Date.now() - date.getTime()) / 1000)\n\n if (seconds < 60) return 'just now'\n if (seconds < 3600) return `${Math.floor(seconds / 60)}m ago`\n if (seconds < 86400) return `${Math.floor(seconds / 3600)}h ago`\n if (seconds < 604800) return `${Math.floor(seconds / 86400)}d ago`\n\n return date.toLocaleDateString()\n}\n", "import { render } from 'ink'\nimport React from 'react'\n\nimport { AuditLogViewer } from '../components/AuditLogViewer'\nimport { getAuditLogPath, readAuditLog } from '../services/audit-log'\n\ninterface AuditOptions {\n limit?: string\n path?: boolean\n}\n\nexport async function runCliAudit(options: AuditOptions) {\n if (options.path) {\n console.log(getAuditLogPath())\n return\n }\n\n const limit = options.limit ? parseInt(options.limit, 10) : 10\n const entries = await readAuditLog(limit)\n render(React.createElement(AuditLogViewer, { entries, limit }))\n}\n", "import { Command } from 'commander'\nimport { render } from 'ink'\nimport React from 'react'\n\nimport { App } from './app'\nimport { PACKAGE_VERSION } from './services/package-info'\n\nconst program = new Command()\n\n// Root command\nprogram\n .name('ai-tools')\n .description('CLI to install and manage AI tools (Skills, MCPs, Agents) for AI coding agents')\n .version(PACKAGE_VERSION)\n\n// Skills subcommand group\nconst skills = program\n .command('skills')\n .description('Manage AI coding agent skills')\n\n// Default action for `ai-tools skills` (no subcommand) \u2192 interactive install\nskills.action(() => {\n render(React.createElement(App, { command: 'install' }))\n})\n\n// Install command\nskills\n .command('install')\n .description('Install skills (interactive by default)')\n .option('-g, --global', 'Install globally to user home', false)\n .option('-s, --skill <names...>', 'Install one or more skills')\n .option('-a, --agent <agents...>', 'Target specific agents')\n .option('--symlink', 'Use symlink instead of copy', false)\n .option('-f, --force', 'Force re-download skills (bypass cache)', false)\n .action(async (options) => {\n if (shouldUseInteractiveMode(options)) {\n render(React.createElement(App, { command: 'install' }))\n return\n }\n\n // CLI mode - dynamic import\n const { runCliInstall } = await import('./cli/install')\n await runCliInstall(options)\n })\n\n// List command\nskills\n .command('list')\n .alias('ls')\n .description('List available/installed agent skills')\n .action(() => {\n render(React.createElement(App, { command: 'list' }))\n })\n\n// Remove command\nskills\n .command('remove')\n .alias('rm')\n .description('Remove installed skills')\n .option('-g, --global', 'Remove from global installation', false)\n .option('-s, --skill <names...>', 'Remove one or more skills')\n .option('-a, --agent <agents...>', 'Target specific agents')\n .option('-f, --force', 'Force removal even if not in lockfile', false)\n .action(async (options) => {\n if (shouldUseInteractiveMode(options)) {\n render(React.createElement(App, { command: 'remove' }))\n return\n }\n\n // CLI mode - dynamic import\n const { runCliRemove } = await import('./cli/remove')\n await runCliRemove(options)\n })\n\n// Update command\nskills\n .command('update')\n .description('Update installed skills to the latest version')\n .option('-s, --skill <name>', 'Update a specific skill')\n .action(async (options) => {\n if (shouldUseInteractiveMode(options)) {\n render(React.createElement(App, { command: 'update' }))\n return\n }\n\n // CLI mode - dynamic import\n const { runCliUpdate } = await import('./cli/update')\n await runCliUpdate(options)\n })\n\n// Cache command\nskills\n .command('cache')\n .description('Manage the skills cache')\n .option('--clear', 'Clear all cached skills and registry')\n .option('--clear-registry', 'Clear only the registry cache')\n .option('--path', 'Show cache directory path')\n .action(async (options) => {\n // CLI mode - dynamic import\n const { runCliCache } = await import('./cli/cache')\n runCliCache(options)\n })\n\n// Credits command\nskills\n .command('credits')\n .description('Show project contributors and credits')\n .action(() => {\n render(React.createElement(App, { command: 'credits' }))\n })\n\n// Audit log command\nskills\n .command('audit')\n .description('View audit log of skill operations')\n .option('-n, --limit <number>', 'Number of entries to show', '10')\n .option('--path', 'Show audit log file path')\n .action(async (options) => {\n const { runCliAudit } = await import('./cli/audit')\n await runCliAudit(options)\n })\n\nprogram.parse(process.argv)\n\nfunction shouldUseInteractiveMode(options: Record<string, unknown>): boolean {\n const optionKeys = Object.keys(options).filter((key) => key !== 'parent')\n return optionKeys.length === 0\n}\n", "import { Box, useApp } from 'ink'\nimport { useEffect, useState } from 'react'\n\nimport { useKonamiCode } from './hooks'\nimport { ArcadeMenu, CreditsView, InstallWizard, ListView, RemoveWizard, UpdateView } from './views'\n\ninterface AppProps {\n command?: string\n args?: string[]\n}\n\nexport const App = ({ command = 'install' }: AppProps) => {\n const { exit } = useApp()\n const [arcade, setArcade] = useState(command === 'arcade')\n const { activated, reset } = useKonamiCode()\n\n useEffect(() => {\n if (activated && !arcade) {\n setArcade(true)\n reset()\n }\n }, [activated, arcade, reset])\n\n if (command === 'credits') {\n return (\n <Box flexDirection=\"column\" padding={1}>\n <CreditsView onExit={exit} />\n </Box>\n )\n }\n\n if (arcade) {\n return (\n <Box flexDirection=\"column\" padding={1}>\n <ArcadeMenu\n onExit={() => {\n if (command === 'arcade') {\n exit()\n } else {\n setArcade(false)\n }\n }}\n />\n </Box>\n )\n }\n\n return (\n <Box flexDirection=\"column\" padding={1}>\n {command === 'list' && <ListView onExit={exit} />}\n {command === 'remove' && <RemoveWizard onExit={exit} />}\n {command === 'update' && <UpdateView onExit={exit} />}\n {(command === 'install' || !command) && <InstallWizard onExit={exit} />}\n </Box>\n )\n}\n", "import { useEffect, useMemo, useState } from 'react'\n\nimport { detectInstalledAgents, getAllAgentTypes } from '../services/agents'\nimport type { AgentType } from '../types'\n\nexport function useAgents() {\n const [selectedAgents, setSelectedAgents] = useState<AgentType[]>([])\n const [installedAgents, setInstalledAgents] = useState<AgentType[]>([])\n const [loading, setLoading] = useState(true)\n const allAgents = useMemo(() => getAllAgentTypes(), [])\n\n useEffect(() => {\n const timer = setTimeout(() => {\n const detected = detectInstalledAgents()\n setInstalledAgents(detected)\n setSelectedAgents(detected)\n setLoading(false)\n }, 800)\n\n return () => clearTimeout(timer)\n }, [])\n\n const toggleAgent = (agent: AgentType) => {\n setSelectedAgents((prev) => (prev.includes(agent) ? prev.filter((a) => a !== agent) : [...prev, agent]))\n }\n\n return { allAgents, installedAgents, selectedAgents, setSelectedAgents, toggleAgent, loading }\n}\n", "import { useEffect, useState } from 'react'\n\nimport type { UserConfig } from '../services/config'\nimport {\n hasShortcutsBeenDismissed,\n isFirstLaunch,\n loadConfig,\n markFirstLaunchComplete,\n markShortcutsDismissed,\n saveConfig,\n} from '../services/config'\n\ninterface UseConfigReturn {\n config: UserConfig | null\n loading: boolean\n error: string | null\n isFirstLaunch: boolean\n hasShortcutsBeenDismissed: boolean\n markFirstLaunchComplete: () => Promise<void>\n markShortcutsDismissed: () => Promise<void>\n updateConfig: (updates: Partial<UserConfig>) => Promise<void>\n}\n\nexport function useConfig(): UseConfigReturn {\n const [config, setConfig] = useState<UserConfig | null>(null)\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<string | null>(null)\n const [isFirstLaunchState, setIsFirstLaunchState] = useState(false)\n const [hasShortcutsDismissedState, setHasShortcutsDismissedState] = useState(false)\n\n useEffect(() => {\n let mounted = true\n\n const load = async () => {\n try {\n const [configData, firstLaunch, shortcutsDismissed] = await Promise.all([\n loadConfig(),\n isFirstLaunch(),\n hasShortcutsBeenDismissed(),\n ])\n\n if (mounted) {\n setConfig(configData)\n setIsFirstLaunchState(firstLaunch)\n setHasShortcutsDismissedState(shortcutsDismissed)\n }\n } catch (err: unknown) {\n if (mounted) setError(err instanceof Error ? err.message : String(err))\n } finally {\n if (mounted) setLoading(false)\n }\n }\n\n load()\n\n return () => {\n mounted = false\n }\n }, [])\n\n const handleMarkFirstLaunchComplete = async () => {\n try {\n await markFirstLaunchComplete()\n setIsFirstLaunchState(false)\n const updatedConfig = await loadConfig()\n setConfig(updatedConfig)\n } catch (err: unknown) {\n setError(err instanceof Error ? err.message : String(err))\n throw err\n }\n }\n\n const handleMarkShortcutsDismissed = async () => {\n try {\n await markShortcutsDismissed()\n setHasShortcutsDismissedState(true)\n const updatedConfig = await loadConfig()\n setConfig(updatedConfig)\n } catch (err: unknown) {\n setError(err instanceof Error ? err.message : String(err))\n throw err\n }\n }\n\n const handleUpdateConfig = async (updates: Partial<UserConfig>) => {\n try {\n await saveConfig(updates)\n const updatedConfig = await loadConfig()\n setConfig(updatedConfig)\n\n if ('firstLaunchComplete' in updates) {\n setIsFirstLaunchState(!updates.firstLaunchComplete)\n }\n\n if ('shortcutsOverlayDismissed' in updates) {\n setHasShortcutsDismissedState(Boolean(updates.shortcutsOverlayDismissed))\n }\n } catch (err: unknown) {\n setError(err instanceof Error ? err.message : String(err))\n throw err\n }\n }\n\n return {\n config,\n loading,\n error,\n isFirstLaunch: isFirstLaunchState,\n hasShortcutsBeenDismissed: hasShortcutsDismissedState,\n markFirstLaunchComplete: handleMarkFirstLaunchComplete,\n markShortcutsDismissed: handleMarkShortcutsDismissed,\n updateConfig: handleUpdateConfig,\n }\n}\n", "import { mkdir, readFile, rename, rm, writeFile } from 'node:fs/promises'\nimport { homedir } from 'node:os'\nimport { dirname, join } from 'node:path'\n\nimport { CONFIG_DIR, CONFIG_FILE, CURRENT_CONFIG_VERSION } from '../utils/constants'\n\nexport interface UserConfig {\n firstLaunchComplete: boolean\n shortcutsOverlayDismissed: boolean\n version: string\n}\n\nconst DEFAULT_CONFIG: UserConfig = {\n firstLaunchComplete: false,\n shortcutsOverlayDismissed: false,\n version: CURRENT_CONFIG_VERSION,\n}\n\nfunction getConfigPath(): string {\n return join(homedir(), CONFIG_DIR, CONFIG_FILE)\n}\n\nfunction validateConfig(config: unknown): UserConfig {\n if (typeof config !== 'object' || config === null) return DEFAULT_CONFIG\n const partial = config as Partial<UserConfig>\n\n return {\n firstLaunchComplete: Boolean(partial.firstLaunchComplete),\n shortcutsOverlayDismissed: Boolean(partial.shortcutsOverlayDismissed),\n version: String(partial.version || CURRENT_CONFIG_VERSION),\n }\n}\n\nexport async function loadConfig(): Promise<UserConfig> {\n const configPath = getConfigPath()\n\n try {\n const content = await readFile(configPath, 'utf-8')\n const parsed = JSON.parse(content)\n return validateConfig(parsed)\n } catch {\n // Return defaults if file doesn't exist or is invalid\n return DEFAULT_CONFIG\n }\n}\n\nexport async function saveConfig(config: Partial<UserConfig>): Promise<void> {\n const configPath = getConfigPath()\n const currentConfig = await loadConfig()\n const updatedConfig = { ...currentConfig, ...config }\n await mkdir(dirname(configPath), { recursive: true })\n const tempPath = `${configPath}.tmp`\n const content = JSON.stringify(updatedConfig, null, 2)\n\n try {\n await writeFile(tempPath, content, 'utf-8')\n await rename(tempPath, configPath)\n } catch (error) {\n try {\n await rm(tempPath, { force: true })\n } catch {\n // Ignore cleanup error\n }\n throw error\n }\n}\n\nexport async function isFirstLaunch(): Promise<boolean> {\n const config = await loadConfig()\n return !config.firstLaunchComplete\n}\n\nexport async function markFirstLaunchComplete(): Promise<void> {\n await saveConfig({ firstLaunchComplete: true })\n}\n\nexport async function hasShortcutsBeenDismissed(): Promise<boolean> {\n const config = await loadConfig()\n return config.shortcutsOverlayDismissed\n}\n\nexport async function markShortcutsDismissed(): Promise<void> {\n await saveConfig({ shortcutsOverlayDismissed: true })\n}\n", "import { useMemo, useState } from 'react'\n\ninterface FilterOptions<T> {\n keys: (keyof T & string)[]\n}\n\nexport function useFilter<T>(items: T[], options: FilterOptions<T>) {\n const [query, setQuery] = useState('')\n\n const filtered = useMemo(() => {\n if (!query.trim()) return items\n\n const tokens = query\n .toLowerCase()\n .split(/\\s+/)\n .filter((t) => t.length > 0)\n\n return items.filter((item) => {\n const searchable = options.keys\n .map((key) => {\n const value = item[key]\n return typeof value === 'string' ? value.toLowerCase() : ''\n })\n .join(' ')\n\n return tokens.every((token) => searchable.includes(token))\n })\n }, [query, items, options.keys])\n\n return { query, setQuery, filtered, hasFilter: query.trim().length > 0 }\n}\n", "import { useState } from 'react'\n\nimport { installSkills } from '../services/installer'\nimport { getSkillWithPath } from '../services/skills-provider'\nimport type { InstallOptions, InstallResult, SkillInfo } from '../types'\n\nexport function useInstaller() {\n const [progress, setProgress] = useState({ current: 0, total: 0, skill: '' })\n const [results, setResults] = useState<InstallResult[]>([])\n const [installing, setInstalling] = useState(false)\n const [error, setError] = useState<string | null>(null)\n\n const install = async (skills: SkillInfo[], options: InstallOptions) => {\n setInstalling(true)\n setError(null)\n setProgress({ current: 0, total: skills.length * options.agents.length, skill: 'Downloading...' })\n\n const resolvedSkills: SkillInfo[] = []\n for (const skill of skills) {\n const resolved = skill.path ? skill : await getSkillWithPath(skill.name)\n if (resolved) resolvedSkills.push(resolved)\n }\n\n setProgress({ current: 0, total: resolvedSkills.length * options.agents.length, skill: 'Installing...' })\n\n try {\n const res = await installSkills(resolvedSkills, options)\n setResults(res)\n return res\n } catch (err: unknown) {\n setError(err instanceof Error ? err.message : String(err))\n return []\n } finally {\n setInstalling(false)\n }\n }\n\n return { install, progress, results, installing, error }\n}\n", "import { existsSync, readdirSync, readFileSync } from 'node:fs'\nimport { join } from 'node:path'\n\nimport {\n CATEGORY_FOLDER_PATTERN,\n CATEGORY_METADATA_FILE,\n DEFAULT_CATEGORY_ID,\n formatCategoryName,\n} from '@gustavobrunodev/core'\n\nimport type { CategoryInfo, SkillInfo } from '../types'\nimport { getLocalSkillsDirectory } from '../utils/paths'\nimport { ensureSkillDownloaded, getRemoteCategories, getRemoteSkills, getSkillMetadata } from './registry'\n\nexport type SkillsMode = 'local' | 'remote'\n\ninterface ModeCache {\n mode: SkillsMode | null\n localDir: string | null\n}\n\nconst cache: ModeCache = { mode: null, localDir: null }\n\nfunction isCategoryFolder(folderName: string): boolean {\n return CATEGORY_FOLDER_PATTERN.test(folderName)\n}\n\nfunction extractCategoryId(folderName: string): string | null {\n const match = folderName.match(CATEGORY_FOLDER_PATTERN)\n return match?.[1] ?? null\n}\n\nfunction parseSkillFrontmatter(content: string): { name?: string; description?: string } {\n const frontmatterMatch = content.match(/^---\\n([\\s\\S]*?)\\n---/)\n if (!frontmatterMatch) return {}\n const frontmatter = frontmatterMatch[1]\n const nameMatch = frontmatter.match(/^name:\\s*(.+)$/m)\n const descMatch = frontmatter.match(/^description:\\s*(.+)$/m)\n return { name: nameMatch?.[1]?.trim(), description: descMatch?.[1]?.trim() }\n}\n\nfunction tryReadSkillFromPath(skillPath: string, categoryId: string): SkillInfo | null {\n const skillMdPath = join(skillPath, 'SKILL.md')\n if (!existsSync(skillMdPath)) return null\n const content = readFileSync(skillMdPath, 'utf-8')\n const { name, description } = parseSkillFrontmatter(content)\n const folderName = skillPath.split('/').pop() ?? ''\n\n return {\n name: name ?? folderName,\n description: description ?? 'No description',\n path: skillPath,\n category: categoryId,\n }\n}\n\nfunction scanLocalSkills(dirPath: string, categoryId: string): SkillInfo[] {\n if (!existsSync(dirPath)) return []\n return readdirSync(dirPath, { withFileTypes: true })\n .filter((entry) => entry.isDirectory())\n .map((entry) => tryReadSkillFromPath(join(dirPath, entry.name), categoryId))\n .filter((skill): skill is SkillInfo => skill !== null)\n}\n\nfunction loadLocalCategoryMetadata(skillsDir: string): Record<string, { name?: string; description?: string }> {\n const metadataPath = join(skillsDir, CATEGORY_METADATA_FILE)\n if (!existsSync(metadataPath)) return {}\n\n try {\n return JSON.parse(readFileSync(metadataPath, 'utf-8'))\n } catch {\n return {}\n }\n}\n\nfunction discoverLocalSkills(skillsDir: string): SkillInfo[] {\n if (!existsSync(skillsDir)) return []\n const entries = readdirSync(skillsDir, { withFileTypes: true })\n\n return entries\n .filter((entry) => entry.isDirectory())\n .flatMap((entry) => {\n if (isCategoryFolder(entry.name)) {\n const categoryId = extractCategoryId(entry.name)\n return categoryId ? scanLocalSkills(join(skillsDir, entry.name), categoryId) : []\n }\n const skill = tryReadSkillFromPath(join(skillsDir, entry.name), DEFAULT_CATEGORY_ID)\n return skill ? [skill] : []\n })\n}\n\nfunction discoverLocalCategories(skillsDir: string): CategoryInfo[] {\n if (!existsSync(skillsDir)) return []\n const metadata = loadLocalCategoryMetadata(skillsDir)\n\n return readdirSync(skillsDir, { withFileTypes: true })\n .filter((entry) => entry.isDirectory() && isCategoryFolder(entry.name))\n .reduce<CategoryInfo[]>((acc, entry, _) => {\n const categoryId = extractCategoryId(entry.name)\n if (!categoryId) return acc\n const meta = metadata[entry.name] ?? {}\n acc.push({ id: categoryId, name: meta.name ?? formatCategoryName(categoryId), description: meta.description })\n return acc\n }, [])\n .sort((a, b) => a.name.localeCompare(b.name))\n}\n\nexport function detectMode(): SkillsMode {\n if (cache.mode) return cache.mode\n const localDir = getLocalSkillsDirectory()\n\n if (localDir) {\n cache.localDir = localDir\n cache.mode = 'local'\n return 'local'\n }\n\n cache.mode = 'remote'\n return 'remote'\n}\n\nexport function getSkillsDirectory(): string {\n const mode = detectMode()\n if (mode === 'local' && cache.localDir) return cache.localDir\n throw new Error('Skills directory not found. Use remote mode or install skills locally.')\n}\n\nfunction isLocalMode(): boolean {\n return detectMode() === 'local' && cache.localDir !== null\n}\n\nexport function discoverSkills(): SkillInfo[] {\n return isLocalMode() ? discoverLocalSkills(cache.localDir!) : []\n}\n\nexport async function discoverSkillsAsync(): Promise<SkillInfo[]> {\n return isLocalMode() ? discoverLocalSkills(cache.localDir!) : getRemoteSkills()\n}\n\nexport function discoverCategories(): CategoryInfo[] {\n return isLocalMode() ? discoverLocalCategories(cache.localDir!) : []\n}\n\nexport async function discoverCategoriesAsync(): Promise<CategoryInfo[]> {\n return isLocalMode() ? discoverLocalCategories(cache.localDir!) : getRemoteCategories()\n}\n\nexport function getSkillByName(name: string): SkillInfo | undefined {\n return discoverSkills().find((s) => s.name === name)\n}\n\nexport async function getSkillByNameAsync(name: string): Promise<SkillInfo | undefined> {\n const skills = await discoverSkillsAsync()\n return skills.find((s) => s.name === name)\n}\n\nexport async function ensureSkillAvailable(skillName: string): Promise<string | null> {\n if (isLocalMode()) return getSkillByName(skillName)?.path ?? null\n return ensureSkillDownloaded(skillName)\n}\n\nexport async function getSkillWithPath(skillName: string): Promise<SkillInfo | null> {\n if (isLocalMode()) return getSkillByName(skillName) ?? null\n const metadata = await getSkillMetadata(skillName)\n if (!metadata) return null\n const localPath = await ensureSkillDownloaded(skillName)\n if (!localPath) return null\n return { name: metadata.name, description: metadata.description, path: localPath, category: metadata.category }\n}\n", "import { existsSync } from 'node:fs'\nimport { dirname, join } from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nconst __filename = fileURLToPath(import.meta.url)\nconst __dirname = dirname(__filename)\n\n/**\n * Gets the path to the skills catalog directory.\n * Returns the path regardless of whether it exists (for fallback scenarios).\n */\nexport function getSkillsCatalogPath(): string {\n return join(getMonorepoRoot(), 'packages', 'skills-catalog', 'skills')\n}\n\n/**\n * Gets the path to a package in the monorepo.\n */\nexport function getPackagePath(packageName: string): string {\n return join(getMonorepoRoot(), 'packages', packageName)\n}\n\n/**\n * Gets the monorepo root directory.\n */\nexport function getWorkspaceRoot(): string {\n return getMonorepoRoot()\n}\n\n/**\n * Checks if the local skills catalog exists (dev mode).\n */\nexport function hasLocalSkillsCatalog(): boolean {\n return existsSync(getSkillsCatalogPath())\n}\n\n/**\n * Gets the local skills directory if it exists, null otherwise.\n */\nexport function getLocalSkillsDirectory(): string | null {\n const path = getSkillsCatalogPath()\n return existsSync(path) ? path : null\n}\n\n/**\n * Resolves paths relative to the monorepo root.\n * In dev mode (tsx): __dirname = packages/cli/src/utils/\n * Goes 4 levels up to reach monorepo root.\n */\nfunction getMonorepoRoot(): string {\n return join(__dirname, '..', '..', '..', '..')\n}\n", "import { useInput } from 'ink'\nimport { useCallback, useRef, useState } from 'react'\n\nconst KONAMI_SEQUENCE = ['up', 'up', 'down', 'down', 'left', 'right', 'left', 'right', 'b', 'a'] as const\n\ntype KonamiKey = (typeof KONAMI_SEQUENCE)[number]\n\nexport function useKonamiCode() {\n const [activated, setActivated] = useState(false)\n const bufferRef = useRef<KonamiKey[]>([])\n\n useInput((input, key) => {\n if (activated) return\n let mapped: KonamiKey | null = null\n if (key.upArrow) mapped = 'up'\n else if (key.downArrow) mapped = 'down'\n else if (key.leftArrow) mapped = 'left'\n else if (key.rightArrow) mapped = 'right'\n else if (input.toLowerCase() === 'b') mapped = 'b'\n else if (input.toLowerCase() === 'a') mapped = 'a'\n\n if (!mapped) {\n bufferRef.current = []\n return\n }\n\n bufferRef.current.push(mapped)\n\n if (bufferRef.current.length > KONAMI_SEQUENCE.length) {\n bufferRef.current = bufferRef.current.slice(-KONAMI_SEQUENCE.length)\n }\n\n if (\n bufferRef.current.length === KONAMI_SEQUENCE.length &&\n bufferRef.current.every((k, i) => k === KONAMI_SEQUENCE[i])\n ) {\n setActivated(true)\n bufferRef.current = []\n }\n })\n\n const reset = useCallback(() => {\n setActivated(false)\n bufferRef.current = []\n }, [])\n\n return { activated, reset }\n}\n", "import { useState } from 'react'\n\nimport { removeSkill } from '../services/installer'\nimport type { AgentType } from '../types'\n\nexport interface RemoveResult {\n skill: string\n agent: string\n success: boolean\n error?: string\n}\n\nexport function useRemover() {\n const [progress, setProgress] = useState({ current: 0, total: 0, skill: '' })\n const [results, setResults] = useState<RemoveResult[]>([])\n const [removing, setRemoving] = useState(false)\n const [error, setError] = useState<string | null>(null)\n\n const remove = async (skillName: string, agents: AgentType[], global = false) => {\n setRemoving(true)\n setProgress({ current: 0, total: agents.length, skill: skillName })\n setError(null)\n\n try {\n const res = await removeSkill(skillName, agents, { global })\n setResults((prev) => [...prev, ...res])\n return res\n } catch (err: unknown) {\n setError(err instanceof Error ? err.message : String(err))\n return []\n } finally {\n setRemoving(false)\n }\n }\n\n const removeMultiple = async (skillsToRemove: { name: string; agents: AgentType[] }[]) => {\n setRemoving(true)\n const totalOps = skillsToRemove.reduce((acc, item) => acc + item.agents.length, 0)\n setProgress({ current: 0, total: totalOps, skill: 'Initializing...' })\n setResults([])\n setError(null)\n\n try {\n let completedOps = 0\n for (const item of skillsToRemove) {\n setProgress({ current: completedOps, total: totalOps, skill: item.name })\n const res = await removeSkill(item.name, item.agents, {})\n setResults((prev) => [...prev, ...res])\n completedOps += item.agents.length\n }\n } catch (err: unknown) {\n setError(err instanceof Error ? err.message : String(err))\n } finally {\n setRemoving(false)\n }\n }\n\n return { remove, removeMultiple, progress, results, removing, error }\n}\n", "import { readFileSync } from 'node:fs'\nimport { join } from 'node:path'\nimport { useEffect, useState } from 'react'\n\nimport { ensureSkillDownloaded, getSkillCachePath, getSkillMetadata, type SkillMetadata } from '../services/registry'\n\nexport interface SkillContent {\n metadata: SkillMetadata | null\n content: string | null\n loading: boolean\n error: string | null\n}\n\nexport function useSkillContent(skillName: string | null): SkillContent {\n const [metadata, setMetadata] = useState<SkillMetadata | null>(null)\n const [content, setContent] = useState<string | null>(null)\n const [loading, setLoading] = useState(false)\n const [error, setError] = useState<string | null>(null)\n\n useEffect(() => {\n if (!skillName) {\n setMetadata(null)\n setContent(null)\n setLoading(false)\n setError(null)\n return\n }\n\n let mounted = true\n setLoading(true)\n setError(null)\n\n const load = async () => {\n try {\n const [meta, cachePath] = await Promise.all([\n getSkillMetadata(skillName).catch(() => null),\n ensureSkillDownloaded(skillName).catch(() => null),\n ])\n\n if (!mounted) return\n if (meta) setMetadata(meta)\n\n const resolvedPath = cachePath ?? getSkillCachePath(skillName)\n\n try {\n const skillMd = readFileSync(join(resolvedPath, 'SKILL.md'), 'utf-8')\n setContent(skillMd)\n } catch {\n setError('Failed to load skill content')\n }\n } catch (err: unknown) {\n if (mounted) {\n setError(err instanceof Error ? err.message : String(err))\n }\n } finally {\n if (mounted) setLoading(false)\n }\n }\n\n load()\n return () => {\n mounted = false\n }\n }, [skillName])\n\n return { metadata, content, loading, error }\n}\n", "import { useEffect, useState } from 'react'\n\nimport { groupSkillsByCategory } from '../services/categories'\nimport { discoverSkillsAsync } from '../services/skills-provider'\nimport type { GroupedSkills, SkillInfo } from '../types'\n\nexport function useSkills() {\n const [skills, setSkills] = useState<SkillInfo[]>([])\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<string | null>(null)\n const [groupedSkills, setGroupedSkills] = useState<GroupedSkills>(new Map())\n\n useEffect(() => {\n let mounted = true\n\n const load = async () => {\n try {\n const data = await discoverSkillsAsync()\n\n if (mounted) {\n setSkills(data)\n setGroupedSkills(groupSkillsByCategory(data))\n }\n } catch (err: unknown) {\n if (mounted) setError(err instanceof Error ? err.message : String(err))\n } finally {\n if (mounted) setLoading(false)\n }\n }\n\n load()\n return () => {\n mounted = false\n }\n }, [])\n\n return { skills, loading, error, groupedSkills }\n}\n", "import { existsSync, readdirSync, readFileSync, writeFileSync } from 'node:fs'\nimport { join } from 'node:path'\n\nimport {\n CATEGORY_FOLDER_PATTERN,\n CATEGORY_METADATA_FILE,\n DEFAULT_CATEGORY,\n DEFAULT_CATEGORY_ID,\n formatCategoryName,\n} from '@gustavobrunodev/core'\n\nimport type { CategoryInfo, CategoryMetadata } from '../types'\nimport { getSkillsCatalogPath } from '../utils/paths'\n\nfunction getSkillsDir(): string {\n return getSkillsCatalogPath()\n}\n\nexport function loadCategoryMetadata(): CategoryMetadata {\n const skillsDir = getSkillsDir()\n const metadataPath = join(skillsDir, CATEGORY_METADATA_FILE)\n if (!existsSync(metadataPath)) return {}\n\n try {\n const content = readFileSync(metadataPath, 'utf-8')\n return JSON.parse(content) as CategoryMetadata\n } catch {\n return {}\n }\n}\n\nexport function saveCategoryMetadata(metadata: CategoryMetadata): void {\n const skillsDir = getSkillsDir()\n const metadataPath = join(skillsDir, CATEGORY_METADATA_FILE)\n const content = JSON.stringify(metadata, null, 2)\n writeFileSync(metadataPath, content + '\\n', 'utf-8')\n}\n\nexport function extractCategoryId(folderName: string): string | null {\n const match = folderName.match(CATEGORY_FOLDER_PATTERN)\n return match ? match[1] : null\n}\n\nexport function isCategoryFolder(folderName: string): boolean {\n return CATEGORY_FOLDER_PATTERN.test(folderName)\n}\n\nexport function categoryIdToFolderName(categoryId: string): string {\n return `(${categoryId})`\n}\n\nexport function getCategories(): CategoryInfo[] {\n const skillsDir = getSkillsDir()\n if (!existsSync(skillsDir)) return []\n\n const metadata = loadCategoryMetadata()\n const entries = readdirSync(skillsDir, { withFileTypes: true })\n const categories: CategoryInfo[] = []\n\n let index = 0\n for (const entry of entries) {\n if (!entry.isDirectory() || !isCategoryFolder(entry.name)) continue\n\n const categoryId = extractCategoryId(entry.name)\n if (!categoryId) continue\n\n const meta = metadata[entry.name] ?? {}\n categories.push({\n id: categoryId,\n name: meta.name ?? formatCategoryName(categoryId),\n description: meta.description,\n priority: meta.priority ?? index,\n })\n index++\n }\n\n categories.sort((a, b) => a.name.localeCompare(b.name))\n return categories\n}\n\nexport function getCategoryById(id: string): CategoryInfo | undefined {\n return getCategories().find((cat) => cat.id === id)\n}\n\nexport function getSkillCategoryId(skillName: string): string {\n const skillsDir = getSkillsDir()\n if (!existsSync(skillsDir)) return DEFAULT_CATEGORY_ID\n\n const entries = readdirSync(skillsDir, { withFileTypes: true })\n\n for (const entry of entries) {\n if (!entry.isDirectory() || !isCategoryFolder(entry.name)) continue\n\n const categoryId = extractCategoryId(entry.name)\n if (!categoryId) continue\n\n const categoryPath = join(skillsDir, entry.name)\n const skillPath = join(categoryPath, skillName)\n if (existsSync(join(skillPath, 'SKILL.md'))) return categoryId\n }\n\n return DEFAULT_CATEGORY_ID\n}\n\nexport function getSkillCategory(skillName: string): CategoryInfo {\n const categoryId = getSkillCategoryId(skillName)\n return getCategoryById(categoryId) ?? DEFAULT_CATEGORY\n}\n\nexport function categoryExists(categoryId: string): boolean {\n return getCategories().some((cat) => cat.id === categoryId)\n}\n\nexport function groupSkillsByCategory<T extends { name: string; category?: string; description?: string }>(\n skills: T[],\n): Map<CategoryInfo, T[]> {\n // Try to get local categories, fall back to building from skills\n let categories = getCategories()\n\n // If no local categories, build from skills data\n if (categories.length === 0) {\n const categoryIds = new Set(skills.map((s) => s.category).filter(Boolean) as string[])\n categories = Array.from(categoryIds).map((id, index) => ({\n id,\n name: formatCategoryName(id),\n priority: index,\n }))\n }\n\n const grouped = new Map<CategoryInfo, T[]>()\n\n for (const category of categories) {\n grouped.set(category, [])\n }\n\n grouped.set(DEFAULT_CATEGORY, [])\n\n for (const skill of skills) {\n const categoryId = skill.category ?? DEFAULT_CATEGORY_ID\n let category = categories.find((c) => c.id === categoryId)\n\n // If category not found, create it dynamically\n if (!category && categoryId !== DEFAULT_CATEGORY_ID) {\n category = {\n id: categoryId,\n name: formatCategoryName(categoryId),\n priority: 999,\n }\n categories.push(category)\n grouped.set(category, [])\n }\n\n const targetCategory = category ?? DEFAULT_CATEGORY\n const group = grouped.get(targetCategory) ?? []\n group.push(skill)\n grouped.set(targetCategory, group)\n }\n\n for (const [category, skillList] of grouped) {\n if (skillList.length === 0) grouped.delete(category)\n }\n\n const sortedGrouped = new Map<CategoryInfo, T[]>()\n const sortedCategories = Array.from(grouped.keys()).sort((a, b) => a.name.localeCompare(b.name))\n\n for (const cat of sortedCategories) {\n const skills = grouped.get(cat)\n\n if (skills) {\n skills.sort((a, b) => a.name.localeCompare(b.name))\n sortedGrouped.set(cat, skills)\n }\n }\n\n return sortedGrouped\n}\n", "import { useState } from 'react'\n\nexport function useWizardStep(totalSteps: number) {\n const [step, setStep] = useState(1)\n\n const next = () => setStep((s) => Math.min(s + 1, totalSteps))\n const back = () => setStep((s) => Math.max(s - 1, 1))\n const goTo = (s: number) => setStep(s)\n\n return {\n step,\n next,\n back,\n goTo,\n isFirst: step === 1,\n isLast: step === totalSteps,\n progress: step / totalSteps,\n }\n}\n", "import { Box, Text } from 'ink'\nimport BigText from 'ink-big-text'\nimport Gradient from 'ink-gradient'\nimport { useEffect, useState } from 'react'\n\nimport { FooterBar } from '../../components/FooterBar'\nimport { SelectPrompt } from '../../components/SelectPrompt'\nimport { colors, symbols } from '../../theme'\nimport { VibeInvaders } from './VibeInvaders'\n\ntype ArcadeScreen = 'menu' | 'invaders'\n\ninterface ArcadeMenuProps {\n onExit: () => void\n}\n\nconst menuItems = [\n { label: 'Vibe Invaders', value: 'invaders' as const, hint: 'Fight vibe-coding!' },\n { label: 'Back', value: 'back' as const, hint: 'Return to CLI' },\n]\n\nconst SCANLINE = '\\u2591'.repeat(56)\n\nexport function ArcadeMenu({ onExit }: ArcadeMenuProps) {\n const [screen, setScreen] = useState<ArcadeScreen>('menu')\n const [blinkVisible, setBlinkVisible] = useState(true)\n\n useEffect(() => {\n const interval = setInterval(() => setBlinkVisible((v) => !v), 600)\n return () => clearInterval(interval)\n }, [])\n\n const handleSelect = (value: 'invaders' | 'back') => {\n if (value === 'back') {\n onExit()\n return\n }\n\n setScreen(value)\n }\n\n if (screen === 'invaders') return <VibeInvaders onExit={() => setScreen('menu')} />\n\n return (\n <Box flexDirection=\"column\" alignItems=\"center\">\n <Box marginBottom={0}>\n <Gradient name=\"cristal\">\n <Text>{SCANLINE}</Text>\n </Gradient>\n </Box>\n\n <Box marginBottom={0}>\n <Gradient name=\"pastel\">\n <BigText text=\"ARCADE\" font=\"chrome\" />\n </Gradient>\n </Box>\n\n <Box marginBottom={0}>\n <Gradient name=\"cristal\">\n <Text>{SCANLINE}</Text>\n </Gradient>\n </Box>\n\n <Box marginBottom={1} marginTop={1}>\n <Text color={blinkVisible ? colors.warning : colors.bg} bold>\n {symbols.sparkle} SECRET UNLOCKED {symbols.sparkle}\n </Text>\n </Box>\n\n <Box marginBottom={1}>\n <Text color={colors.textDim}>\n {symbols.diamond} Choose your adventure {symbols.diamond}\n </Text>\n </Box>\n\n <Box width={50}>\n <SelectPrompt items={menuItems} onSelect={handleSelect} onCancel={onExit} hideFooter />\n </Box>\n\n <FooterBar\n hints={[\n { key: '\\u2191\\u2193', label: 'navigate' },\n { key: '\\u23CE', label: 'select' },\n { key: 'esc', label: 'back', color: colors.warning },\n ]}\n />\n </Box>\n )\n}\n", "import { Box, Text } from 'ink'\nimport { memo } from 'react'\n\nimport { colors, symbols } from '../theme'\n\nexport interface FooterHint {\n key: string\n label: string\n color?: string\n}\n\nexport interface FooterBarProps {\n hints: FooterHint[]\n status?: React.ReactNode\n}\n\nexport const FooterBar = memo(function FooterBar({ hints, status }: FooterBarProps) {\n return (\n <Box marginTop={1} borderStyle=\"round\" borderColor={colors.border} paddingX={1}>\n <Box justifyContent=\"space-between\" width=\"100%\">\n <Text>\n {hints.map((hint, i) => (\n <Text key={hint.key}>\n {i > 0 && <Text color={colors.textDim}> {symbols.dot} </Text>}\n <Text color={hint.color ?? colors.accent} bold>\n {hint.key}\n </Text>\n <Text color={colors.textDim}> {hint.label}</Text>\n </Text>\n ))}\n </Text>\n {status && <Box>{status}</Box>}\n </Box>\n </Box>\n )\n})\n", "export const colors = {\n primary: '#3b82f6',\n primaryLight: '#60a5fa',\n primaryDark: '#1e3a8a',\n accent: '#06b6d4',\n accentLight: '#22d3ee',\n success: '#22c55e',\n warning: '#f59e0b',\n error: '#ef4444',\n text: '#f8fafc',\n textDim: '#94a3b8',\n textMuted: '#64748b',\n border: '#334155',\n bg: '#0f172a',\n bgLight: '#1e293b',\n} as const\n\nexport const gradientStops = [\n { color: '#1e3a8a', pos: 0 },\n { color: '#3b82f6', pos: 0.3 },\n { color: '#0ea5e9', pos: 0.5 },\n { color: '#06b6d4', pos: 0.7 },\n { color: '#22d3ee', pos: 1 },\n] as const\n", "export const symbols = {\n bar: '\u2502',\n barEnd: '\u2514',\n radioActive: '\u25CF',\n radioInactive: '\u25CB',\n checkboxActive: '\u25FC',\n checkboxInactive: '\u25FB',\n diamond: '\u25C6',\n arrow: '\u203A',\n arrowRight: '\u2192',\n arrowUp: '\u2191',\n arrowDown: '\u2193',\n dot: '\u00B7',\n bullet: '\u25B8',\n check: '\u2713',\n cross: '\u2717',\n star: '\u2605',\n sparkle: '\u2726',\n installed: '\u25CF',\n warning: '\u26A0',\n info: '\u2139',\n} as const\n", "import { Box, Text, useInput } from 'ink'\nimport { useMemo, useState } from 'react'\n\nimport { colors, symbols } from '../theme'\n\nexport interface SelectOption<T> {\n label: string\n value: T\n hint?: string\n}\n\ninterface SelectPromptProps<T> {\n items: SelectOption<T>[]\n onSelect: (value: T) => void\n onCancel?: () => void\n initialIndex?: number\n itemLimit?: number\n hideFooter?: boolean\n footerRight?: React.ReactNode\n}\n\nexport function SelectPrompt<T>({\n items,\n onSelect,\n onCancel,\n initialIndex = 0,\n itemLimit = 10,\n hideFooter,\n footerRight,\n}: SelectPromptProps<T>) {\n const [selectedIndex, setSelectedIndex] = useState(initialIndex)\n const [offset, setOffset] = useState(0)\n\n useInput((input, key) => {\n if (key.upArrow) {\n setSelectedIndex((prev) => Math.max(0, prev - 1))\n if (selectedIndex <= offset) setOffset((prev) => Math.max(0, prev - 1))\n }\n\n if (key.downArrow) {\n setSelectedIndex((prev) => Math.min(items.length - 1, prev + 1))\n if (selectedIndex >= offset + itemLimit - 1) setOffset((prev) => Math.min(items.length - itemLimit, prev + 1))\n }\n\n if (key.return) onSelect(items[selectedIndex].value)\n if (key.escape && onCancel) onCancel()\n })\n\n const visibleItems = useMemo(() => {\n return items.slice(offset, offset + itemLimit)\n }, [items, offset, itemLimit])\n\n return (\n <Box flexDirection=\"column\">\n {visibleItems.map((item, index) => {\n const isFocused = index + offset === selectedIndex\n return (\n <Box key={`${item.label}-${index}`} backgroundColor={isFocused ? colors.bgLight : undefined} paddingX={1}>\n <Box width={2}>\n <Text color={isFocused ? colors.accent : colors.textMuted}>{isFocused ? symbols.bullet : ' '}</Text>\n </Box>\n <Text color={isFocused ? colors.accent : colors.text} bold={isFocused}>\n {isFocused ? symbols.radioActive : symbols.radioInactive} {item.label}\n </Text>\n {isFocused && item.hint && (\n <Text color={colors.textDim}>\n {' '}\n {symbols.dot} {item.hint}\n </Text>\n )}\n </Box>\n )\n })}\n\n {items.length > itemLimit && (\n <Box marginTop={1} paddingX={1}>\n <Text color={colors.textDim}>\n {symbols.arrowUp}\n {symbols.arrowDown} {offset + 1}-{Math.min(offset + itemLimit, items.length)} of {items.length}\n </Text>\n </Box>\n )}\n\n {!hideFooter && (\n <Box marginTop={1} borderStyle=\"round\" borderColor={colors.border} paddingX={1}>\n <Box justifyContent=\"space-between\" width=\"100%\">\n <Text>\n <Text color={colors.success} bold>\n enter\n </Text>\n <Text color={colors.textDim}> select</Text>\n {onCancel && (\n <>\n <Text color={colors.textDim}> {symbols.dot} </Text>\n <Text color={colors.warning} bold>\n esc\n </Text>\n <Text color={colors.textDim}> back</Text>\n </>\n )}\n </Text>\n {footerRight && <Box>{footerRight}</Box>}\n </Box>\n </Box>\n )}\n </Box>\n )\n}\n", "import { Box, Text, useInput, useStdout } from 'ink'\nimport { useCallback, useEffect, useRef, useState } from 'react'\n\nimport { colors } from '../../theme'\n\nconst MAX_WIDTH = 100\nconst GAME_HEIGHT = 16\nconst TICK_MS = 50\nconst BASE_MOVE_EVERY = 10\nconst RATE_LIMIT_PENALTY = 30\nconst SNIPER_MULTIPLIER = 5\n\nconst LOSE_MESSAGES = [\n 'BANKRUPT. Your burn rate was too high.',\n 'DOWN ROUND. Valuation dropped to zero.',\n 'RUNWAY EXPIRED. Back to living with parents.',\n 'SERVER COSTS > REVENUE. You are cooked.',\n 'AUDIT FAILED. Too much tech debt.',\n]\n\nconst WIN_MESSAGES = [\n 'ACQUIRED BY BIG TECH. Golden handcuffs on.',\n 'SERIES B SECURED. Keep burning cash!',\n 'IPO SUCCESSFUL. Time to buy a yacht.',\n 'PROFITABLE? No, but the vibes are great.',\n]\n\nconst INVADER_ROWS: string[][] = [\n ['AGI_SOON', '100x_DEV', 'LOVABLE', 'HYPE'],\n ['DEEPSEEK', 'GEMINI', 'GPT', 'V0_DEV'],\n ['TAB_SPAM', 'NO_READ', 'TRUST_ME', 'YOLO'],\n ['SLOP', 'SPAGHETTI', 'ANY_TYPE', 'BUG'],\n]\n\ninterface Position {\n x: number\n y: number\n}\n\ninterface Invader extends Position {\n label: string\n alive: boolean\n width: number\n}\n\ninterface GameState {\n player: Position\n playerBullets: Position[]\n enemyBullets: Position[]\n invaders: Invader[]\n score: number\n lives: number\n gameOver: boolean\n won: boolean\n invaderDirection: 1 | -1\n tickCount: number\n flash: boolean\n glitch: boolean\n rateLimited: number\n}\n\nfunction createInvaders(cols: number): Invader[] {\n const invaders: Invader[] = []\n const longestWord = Math.max(...INVADER_ROWS.flat().map((w) => w.length))\n const colSpacing = longestWord + 4\n const totalWidth = INVADER_ROWS[0].length * colSpacing\n const startX = Math.floor((cols - totalWidth) / 2)\n\n for (let row = 0; row < INVADER_ROWS.length; row++) {\n for (let col = 0; col < INVADER_ROWS[row].length; col++) {\n const label = INVADER_ROWS[row][col]\n invaders.push({\n x: Math.max(0, startX + col * colSpacing),\n y: 1 + row * 2,\n label,\n width: label.length,\n alive: true,\n })\n }\n }\n\n return invaders\n}\n\ninterface VibeInvadersProps {\n onExit: () => void\n}\n\nexport function VibeInvaders({ onExit }: VibeInvadersProps) {\n const { stdout } = useStdout()\n\n const terminalCols = stdout?.columns ?? 80\n const gameWidth = Math.max(60, Math.min(terminalCols - 4, MAX_WIDTH))\n const finalMessageRef = useRef<string>('')\n\n const [state, setState] = useState<GameState>(() => ({\n player: { x: Math.floor(gameWidth / 2), y: GAME_HEIGHT - 1 },\n playerBullets: [],\n enemyBullets: [],\n invaders: createInvaders(gameWidth),\n score: 0,\n lives: 5,\n gameOver: false,\n won: false,\n invaderDirection: 1,\n tickCount: 0,\n flash: false,\n glitch: false,\n rateLimited: 0,\n }))\n\n if ((state.gameOver || state.won) && !finalMessageRef.current) {\n const pool = state.won ? WIN_MESSAGES : LOSE_MESSAGES\n finalMessageRef.current = pool[Math.floor(Math.random() * pool.length)]\n }\n\n useInput((input, key) => {\n if (state.gameOver || state.won) {\n if (key.return || key.escape) onExit()\n return\n }\n\n if (key.escape) {\n onExit()\n return\n }\n\n setState((prev) => {\n let newX = prev.player.x\n if (key.leftArrow) newX = Math.max(0, prev.player.x - 2)\n if (key.rightArrow) newX = Math.min(gameWidth - 1, prev.player.x + 2)\n\n let newBullets = prev.playerBullets\n let currentRateLimit = prev.rateLimited\n\n if (input === ' ' && currentRateLimit === 0) {\n if (prev.playerBullets.length >= 2) {\n currentRateLimit = RATE_LIMIT_PENALTY\n newBullets = []\n } else {\n newBullets = [...prev.playerBullets, { x: newX, y: prev.player.y - 1 }]\n }\n }\n\n return { ...prev, player: { ...prev.player, x: newX }, playerBullets: newBullets, rateLimited: currentRateLimit }\n })\n })\n\n const tick = useCallback(() => {\n setState((prev) => {\n if (prev.gameOver || prev.won) return prev\n\n const tick = prev.tickCount + 1\n let score = prev.score\n let lives = prev.lives\n let gameOver: boolean = prev.gameOver\n let flash = false\n let glitch = false\n const rateLimited = prev.rateLimited > 0 ? prev.rateLimited - 1 : 0\n\n // Logic\n const aliveInvaders = prev.invaders.filter((i) => i.alive)\n const totalInvaders = INVADER_ROWS.flat().length\n const survivalRatio = aliveInvaders.length / totalInvaders\n const moveEvery = Math.max(2, Math.floor(BASE_MOVE_EVERY * survivalRatio) + 1)\n const shootChance = 0.02 + 0.08 * (1 - survivalRatio)\n\n // Bullets\n let pBullets = prev.playerBullets.map((b) => ({ ...b, y: b.y - 1 })).filter((b) => b.y >= 0)\n let eBullets = prev.enemyBullets.map((b) => ({ ...b, y: b.y + 1 })).filter((b) => b.y < GAME_HEIGHT)\n\n const invaders = prev.invaders.map((i) => ({ ...i }))\n\n // Collisions: Player -> Invader\n for (const b of pBullets) {\n if (b.y === -1) continue\n for (const inv of invaders) {\n if (!inv.alive) continue\n if (b.y === inv.y && b.x >= inv.x && b.x < inv.x + inv.width) {\n inv.alive = false\n b.y = -1\n score += 100\n flash = true\n break\n }\n }\n }\n\n pBullets = pBullets.filter((b) => b.y !== -1)\n\n // Collisions: Enemy -> Player\n if (eBullets.some((b) => b.x === prev.player.x && b.y === prev.player.y)) {\n lives -= 1\n flash = true\n glitch = true\n eBullets = []\n if (lives <= 0) gameOver = true\n }\n\n // Win?\n if (invaders.every((i) => !i.alive)) return { ...prev, won: true, score: score + lives * 1000, invaders }\n\n // Shoot\n if (aliveInvaders.length > 0) {\n const shooters = aliveInvaders.filter((inv) => {\n const inSight = prev.player.x >= inv.x - 1 && prev.player.x <= inv.x + inv.width + 1\n return Math.random() < (inSight ? shootChance * SNIPER_MULTIPLIER : shootChance)\n })\n\n if (shooters.length > 0) {\n const s = shooters[Math.floor(Math.random() * shooters.length)]\n eBullets.push({ x: s.x + Math.floor(s.width / 2), y: s.y + 1 })\n }\n }\n\n // Move\n let dir = prev.invaderDirection\n\n if (tick % moveEvery === 0) {\n const xs = invaders.filter((i) => i.alive).map((i) => i.x)\n const minX = Math.min(...xs)\n const maxX = Math.max(...invaders.filter((i) => i.alive).map((i) => i.x + i.width))\n if (maxX >= gameWidth - 2 && dir === 1) dir = -1\n if (minX <= 0 && dir === -1) dir = 1\n invaders.forEach((i) => i.alive && (i.x += dir))\n }\n\n // Drop\n if (tick % 45 === 0) {\n invaders.forEach((i) => i.alive && (i.y += 1))\n if (invaders.some((i) => i.alive && i.y >= GAME_HEIGHT - 1)) gameOver = true\n }\n\n return {\n ...prev,\n playerBullets: pBullets,\n enemyBullets: eBullets,\n invaders,\n score,\n lives,\n gameOver,\n invaderDirection: dir,\n tickCount: tick,\n flash,\n glitch,\n rateLimited,\n }\n })\n }, [gameWidth])\n\n useEffect(() => {\n const t = setInterval(tick, TICK_MS)\n return () => clearInterval(t)\n }, [tick])\n\n const renderGrid = () => {\n const rows = Array.from({ length: GAME_HEIGHT }, () => Array(gameWidth).fill(' '))\n\n state.invaders.forEach((inv) => {\n if (inv.alive) {\n for (let i = 0; i < inv.width; i++) {\n if (inv.x + i < gameWidth && inv.y < GAME_HEIGHT) rows[inv.y][inv.x + i] = state.glitch ? '?' : inv.label[i]\n }\n }\n })\n\n state.playerBullets.forEach((b) => {\n if (b.x < gameWidth && b.y < GAME_HEIGHT) rows[b.y][b.x] = '$'\n })\n\n state.enemyBullets.forEach((b) => {\n if (b.x < gameWidth && b.y < GAME_HEIGHT) rows[b.y][b.x] = '*'\n })\n\n const { x, y } = state.player\n if (x < gameWidth && y < GAME_HEIGHT) rows[y][x] = state.rateLimited > 0 ? 'X' : '^'\n return rows.map((r) => r.join('')).join('\\n')\n }\n\n const statusColor = state.rateLimited > 0 ? colors.error : colors.accent\n const gridColor = state.glitch ? colors.warning : state.flash ? colors.error : colors.success\n\n return (\n <Box width=\"100%\" alignItems=\"center\" flexDirection=\"column\">\n <Box width={gameWidth + 4} flexDirection=\"column\" alignItems=\"center\">\n <Box width={gameWidth} flexDirection=\"row\" paddingX={1}>\n <Box width=\"35%\">\n <Text color={statusColor} bold>\n {state.rateLimited > 0 ? `LIMIT (${state.rateLimited})` : `$${state.score}k`}\n </Text>\n </Box>\n <Box width=\"30%\" justifyContent=\"center\">\n <Text color={colors.warning} bold>\n VIBE INVADERS\n </Text>\n </Box>\n <Box width=\"35%\" justifyContent=\"flex-end\">\n <Text color={colors.success} bold>\n RUNWAY: {'$'.repeat(state.lives)}\n </Text>\n </Box>\n </Box>\n\n <Box\n borderStyle=\"round\"\n borderColor={state.rateLimited > 0 ? colors.error : colors.border}\n flexDirection=\"column\"\n width={gameWidth + 2}\n height={GAME_HEIGHT + 2}\n >\n <Text color={state.gameOver ? colors.error : gridColor}>{renderGrid()}</Text>\n </Box>\n\n <Box\n marginTop={0}\n width={gameWidth + 2}\n justifyContent=\"center\"\n borderStyle=\"round\"\n borderColor={colors.accent}\n >\n {state.gameOver || state.won ? (\n <Text color={state.won ? colors.success : colors.error} bold>\n {finalMessageRef.current} Val: ${state.score}k\n </Text>\n ) : (\n <Box gap={1}>\n <Text color={colors.accent}>\u2190\u2192</Text>\n <Text> move </Text>\n <Text color={colors.accent}>spc</Text>\n <Text> shoot </Text>\n <Text color={colors.accent}>esc</Text>\n <Text> quit</Text>\n </Box>\n )}\n </Box>\n </Box>\n </Box>\n )\n}\n", "import { Box, Text, useInput } from 'ink'\n\nimport { Header } from '../components/Header'\nimport { SelectPrompt } from '../components/SelectPrompt'\nimport { colors, symbols } from '../theme'\n\ninterface ActionSelectorProps {\n onSelect: (action: 'install' | 'update' | 'remove') => void\n onBack?: () => void\n onCredits?: () => void\n}\n\nexport function ActionSelector({ onSelect, onBack, onCredits }: ActionSelectorProps) {\n const items = [\n { label: 'Install new skills', value: 'install' as const, hint: 'browse and select skills to install' },\n { label: 'Update existing skills', value: 'update' as const, hint: 'check for content changes' },\n { label: 'Remove installed skills', value: 'remove' as const, hint: 'uninstall skills from agents' },\n ]\n\n useInput((input) => {\n if (input === 'c' && onCredits) onCredits()\n })\n\n const creditsHint = (\n <Text>\n <Text color={colors.accent} bold>\n c\n </Text>\n <Text color={colors.textDim}> credits</Text>\n </Text>\n )\n\n return (\n <Box flexDirection=\"column\" paddingX={1}>\n <Header />\n <Box marginBottom={1}>\n <Text bold color={colors.primary}>\n {symbols.diamond} What would you like to do?\n </Text>\n </Box>\n\n <SelectPrompt items={items} onSelect={onSelect} onCancel={onBack} footerRight={creditsHint} />\n </Box>\n )\n}\n", "import { Box, Text } from 'ink'\nimport BigText from 'ink-big-text'\nimport Gradient from 'ink-gradient'\nimport { useAtomValue } from 'jotai'\nimport { useMemo } from 'react'\n\nimport { environmentCheckAtom } from '../atoms/environmentCheck'\nimport { PACKAGE_VERSION } from '../services/package-info'\nimport { symbols } from '../theme/symbols'\nimport { MESSAGES } from '../utils/constants'\n\nconst crystalColors = ['#1e3a8a', '#3b82f6', '#0ea5e9', '#06b6d4', '#22d3ee']\nconst SEPARATOR_CHAR = '\u2500'\n\nexport const Header = ({ notification: overrideNotification }: { notification?: React.ReactNode }) => {\n const envCheck = useAtomValue(environmentCheckAtom)\n\n const notification = useMemo(() => {\n if (overrideNotification) return overrideNotification\n\n const { updateAvailable, currentVersion, isGlobal, isLoading } = envCheck\n\n if (isLoading) return null\n\n if (updateAvailable && !isGlobal) {\n return (\n <Box flexDirection=\"column\" alignItems=\"center\">\n <Text color=\"yellow\">\n {symbols.warning} {MESSAGES.UPDATE_AVAILABLE(currentVersion, updateAvailable)}\n </Text>\n <Text color=\"blue\">\n {symbols.info} {MESSAGES.TIP_INSTALL_UPDATE} <Text bold>{MESSAGES.INSTALL_COMMAND}</Text>\n </Text>\n </Box>\n )\n }\n\n if (updateAvailable) {\n return (\n <Text color=\"yellow\">\n {symbols.warning} {MESSAGES.UPDATE_AVAILABLE(currentVersion, updateAvailable)} (run{' '}\n <Text bold>{MESSAGES.UPDATE_COMMAND}</Text>)\n </Text>\n )\n }\n\n if (!isGlobal) {\n return (\n <Text color=\"blue\">\n {symbols.info} {MESSAGES.TIP_INSTALL_ACCESS} <Text bold>{MESSAGES.INSTALL_COMMAND}</Text>\n </Text>\n )\n }\n\n return null\n }, [overrideNotification, envCheck])\n\n return (\n <Box flexDirection=\"column\" paddingBottom={1}>\n <Box flexDirection=\"column\" alignItems=\"center\" marginBottom={1}>\n <Box marginBottom={-1}>\n <Gradient colors={['#1e3a8a', '#3b82f6']}>\n <BigText text=\"TLC\" font=\"tiny\" />\n </Gradient>\n </Box>\n\n <Box>\n <Gradient colors={crystalColors}>\n <BigText text=\"AGENT SKILLS\" font=\"block\" />\n </Gradient>\n </Box>\n\n <Box marginTop={-1} alignItems=\"center\">\n <Text color=\"#334155\">\u2500\u2500\u2500\u2500\u2500\u2500 </Text>\n <Text color=\"white\" bold>\n VERSION {PACKAGE_VERSION}\n </Text>\n <Text color=\"#334155\"> \u2500\u2500\u2500\u2500\u2500\u2500</Text>\n </Box>\n\n <Box marginTop={1}>\n <Text color=\"#64748b\" italic>\n {MESSAGES.DESCRIPTION}\n </Text>\n </Box>\n\n {notification && <Box marginTop={1}>{notification}</Box>}\n </Box>\n\n <Box marginTop={notification ? 0 : 1} justifyContent=\"center\">\n <Gradient colors={crystalColors}>\n <Text>{SEPARATOR_CHAR.repeat(60)}</Text>\n </Gradient>\n </Box>\n </Box>\n )\n}\n", "import { atom } from 'jotai'\nimport { unwrap } from 'jotai/utils'\n\nimport { isGloballyInstalled } from '../services/global-path'\nimport { getCachedUpdate, setCachedUpdate } from '../services/update-cache'\nimport { checkForUpdates, getCurrentVersion } from '../services/update-check'\nimport { UPDATE_CHECK_TIMEOUT_MS } from '../utils/constants'\n\nexport interface EnvironmentCheckState {\n updateAvailable: string | null\n currentVersion: string\n isGlobal: boolean\n isLoading?: boolean\n}\n\nasync function resolveUpdateAvailable(currentVersion: string): Promise<string | null> {\n const cached = await getCachedUpdate()\n const cachedUpdate = cached && cached.latestVersion !== currentVersion ? cached.latestVersion : null\n\n try {\n const update = await Promise.race([\n checkForUpdates(currentVersion),\n new Promise<string | null>((_, reject) =>\n setTimeout(() => reject(new Error('timeout')), UPDATE_CHECK_TIMEOUT_MS),\n ),\n ])\n\n setCachedUpdate(update ?? currentVersion).catch(() => {})\n return update\n } catch {\n return cachedUpdate\n }\n}\n\nconst runCheck = async (): Promise<EnvironmentCheckState> => {\n const currentVersion = getCurrentVersion()\n\n const [updateAvailable, isGlobal] = await Promise.all([\n resolveUpdateAvailable(currentVersion).catch(() => null),\n Promise.resolve(isGloballyInstalled()).catch(() => false),\n ])\n\n return { updateAvailable, currentVersion, isGlobal: isGlobal as boolean, isLoading: false }\n}\n\nconst environmentCheckAsyncAtom = atom<Promise<EnvironmentCheckState>>(runCheck())\n\nexport const environmentCheckAtom = unwrap(\n environmentCheckAsyncAtom,\n (prev) => prev ?? { updateAvailable: null, currentVersion: getCurrentVersion(), isGlobal: false, isLoading: true },\n)\n", "import { mkdir, readFile, writeFile } from 'node:fs/promises'\nimport { homedir } from 'node:os'\nimport { dirname, join } from 'node:path'\n\nimport { CACHE_FILE, UPDATE_CHECK_CACHE_TTL_MS, CONFIG_DIR } from '../utils/constants'\n\nexport interface UpdateCache {\n lastUpdateCheck: number\n latestVersion: string | null\n}\n\nfunction getCachePath(): string {\n return join(homedir(), CONFIG_DIR, CACHE_FILE)\n}\n\nfunction validateCache(cache: unknown): UpdateCache | null {\n if (typeof cache !== 'object' || cache === null) return null\n const partial = cache as Partial<UpdateCache>\n if (typeof partial.lastUpdateCheck !== 'number') return null\n return { lastUpdateCheck: partial.lastUpdateCheck, latestVersion: partial.latestVersion ?? null }\n}\n\nexport async function getCachedUpdate(): Promise<UpdateCache | null> {\n const cachePath = getCachePath()\n\n try {\n const content = await readFile(cachePath, 'utf-8')\n const parsed = JSON.parse(content)\n return validateCache(parsed)\n } catch {\n // Return null if file doesn't exist or is invalid\n return null\n }\n}\n\nexport async function setCachedUpdate(version: string | null): Promise<void> {\n const cachePath = getCachePath()\n const cache: UpdateCache = {\n lastUpdateCheck: Date.now(),\n latestVersion: version,\n }\n\n // Ensure directory exists\n await mkdir(dirname(cachePath), { recursive: true })\n await writeFile(cachePath, JSON.stringify(cache, null, 2), 'utf-8')\n}\n\nexport async function isCacheValid(): Promise<boolean> {\n const cache = await getCachedUpdate()\n if (!cache) return false\n const now = Date.now()\n const age = now - cache.lastUpdateCheck\n return age < UPDATE_CHECK_CACHE_TTL_MS\n}\n\nexport async function clearCache(): Promise<void> {\n const cachePath = getCachePath()\n\n try {\n const { unlink } = await import('node:fs/promises')\n await unlink(cachePath)\n } catch {\n // Silently fail if file doesn't exist\n }\n}\n", "import packageJson from 'package-json'\n\nimport { PACKAGE_NAME } from '../utils/constants'\nimport { PACKAGE_VERSION } from './package-info'\n\nexport async function checkForUpdates(currentVersion: string): Promise<string | null> {\n try {\n // Don't check for updates if running a prerelease version\n if (isPrerelease(currentVersion)) return null\n\n const result = await packageJson(PACKAGE_NAME, { version: 'latest' })\n if (result.version !== currentVersion) return result.version\n return null\n } catch {\n // Silently fail if offline or registry unavailable\n return null\n }\n}\n\nfunction isPrerelease(version: string): boolean {\n return /-(alpha|beta|rc|snapshot|dev|canary|next)/i.test(version)\n}\n\nexport function getCurrentVersion(): string {\n return PACKAGE_VERSION\n}\n", "import { createRequire } from 'node:module'\nimport { dirname, join } from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nconst __filename = fileURLToPath(import.meta.url)\nconst __dirname = dirname(__filename)\n\nconst require = createRequire(import.meta.url)\n\nlet pkg: { version?: string; description?: string }\n\ntry {\n pkg = require('./package.json')\n} catch {\n pkg = require(join(__dirname, '../../package.json'))\n}\n\nexport const PACKAGE_VERSION = pkg.version || '0.0.0'\nexport const PACKAGE_DESCRIPTION = pkg.description || 'CLI to install and manage skills for AI coding agents'\n", "import { Box, Text, useInput, useStdout } from 'ink'\nimport Spinner from 'ink-spinner'\nimport { useState } from 'react'\n\nimport { FooterBar } from '../components/FooterBar'\nimport { Header } from '../components/Header'\nimport { KeyboardShortcutsOverlay, type ShortcutEntry } from '../components/KeyboardShortcutsOverlay'\nimport { MultiSelectPrompt } from '../components/MultiSelectPrompt'\nimport { useAgents } from '../hooks/useAgents'\nimport { getAgentConfig } from '../services/agents'\nimport { colors, symbols } from '../theme'\nimport type { AgentType } from '../types'\n\ninterface AgentSelectorProps {\n onSelect: (agents: AgentType[]) => void\n onBack?: () => void\n}\n\nconst CHROME_LINES = 28\n\nexport function AgentSelector({ onSelect, onBack }: AgentSelectorProps) {\n const { stdout } = useStdout()\n const termRows = stdout?.rows ?? 40\n const listLimit = Math.max(3, termRows - CHROME_LINES)\n\n const { allAgents, installedAgents, selectedAgents, setSelectedAgents, loading } = useAgents()\n\n const agentShortcuts: ShortcutEntry[] = [\n { key: 'space', description: 'Toggle selection' },\n { key: 'enter', description: 'Confirm' },\n { key: 'ctrl+a', description: 'Select all' },\n { key: 'esc', description: 'Go back' },\n ]\n\n const [showShortcuts, setShowShortcuts] = useState(false)\n useInput((input) => {\n if (input === '?') setShowShortcuts((prev) => !prev)\n })\n\n const items = allAgents.map((agent) => {\n const config = getAgentConfig(agent)\n const isDetected = installedAgents.includes(agent)\n return { label: config.displayName, value: agent, hint: isDetected ? `${symbols.check} detected` : undefined }\n })\n\n if (loading) {\n return (\n <Box flexDirection=\"column\" paddingX={1}>\n <Header />\n <Box marginTop={1}>\n <Text color={colors.accent}>\n <Spinner type=\"dots\" /> Scanning for installed agents...\n </Text>\n </Box>\n </Box>\n )\n }\n\n return (\n <Box flexDirection=\"column\" paddingX={1} minHeight={20}>\n <Header />\n\n {showShortcuts ? (\n <>\n <Box flexDirection=\"column\" flexGrow={1} alignItems=\"center\" justifyContent=\"center\">\n <KeyboardShortcutsOverlay\n visible={showShortcuts}\n onDismiss={() => setShowShortcuts(false)}\n shortcuts={agentShortcuts}\n />\n </Box>\n\n <FooterBar\n hints={[\n { key: 'space', label: 'toggle' },\n { key: 'enter', label: 'confirm', color: colors.success },\n ...(onBack ? [{ key: 'esc', label: 'back', color: colors.warning }] : []),\n { key: '?', label: 'help' },\n ]}\n />\n </>\n ) : (\n <>\n <Box marginBottom={1}>\n <Text bold color={colors.primary}>\n {symbols.diamond} Where do you want to install skills?\n </Text>\n </Box>\n <Box marginBottom={1}>\n <Text color={colors.textDim}>{installedAgents.length} agents detected on this machine</Text>\n </Box>\n\n <MultiSelectPrompt\n items={items}\n initialSelected={selectedAgents}\n onSubmit={onSelect}\n onCancel={onBack}\n onChange={setSelectedAgents}\n limit={listLimit}\n />\n </>\n )}\n </Box>\n )\n}\n", "import { Box, Text, useInput } from 'ink'\nimport React, { useEffect } from 'react'\n\nimport { colors, symbols } from '../theme'\nimport { AnimatedTransition } from './AnimatedTransition'\n\nexport interface ShortcutEntry {\n key: string\n description: string\n}\n\nexport interface KeyboardShortcutsOverlayProps {\n visible: boolean\n onDismiss: () => void\n shortcuts: ShortcutEntry[]\n}\n\nexport const KeyboardShortcutsOverlay: React.FC<KeyboardShortcutsOverlayProps> = ({\n visible,\n onDismiss,\n shortcuts,\n}) => {\n useInput(\n () => {\n if (visible) onDismiss()\n },\n { isActive: visible },\n )\n\n useEffect(() => {\n let timer: NodeJS.Timeout\n\n if (visible) {\n timer = setTimeout(() => {\n onDismiss()\n }, 8000)\n }\n\n return () => {\n if (timer) clearTimeout(timer)\n }\n }, [visible, onDismiss])\n\n const mid = Math.ceil(shortcuts.length / 2)\n const leftColumn = shortcuts.slice(0, mid)\n const rightColumn = shortcuts.slice(mid)\n\n const KeyBadge = ({ label }: { label: string }) => (\n <Box flexShrink={0}>\n <Text backgroundColor={colors.bgLight} color={colors.accent} bold>\n {` ${label} `}\n </Text>\n </Box>\n )\n\n const ShortcutRow = ({ entry }: { entry: ShortcutEntry }) => (\n <Box marginBottom={0} gap={1}>\n <Box width={10} justifyContent=\"flex-end\" flexShrink={0}>\n <KeyBadge label={entry.key} />\n </Box>\n <Text color={colors.textDim}>{entry.description}</Text>\n </Box>\n )\n\n const divider = '\u2500'.repeat(48)\n\n return (\n <AnimatedTransition visible={visible} duration={200}>\n <Box\n borderStyle=\"round\"\n borderColor={colors.border}\n backgroundColor={colors.bg}\n paddingX={2}\n paddingY={1}\n flexDirection=\"column\"\n width={56}\n >\n <Box justifyContent=\"center\" marginBottom={1}>\n <Text color={colors.accent} bold>\n {symbols.sparkle} Keyboard Shortcuts\n </Text>\n </Box>\n\n <Box justifyContent=\"center\">\n <Text color={colors.border}>{divider}</Text>\n </Box>\n\n <Box marginTop={1} gap={2}>\n <Box flexDirection=\"column\" gap={1} flexGrow={1}>\n {leftColumn.map((entry) => (\n <ShortcutRow key={entry.key} entry={entry} />\n ))}\n </Box>\n\n <Box flexDirection=\"column\" gap={1} flexGrow={1}>\n {rightColumn.map((entry) => (\n <ShortcutRow key={entry.key} entry={entry} />\n ))}\n </Box>\n </Box>\n\n <Box justifyContent=\"center\" marginTop={1}>\n <Text color={colors.border}>{divider}</Text>\n </Box>\n\n <Box marginTop={1} justifyContent=\"center\">\n <Text color={colors.textMuted}>press any key to dismiss</Text>\n </Box>\n </Box>\n </AnimatedTransition>\n )\n}\n", "import React, { useEffect, useState } from 'react'\n\nexport interface AnimatedTransitionProps {\n visible: boolean\n duration?: number\n children: React.ReactNode\n}\n\nexport const AnimatedTransition: React.FC<AnimatedTransitionProps> = ({ visible, duration = 250, children }) => {\n const [opacity, setOpacity] = useState(visible ? 1 : 0)\n\n useEffect(() => {\n if ((visible && opacity === 1) || (!visible && opacity === 0)) return\n\n const startTime = Date.now()\n const startOpacity = opacity\n const targetOpacity = visible ? 1 : 0\n const frameDuration = 16\n\n const interval = setInterval(() => {\n const now = Date.now()\n const elapsed = now - startTime\n const progress = Math.min(elapsed / duration, 1)\n const currentOpacity = startOpacity + (visible ? progress : -progress) * Math.abs(targetOpacity - startOpacity)\n const clampedOpacity = Math.max(0, Math.min(1, currentOpacity))\n\n setOpacity(clampedOpacity)\n\n if (progress >= 1) {\n clearInterval(interval)\n setOpacity(targetOpacity)\n }\n }, frameDuration)\n\n return () => {\n clearInterval(interval)\n }\n }, [visible, duration])\n\n if (!visible && opacity <= 0.05) return null\n return <>{children}</>\n}\n", "import { Box, Text, useInput } from 'ink'\nimport { useEffect, useRef, useState } from 'react'\n\nimport { colors, symbols } from '../theme'\nimport { FooterBar, type FooterHint } from './FooterBar'\nimport { KeyboardShortcutsOverlay, type ShortcutEntry } from './KeyboardShortcutsOverlay'\n\nexport interface MultiSelectOption<T> {\n label: string\n value: T\n hint?: string\n}\n\ninterface MultiSelectPromptProps<T> {\n items: MultiSelectOption<T>[]\n onSubmit: (selected: T[]) => void\n onCancel?: () => void\n onChange?: (selected: T[]) => void\n initialSelected?: T[]\n limit?: number\n}\n\nexport function MultiSelectPrompt<T>({\n items,\n onSubmit,\n onCancel,\n onChange,\n initialSelected = [],\n limit = 10,\n}: MultiSelectPromptProps<T>) {\n const [selected, setSelected] = useState<T[]>(initialSelected)\n const [focusIndex, setFocusIndex] = useState(0)\n const [offset, setOffset] = useState(0)\n const [showShortcuts, setShowShortcuts] = useState(false)\n const prevInitialSelectedRef = useRef<T[]>(initialSelected)\n\n useEffect(() => {\n const prev = prevInitialSelectedRef.current\n const hasChanged = prev.length !== initialSelected.length || prev.some((v, i) => v !== initialSelected[i])\n\n if (hasChanged) {\n setSelected(initialSelected)\n prevInitialSelectedRef.current = initialSelected\n }\n }, [initialSelected])\n\n useInput((input, key) => {\n if (input === '?') {\n setShowShortcuts((prev) => !prev)\n return\n }\n\n if (showShortcuts) {\n setShowShortcuts(false)\n return\n }\n\n if (key.return) {\n onSubmit(selected)\n return\n }\n\n if (key.escape && onCancel) {\n onCancel()\n return\n }\n\n let newIndex = focusIndex\n let newOffset = offset\n\n if (key.upArrow) {\n newIndex = focusIndex > 0 ? focusIndex - 1 : items.length - 1\n } else if (key.downArrow) {\n newIndex = focusIndex < items.length - 1 ? focusIndex + 1 : 0\n }\n\n if (newIndex < newOffset) {\n newOffset = newIndex\n } else if (newIndex >= newOffset + limit) {\n newOffset = newIndex - limit + 1\n }\n\n if (key.upArrow && focusIndex === 0) {\n newOffset = Math.max(0, items.length - limit)\n } else if (key.downArrow && focusIndex === items.length - 1) {\n newOffset = 0\n }\n\n if (newIndex !== focusIndex) {\n setFocusIndex(newIndex)\n setOffset(newOffset)\n }\n\n if (input === ' ') {\n const item = items[focusIndex]\n\n if (selected.includes(item.value)) {\n const newSelected = selected.filter((v) => v !== item.value)\n setSelected(newSelected)\n onChange?.(newSelected)\n } else {\n const newSelected = [...selected, item.value]\n setSelected(newSelected)\n onChange?.(newSelected)\n }\n }\n\n if (input === 'a' && key.ctrl) {\n if (selected.length === items.length) {\n setSelected([])\n onChange?.([])\n } else {\n const all = items.map((i) => i.value)\n setSelected(all)\n onChange?.(all)\n }\n }\n })\n\n const visibleItems = items.slice(offset, offset + limit)\n const hasItemsAbove = offset > 0\n const hasItemsBelow = items.length > offset + limit\n\n const shortcuts: ShortcutEntry[] = [\n { key: '\u2191/\u2193', description: 'Navigate' },\n { key: 'space', description: 'Toggle selection' },\n { key: 'enter', description: 'Confirm' },\n { key: 'ctrl+a', description: 'Select all / none' },\n ...(onCancel ? [{ key: 'esc', description: 'Cancel' }] : []),\n ]\n\n if (showShortcuts) {\n return (\n <Box flexDirection=\"column\" flexGrow={1} alignItems=\"center\" justifyContent=\"center\">\n <KeyboardShortcutsOverlay\n visible={showShortcuts}\n onDismiss={() => setShowShortcuts(false)}\n shortcuts={shortcuts}\n />\n </Box>\n )\n }\n\n return (\n <Box flexDirection=\"column\">\n {hasItemsAbove && (\n <Box justifyContent=\"center\" marginBottom={1}>\n <Text color={colors.textDim}>\n {symbols.arrowUp} {symbols.arrowUp} {symbols.arrowUp}\n </Text>\n </Box>\n )}\n\n {visibleItems.map((item, index) => {\n const realIndex = index + offset\n const isFocused = realIndex === focusIndex\n const isSelected = selected.includes(item.value)\n\n const pointer = isFocused ? symbols.bullet : ' '\n const pointerColor = isSelected ? colors.success : colors.accent\n const checkbox = isSelected ? symbols.checkboxActive : symbols.checkboxInactive\n const checkboxColor = isSelected ? colors.success : colors.textMuted\n const textColor = isFocused ? colors.primary : isSelected ? colors.primaryLight : colors.text\n return (\n <Box\n key={`${String(item.value)}-${realIndex}`}\n backgroundColor={isFocused ? colors.bgLight : undefined}\n paddingX={1}\n >\n <Box width={2}>\n <Text color={pointerColor}>{pointer}</Text>\n </Box>\n <Box width={2}>\n <Text color={checkboxColor}>{checkbox}</Text>\n </Box>\n <Text color={textColor} bold={isFocused}>\n {item.label}\n </Text>\n {item.hint && (\n <Text color={isSelected ? colors.success : colors.textDim}>\n {' '}\n {symbols.dot} {item.hint}\n </Text>\n )}\n </Box>\n )\n })}\n\n {hasItemsBelow && (\n <Box justifyContent=\"center\" marginTop={1}>\n <Text color={colors.textDim}>\n {symbols.arrowDown} {symbols.arrowDown} {symbols.arrowDown}\n </Text>\n </Box>\n )}\n\n <FooterBar\n hints={\n [\n { key: 'space', label: 'toggle' },\n { key: 'enter', label: 'confirm', color: colors.success },\n ...(onCancel ? [{ key: 'esc', label: 'back', color: colors.warning }] : []),\n { key: '?', label: 'help' },\n ] satisfies FooterHint[]\n }\n status={\n selected.length > 0 ? (\n <Text>\n <Text color={colors.success} bold>\n {symbols.checkboxActive} {selected.length}\n </Text>\n <Text color={colors.textDim}> selected</Text>\n </Text>\n ) : undefined\n }\n />\n </Box>\n )\n}\n", "import { Box, Text, useInput, useStdout } from 'ink'\nimport BigText from 'ink-big-text'\nimport Gradient from 'ink-gradient'\nimport type { ChildProcess } from 'node:child_process'\nimport { existsSync } from 'node:fs'\nimport { dirname, join } from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react'\n\nimport { play, stop } from '../services/audio-player'\nimport { fetchContributors, fetchRepoStars } from '../services/github-contributors'\nimport { colors, symbols } from '../theme'\nimport type { GitHubContributor } from '../types'\n\ninterface CreditsViewProps {\n onExit: () => void\n}\n\nconst BASE_SPEED_MS = 220\nconst CONTENT_WIDTH = 52\nconst CRYSTAL_COLORS = ['#1e3a8a', '#3b82f6', '#0ea5e9', '#06b6d4', '#22d3ee']\nconst HEADER_HEIGHT = 14\nconst MAX_SPEED_MS = 500\nconst MIN_SPEED_MS = 60\nconst SEPARATOR = '\u2500'.repeat(CONTENT_WIDTH - 4)\nconst SPEED_STEP_MS = 40\nconst WARM_COLORS = ['#f59e0b', '#ef4444', '#ec4899', '#a855f7']\n\nconst RANK_DECORATORS: Record<number, { badge: string; color: string }> = {\n 1: { badge: `${symbols.star}${symbols.star}${symbols.star}`, color: '#f59e0b' },\n 2: { badge: `${symbols.star}${symbols.star}`, color: '#c0c0c0' },\n 3: { badge: symbols.star, color: '#cd7f32' },\n}\n\ntype CreditLine =\n | { type: 'blank' }\n | { type: 'text'; text: string; color: string; bold?: boolean }\n | { type: 'gradient'; text: string; gradientColors: readonly string[] }\n | { type: 'contributor'; rank: number; login: string; contributions: number }\n\nfunction buildCreditLines(contributors: GitHubContributor[], stars: number): CreditLine[] {\n const lines: CreditLine[] = []\n\n lines.push({ type: 'blank' })\n lines.push({ type: 'text', text: 'A Tech Leads Club Production', color: '#94a3b8' })\n lines.push({ type: 'blank' })\n lines.push({ type: 'blank' })\n\n lines.push({\n type: 'gradient',\n text: `${symbols.sparkle} C O N T R I B U T O R S ${symbols.sparkle}`,\n gradientColors: WARM_COLORS,\n })\n\n lines.push({ type: 'gradient', text: SEPARATOR, gradientColors: CRYSTAL_COLORS })\n lines.push({ type: 'blank' })\n\n for (let i = 0; i < contributors.length; i++) {\n const c = contributors[i]\n lines.push({ type: 'contributor', rank: i + 1, login: c.login, contributions: c.contributions })\n }\n\n lines.push({ type: 'blank' })\n lines.push({ type: 'blank' })\n\n lines.push({ type: 'gradient', text: `${symbols.star} S T A T S ${symbols.star}`, gradientColors: WARM_COLORS })\n lines.push({ type: 'gradient', text: SEPARATOR, gradientColors: CRYSTAL_COLORS })\n lines.push({ type: 'blank' })\n\n if (stars > 0) {\n lines.push({ type: 'text', text: `${symbols.star} GitHub Stars \u00B7\u00B7\u00B7\u00B7\u00B7 ${stars}`, color: '#f59e0b', bold: true })\n }\n\n lines.push({ type: 'text', text: `${symbols.diamond} Contributors \u00B7\u00B7\u00B7\u00B7\u00B7 ${contributors.length}`, color: '#06b6d4' })\n const totalContribs = contributors.reduce((sum, c) => sum + c.contributions, 0)\n lines.push({ type: 'text', text: `${symbols.check} Contributions \u00B7\u00B7\u00B7\u00B7 ${totalContribs}`, color: '#22c55e' })\n\n lines.push({ type: 'blank' })\n lines.push({ type: 'blank' })\n\n lines.push({\n type: 'gradient',\n text: `${symbols.sparkle} S P E C I A L T H A N K S ${symbols.sparkle}`,\n gradientColors: WARM_COLORS,\n })\n\n lines.push({ type: 'gradient', text: SEPARATOR, gradientColors: CRYSTAL_COLORS })\n lines.push({ type: 'blank' })\n lines.push({ type: 'text', text: 'To every contributor, stargazer,', color: '#94a3b8' })\n lines.push({ type: 'text', text: 'and community member who makes', color: '#94a3b8' })\n lines.push({ type: 'text', text: 'this project possible.', color: '#94a3b8' })\n lines.push({ type: 'blank' })\n lines.push({ type: 'text', text: 'Built with \\u2665 by the community', color: '#ef4444' })\n lines.push({ type: 'blank' })\n lines.push({ type: 'gradient', text: 'github.com/gustavobrunodev/ai-tools', gradientColors: CRYSTAL_COLORS })\n lines.push({ type: 'blank' })\n lines.push({ type: 'blank' })\n lines.push({ type: 'blank' })\n\n return lines\n}\n\nfunction getAssetPath(): string | null {\n try {\n let dir = dirname(fileURLToPath(import.meta.url))\n for (let i = 0; i < 5; i++) {\n const candidate = join(dir, 'assets', 'chiptune.mp3')\n if (existsSync(candidate)) return candidate\n dir = dirname(dir)\n }\n return null\n } catch {\n return null\n }\n}\n\nfunction ContributorRow({ rank, login, contributions }: { rank: number; login: string; contributions: number }) {\n const decorator = RANK_DECORATORS[rank]\n const nameColor = decorator?.color ?? '#e2e8f0'\n const rankStr = rank.toString().padStart(2)\n const name = `@${login}`\n const contribStr = `${contributions}`\n const badgeSuffix = decorator ? ` ${decorator.badge}` : ''\n const usedLen = 4 + 1 + name.length + badgeSuffix.length + 1 + contribStr.length\n const dotsLen = Math.max(2, CONTENT_WIDTH - 4 - usedLen)\n const dots = '\\u00b7'.repeat(dotsLen)\n\n return (\n <Text>\n <Text color=\"#64748b\">{rankStr}. </Text>\n <Text color={nameColor} bold={!!decorator}>\n {name}\n </Text>\n <Text color={decorator?.color ?? '#94a3b8'}>{badgeSuffix}</Text>\n <Text color=\"#334155\"> {dots} </Text>\n <Text color=\"#22c55e\" bold>\n {contribStr}\n </Text>\n </Text>\n )\n}\n\nfunction CreditLineRenderer({ line }: { line: CreditLine }) {\n switch (line.type) {\n case 'blank':\n return <Text> </Text>\n case 'text':\n return (\n <Text color={line.color} bold={line.bold}>\n {line.text}\n </Text>\n )\n case 'gradient':\n return (\n <Gradient colors={[...line.gradientColors]}>\n <Text>{line.text}</Text>\n </Gradient>\n )\n case 'contributor':\n return <ContributorRow rank={line.rank} login={line.login} contributions={line.contributions} />\n }\n}\n\nfunction SpeedIndicator({ speed, paused }: { speed: number; paused: boolean }) {\n if (paused) {\n return (\n <Text color={colors.warning} bold>\n {' '}\n {symbols.bar}\n {symbols.bar} PAUSED\n </Text>\n )\n }\n\n const level = Math.round(((MAX_SPEED_MS - speed) / (MAX_SPEED_MS - MIN_SPEED_MS)) * 4) + 1\n const bars = '\\u25AE'.repeat(level) + '\\u25AF'.repeat(5 - level)\n return <Text color={colors.textMuted}> {bars}</Text>\n}\n\nexport function CreditsView({ onExit }: CreditsViewProps) {\n const { stdout } = useStdout()\n const termRows = stdout?.rows ?? 24\n const scrollAreaHeight = Math.max(6, termRows - HEADER_HEIGHT - 4)\n\n const [contributors, setContributors] = useState<GitHubContributor[]>([])\n const [stars, setStars] = useState(0)\n const [loading, setLoading] = useState(true)\n const [scrollOffset, setScrollOffset] = useState(0)\n const [speed, setSpeed] = useState(BASE_SPEED_MS)\n const [paused, setPaused] = useState(false)\n\n const audioRef = useRef<ChildProcess | null>(null)\n const intervalRef = useRef<ReturnType<typeof setInterval> | null>(null)\n\n useEffect(() => {\n Promise.all([fetchContributors(), fetchRepoStars()]).then(([c, s]) => {\n setContributors(c)\n setStars(s)\n setLoading(false)\n })\n }, [])\n\n useEffect(() => {\n const assetPath = getAssetPath()\n if (assetPath) audioRef.current = play(assetPath)\n\n return () => {\n stop(audioRef.current)\n }\n }, [])\n\n const creditLines = useMemo(() => buildCreditLines(contributors, stars), [contributors, stars])\n const maxOffset = creditLines.length + scrollAreaHeight\n const finished = scrollOffset >= maxOffset\n\n const advance = useCallback(() => {\n setScrollOffset((prev) => (prev >= maxOffset ? prev : prev + 1))\n }, [maxOffset])\n\n useEffect(() => {\n if (loading || paused || finished) {\n if (intervalRef.current) clearInterval(intervalRef.current)\n intervalRef.current = null\n return\n }\n\n intervalRef.current = setInterval(advance, speed)\n return () => {\n if (intervalRef.current) clearInterval(intervalRef.current)\n }\n }, [loading, paused, finished, speed, advance])\n\n useEffect(() => {\n if (!finished) return\n const timer = setTimeout(() => {\n stop(audioRef.current)\n onExit()\n }, 3000)\n\n return () => clearTimeout(timer)\n }, [finished, onExit])\n\n useInput((input, key) => {\n if (key.escape) {\n stop(audioRef.current)\n onExit()\n return\n }\n\n if (input === ' ') {\n setPaused((p) => !p)\n return\n }\n\n if (key.upArrow) {\n setSpeed((s) => Math.max(MIN_SPEED_MS, s - SPEED_STEP_MS))\n return\n }\n\n if (key.downArrow) {\n setSpeed((s) => Math.min(MAX_SPEED_MS, s + SPEED_STEP_MS))\n return\n }\n })\n\n if (loading) {\n return (\n <Box flexDirection=\"column\" alignItems=\"center\" padding={2}>\n <Text color={colors.accent}>Loading contributors...</Text>\n </Box>\n )\n }\n\n const blankLine: CreditLine = { type: 'blank' }\n const padTop = Array(scrollAreaHeight).fill(blankLine) as CreditLine[]\n const padBottom = Array(scrollAreaHeight).fill(blankLine) as CreditLine[]\n const allLines = [...padTop, ...creditLines, ...padBottom]\n const visibleSlice = allLines.slice(scrollOffset, scrollOffset + scrollAreaHeight)\n\n return (\n <Box flexDirection=\"column\" alignItems=\"center\">\n <Box marginBottom={-1}>\n <Gradient colors={['#1e3a8a', '#3b82f6']}>\n <BigText text=\"TLC\" font=\"tiny\" />\n </Gradient>\n </Box>\n <Box>\n <Gradient colors={[...CRYSTAL_COLORS]}>\n <BigText text=\"AGENT SKILLS\" font=\"block\" />\n </Gradient>\n </Box>\n <Box>\n <Gradient colors={[...CRYSTAL_COLORS]}>\n <Text>{'\\u2500'.repeat(60)}</Text>\n </Gradient>\n </Box>\n\n <Box flexDirection=\"column\" alignItems=\"center\" height={scrollAreaHeight} width={CONTENT_WIDTH}>\n {visibleSlice.map((line, i) => (\n <Box key={`cl-${scrollOffset}-${i}`} justifyContent=\"center\">\n <CreditLineRenderer line={line} />\n </Box>\n ))}\n </Box>\n\n <Box marginTop={1} gap={2}>\n <Text>\n <Text color={colors.accent} bold>\n space\n </Text>\n <Text color={colors.textDim}> pause</Text>\n </Text>\n <Text color={colors.textMuted}>{symbols.dot}</Text>\n <Text>\n <Text color={colors.accent} bold>\n {symbols.arrowUp}\n {symbols.arrowDown}\n </Text>\n <Text color={colors.textDim}> speed</Text>\n </Text>\n <SpeedIndicator speed={speed} paused={paused} />\n <Text color={colors.textMuted}>{symbols.dot}</Text>\n <Text>\n <Text color={colors.warning} bold>\n esc\n </Text>\n <Text color={colors.textDim}> back</Text>\n </Text>\n </Box>\n </Box>\n )\n}\n", "import { execSync, spawn, type ChildProcess } from 'node:child_process'\nimport { platform } from 'node:os'\n\nfunction commandExists(cmd: string): boolean {\n try {\n execSync(`which ${cmd}`, { stdio: 'ignore' })\n return true\n } catch {\n return false\n }\n}\n\nfunction spawnLinuxPlayer(filePath: string): ChildProcess {\n const players = [\n { cmd: 'mpv', args: ['--no-video', '--no-terminal', filePath] },\n { cmd: 'ffplay', args: ['-nodisp', '-autoexit', '-loglevel', 'quiet', filePath] },\n { cmd: 'paplay', args: [filePath] },\n { cmd: 'aplay', args: [filePath] },\n ]\n\n for (const { cmd, args } of players) {\n if (commandExists(cmd)) return spawn(cmd, args, { stdio: 'ignore' })\n }\n\n return spawn('mpv', ['--no-video', '--no-terminal', filePath], { stdio: 'ignore' })\n}\n\nexport function play(filePath: string): ChildProcess | null {\n try {\n const os = platform()\n let proc: ChildProcess\n\n if (os === 'darwin') {\n proc = spawn('afplay', [filePath], { stdio: 'ignore' })\n } else if (os === 'win32') {\n proc = spawn('powershell', ['-c', `(New-Object Media.SoundPlayer \"${filePath}\").PlaySync()`], {\n stdio: 'ignore',\n })\n } else {\n proc = spawnLinuxPlayer(filePath)\n }\n\n proc.on('error', () => {\n // Player not available, silently ignore\n })\n\n return proc\n } catch {\n return null\n }\n}\n\nexport function stop(proc: ChildProcess | null): void {\n if (proc && !proc.killed) proc.kill()\n}\n", "import ky from 'ky'\n\nimport type { GitHubContributor } from '../types'\n\nconst REPO_API = 'https://api.github.com/repos/gustavobrunodev/ai-tools'\nconst CONTRIBUTORS_URL = `${REPO_API}/contributors`\n\nlet contributorsCache: GitHubContributor[] | null = null\nlet starsCache: number | null = null\n\nexport async function fetchContributors(): Promise<GitHubContributor[]> {\n if (contributorsCache) return contributorsCache\n\n try {\n const data = await ky\n .get(CONTRIBUTORS_URL, {\n headers: { Accept: 'application/vnd.github.v3+json' },\n timeout: 10_000,\n })\n .json<Array<{ login: string; avatar_url: string; contributions: number }>>()\n\n contributorsCache = data\n .filter(({ login }) => !isBot(login))\n .map(({ login, avatar_url, contributions }) => ({\n login,\n avatarUrl: avatar_url,\n contributions,\n }))\n\n return contributorsCache\n } catch {\n return []\n }\n}\n\nexport async function fetchRepoStars(): Promise<number> {\n if (starsCache !== null) return starsCache\n\n try {\n const data = await ky\n .get(REPO_API, {\n headers: { Accept: 'application/vnd.github.v3+json' },\n timeout: 10_000,\n })\n .json<{ stargazers_count: number }>()\n\n starsCache = data.stargazers_count\n return starsCache\n } catch {\n return 0\n }\n}\n\nfunction isBot(login: string): boolean {\n return login.endsWith('[bot]')\n}\n", "import { Box, Text, useInput } from 'ink'\nimport { useState } from 'react'\n\nimport { Header } from '../components/Header'\nimport { SelectPrompt } from '../components/SelectPrompt'\nimport { colors, symbols } from '../theme'\n\ninterface InstallConfigProps {\n onConfirm: (config: { method: 'copy' | 'symlink'; global: boolean }) => void\n onBack: () => void\n initialMethod?: 'copy' | 'symlink'\n initialGlobal?: boolean\n}\n\nexport function InstallConfig({\n onConfirm,\n onBack,\n initialMethod = 'copy',\n initialGlobal = false,\n}: InstallConfigProps) {\n const [step, setStep] = useState<'method' | 'scope' | 'confirm'>('method')\n const [method, setMethod] = useState<'copy' | 'symlink'>(initialMethod)\n const [isGlobal, setIsGlobal] = useState(initialGlobal)\n\n if (step === 'method') {\n return (\n <Box flexDirection=\"column\" paddingX={1}>\n <Header />\n <Box marginBottom={1}>\n <Text bold color={colors.primary}>\n {symbols.diamond} Choose installation method:\n </Text>\n </Box>\n <SelectPrompt\n items={[\n { label: 'Copy', value: 'copy', hint: 'independent copies (recommended)' },\n { label: 'Symlink', value: 'symlink', hint: 'shared source (may not work with all agents)' },\n ]}\n onSelect={(val) => {\n setMethod(val as 'copy' | 'symlink')\n setStep('scope')\n }}\n onCancel={onBack}\n />\n </Box>\n )\n }\n\n if (step === 'scope') {\n return (\n <Box flexDirection=\"column\" paddingX={1}>\n <Header />\n <Box marginBottom={1}>\n <Text bold color={colors.primary}>\n {symbols.diamond} Choose installation scope:\n </Text>\n </Box>\n <SelectPrompt\n items={[\n { label: 'Local', value: false, hint: 'this project only' },\n { label: 'Global', value: true, hint: 'user home directory' },\n ]}\n onSelect={(val) => {\n setIsGlobal(val as boolean)\n setStep('confirm')\n }}\n onCancel={() => setStep('method')}\n />\n </Box>\n )\n }\n\n return (\n <InstallSummary\n method={method}\n isGlobal={isGlobal}\n onConfirm={() => onConfirm({ method, global: isGlobal })}\n onBack={() => setStep('scope')}\n />\n )\n}\n\nfunction InstallSummary({\n method,\n isGlobal,\n onConfirm,\n onBack,\n}: {\n method: string\n isGlobal: boolean\n onConfirm: () => void\n onBack: () => void\n}) {\n useInput((input, key) => {\n if (key.return || input === 'y' || input === 'Y') onConfirm()\n if (key.escape || input === 'n' || input === 'N') onBack()\n })\n\n return (\n <Box flexDirection=\"column\" paddingX={1}>\n <Header />\n\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor={colors.accent} paddingX={2} paddingY={1}>\n <Box marginBottom={1}>\n <Text bold color={colors.accent}>\n {symbols.diamond} Ready to install\n </Text>\n </Box>\n\n <Box>\n <Box width={10}>\n <Text color={colors.textDim}>Method</Text>\n </Box>\n <Text color={colors.text} bold>\n {method === 'copy' ? 'Copy' : 'Symlink'}\n </Text>\n <Text color={colors.textMuted}>\n {' '}\n {symbols.dot} {method === 'copy' ? 'Recommended' : 'Developer mode'}\n </Text>\n </Box>\n\n <Box>\n <Box width={10}>\n <Text color={colors.textDim}>Scope</Text>\n </Box>\n <Text color={colors.text} bold>\n {isGlobal ? 'Global' : 'Local'}\n </Text>\n <Text color={colors.textMuted}>\n {' '}\n {symbols.dot} {isGlobal ? 'User home' : 'This project'}\n </Text>\n </Box>\n </Box>\n\n <Box marginTop={1} borderStyle=\"round\" borderColor={colors.border} paddingX={1}>\n <Box justifyContent=\"space-between\" width=\"100%\">\n <Text>\n <Text color={colors.success} bold>\n Y\n </Text>\n <Text color={colors.textDim}> / </Text>\n <Text color={colors.success} bold>\n enter\n </Text>\n <Text color={colors.textDim}> confirm</Text>\n <Text color={colors.textDim}> {symbols.dot} </Text>\n <Text color={colors.warning} bold>\n N\n </Text>\n <Text color={colors.textDim}> / </Text>\n <Text color={colors.warning} bold>\n esc\n </Text>\n <Text color={colors.textDim}> back</Text>\n </Text>\n </Box>\n </Box>\n </Box>\n )\n}\n", "import { Box, Text, useInput } from 'ink'\nimport Spinner from 'ink-spinner'\nimport { useAtom, useAtomValue, useSetAtom } from 'jotai'\nimport { useEffect, useMemo, useState } from 'react'\n\nimport { installedSkillsAtom, installedSkillsRefreshAtom } from '../atoms/installedSkills'\nimport { selectedAgentsAtom, selectedSkillsAtom } from '../atoms/wizard'\nimport { Header } from '../components/Header'\nimport { InstallResults } from '../components/InstallResults'\nimport { useInstaller } from '../hooks/useInstaller'\nimport { useSkills } from '../hooks/useSkills'\nimport { useWizardStep } from '../hooks/useWizardStep'\nimport { colors, symbols } from '../theme'\nimport type { AgentType, SkillInfo } from '../types'\nimport { ActionSelector } from './ActionSelector'\nimport { AgentSelector } from './AgentSelector'\nimport { CreditsView } from './CreditsView'\nimport { InstallConfig } from './InstallConfig'\nimport { RemoveWizard } from './RemoveWizard'\nimport { SkillBrowser } from './SkillBrowser'\nimport { UpdateView } from './UpdateView'\n\nexport function InstallWizard({ onExit }: { onExit: () => void }) {\n const { step, next, back } = useWizardStep(5)\n const [selectedAgents, setSelectedAgents] = useAtom(selectedAgentsAtom)\n const [selectedSkills, setSelectedSkills] = useAtom(selectedSkillsAtom)\n const refreshInstalledSkills = useSetAtom(installedSkillsRefreshAtom)\n const installedSkills = useAtomValue(installedSkillsAtom)\n const [action, setAction] = useState<'install' | 'update' | 'remove'>('install')\n const [showCredits, setShowCredits] = useState(false)\n const [showUpdate, setShowUpdate] = useState(false)\n const [showRemove, setShowRemove] = useState(false)\n const [installConfig, setInstallConfig] = useState<{ method: 'copy' | 'symlink'; global: boolean }>({\n method: 'copy',\n global: false,\n })\n\n const { skills } = useSkills()\n const { install, progress, results, installing } = useInstaller()\n const [installStarted, setInstallStarted] = useState(false)\n const [installComplete, setInstallComplete] = useState(false)\n\n const handleAgentSelect = (agents: AgentType[]) => {\n if (agents.length === 0) return\n setSelectedAgents(agents)\n next()\n }\n\n const handleActionSelect = (act: 'install' | 'update' | 'remove') => {\n setAction(act)\n\n if (act === 'update') {\n setShowUpdate(true)\n return\n }\n\n if (act === 'remove') {\n setShowRemove(true)\n return\n }\n\n next()\n }\n\n const handleSkillSelect = (skills: SkillInfo[]) => {\n if (skills.length === 0) return\n setSelectedSkills(skills)\n next()\n }\n\n const handleConfigConfirm = (config: { method: 'copy' | 'symlink'; global: boolean }) => {\n setInstallConfig(config)\n next()\n }\n\n const visibleSkills = useMemo(() => {\n if (action === 'install') return undefined\n const installedOnSelected = new Set<string>()\n Object.entries(installedSkills).forEach(([skillName, agents]) => {\n if (agents.some((a) => selectedAgents.includes(a))) installedOnSelected.add(skillName)\n })\n return skills.filter((s) => installedOnSelected.has(s.name))\n }, [action, installedSkills, skills, selectedAgents])\n\n useEffect(() => {\n const runInstall = async () => {\n if (step === 5 && !installStarted && !installComplete) {\n setInstallStarted(true)\n await install(selectedSkills, {\n agents: selectedAgents,\n skills: selectedSkills.map((s) => s.name),\n method: installConfig.method,\n global: installConfig.global,\n })\n setInstallComplete(true)\n refreshInstalledSkills((prev) => prev + 1)\n }\n }\n runInstall()\n }, [step, installStarted, installComplete, install, selectedSkills, selectedAgents, refreshInstalledSkills])\n\n if (step === 5) {\n if (installComplete) {\n return <InstallResults results={results} onExit={onExit} title=\"Installation Complete\" successLabel=\"installed\" />\n }\n\n return (\n <Box flexDirection=\"column\" paddingX={1}>\n <Header />\n <Box marginTop={1}>\n <Text color={colors.accent}>\n <Spinner type=\"dots\" />{' '}\n </Text>\n <Text>\n Installing {selectedSkills.length} skills to {selectedAgents.length} agents...\n </Text>\n </Box>\n {installing && (\n <Box marginTop={1} paddingX={2}>\n <Text color={colors.textDim}>\n {symbols.arrow} {progress.skill} ({progress.current}/{progress.total})\n </Text>\n </Box>\n )}\n </Box>\n )\n }\n\n if (showUpdate) return <UpdateView selectedAgents={selectedAgents} onExit={() => setShowUpdate(false)} />\n if (showRemove) return <RemoveWizard selectedAgents={selectedAgents} onExit={() => setShowRemove(false)} />\n if (showCredits) return <CreditsView onExit={() => setShowCredits(false)} />\n\n return (\n <Box flexDirection=\"column\">\n {step === 1 && <AgentSelector onSelect={handleAgentSelect} onBack={onExit} />}\n\n {step === 2 && (\n <ActionSelector onSelect={handleActionSelect} onBack={back} onCredits={() => setShowCredits(true)} />\n )}\n\n {step === 3 && (action === 'install' || (visibleSkills && visibleSkills.length > 0)) && (\n <SkillBrowser onInstall={handleSkillSelect} onExit={back} overrideSkills={visibleSkills} />\n )}\n\n {step === 3 && action === 'update' && visibleSkills && visibleSkills.length === 0 && (\n <UpToDateMessage onBack={back} />\n )}\n\n {step === 4 && (\n <InstallConfig onConfirm={handleConfigConfirm} onBack={back} initialMethod=\"copy\" initialGlobal={false} />\n )}\n </Box>\n )\n}\n\nfunction UpToDateMessage({ onBack }: { onBack: () => void }) {\n useInput((input, key) => {\n if (key.escape || input === 'b' || key.backspace) onBack()\n })\n\n return (\n <Box flexDirection=\"column\" paddingX={1}>\n <Header />\n\n <Box borderColor={colors.success} borderStyle=\"round\" paddingX={2} paddingY={1}>\n <Text color={colors.success} bold>\n {symbols.check} All skills are up to date on selected agents\n </Text>\n </Box>\n\n <Box marginTop={1} borderStyle=\"round\" borderColor={colors.border} paddingX={1}>\n <Text>\n <Text color={colors.warning} bold>\n esc\n </Text>\n <Text color={colors.textDim}> back</Text>\n </Text>\n </Box>\n </Box>\n )\n}\n", "import { atom } from 'jotai'\nimport { unwrap } from 'jotai/utils'\n\nimport { detectInstalledAgents } from '../services/agents'\nimport { listInstalledSkills } from '../services/installer'\nimport type { AgentType } from '../types'\n\nexport type InstallationMap = Record<string, AgentType[]>\n\nconst fetchInstalledSkills = async (): Promise<InstallationMap> => {\n const agents = detectInstalledAgents()\n const status: InstallationMap = {}\n\n for (const agent of agents) {\n const [local, global] = await Promise.all([\n listInstalledSkills(agent, false).catch(() => []),\n listInstalledSkills(agent, true).catch(() => []),\n ])\n\n for (const skill of new Set([...local, ...global])) {\n if (!status[skill]) status[skill] = []\n if (!status[skill].includes(agent)) status[skill].push(agent)\n }\n }\n\n return status\n}\n\nexport const installedSkillsRefreshAtom = atom(0)\n\nconst installedSkillsAsyncAtom = atom(async (get) => {\n get(installedSkillsRefreshAtom)\n return fetchInstalledSkills()\n})\n\nexport const installedSkillsAtom = unwrap(installedSkillsAsyncAtom, (prev) => prev ?? {})\n", "import { atom } from 'jotai'\n\nimport type { AgentType, SkillInfo } from '../types'\n\nexport const selectedAgentsAtom = atom<AgentType[]>([])\nexport const selectedSkillsAtom = atom<SkillInfo[]>([])\n", "import { Box, Text, useInput } from 'ink'\n\nimport { colors, symbols } from '../theme'\nimport { Header } from './Header'\n\ninterface InstallResultsProps {\n results: Array<{ success: boolean; skill: string; agent: string; error?: string }>\n onExit: () => void\n title?: string\n successLabel?: string\n}\n\nexport function InstallResults({\n results,\n onExit,\n title = 'Installation Complete',\n successLabel = 'succeeded',\n}: InstallResultsProps) {\n useInput((_, key) => {\n if (key.return || key.escape) onExit()\n })\n\n const uniqueSuccessSkills = new Set(results.filter((r) => r.success).map((r) => r.skill))\n const uniqueFailedSkills = new Set(results.filter((r) => !r.success).map((r) => r.skill))\n const successCount = uniqueSuccessSkills.size\n const failCount = uniqueFailedSkills.size\n\n const allFailed = successCount === 0 && failCount > 0\n const anyFailed = failCount > 0\n const borderColor = allFailed ? colors.error : anyFailed ? colors.warning : colors.success\n\n const displayTitle = allFailed\n ? `${symbols.cross} Installation Failed`\n : anyFailed\n ? `${symbols.warning} Partially Installed`\n : `${symbols.check} ${title}`\n\n const titleColor = allFailed ? colors.error : anyFailed ? colors.warning : colors.success\n\n return (\n <Box flexDirection=\"column\" paddingX={1}>\n <Header />\n\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor={borderColor} paddingX={2} paddingY={1}>\n <Box marginBottom={1}>\n <Text color={titleColor} bold>\n {displayTitle}\n </Text>\n </Box>\n\n {results.map((res, i) => (\n <Box key={i} flexDirection=\"column\">\n <Box paddingX={1}>\n <Box width={2}>\n <Text color={res.success ? colors.success : colors.error}>\n {res.success ? symbols.check : symbols.cross}\n </Text>\n </Box>\n <Text color={res.success ? colors.text : colors.error}>{res.skill}</Text>\n <Text color={colors.textDim}>\n {' '}\n {symbols.arrow} {res.agent}\n </Text>\n </Box>\n {!res.success && res.error && (\n <Box paddingLeft={4}>\n <Text color={colors.error} dimColor>\n {res.error}\n </Text>\n </Box>\n )}\n </Box>\n ))}\n\n {(successCount > 0 || failCount > 0) && (\n <Box marginTop={1}>\n <Text color={colors.textDim}>\n {successCount > 0 && (\n <Text color={colors.success}>\n {successCount} {successLabel}\n </Text>\n )}\n {successCount > 0 && failCount > 0 && <Text> {symbols.dot} </Text>}\n {failCount > 0 && <Text color={colors.error}>{failCount} failed</Text>}\n </Text>\n </Box>\n )}\n\n <Box marginTop={1}>\n <Text color={colors.textDim}>\n View details: <Text color={colors.accent}>ai-tools skills audit</Text>\n </Text>\n </Box>\n </Box>\n\n <Box marginTop={1} borderStyle=\"round\" borderColor={colors.border} paddingX={1}>\n <Text>\n <Text color={colors.success} bold>\n enter\n </Text>\n <Text color={colors.textDim}> / </Text>\n <Text color={colors.warning} bold>\n esc\n </Text>\n <Text color={colors.textDim}> exit</Text>\n </Text>\n </Box>\n </Box>\n )\n}\n", "import { Box, Text, useInput } from 'ink'\nimport Spinner from 'ink-spinner'\nimport { useAtomValue } from 'jotai'\nimport { useMemo, useState } from 'react'\n\nimport { Header } from '../components/Header'\nimport { MultiSelectPrompt } from '../components/MultiSelectPrompt'\nimport { SelectPrompt } from '../components/SelectPrompt'\nimport { useRemover } from '../hooks/useRemover'\nimport { colors, symbols } from '../theme'\nimport type { AgentType } from '../types'\nimport { AgentSelector } from './AgentSelector'\n\nimport { deprecatedSkillsAtom } from '../atoms/deprecatedSkills'\nimport { installedSkillsAtom } from '../atoms/installedSkills'\n\nexport function RemoveWizard({ selectedAgents, onExit }: { selectedAgents?: AgentType[]; onExit: () => void }) {\n const [internalAgents, setInternalAgents] = useState<AgentType[]>(selectedAgents || [])\n const { removeMultiple, progress, results } = useRemover()\n\n const installedSkills = useAtomValue(installedSkillsAtom)\n const deprecatedMap = useAtomValue(deprecatedSkillsAtom)\n\n const [step, setStep] = useState<'agent-select' | 'select' | 'confirm' | 'removing' | 'done'>(\n selectedAgents ? 'select' : 'agent-select',\n )\n\n const [selectedToRemove, setSelectedToRemove] = useState<string[]>([])\n const activeAgents = selectedAgents || internalAgents\n\n const filteredSkills = useMemo(() => {\n const filtered: Record<string, AgentType[]> = {}\n Object.entries(installedSkills).forEach(([skillName, agents]) => {\n const matchingAgents = agents.filter((a: AgentType) => activeAgents.includes(a))\n if (matchingAgents.length > 0) filtered[skillName] = matchingAgents\n })\n return filtered\n }, [installedSkills, activeAgents])\n\n const skillNames = useMemo(() => Object.keys(filteredSkills), [filteredSkills])\n\n const selectItems = useMemo(() => {\n return skillNames.map((name) => {\n const isDeprecated = deprecatedMap instanceof Map && deprecatedMap.has(name)\n const agentHint = `${filteredSkills[name].length} agents: ${filteredSkills[name].join(', ')}`\n const hint = isDeprecated ? `${agentHint} \u26A0 deprecated` : agentHint\n return { label: name, value: name, hint }\n })\n }, [skillNames, filteredSkills, deprecatedMap])\n\n useInput((_, key) => {\n if (step === 'done' && (key.return || key.escape)) onExit()\n if (skillNames.length === 0 && key.escape) onExit()\n })\n\n if (step === 'agent-select') {\n return (\n <AgentSelector\n onSelect={(agents) => {\n setInternalAgents(agents)\n setStep('select')\n }}\n onBack={onExit}\n />\n )\n }\n\n if (skillNames.length === 0) {\n return (\n <Box flexDirection=\"column\" paddingX={1}>\n <Header />\n <Box borderStyle=\"round\" borderColor={colors.warning} paddingX={2} paddingY={1}>\n <Text color={colors.warning}>No skills found to remove for the selected agents.</Text>\n </Box>\n <Box marginTop={1} borderStyle=\"round\" borderColor={colors.border} paddingX={1}>\n <Text>\n <Text color={colors.warning} bold>\n esc\n </Text>\n <Text color={colors.textDim}> exit</Text>\n </Text>\n </Box>\n </Box>\n )\n }\n\n const handleSelect = (selected: string[]) => {\n if (selected.length === 0) return\n setSelectedToRemove(selected)\n setStep('confirm')\n }\n\n const executeRemoval = async () => {\n setStep('removing')\n const targets = selectedToRemove.map((name) => ({ name, agents: filteredSkills[name] || [] }))\n await removeMultiple(targets)\n setStep('done')\n }\n\n if (step === 'select') {\n return (\n <Box flexDirection=\"column\" paddingX={1}>\n <Header />\n <Box marginBottom={1}>\n <Text bold color={colors.error}>\n {symbols.diamond} Select skills to remove:\n </Text>\n </Box>\n <MultiSelectPrompt items={selectItems} onSubmit={handleSelect} onCancel={onExit} />\n </Box>\n )\n }\n\n if (step === 'confirm') {\n return (\n <Box flexDirection=\"column\" paddingX={1}>\n <Header />\n\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor={colors.error} paddingX={2} paddingY={1}>\n <Box marginBottom={1}>\n <Text color={colors.error} bold>\n {symbols.cross} Remove {selectedToRemove.length} skill{selectedToRemove.length > 1 ? 's' : ''}?\n </Text>\n </Box>\n\n {selectedToRemove.map((s) => (\n <Box key={s} paddingX={1}>\n <Box width={2}>\n <Text color={colors.error}>{symbols.dot}</Text>\n </Box>\n <Text color={colors.textDim}>{s}</Text>\n </Box>\n ))}\n </Box>\n\n <Box marginTop={1}>\n <SelectPrompt\n items={[\n { label: 'Yes, remove them', value: 'yes' },\n { label: 'No, cancel', value: 'no' },\n ]}\n onSelect={(val) => {\n if (val === 'yes') executeRemoval()\n else setStep('select')\n }}\n />\n </Box>\n </Box>\n )\n }\n\n if (step === 'removing') {\n return (\n <Box flexDirection=\"column\" paddingX={1}>\n <Header />\n <Box marginTop={1}>\n <Text color={colors.accent}>\n <Spinner type=\"dots\" />{' '}\n </Text>\n <Text>Removing skills...</Text>\n </Box>\n <Box marginTop={1} paddingX={2}>\n <Text color={colors.textDim}>\n {symbols.arrow} {progress.skill} ({progress.current}/{progress.total})\n </Text>\n </Box>\n </Box>\n )\n }\n\n if (step === 'done') {\n const successCount = results.filter((r) => r.success).length\n const failCount = results.filter((r) => !r.success).length\n const allFailed = successCount === 0\n\n return (\n <Box flexDirection=\"column\" paddingX={1}>\n <Header />\n\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={allFailed ? colors.error : colors.success}\n paddingX={2}\n paddingY={1}\n >\n <Box marginBottom={1}>\n <Text color={allFailed ? colors.error : colors.success} bold>\n {allFailed ? symbols.cross : symbols.check} {allFailed ? 'Removal Failed' : 'Removal Complete'}\n </Text>\n </Box>\n\n {results.map((res, i) => (\n <Box key={i} paddingX={1}>\n <Box width={2}>\n <Text color={res.success ? colors.success : colors.error}>\n {res.success ? symbols.check : symbols.cross}\n </Text>\n </Box>\n <Text color={res.success ? colors.text : colors.error}>{res.skill}</Text>\n <Text color={colors.textDim}>\n {' '}\n {symbols.arrow} {res.agent}\n </Text>\n {!res.success && res.error && <Text color={colors.error}> ({res.error})</Text>}\n </Box>\n ))}\n\n {(successCount > 0 || failCount > 0) && (\n <Box marginTop={1}>\n <Text color={colors.textDim}>\n {successCount > 0 && <Text color={colors.success}>{successCount} succeeded</Text>}\n {successCount > 0 && failCount > 0 && <Text> {symbols.dot} </Text>}\n {failCount > 0 && <Text color={colors.error}>{failCount} failed</Text>}\n </Text>\n </Box>\n )}\n </Box>\n\n <Box marginTop={1} borderStyle=\"round\" borderColor={colors.border} paddingX={1}>\n <Text>\n <Text color={colors.success} bold>\n enter\n </Text>\n <Text color={colors.textDim}> / </Text>\n <Text color={colors.warning} bold>\n esc\n </Text>\n <Text color={colors.textDim}> exit</Text>\n </Text>\n </Box>\n </Box>\n )\n }\n\n return null\n}\n", "import { atom } from 'jotai'\nimport { unwrap } from 'jotai/utils'\n\nimport { getDeprecatedMap } from '../services/registry'\nimport type { DeprecatedEntry } from '../types'\n\nconst deprecatedSkillsAsyncAtom = atom(async (): Promise<Map<string, DeprecatedEntry>> => {\n return getDeprecatedMap()\n})\n\nexport const deprecatedSkillsAtom = unwrap(deprecatedSkillsAsyncAtom, (prev) => prev ?? new Map())\n", "import { Box, Text, useInput, useStdout } from 'ink'\nimport { useAtomValue } from 'jotai'\nimport { useMemo, useState } from 'react'\n\nimport { CategoryHeader, Header, SearchInput, SkillCard, SkillDetailPanel } from '../components'\nimport { FooterBar } from '../components/FooterBar'\nimport { KeyboardShortcutsOverlay, type ShortcutEntry } from '../components/KeyboardShortcutsOverlay'\nimport { useFilter, useSkills } from '../hooks'\nimport { groupSkillsByCategory } from '../services/categories'\nimport { canShowDetailPanel } from '../services/terminal-dimensions'\nimport { colors, symbols } from '../theme'\nimport type { SkillInfo } from '../types'\n\nimport { deprecatedSkillsAtom } from '../atoms/deprecatedSkills'\nimport { installedSkillsAtom } from '../atoms/installedSkills'\nimport { selectedAgentsAtom } from '../atoms/wizard'\n\ninterface SkillBrowserProps {\n onInstall?: (selectedSkills: SkillInfo[]) => void\n onExit?: () => void\n overrideSkills?: SkillInfo[]\n readOnly?: boolean\n}\n\ntype VisualItem =\n | { type: 'header'; category: string; categoryId?: string; count: number; installedCount: number }\n | { type: 'skill'; skill: SkillInfo }\n\nconst MIN_VISIBLE = 5\nconst CHROME_LINES = 24\nconst PANEL_WIDTH_RATIO = 0.35\n\nconst getShortcuts = (readOnly: boolean): ShortcutEntry[] => {\n const common = [\n { key: '/', description: 'Filter skills' },\n { key: '\u2190/\u2192', description: 'Collapse / expand' },\n { key: 'tab/\u2192', description: 'Skill details' },\n { key: 'f', description: 'Expand / compact panel' },\n ]\n\n const exitKey = { key: 'esc', description: readOnly ? 'Exit / close panel' : 'Back / close panel' }\n\n if (readOnly) return [...common, exitKey]\n\n return [\n ...common,\n { key: 'space', description: 'Toggle / expand' },\n { key: 'enter', description: 'Install selected' },\n { key: 'ctrl+a', description: 'Select all' },\n exitKey,\n ]\n}\n\nexport const SkillBrowser = ({ onInstall, onExit, overrideSkills, readOnly = false }: SkillBrowserProps) => {\n const { skills: fetchedSkills, loading: fetching, error } = useSkills()\n const { stdout } = useStdout()\n\n const selectedAgents = useAtomValue(selectedAgentsAtom)\n const installedSkills = useAtomValue(installedSkillsAtom)\n const deprecatedMap = useAtomValue(deprecatedSkillsAtom)\n\n const skills = overrideSkills || fetchedSkills\n const loading = overrideSkills ? false : fetching\n\n const { query, setQuery, filtered } = useFilter(skills, {\n keys: ['name', 'description', 'category'],\n })\n\n const [selectedSet, setSelectedSet] = useState<Set<string>>(new Set())\n const [focusArea, setFocusArea] = useState<'search' | 'list'>('list')\n const [listIndex, setListIndex] = useState(0)\n const [offset, setOffset] = useState(0)\n const [showSearch, setShowSearch] = useState(false)\n const [showShortcuts, setShowShortcuts] = useState(false)\n const [detailSkill, setDetailSkill] = useState<SkillInfo | null>(null)\n const [drawerExpanded, setDrawerExpanded] = useState(false)\n const [expandedCategory, setExpandedCategory] = useState<string | null>(null)\n\n const canShowPanel = canShowDetailPanel()\n const terminalRows = stdout?.rows ?? 40\n const terminalCols = stdout?.columns ?? 120\n const VISIBLE_ITEMS = Math.max(MIN_VISIBLE, terminalRows - CHROME_LINES)\n const panelWidth = Math.max(30, Math.round(terminalCols * PANEL_WIDTH_RATIO))\n const contentAreaHeight = Math.max(10, terminalRows - 17)\n const isSearchExpanded = query.trim().length > 0\n\n const groupedMap = useMemo(() => groupSkillsByCategory(filtered), [filtered])\n\n useMemo(() => {\n if (query) setShowSearch(true)\n }, [query])\n\n const isCategoryExpanded = (categoryName: string) => isSearchExpanded || expandedCategory === categoryName\n\n const toggleCategory = (categoryName: string) => {\n setExpandedCategory(isCategoryExpanded(categoryName) ? null : categoryName)\n }\n\n const visualList = useMemo(() => {\n const list: VisualItem[] = []\n\n for (const [category, categorySkills] of groupedMap.entries()) {\n const installedCount = categorySkills.filter((s) => {\n const agents = installedSkills[s.name] || []\n if (selectedAgents.length > 0) return agents.some((a) => selectedAgents.includes(a))\n return agents.length > 0\n }).length\n\n list.push({\n type: 'header',\n category: category.name,\n categoryId: category.id,\n count: categorySkills.length,\n installedCount,\n })\n\n if (isCategoryExpanded(category.name)) categorySkills.forEach((skill) => list.push({ type: 'skill', skill }))\n }\n\n return list\n }, [groupedMap, expandedCategory, isSearchExpanded, installedSkills, selectedAgents])\n\n const handleToggleShortcuts = () => setShowShortcuts((prev) => !prev)\n\n const handleEscape = () => {\n if (showSearch) {\n setShowSearch(false)\n setQuery('')\n setFocusArea('list')\n return\n }\n onExit?.()\n }\n\n const handleSelectAll = () => {\n const allSkillNames = filtered.map((s) => s.name)\n setSelectedSet(selectedSet.size === allSkillNames.length ? new Set() : new Set(allSkillNames))\n }\n\n const handleSearchNavigation = (key: { downArrow?: boolean; return?: boolean }) => {\n if ((key.downArrow || key.return) && visualList.length > 0) {\n setFocusArea('list')\n setListIndex(0)\n }\n }\n\n const handleUpArrow = () => {\n if (listIndex === 0 && showSearch) {\n setFocusArea('search')\n return\n }\n\n const newIndex = Math.max(0, listIndex - 1)\n setListIndex(newIndex)\n if (newIndex < offset) setOffset(newIndex)\n }\n\n const handleDownArrow = () => {\n const newIndex = Math.min(visualList.length - 1, listIndex + 1)\n setListIndex(newIndex)\n if (newIndex >= offset + VISIBLE_ITEMS) setOffset(newIndex - VISIBLE_ITEMS + 1)\n }\n\n const handleSpaceKey = () => {\n const item = visualList[listIndex]\n\n if (item.type === 'header') {\n toggleCategory(item.category)\n return\n }\n\n if (item.type === 'skill' && !readOnly) {\n const isInstalled =\n selectedAgents.length > 0\n ? (installedSkills[item.skill.name]?.some((a) => selectedAgents.includes(a)) ?? false)\n : (installedSkills[item.skill.name]?.length ?? 0) > 0\n\n if (isInstalled && !overrideSkills) return\n\n const newSet = new Set(selectedSet)\n if (newSet.has(item.skill.name)) {\n newSet.delete(item.skill.name)\n } else {\n newSet.add(item.skill.name)\n }\n setSelectedSet(newSet)\n }\n }\n\n const handleEnterKey = () => {\n const item = visualList[listIndex]\n\n if (item.type === 'header') {\n toggleCategory(item.category)\n return\n }\n\n if (readOnly) return\n\n const selectedSkills = skills.filter((s) => selectedSet.has(s.name))\n if (selectedSkills.length > 0) onInstall?.(selectedSkills)\n }\n\n const handleTabOrRightArrow = (isTab: boolean) => {\n const item = visualList[listIndex]\n\n if (item.type === 'skill' && canShowPanel) {\n setDetailSkill(item.skill)\n setDrawerExpanded(false)\n return\n }\n\n if (!isTab && item.type === 'header' && !isCategoryExpanded(item.category)) setExpandedCategory(item.category)\n }\n\n const handleLeftArrow = () => {\n const item = visualList[listIndex]\n if (item.type === 'header' && isCategoryExpanded(item.category)) setExpandedCategory(null)\n }\n\n const isRegularCharacter = (\n input: string,\n key: {\n ctrl?: boolean\n meta?: boolean\n upArrow?: boolean\n downArrow?: boolean\n leftArrow?: boolean\n rightArrow?: boolean\n },\n ) =>\n input.length === 1 && !key.ctrl && !key.meta && !key.upArrow && !key.downArrow && !key.leftArrow && !key.rightArrow\n\n useInput(\n (input, key) => {\n if (input === '?') return handleToggleShortcuts()\n if (showShortcuts) return setShowShortcuts(false)\n if (key.escape) return handleEscape()\n\n if (!showSearch && input === '/') {\n setShowSearch(true)\n setFocusArea('search')\n return\n }\n\n if (input === 'a' && key.ctrl && !readOnly) return handleSelectAll()\n if (focusArea === 'search') return handleSearchNavigation(key)\n\n if (focusArea === 'list') {\n if (key.upArrow) return handleUpArrow()\n if (key.downArrow) return handleDownArrow()\n if (input === ' ') return handleSpaceKey()\n if (key.return) return handleEnterKey()\n if (key.tab) return handleTabOrRightArrow(true)\n if (key.rightArrow) return handleTabOrRightArrow(false)\n if (key.leftArrow) return handleLeftArrow()\n\n if (isRegularCharacter(input, key)) {\n setShowSearch(true)\n setFocusArea('search')\n setQuery(input)\n }\n }\n },\n { isActive: !detailSkill },\n )\n\n const visibleWindow = visualList.slice(offset, offset + VISIBLE_ITEMS)\n const hasItemsAbove = offset > 0\n const hasItemsBelow = offset + VISIBLE_ITEMS < visualList.length\n const scrollPercent =\n visualList.length <= VISIBLE_ITEMS ? 100 : Math.round(((offset + VISIBLE_ITEMS) / visualList.length) * 100)\n const showSkillList = !detailSkill || !drawerExpanded\n\n if (loading) {\n return (\n <Box flexDirection=\"column\" paddingX={1}>\n <Header />\n <Box flexDirection=\"column\" alignItems=\"center\" justifyContent=\"center\" paddingY={4}>\n <Text color={colors.accent}>Loading skills...</Text>\n </Box>\n </Box>\n )\n }\n\n if (error || (!loading && skills.length === 0)) {\n return (\n <Box flexDirection=\"column\" paddingX={1} minHeight={20}>\n <Header />\n <Box flexDirection=\"column\" alignItems=\"center\" justifyContent=\"center\" flexGrow={1}>\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={colors.error}\n paddingX={3}\n paddingY={2}\n alignItems=\"center\"\n >\n <Text color={colors.error} bold>\n {symbols.cross} No Skills Available\n </Text>\n <Box marginTop={1}>\n <Text color={colors.textDim}>Check your internet connection and try again</Text>\n </Box>\n {error && (\n <Box marginTop={1}>\n <Text color={colors.textMuted} dimColor>\n {error}\n </Text>\n </Box>\n )}\n </Box>\n <Box marginTop={2}>\n <Text color={colors.textDim}>\n Press{' '}\n <Text color={colors.accent} bold>\n Esc\n </Text>{' '}\n to exit\n </Text>\n </Box>\n </Box>\n </Box>\n )\n }\n\n const renderSkillListItem = (item: VisualItem, index: number) => {\n const realIndex = offset + index\n const isFocused = focusArea === 'list' && realIndex === listIndex\n\n if (item.type === 'header') {\n return (\n <Box key={`cat-${item.category}`} marginTop={index === 0 ? 0 : 1}>\n <CategoryHeader\n name={item.category}\n categoryId={item.categoryId}\n totalCount={item.count}\n installedCount={item.installedCount}\n isExpanded={isCategoryExpanded(item.category)}\n isFocused={isFocused}\n />\n </Box>\n )\n }\n\n const isSelected = selectedSet.has(item.skill.name)\n const isInstalled =\n selectedAgents.length > 0\n ? (installedSkills[item.skill.name]?.some((a) => selectedAgents.includes(a)) ?? false)\n : (installedSkills[item.skill.name]?.length ?? 0) > 0\n const isDeprecated = deprecatedMap instanceof Map && deprecatedMap.has(item.skill.name)\n const status = isDeprecated ? 'deprecated' : isInstalled ? 'installed' : null\n\n return (\n <SkillCard\n key={item.skill.name}\n name={item.skill.name}\n description={item.skill.description}\n status={status}\n selected={isSelected}\n focused={isFocused}\n readOnly={readOnly}\n />\n )\n }\n\n const renderScrollIndicator = (direction: 'up' | 'down') => (\n <Box justifyContent=\"center\" marginBottom={direction === 'up' ? 1 : 0} marginTop={direction === 'down' ? 1 : 0}>\n <Text color={colors.textDim}>\n {direction === 'up' ? symbols.arrowUp : symbols.arrowDown}{' '}\n {direction === 'up' ? symbols.arrowUp : symbols.arrowDown}{' '}\n {direction === 'up' ? symbols.arrowUp : symbols.arrowDown}\n </Text>\n </Box>\n )\n\n const renderFooterHints = () => {\n if (detailSkill) {\n return [\n { key: '\u2191/\u2193', label: 'scroll' },\n { key: 'f', label: drawerExpanded ? 'compact' : 'expand' },\n { key: 'Esc', label: 'close', color: colors.warning },\n ]\n }\n\n if (readOnly) {\n return [\n { key: '/', label: 'filter' },\n { key: 'tab', label: 'detail' },\n { key: 'esc', label: 'exit', color: colors.warning },\n { key: '?', label: 'help' },\n ]\n }\n\n return [\n { key: 'space', label: 'toggle' },\n { key: 'enter', label: 'install', color: colors.success },\n { key: '/', label: 'filter' },\n { key: 'tab', label: 'detail' },\n { key: 'esc', label: 'exit', color: colors.warning },\n { key: '?', label: 'help' },\n ]\n }\n\n const renderFooterStatus = () => {\n if (detailSkill) return undefined\n\n return (\n <>\n {!readOnly && selectedSet.size > 0 && (\n <Text>\n <Text color={colors.success} bold>\n {symbols.checkboxActive} {selectedSet.size}\n </Text>\n <Text color={colors.textDim}> selected</Text>\n </Text>\n )}\n {visualList.length > VISIBLE_ITEMS && (\n <Text color={colors.textDim}>\n {!readOnly && selectedSet.size > 0 ? ` ${symbols.dot} ` : ''}\n {scrollPercent}%\n </Text>\n )}\n </>\n )\n }\n\n return (\n <Box flexDirection=\"column\" paddingX={1} minHeight={20}>\n <Header />\n\n {showShortcuts ? (\n <Box flexDirection=\"column\" flexGrow={1} alignItems=\"center\" justifyContent=\"center\">\n <KeyboardShortcutsOverlay\n visible={showShortcuts}\n onDismiss={() => setShowShortcuts(false)}\n shortcuts={getShortcuts(readOnly)}\n />\n </Box>\n ) : (\n <Box\n flexDirection=\"row\"\n height={detailSkill ? contentAreaHeight : undefined}\n flexGrow={detailSkill ? 0 : 1}\n overflow=\"hidden\"\n >\n {showSkillList && (\n <Box key=\"skill-list\" flexDirection=\"column\" flexGrow={1} flexShrink={1}>\n {showSearch && (\n <Box marginBottom={1}>\n <SearchInput\n query={query}\n onChange={(q) => {\n setQuery(q)\n setListIndex(0)\n setOffset(0)\n }}\n total={skills.length}\n filtered={filtered.length}\n isLoading={loading}\n focus={focusArea === 'search'}\n />\n </Box>\n )}\n\n <Box flexDirection=\"column\" flexGrow={1}>\n {hasItemsAbove && renderScrollIndicator('up')}\n {visibleWindow.map(renderSkillListItem)}\n {hasItemsBelow && renderScrollIndicator('down')}\n {visualList.length === 0 && (\n <Box paddingY={1}>\n <Text color={colors.textMuted}>No skills match \"{query}\"</Text>\n </Box>\n )}\n </Box>\n </Box>\n )}\n\n {detailSkill && (\n <Box\n key=\"detail-panel\"\n flexDirection=\"column\"\n width={drawerExpanded ? undefined : panelWidth}\n flexGrow={drawerExpanded ? 1 : 0}\n flexShrink={0}\n >\n <SkillDetailPanel\n skill={detailSkill}\n expanded={drawerExpanded}\n onClose={() => {\n setDetailSkill(null)\n setDrawerExpanded(false)\n }}\n onToggleExpand={() => setDrawerExpanded((prev) => !prev)}\n />\n </Box>\n )}\n </Box>\n )}\n\n <FooterBar hints={renderFooterHints()} status={renderFooterStatus()} />\n </Box>\n )\n}\n", "import { Box, Text } from 'ink'\nimport { useMemo } from 'react'\n\nimport { formatCategoryBadge } from '../services/badge-format'\nimport { colors, symbols } from '../theme'\n\ninterface CategoryHeaderProps {\n name: string\n categoryId?: string\n totalCount: number\n installedCount?: number\n isExpanded?: boolean\n isFocused?: boolean\n}\n\nexport const CategoryHeader = ({\n name,\n totalCount,\n installedCount = 0,\n isExpanded = false,\n isFocused = false,\n}: CategoryHeaderProps) => {\n const badge = useMemo(() => formatCategoryBadge(installedCount, totalCount), [installedCount, totalCount])\n const chevron = isExpanded ? '\\u25BE' : '\\u25B8'\n\n return (\n <Box>\n <Box width={2}>{isFocused ? <Text color={colors.accent}>{symbols.bullet}</Text> : <Text> </Text>}</Box>\n <Text color={isFocused ? colors.accent : colors.primaryLight} bold>\n {chevron}{' '}\n </Text>\n <Text color={isFocused ? colors.accent : colors.text} bold>\n {name}\n </Text>\n <Text color={installedCount > 0 ? colors.success : colors.textMuted}> {badge}</Text>\n {!isExpanded && isFocused && <Text color={colors.textDim}> {symbols.dot} press space to expand</Text>}\n </Box>\n )\n}\n", "export function formatCategoryBadge(installed: number, total: number): string {\n if (installed > 0) return `(${installed}/${total})`\n return `(${total})`\n}\n", "import { Box, Text, useInput } from 'ink'\nimport { useState } from 'react'\n\nimport { colors, symbols } from '../theme'\n\ninterface ConfirmPromptProps {\n message: string\n initialValue?: boolean\n onSubmit: (value: boolean) => void\n}\n\nexport const ConfirmPrompt = ({ message, initialValue = false, onSubmit }: ConfirmPromptProps) => {\n const [value, setValue] = useState(initialValue)\n\n useInput((input, key) => {\n if (key.leftArrow || key.rightArrow || input === 'y' || input === 'n') setValue((prev) => !prev)\n if (key.return) onSubmit(value)\n })\n\n return (\n <Box flexDirection=\"column\" marginTop={1}>\n <Text bold>{message}</Text>\n <Box marginTop={1}>\n <Text color={value ? colors.success : colors.textMuted} bold={value}>\n {value ? symbols.radioActive : symbols.radioInactive} Yes\n </Text>\n <Box width={2} />\n <Text color={!value ? colors.error : colors.textMuted} bold={!value}>\n {!value ? symbols.radioActive : symbols.radioInactive} No\n </Text>\n </Box>\n </Box>\n )\n}\n", "import { Box, Text } from 'ink'\nimport TextInput from 'ink-text-input'\n\nimport { colors } from '../theme'\n\ninterface SearchInputProps {\n query: string\n onChange: (query: string) => void\n total: number\n filtered: number\n isLoading?: boolean\n focus?: boolean\n}\n\nexport const SearchInput = ({\n query,\n onChange,\n total,\n filtered,\n isLoading = false,\n focus = true,\n}: SearchInputProps) => {\n return (\n <Box borderStyle=\"round\" borderColor={focus ? colors.accent : colors.border} paddingX={1}>\n <Box marginRight={1}>\n <Text>\uD83D\uDD0D</Text>\n </Box>\n <Box flexGrow={1}>\n <TextInput value={query} onChange={onChange} placeholder=\"Type to filter skills...\" focus={focus} />\n </Box>\n <Box marginLeft={1}>\n <Text color={colors.textDim}>{isLoading ? 'Loading...' : `${filtered}/${total} skills`}</Text>\n </Box>\n </Box>\n )\n}\n", "import { Box, Text } from 'ink'\n\nimport { colors } from '../theme/colors'\nimport { symbols } from '../theme/symbols'\nimport { StatusBadge, type StatusType } from './StatusBadge'\n\nexport interface SkillCardProps {\n name: string\n description: string\n status?: StatusType | null\n selected?: boolean\n focused?: boolean\n readOnly?: boolean\n}\n\nexport function SkillCard({\n name,\n description,\n status,\n selected = false,\n focused = false,\n readOnly = false,\n}: SkillCardProps) {\n const isInstalled = status === 'installed'\n\n const checkbox = isInstalled ? symbols.checkboxActive : selected ? symbols.checkboxActive : symbols.checkboxInactive\n const checkboxColor = isInstalled ? colors.textMuted : selected ? colors.success : colors.textMuted\n\n const pointer = focused ? symbols.bullet : ' '\n const pointerColor = isInstalled ? colors.textMuted : selected ? colors.success : colors.accent\n const nameColor = isInstalled\n ? colors.textDim\n : focused\n ? colors.primary\n : selected\n ? colors.primaryLight\n : colors.text\n const descColor = colors.textMuted\n const bgColor = focused ? colors.bgLight : undefined\n\n return (\n <Box flexDirection=\"column\" backgroundColor={bgColor}>\n <Box>\n <Box width={2} flexShrink={0}>\n <Text color={pointerColor}>{pointer}</Text>\n </Box>\n\n {!readOnly && (\n <Box width={2} flexShrink={0}>\n <Text color={checkboxColor}>{checkbox}</Text>\n </Box>\n )}\n\n <Box flexGrow={1}>\n <Text bold color={nameColor}>\n {name}\n </Text>\n </Box>\n\n {status && (\n <Box marginLeft={1} flexShrink={0}>\n <StatusBadge status={status} />\n </Box>\n )}\n </Box>\n\n <Box paddingLeft={readOnly ? 2 : 4}>\n <Text color={descColor} wrap=\"truncate\">\n {description}\n </Text>\n </Box>\n </Box>\n )\n}\n", "import { Box, Text } from 'ink'\n\nimport { colors } from '../theme/colors'\nimport { symbols } from '../theme/symbols'\n\nexport type StatusType = 'installed' | 'update' | 'new' | 'deprecated'\n\nexport interface StatusBadgeProps {\n status: StatusType\n}\n\nconst badgeConfig = {\n installed: { icon: symbols.check, label: 'installed', color: colors.success, bg: '#052e16' },\n update: { icon: symbols.arrowUp, label: 'update', color: colors.warning, bg: '#422006' },\n new: { icon: symbols.sparkle, label: 'new', color: colors.accent, bg: '#083344' },\n deprecated: { icon: symbols.warning, label: 'deprecated', color: colors.warning, bg: '#422006' },\n} as const\n\nexport function StatusBadge({ status }: StatusBadgeProps) {\n const config = badgeConfig[status]\n if (!config) return null\n\n return (\n <Box>\n <Text backgroundColor={config.bg} color={config.color}>\n {' '}\n {config.icon} {config.label}{' '}\n </Text>\n </Box>\n )\n}\n\nexport interface AgentBadgeProps {\n agents: string[]\n}\n\nexport function AgentBadge({ agents }: AgentBadgeProps) {\n if (!agents || agents.length === 0) return null\n\n return (\n <Text color={colors.textDim}>\n <Text color={colors.success}>{symbols.check}</Text> {agents.join(', ')}\n </Text>\n )\n}\n", "import chalk from 'chalk'\nimport { Box, Text, useInput, useStdout } from 'ink'\nimport Spinner from 'ink-spinner'\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'\n\nimport { useSkillContent } from '../hooks/useSkillContent'\nimport { getColorForCategory } from '../services/category-colors'\nimport { parseMarkdown, type MarkdownToken } from '../services/markdown-parser'\nimport { colors, symbols } from '../theme'\nimport type { SkillInfo } from '../types'\n\nexport interface SkillDetailPanelProps {\n skill: SkillInfo | null\n expanded?: boolean\n onClose: () => void\n onToggleExpand?: () => void\n}\n\nconst FIXED_HEADER_LINES = 6\nconst BORDER_LINES = 2\nconst INDICATOR_LINES = 2\n\nconst fmt = {\n h1: (s: string) => chalk.hex(colors.primary).bold(s),\n h2: (s: string) => chalk.hex(colors.primaryLight).bold(s),\n h3: (s: string) => chalk.hex(colors.accent).bold(s),\n text: (s: string) => chalk.hex(colors.textDim)(s),\n muted: (s: string) => chalk.hex(colors.textMuted)(s),\n code: (s: string) => chalk.hex(colors.accent)(s),\n border: (s: string) => chalk.hex(colors.border)(s),\n bold: (s: string) => chalk.hex(colors.text).bold(s),\n dim: (s: string) => chalk.dim(s),\n indicator: (s: string) => chalk.hex(colors.textDim)(s),\n}\n\nfunction formatInline(text: string): string {\n return text\n .replace(/\\*\\*(.+?)\\*\\*/g, (_, t) => fmt.bold(t))\n .replace(/\\*(.+?)\\*/g, (_, t) => fmt.dim(t))\n .replace(/`(.+?)`/g, (_, t) => fmt.code(t))\n}\n\nfunction tokensToLines(tokens: MarkdownToken[]): string[] {\n const lines: string[] = []\n for (const token of tokens) {\n switch (token.type) {\n case 'heading': {\n const sym = token.level === 1 ? symbols.diamond : token.level === 2 ? symbols.arrow : symbols.dot\n const colorFn = token.level === 1 ? fmt.h1 : token.level === 2 ? fmt.h2 : fmt.h3\n if (token.level === 1 && lines.length > 0) lines.push('')\n lines.push(colorFn(`${sym} ${token.text}`))\n break\n }\n case 'paragraph':\n lines.push(fmt.text(formatInline(token.text)))\n break\n case 'list-item': {\n const indent = ' '.repeat(token.indent)\n lines.push(`${indent}${fmt.muted(symbols.bullet)} ${fmt.text(formatInline(token.text))}`)\n break\n }\n case 'code-block':\n if (token.language) lines.push(fmt.dim(` ${token.language}`))\n for (const line of token.lines) {\n lines.push(` ${fmt.border(symbols.bar)} ${fmt.code(line)}`)\n }\n break\n case 'hr':\n lines.push(fmt.border('\u2500'.repeat(30)))\n break\n case 'blank':\n lines.push('')\n break\n }\n }\n return lines\n}\n\nconst MetadataHeader = React.memo(\n ({ skill, metadata }: { skill: SkillInfo; metadata: { author?: string; files: string[] } | null }) => {\n const categoryColor = getColorForCategory(skill.category ?? 'default')\n const author = metadata?.author ? ` ${symbols.dot} @${metadata.author}` : ''\n const files = metadata?.files?.length\n ? ` ${symbols.dot} ${metadata.files.length} file${metadata.files.length !== 1 ? 's' : ''}`\n : ''\n\n return (\n <Box flexDirection=\"column\" marginBottom={1}>\n <Text bold color={colors.text}>\n {symbols.sparkle} {skill.name}\n </Text>\n <Text>\n <Text color={categoryColor} bold>\n {skill.category}\n </Text>\n <Text color={colors.textDim}>\n {author}\n {files}\n </Text>\n </Text>\n <Text color={colors.textDim} wrap=\"truncate\">\n {skill.description}\n </Text>\n </Box>\n )\n },\n)\nMetadataHeader.displayName = 'MetadataHeader'\n\nexport const SkillDetailPanel = React.memo(\n ({ skill, expanded = false, onClose, onToggleExpand }: SkillDetailPanelProps) => {\n const { metadata, content, loading, error } = useSkillContent(skill?.name ?? null)\n const { stdout } = useStdout()\n const [scrollOffset, setScrollOffset] = useState(0)\n\n const terminalRows = stdout?.rows ?? 24\n const formattedLines = useMemo(() => (content ? tokensToLines(parseMarkdown(content)) : []), [content])\n\n const containerHeight = Math.max(10, terminalRows - 17)\n const scrollAreaHeight = Math.max(3, containerHeight - FIXED_HEADER_LINES - BORDER_LINES)\n const contentVisibleLines = Math.max(1, scrollAreaHeight - INDICATOR_LINES)\n\n const maxScroll = Math.max(0, formattedLines.length - contentVisibleLines)\n const canScroll = maxScroll > 0\n\n const scrollPercent = canScroll\n ? Math.round(((scrollOffset + contentVisibleLines) / formattedLines.length) * 100)\n : 100\n\n const maxScrollRef = useRef(maxScroll)\n maxScrollRef.current = maxScroll\n const onCloseRef = useRef(onClose)\n onCloseRef.current = onClose\n const onToggleExpandRef = useRef(onToggleExpand)\n onToggleExpandRef.current = onToggleExpand\n\n const handleInput = useCallback(\n (\n input: string,\n key: { upArrow: boolean; downArrow: boolean; escape: boolean; tab: boolean; leftArrow: boolean },\n ) => {\n if (key.upArrow) {\n setScrollOffset((prev) => Math.max(0, prev - 1))\n } else if (key.downArrow) {\n setScrollOffset((prev) => Math.min(maxScrollRef.current, prev + 1))\n } else if (input === 'f') {\n onToggleExpandRef.current?.()\n } else if (key.escape || key.tab || key.leftArrow) {\n onCloseRef.current()\n }\n },\n [],\n )\n\n useInput(handleInput)\n\n useEffect(() => {\n setScrollOffset(0)\n }, [skill?.name])\n\n if (!skill) return null\n\n const hasAbove = scrollOffset > 0\n const hasMore = scrollOffset + contentVisibleLines < formattedLines.length\n const visibleSlice = formattedLines.slice(scrollOffset, scrollOffset + contentVisibleLines)\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor={colors.accent} paddingX={1} flexGrow={1}>\n <Box>\n <Text bold color={colors.accent}>\n {symbols.info} Skill Details\n </Text>\n <Box flexGrow={1} />\n <Text color={colors.textMuted}>\n {canScroll && (\n <Text color={colors.textDim}>\n {scrollPercent}% {symbols.dot}{' '}\n </Text>\n )}\n <Text color={colors.accent} bold>\n \u2191\u2193\n </Text>{' '}\n scroll {symbols.dot}{' '}\n <Text color={colors.accent} bold>\n f\n </Text>{' '}\n {expanded ? 'compact' : 'expand'} {symbols.dot}{' '}\n <Text color={colors.accent} bold>\n Esc\n </Text>{' '}\n close\n </Text>\n </Box>\n\n <Text color={colors.border} wrap=\"truncate\">\n {'\u2500'.repeat(200)}\n </Text>\n\n {loading ? (\n <Box alignItems=\"center\" justifyContent=\"center\" flexGrow={1}>\n <Text color={colors.accent}>\n <Spinner type=\"dots\" /> Loading\u2026\n </Text>\n </Box>\n ) : error ? (\n <Box alignItems=\"center\" justifyContent=\"center\" flexGrow={1}>\n <Text color={colors.error}>\n {symbols.cross} {error}\n </Text>\n </Box>\n ) : (\n <>\n <MetadataHeader skill={skill} metadata={metadata} />\n\n <Box flexDirection=\"column\" height={scrollAreaHeight} overflowY=\"hidden\">\n {hasAbove && (\n <Text color={colors.textDim}>{` ${symbols.arrowUp} ${symbols.arrowUp} ${symbols.arrowUp}`}</Text>\n )}\n <Text>{visibleSlice.join('\\n')}</Text>\n {hasMore && (\n <Text color={colors.textDim}>\n {` ${symbols.arrowDown} ${symbols.arrowDown} ${symbols.arrowDown}`}\n </Text>\n )}\n </Box>\n </>\n )}\n </Box>\n )\n },\n)\n\nSkillDetailPanel.displayName = 'SkillDetailPanel'\n", "export const categoryColors: Record<string, string> = {\n web: '#3b82f6',\n devops: '#10b981',\n data: '#8b5cf6',\n mobile: '#f59e0b',\n testing: '#ef4444',\n ai: '#06b6d4',\n security: '#ec4899',\n default: '#64748b',\n} as const\n\nexport function getColorForCategory(categoryId: string): string {\n if (Object.prototype.hasOwnProperty.call(categoryColors, categoryId)) return categoryColors[categoryId]\n return categoryColors.default\n}\n\nexport function getAllCategoryColors(): Record<string, string> {\n return { ...categoryColors }\n}\n", "export type MarkdownToken =\n | { type: 'heading'; level: 1 | 2 | 3; text: string }\n | { type: 'paragraph'; text: string }\n | { type: 'list-item'; text: string; indent: number }\n | { type: 'code-block'; language: string; lines: string[] }\n | { type: 'hr' }\n | { type: 'blank' }\n\nfunction stripFrontmatter(raw: string): string {\n if (!raw.startsWith('---')) return raw\n const endIndex = raw.indexOf('---', 3)\n if (endIndex === -1) return raw\n return raw.slice(endIndex + 3).trimStart()\n}\n\nexport function parseMarkdown(raw: string): MarkdownToken[] {\n const body = stripFrontmatter(raw)\n const lines = body.split('\\n')\n const tokens: MarkdownToken[] = []\n\n let i = 0\n while (i < lines.length) {\n const line = lines[i]\n\n if (line.startsWith('```')) {\n const language = line.slice(3).trim()\n const codeLines: string[] = []\n i++\n while (i < lines.length && !lines[i].startsWith('```')) {\n codeLines.push(lines[i])\n i++\n }\n tokens.push({ type: 'code-block', language, lines: codeLines })\n i++\n continue\n }\n\n if (line.trim() === '') {\n tokens.push({ type: 'blank' })\n i++\n continue\n }\n\n if (/^(-{3,}|_{3,}|\\*{3,})$/.test(line.trim())) {\n tokens.push({ type: 'hr' })\n i++\n continue\n }\n\n const headingMatch = line.match(/^(#{1,3})\\s+(.+)$/)\n if (headingMatch) {\n tokens.push({\n type: 'heading',\n level: headingMatch[1].length as 1 | 2 | 3,\n text: headingMatch[2],\n })\n i++\n continue\n }\n\n const listMatch = line.match(/^(\\s*)([-*]|\\d+\\.)\\s+(.+)$/)\n\n if (listMatch) {\n const indent = Math.floor(listMatch[1].length / 2)\n tokens.push({ type: 'list-item', text: listMatch[3], indent })\n i++\n continue\n }\n\n tokens.push({ type: 'paragraph', text: line })\n i++\n }\n\n return tokens\n}\n\nexport interface InlineSegment {\n text: string\n bold?: boolean\n italic?: boolean\n code?: boolean\n}\n\nexport function parseInline(text: string): InlineSegment[] {\n const segments: InlineSegment[] = []\n const regex = /(`[^`]+`|\\*\\*[^*]+\\*\\*|\\*[^*]+\\*)/g\n let lastIndex = 0\n let match: RegExpExecArray | null\n\n while ((match = regex.exec(text)) !== null) {\n if (match.index > lastIndex) segments.push({ text: text.slice(lastIndex, match.index) })\n const token = match[0]\n\n if (token.startsWith('`')) {\n segments.push({ text: token.slice(1, -1), code: true })\n } else if (token.startsWith('**')) {\n segments.push({ text: token.slice(2, -2), bold: true })\n } else if (token.startsWith('*')) {\n segments.push({ text: token.slice(1, -1), italic: true })\n }\n\n lastIndex = match.index + token.length\n }\n\n if (lastIndex < text.length) segments.push({ text: text.slice(lastIndex) })\n if (segments.length === 0) segments.push({ text })\n return segments\n}\n", "export interface TerminalSize {\n width: number\n height: number\n}\n\nexport function getTerminalSize(): TerminalSize {\n return { width: process.stdout.columns || 80, height: process.stdout.rows || 24 }\n}\n\nexport function shouldUseBottomPanel(): boolean {\n const { width } = getTerminalSize()\n return width < 120\n}\n\nexport function canShowDetailPanel(): boolean {\n const { width, height } = getTerminalSize()\n return width >= 80 && height >= 24\n}\n", "import { Box, Text, useInput } from 'ink'\nimport Spinner from 'ink-spinner'\nimport { useAtomValue } from 'jotai'\nimport { useEffect, useMemo, useState } from 'react'\n\nimport { deprecatedSkillsAtom } from '../atoms/deprecatedSkills'\nimport { installedSkillsAtom } from '../atoms/installedSkills'\nimport { Header } from '../components/Header'\nimport { InstallResults } from '../components/InstallResults'\nimport { MultiSelectPrompt } from '../components/MultiSelectPrompt'\nimport { useInstaller } from '../hooks/useInstaller'\nimport { useSkills } from '../hooks/useSkills'\nimport { getUpdatableSkills } from '../services/registry'\nimport { colors, symbols } from '../theme'\nimport type { AgentType, DeprecatedEntry, SkillInfo } from '../types'\nimport { AgentSelector } from './AgentSelector'\n\nexport function UpdateView({ selectedAgents, onExit }: { selectedAgents?: AgentType[]; onExit: () => void }) {\n const [checkingUpdates, setCheckingUpdates] = useState(false)\n const [updateCheckComplete, setUpdateCheckComplete] = useState(false)\n const [installComplete, setInstallComplete] = useState(false)\n const [internalAgents, setInternalAgents] = useState<AgentType[]>(selectedAgents || [])\n const [showAgentSelect, setShowAgentSelect] = useState(!selectedAgents)\n const [updatableSkills, setUpdatableSkills] = useState<SkillInfo[]>([])\n const { install, progress, results, installing } = useInstaller()\n const installedSkills = useAtomValue(installedSkillsAtom)\n const deprecatedMap = useAtomValue(deprecatedSkillsAtom)\n const { skills, loading: loadingSkills } = useSkills()\n\n const activeAgents = selectedAgents || internalAgents\n\n const installedList = useMemo(() => {\n if (loadingSkills) return []\n const installedNames = new Set(Object.keys(installedSkills))\n\n return skills.filter((s) => {\n if (!installedNames.has(s.name)) return false\n const agents = installedSkills[s.name] || []\n return agents.some((a: AgentType) => activeAgents.includes(a))\n })\n }, [installedSkills, skills, loadingSkills, activeAgents])\n\n const deprecatedInstalled = useMemo(() => {\n if (loadingSkills || !(deprecatedMap instanceof Map) || deprecatedMap.size === 0) return []\n const installedNames = new Set(Object.keys(installedSkills))\n const registryNames = new Set(skills.map((s) => s.name))\n\n const result: { name: string; entry?: DeprecatedEntry }[] = []\n\n for (const name of installedNames) {\n if (deprecatedMap.has(name)) result.push({ name, entry: deprecatedMap.get(name) })\n else if (!registryNames.has(name)) result.push({ name })\n }\n\n return result\n }, [installedSkills, skills, loadingSkills, deprecatedMap])\n\n useEffect(() => {\n if (installedList.length === 0) {\n setCheckingUpdates(false)\n setUpdateCheckComplete(true)\n return\n }\n\n setCheckingUpdates(true)\n const checkUpdates = async () => {\n const installedNames = installedList.map((s) => s.name)\n const { toUpdate } = await getUpdatableSkills(installedNames)\n const skillsToUpdate = installedList.filter((s) => toUpdate.includes(s.name))\n setUpdatableSkills(skillsToUpdate)\n setCheckingUpdates(false)\n setUpdateCheckComplete(true)\n }\n\n checkUpdates()\n }, [installedList])\n\n useInput((_, key) => {\n if (\n key.escape &&\n !installing &&\n !installComplete &&\n !checkingUpdates &&\n updateCheckComplete &&\n updatableSkills.length === 0\n ) {\n onExit()\n }\n })\n\n if (showAgentSelect) {\n return (\n <AgentSelector\n onSelect={(agents) => {\n setInternalAgents(agents)\n setShowAgentSelect(false)\n }}\n onBack={onExit}\n />\n )\n }\n\n const handleUpdate = async (selectedSkills: SkillInfo[]) => {\n if (selectedSkills.length === 0) return\n\n const involvedAgents = new Set<AgentType>()\n selectedSkills.forEach((s) => {\n const agents = installedSkills[s.name] || []\n agents.forEach((a: AgentType) => {\n if (activeAgents.includes(a)) involvedAgents.add(a)\n })\n })\n\n await install(selectedSkills, {\n agents: Array.from(involvedAgents),\n method: 'copy',\n global: false,\n skills: selectedSkills.map((s) => s.name),\n isUpdate: true,\n })\n setInstallComplete(true)\n }\n\n if (installComplete) {\n return (\n <InstallResults results={results} onExit={onExit} title=\"Skills Updated Successfully\" successLabel=\"updated\" />\n )\n }\n\n if (installing) {\n return (\n <Box flexDirection=\"column\" paddingX={1}>\n <Header />\n <Box marginTop={1}>\n <Text color={colors.accent}>\n <Spinner type=\"dots\" />{' '}\n </Text>\n <Text>Updating skills...</Text>\n </Box>\n <Box marginTop={1} paddingX={2}>\n <Text color={colors.textDim}>\n {symbols.arrow} {progress.skill} ({progress.current}/{progress.total})\n </Text>\n </Box>\n </Box>\n )\n }\n\n if (loadingSkills || checkingUpdates) {\n return (\n <Box flexDirection=\"column\" paddingX={1}>\n <Header />\n <Box marginTop={1}>\n <Text color={colors.accent}>\n <Spinner type=\"dots\" /> {checkingUpdates ? 'Checking for updates...' : 'Loading...'}\n </Text>\n </Box>\n </Box>\n )\n }\n\n if (updateCheckComplete && updatableSkills.length === 0) {\n return (\n <Box flexDirection=\"column\" paddingX={1}>\n <Header />\n <Box borderStyle=\"round\" borderColor={colors.success} paddingX={2} paddingY={1}>\n <Text color={colors.success}>{symbols.check} All installed skills are up to date!</Text>\n </Box>\n\n {deprecatedInstalled.length > 0 && (\n <Box\n flexDirection=\"column\"\n marginTop={1}\n borderStyle=\"round\"\n borderColor={colors.warning}\n paddingX={2}\n paddingY={1}\n >\n <Box marginBottom={1}>\n <Text color={colors.warning} bold>\n {symbols.warning} {deprecatedInstalled.length} deprecated skill\n {deprecatedInstalled.length > 1 ? 's' : ''} detected:\n </Text>\n </Box>\n {deprecatedInstalled.map((d) => (\n <Box key={d.name} flexDirection=\"column\" paddingX={1} marginBottom={1}>\n <Text color={colors.warning}>\n {symbols.arrow} {d.name}\n </Text>\n {d.entry?.message && <Text color={colors.textDim}> {d.entry.message}</Text>}\n {!d.entry && <Text color={colors.textDim}> No longer available in the registry</Text>}\n {d.entry?.alternatives && d.entry.alternatives.length > 0 && (\n <Text color={colors.textDim}>\n {' '}Try: ai-tools skills install --skill {d.entry.alternatives.join(', ')}\n </Text>\n )}\n </Box>\n ))}\n <Text color={colors.textMuted}>Run: ai-tools skills remove --skill {'<name>'} to clean up</Text>\n </Box>\n )}\n\n <Box marginTop={1} borderStyle=\"round\" borderColor={colors.border} paddingX={1}>\n <Text>\n <Text color={colors.warning} bold>\n esc\n </Text>\n <Text color={colors.textDim}> exit</Text>\n </Text>\n </Box>\n </Box>\n )\n }\n\n return (\n <UpdateSelector\n skills={updatableSkills}\n installedSkills={installedSkills}\n selectedAgents={activeAgents}\n onUpdate={handleUpdate}\n onExit={onExit}\n />\n )\n}\n\nfunction UpdateSelector({\n skills,\n installedSkills,\n selectedAgents,\n onUpdate,\n onExit,\n}: {\n skills: SkillInfo[]\n installedSkills: Record<string, AgentType[]>\n selectedAgents: AgentType[]\n onUpdate: (skills: SkillInfo[]) => void\n onExit: () => void\n}) {\n const items = skills.map((s) => {\n const allAgents = installedSkills[s.name] || []\n const filteredAgents = allAgents.filter((a) => selectedAgents.includes(a))\n return {\n label: s.name,\n value: s.name,\n hint: `${filteredAgents.length} agent${filteredAgents.length > 1 ? 's' : ''}: ${filteredAgents.join(', ')}`,\n }\n })\n\n const allValues = skills.map((s) => s.name)\n\n const handleSubmit = (selectedNames: string[]) => {\n const selectedSkills = skills.filter((s) => selectedNames.includes(s.name))\n onUpdate(selectedSkills)\n }\n\n return (\n <Box flexDirection=\"column\" paddingX={1}>\n <Header />\n <Box marginBottom={1}>\n <Text bold color={colors.primary}>\n {symbols.diamond} Select skills to update:\n </Text>\n </Box>\n <Box marginBottom={1}>\n <Text color={colors.textDim}>\n {skills.length} installed skill{skills.length > 1 ? 's' : ''} found {symbols.dot} all pre-selected\n </Text>\n </Box>\n <MultiSelectPrompt items={items} initialSelected={allValues} onSubmit={handleSubmit} onCancel={onExit} />\n </Box>\n )\n}\n", "import { Box, Text } from 'ink'\nimport { useAtomValue } from 'jotai'\nimport { useMemo } from 'react'\n\nimport { installedSkillsAtom } from '../atoms/installedSkills'\nimport { Header } from '../components/Header'\nimport { useSkills } from '../hooks/useSkills'\nimport { colors } from '../theme'\nimport { SkillBrowser } from './SkillBrowser'\n\nexport function ListView({ onExit }: { onExit: () => void }) {\n const installedSkills = useAtomValue(installedSkillsAtom)\n const { skills, loading: loadingSkills } = useSkills()\n\n const installedList = useMemo(() => {\n if (loadingSkills) return []\n const installedNames = new Set(Object.keys(installedSkills))\n return skills.filter((s) => installedNames.has(s.name))\n }, [installedSkills, skills, loadingSkills])\n\n if (loadingSkills) {\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Header />\n <Text>Loading...</Text>\n </Box>\n )\n }\n\n if (installedList.length === 0) {\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Header />\n <Text color={colors.warning}>No skills installed.</Text>\n <Text color={colors.textDim}>(Press any key to exit)</Text>\n </Box>\n )\n }\n\n return <SkillBrowser onExit={onExit} readOnly={true} overrideSkills={installedList} />\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["existsSync", "dirname", "join", "parse", "resolve", "findProjectRoot", "startDir", "currentDir", "root", "init_project_root", "__esmMin", "existsSync", "readdirSync", "homedir", "join", "detectInstalledAgents", "agents", "config", "type", "getAgentConfig", "getAllAgentTypes", "a", "b", "home", "projectRoot", "isExtensionInstalled", "init_agents", "__esmMin", "init_project_root", "findProjectRoot", "publisher", "name", "extensionsDirs", "dir", "e", "PACKAGE_NAME", "SKILLS_CATALOG_PACKAGE", "CONFIG_DIR", "CACHE_FILE", "SKILL_META_FILE", "AGENTS_DIR", "CANONICAL_SKILLS_DIR", "LOCK_FILE", "LOCK_FILE_BACKUP", "GLOBAL_CONFIG_DIR", "AUDIT_LOG_FILE", "CACHE_BASE_DIR", "CACHE_NAMESPACE", "SKILLS_SUBDIR", "REGISTRY_CACHE_FILENAME", "MESSAGES", "init_constants", "__esmMin", "current", "update", "appendFile", "mkdir", "readFile", "homedir", "join", "getAuditLogPath", "baseDir", "GLOBAL_CONFIG_DIR", "AUDIT_LOG_FILE", "logAudit", "entry", "logPath", "logDir", "logLine", "readAuditLog", "limit", "entries", "line", "init_audit_log", "__esmMin", "init_constants", "execSync", "existsSync", "join", "getNpmGlobalRoot", "isGloballyInstalled", "npmGlobalRoot", "packagePath", "PACKAGE_NAME", "init_global_path", "__esmMin", "init_constants", "DEFAULT_CATEGORY_ID", "CATEGORY_FOLDER_PATTERN", "CATEGORY_METADATA_FILE", "DEFAULT_CATEGORY", "init_constants", "__esmMin", "AGENT_TYPES", "init_types", "__esmMin", "formatCategoryName", "categoryId", "word", "init_utils", "__esmMin", "init_src", "__esmMin", "init_constants", "init_types", "init_utils", "lockfile_exports", "__export", "addSkillToLock", "getAllLockedSkills", "getSkillFromLock", "readSkillLock", "removeSkillFromLock", "writeSkillLock", "mkdir", "readFile", "rename", "unlink", "writeFile", "homedir", "dirname", "join", "z", "getSkillLockPath", "global", "AGENTS_DIR", "LOCK_FILE", "projectRoot", "findProjectRoot", "getBackupPath", "LOCK_FILE_BACKUP", "createEmptyLockFile", "CURRENT_VERSION", "migrateLockFile", "data", "parsed", "SkillLockFileSchema", "key", "entry", "lockPath", "content", "lock", "backupPath", "tempPath", "existing", "error", "skillName", "agents", "options", "now", "existingEntry", "AgentTypeSchema", "SkillLockEntrySchema", "init_lockfile", "__esmMin", "init_src", "init_constants", "init_project_root", "AGENT_TYPES", "ky", "existsSync", "mkdirSync", "readFileSync", "rmSync", "writeFileSync", "homedir", "join", "packageJson", "ensureCacheDir", "PATHS", "isCacheValid", "fetchedAt", "CONFIG", "tryReadCachedRegistry", "content", "saveRegistryToCache", "registry", "cached", "fetchWithFallback", "url", "fallbackUrl", "httpClient", "error", "getResolvedCdnRef", "cachedCdnRef", "SKILLS_CATALOG_PACKAGE", "buildUrls", "cdnRef", "cdnBase", "fallbackCdnBase", "fetchRegistry", "forceRefresh", "resolvedRef", "versionChanged", "urls", "sanitizeName", "name", "UNSAFE_PATH_PATTERNS", "result", "pattern", "isPathSafe", "basePath", "targetPath", "resolvedBase", "getSkillCachePath", "skillName", "safeName", "isSkillCached", "skillPath", "saveCachedSkillMeta", "meta", "metaPath", "SKILL_META_FILE", "readCachedSkillMeta", "needsUpdate", "metadata", "getSkillMetadata", "getCachedContentHash", "getUpdatableSkills", "skillNames", "toUpdate", "upToDate", "downloadSkillFile", "skill", "file", "skillCachePath", "filePath", "parentDir", "fileUrl", "response", "downloadSkill", "files", "downloadedCount", "batch", "results", "getRemoteSkills", "s", "getDeprecatedSkills", "getDeprecatedMap", "deprecated", "d", "ensureSkillDownloaded", "clearCache", "clearSkillCache", "clearRegistryCache", "forceDownloadSkill", "getCacheDir", "init_registry", "__esmMin", "init_constants", "CACHE_BASE_DIR", "CACHE_NAMESPACE", "REGISTRY_CACHE_FILENAME", "SKILLS_SUBDIR", "attemptCount", "cp", "lstat", "mkdir", "readdir", "readlink", "rm", "symlink", "homedir", "platform", "join", "normalize", "relative", "resolve", "sep", "CANONICAL_SKILLS_PATH", "sanitizeName", "isPathSafe", "createSymlink", "cleanExistingPath", "validateSymlinkTarget", "copySkillDirectory", "getInstallMode", "createSuccessResult", "createErrorResult", "installHandlers", "validatePath", "installSkillForAgent", "installSkills", "listInstalledSkills", "getCanonicalPath", "removeSkill", "init_installer", "__esmMin", "init_constants", "init_agents", "init_audit_log", "init_global_path", "init_lockfile", "init_project_root", "init_registry", "AGENTS_DIR", "CANONICAL_SKILLS_DIR", "name", "basePath", "targetPath", "normalizedBase", "normalizedTarget", "target", "linkPath", "relativePath", "type", "existingTarget", "err", "baseDir", "resolvedTarget", "src", "dest", "method", "global", "ctx", "extras", "error", "canonicalDir", "targetDir", "skillTargetPath", "projectRoot", "skill", "agent", "config", "getAgentConfig", "safeSkillName", "validationError", "mode", "skills", "options", "findProjectRoot", "results", "result", "addSkillToLock", "getCachedContentHash", "logAudit", "s", "a", "r", "e", "skillName", "canonicalPath", "agents", "lockEntry", "getSkillFromLock", "localPath", "globalPath", "pathsToTry", "removed", "lastError", "path", "removeSkillFromLock", "install_exports", "__export", "runCliInstall", "chalk", "downloadSkills", "skillNames", "forceDownload", "allSkills", "getRemoteSkills", "selectedSkills", "skillName", "skill", "s", "path", "forceDownloadSkill", "ensureSkillDownloaded", "showInstallResults", "results", "successful", "failed", "options", "skills", "agents", "method", "installOptions", "installSkills", "r", "init_install", "__esmMin", "init_installer", "init_registry", "remove_exports", "__export", "runCliRemove", "chalk", "options", "skillNames", "agents", "totalSuccess", "totalFailed", "hasLockfileError", "skillName", "results", "removeSkill", "successful", "r", "failed", "init_remove", "__esmMin", "init_installer", "update_exports", "__export", "runCliUpdate", "chalk", "options", "fetchRegistry", "needsUpdate", "forceDownloadSkill", "readSkillLock", "lock", "installedNames", "toUpdate", "upToDate", "getUpdatableSkills", "updated", "failed", "name", "deprecatedMap", "getDeprecatedMap", "remoteSkills", "getRemoteSkills", "registryNames", "s", "deprecated", "renderers", "entry", "init_update", "__esmMin", "init_registry", "cache_exports", "__export", "runCliCache", "chalk", "options", "clearCache", "clearRegistryCache", "getCacheDir", "init_cache", "__esmMin", "init_registry", "Box", "Text", "Fragment", "jsx", "jsxs", "AuditLogViewer", "entries", "limit", "displayEntries", "entry", "idx", "date", "timeAgo", "getTimeAgo", "actionColor", "statusIcon", "seconds", "init_AuditLogViewer", "__esmMin", "audit_exports", "__export", "runCliAudit", "render", "React", "options", "getAuditLogPath", "limit", "entries", "readAuditLog", "AuditLogViewer", "init_audit", "__esmMin", "init_AuditLogViewer", "init_audit_log", "Command", "render", "React", "Box", "useApp", "useEffect", "useState", "init_agents", "useEffect", "useMemo", "useState", "useAgents", "selectedAgents", "setSelectedAgents", "installedAgents", "setInstalledAgents", "loading", "setLoading", "allAgents", "getAllAgentTypes", "timer", "detected", "detectInstalledAgents", "agent", "prev", "a", "useEffect", "useState", "init_constants", "useMemo", "useState", "useFilter", "items", "options", "query", "setQuery", "filtered", "tokens", "t", "item", "searchable", "key", "value", "token", "init_installer", "useState", "init_src", "existsSync", "readdirSync", "readFileSync", "join", "existsSync", "dirname", "join", "fileURLToPath", "__filename", "__dirname", "getSkillsCatalogPath", "getMonorepoRoot", "getLocalSkillsDirectory", "path", "getSkillsCatalogPath", "existsSync", "getMonorepoRoot", "join", "__dirname", "init_registry", "cache", "isCategoryFolder", "folderName", "CATEGORY_FOLDER_PATTERN", "extractCategoryId", "parseSkillFrontmatter", "content", "frontmatterMatch", "frontmatter", "nameMatch", "descMatch", "tryReadSkillFromPath", "skillPath", "categoryId", "skillMdPath", "join", "existsSync", "readFileSync", "name", "description", "scanLocalSkills", "dirPath", "readdirSync", "entry", "skill", "discoverLocalSkills", "skillsDir", "existsSync", "readdirSync", "entry", "isCategoryFolder", "categoryId", "extractCategoryId", "scanLocalSkills", "join", "skill", "tryReadSkillFromPath", "DEFAULT_CATEGORY_ID", "detectMode", "cache", "localDir", "getLocalSkillsDirectory", "isLocalMode", "detectMode", "cache", "discoverSkills", "discoverLocalSkills", "discoverSkillsAsync", "getRemoteSkills", "getSkillByName", "name", "discoverSkills", "s", "getSkillWithPath", "skillName", "isLocalMode", "getSkillByName", "metadata", "getSkillMetadata", "localPath", "ensureSkillDownloaded", "useInstaller", "progress", "setProgress", "useState", "results", "setResults", "installing", "setInstalling", "error", "setError", "skills", "options", "resolvedSkills", "skill", "resolved", "getSkillWithPath", "res", "installSkills", "err", "useInput", "useCallback", "useRef", "useState", "KONAMI_SEQUENCE", "useKonamiCode", "activated", "setActivated", "bufferRef", "input", "key", "mapped", "k", "i", "reset", "init_installer", "useState", "useRemover", "progress", "setProgress", "results", "setResults", "removing", "setRemoving", "error", "setError", "skillName", "agents", "global", "res", "removeSkill", "prev", "err", "skillsToRemove", "totalOps", "acc", "item", "completedOps", "init_registry", "readFileSync", "join", "useEffect", "useState", "useSkillContent", "skillName", "metadata", "setMetadata", "content", "setContent", "loading", "setLoading", "error", "setError", "mounted", "meta", "cachePath", "getSkillMetadata", "ensureSkillDownloaded", "resolvedPath", "getSkillCachePath", "skillMd", "err", "useEffect", "useState", "init_src", "existsSync", "readdirSync", "readFileSync", "writeFileSync", "join", "getSkillsDir", "getSkillsCatalogPath", "loadCategoryMetadata", "skillsDir", "metadataPath", "join", "CATEGORY_METADATA_FILE", "existsSync", "content", "readFileSync", "extractCategoryId", "folderName", "match", "CATEGORY_FOLDER_PATTERN", "isCategoryFolder", "getCategories", "skillsDir", "getSkillsDir", "existsSync", "metadata", "loadCategoryMetadata", "entries", "readdirSync", "categories", "index", "entry", "isCategoryFolder", "categoryId", "extractCategoryId", "meta", "formatCategoryName", "a", "b", "groupSkillsByCategory", "skills", "categories", "getCategories", "categoryIds", "s", "id", "index", "formatCategoryName", "grouped", "category", "DEFAULT_CATEGORY", "skill", "categoryId", "DEFAULT_CATEGORY_ID", "c", "targetCategory", "group", "skillList", "sortedGrouped", "sortedCategories", "a", "b", "cat", "useSkills", "skills", "setSkills", "useState", "loading", "setLoading", "error", "setError", "groupedSkills", "setGroupedSkills", "useEffect", "mounted", "data", "discoverSkillsAsync", "groupSkillsByCategory", "err", "useState", "useWizardStep", "totalSteps", "step", "setStep", "s", "Box", "Text", "BigText", "Gradient", "useEffect", "useState", "Box", "Text", "memo", "colors", "symbols", "jsx", "jsxs", "FooterBar", "memo", "hints", "status", "Box", "colors", "Text", "hint", "symbols", "Box", "Text", "useInput", "useMemo", "useState", "Fragment", "jsx", "jsxs", "SelectPrompt", "items", "onSelect", "onCancel", "initialIndex", "itemLimit", "hideFooter", "footerRight", "selectedIndex", "setSelectedIndex", "useState", "offset", "setOffset", "useInput", "input", "key", "prev", "visibleItems", "useMemo", "Box", "item", "index", "isFocused", "colors", "Text", "symbols", "Box", "Text", "useInput", "useStdout", "useCallback", "useEffect", "useRef", "useState", "jsx", "jsxs", "MAX_WIDTH", "GAME_HEIGHT", "TICK_MS", "BASE_MOVE_EVERY", "RATE_LIMIT_PENALTY", "SNIPER_MULTIPLIER", "LOSE_MESSAGES", "WIN_MESSAGES", "INVADER_ROWS", "createInvaders", "cols", "invaders", "colSpacing", "w", "totalWidth", "startX", "row", "col", "label", "VibeInvaders", "onExit", "stdout", "useStdout", "terminalCols", "gameWidth", "finalMessageRef", "useRef", "state", "setState", "useState", "pool", "useInput", "input", "key", "prev", "newX", "newBullets", "currentRateLimit", "tick", "useCallback", "score", "lives", "gameOver", "flash", "glitch", "rateLimited", "aliveInvaders", "i", "totalInvaders", "survivalRatio", "moveEvery", "shootChance", "pBullets", "b", "eBullets", "inv", "shooters", "inSight", "s", "dir", "xs", "minX", "useEffect", "t", "renderGrid", "rows", "x", "y", "r", "statusColor", "colors", "gridColor", "Box", "Text", "jsx", "jsxs", "menuItems", "SCANLINE", "ArcadeMenu", "onExit", "screen", "setScreen", "useState", "blinkVisible", "setBlinkVisible", "useEffect", "interval", "v", "handleSelect", "value", "VibeInvaders", "Box", "Gradient", "Text", "BigText", "colors", "symbols", "SelectPrompt", "FooterBar", "Box", "Text", "useInput", "Box", "Text", "BigText", "Gradient", "useAtomValue", "useMemo", "init_global_path", "atom", "unwrap", "init_constants", "mkdir", "readFile", "writeFile", "homedir", "dirname", "join", "getCachePath", "CONFIG_DIR", "CACHE_FILE", "validateCache", "cache", "partial", "getCachedUpdate", "cachePath", "content", "parsed", "setCachedUpdate", "version", "init_constants", "packageJson", "createRequire", "dirname", "join", "fileURLToPath", "__filename", "__dirname", "require", "pkg", "PACKAGE_VERSION", "PACKAGE_DESCRIPTION", "checkForUpdates", "currentVersion", "isPrerelease", "result", "packageJson", "PACKAGE_NAME", "version", "getCurrentVersion", "PACKAGE_VERSION", "init_constants", "resolveUpdateAvailable", "currentVersion", "cached", "getCachedUpdate", "cachedUpdate", "update", "checkForUpdates", "_", "reject", "setCachedUpdate", "runCheck", "getCurrentVersion", "updateAvailable", "isGlobal", "isGloballyInstalled", "environmentCheckAsyncAtom", "atom", "environmentCheckAtom", "unwrap", "prev", "init_constants", "jsx", "jsxs", "crystalColors", "SEPARATOR_CHAR", "Header", "overrideNotification", "envCheck", "useAtomValue", "environmentCheckAtom", "notification", "useMemo", "updateAvailable", "currentVersion", "isGlobal", "isLoading", "Box", "Text", "symbols", "MESSAGES", "Gradient", "BigText", "PACKAGE_VERSION", "jsx", "jsxs", "ActionSelector", "onSelect", "onBack", "onCredits", "items", "useInput", "input", "creditsHint", "Text", "colors", "Box", "Header", "symbols", "SelectPrompt", "Box", "Text", "useInput", "useStdout", "Spinner", "useState", "Box", "Text", "useInput", "useEffect", "useEffect", "useState", "Fragment", "jsx", "AnimatedTransition", "visible", "duration", "children", "opacity", "setOpacity", "startTime", "startOpacity", "targetOpacity", "interval", "elapsed", "progress", "currentOpacity", "clampedOpacity", "jsx", "jsxs", "KeyboardShortcutsOverlay", "visible", "onDismiss", "shortcuts", "useInput", "useEffect", "timer", "mid", "leftColumn", "rightColumn", "KeyBadge", "label", "Box", "Text", "colors", "ShortcutRow", "entry", "divider", "AnimatedTransition", "symbols", "Box", "Text", "useInput", "useEffect", "useRef", "useState", "jsx", "jsxs", "MultiSelectPrompt", "items", "onSubmit", "onCancel", "onChange", "initialSelected", "limit", "selected", "setSelected", "useState", "focusIndex", "setFocusIndex", "offset", "setOffset", "showShortcuts", "setShowShortcuts", "prevInitialSelectedRef", "useRef", "useEffect", "prev", "v", "i", "useInput", "input", "key", "newIndex", "newOffset", "item", "newSelected", "all", "visibleItems", "hasItemsAbove", "hasItemsBelow", "shortcuts", "Box", "KeyboardShortcutsOverlay", "Text", "colors", "symbols", "index", "realIndex", "isFocused", "isSelected", "pointer", "pointerColor", "checkbox", "checkboxColor", "textColor", "FooterBar", "init_agents", "Fragment", "jsx", "jsxs", "CHROME_LINES", "AgentSelector", "onSelect", "onBack", "stdout", "useStdout", "termRows", "listLimit", "allAgents", "installedAgents", "selectedAgents", "setSelectedAgents", "loading", "useAgents", "agentShortcuts", "showShortcuts", "setShowShortcuts", "useState", "useInput", "input", "prev", "items", "agent", "config", "getAgentConfig", "isDetected", "symbols", "Box", "Header", "Text", "colors", "Spinner", "KeyboardShortcutsOverlay", "FooterBar", "MultiSelectPrompt", "Box", "Text", "useInput", "useStdout", "BigText", "Gradient", "existsSync", "dirname", "join", "fileURLToPath", "useCallback", "useEffect", "useMemo", "useRef", "useState", "execSync", "spawn", "platform", "commandExists", "cmd", "spawnLinuxPlayer", "filePath", "players", "args", "play", "os", "proc", "stop", "ky", "REPO_API", "CONTRIBUTORS_URL", "contributorsCache", "starsCache", "fetchContributors", "login", "isBot", "avatar_url", "contributions", "fetchRepoStars", "jsx", "jsxs", "BASE_SPEED_MS", "CONTENT_WIDTH", "CRYSTAL_COLORS", "HEADER_HEIGHT", "MAX_SPEED_MS", "MIN_SPEED_MS", "SEPARATOR", "SPEED_STEP_MS", "WARM_COLORS", "RANK_DECORATORS", "symbols", "buildCreditLines", "contributors", "stars", "lines", "c", "totalContribs", "sum", "getAssetPath", "dir", "dirname", "fileURLToPath", "i", "candidate", "join", "existsSync", "ContributorRow", "rank", "login", "contributions", "decorator", "nameColor", "rankStr", "name", "contribStr", "badgeSuffix", "usedLen", "dotsLen", "dots", "Text", "CreditLineRenderer", "line", "Gradient", "SpeedIndicator", "speed", "paused", "colors", "level", "bars", "CreditsView", "onExit", "stdout", "useStdout", "termRows", "scrollAreaHeight", "setContributors", "useState", "setStars", "loading", "setLoading", "scrollOffset", "setScrollOffset", "setSpeed", "setPaused", "audioRef", "useRef", "intervalRef", "useEffect", "fetchContributors", "fetchRepoStars", "s", "assetPath", "play", "stop", "creditLines", "useMemo", "maxOffset", "finished", "advance", "useCallback", "prev", "timer", "useInput", "input", "key", "p", "Box", "blankLine", "padTop", "padBottom", "visibleSlice", "BigText", "Box", "Text", "useInput", "useState", "jsx", "jsxs", "InstallConfig", "onConfirm", "onBack", "initialMethod", "initialGlobal", "step", "setStep", "useState", "method", "setMethod", "isGlobal", "setIsGlobal", "Box", "Header", "Text", "colors", "symbols", "SelectPrompt", "val", "InstallSummary", "useInput", "input", "key", "Box", "Text", "useInput", "Spinner", "useAtom", "useAtomValue", "useSetAtom", "useEffect", "useMemo", "useState", "init_agents", "init_installer", "atom", "unwrap", "fetchInstalledSkills", "agents", "detectInstalledAgents", "status", "agent", "local", "global", "listInstalledSkills", "skill", "installedSkillsRefreshAtom", "installedSkillsAsyncAtom", "get", "installedSkillsAtom", "prev", "atom", "selectedAgentsAtom", "selectedSkillsAtom", "Box", "Text", "useInput", "jsx", "jsxs", "InstallResults", "results", "onExit", "title", "successLabel", "useInput", "_", "key", "uniqueSuccessSkills", "r", "uniqueFailedSkills", "successCount", "failCount", "allFailed", "anyFailed", "borderColor", "colors", "displayTitle", "symbols", "titleColor", "Box", "Header", "Text", "res", "i", "Box", "Text", "useInput", "Spinner", "useAtomValue", "useMemo", "useState", "init_registry", "atom", "unwrap", "deprecatedSkillsAsyncAtom", "getDeprecatedMap", "deprecatedSkillsAtom", "prev", "jsx", "jsxs", "RemoveWizard", "selectedAgents", "onExit", "internalAgents", "setInternalAgents", "useState", "removeMultiple", "progress", "results", "useRemover", "installedSkills", "useAtomValue", "installedSkillsAtom", "deprecatedMap", "deprecatedSkillsAtom", "step", "setStep", "selectedToRemove", "setSelectedToRemove", "activeAgents", "filteredSkills", "useMemo", "filtered", "skillName", "agents", "matchingAgents", "a", "skillNames", "selectItems", "name", "isDeprecated", "agentHint", "hint", "useInput", "_", "key", "AgentSelector", "Box", "Header", "colors", "Text", "handleSelect", "selected", "executeRemoval", "targets", "symbols", "MultiSelectPrompt", "s", "SelectPrompt", "val", "Spinner", "successCount", "r", "failCount", "allFailed", "res", "i", "Box", "Text", "useInput", "useStdout", "useAtomValue", "useMemo", "useState", "Box", "Text", "useMemo", "formatCategoryBadge", "installed", "total", "jsx", "jsxs", "CategoryHeader", "name", "totalCount", "installedCount", "isExpanded", "isFocused", "badge", "useMemo", "formatCategoryBadge", "chevron", "Box", "Text", "colors", "symbols", "Box", "Text", "useInput", "useState", "jsx", "jsxs", "Box", "Text", "TextInput", "jsx", "jsxs", "SearchInput", "query", "onChange", "total", "filtered", "isLoading", "focus", "Box", "colors", "Text", "TextInput", "Box", "Text", "Box", "Text", "jsx", "jsxs", "badgeConfig", "symbols", "colors", "StatusBadge", "status", "config", "Box", "Text", "jsx", "jsxs", "SkillCard", "name", "description", "status", "selected", "focused", "readOnly", "isInstalled", "checkbox", "symbols", "checkboxColor", "colors", "pointer", "pointerColor", "nameColor", "descColor", "bgColor", "Box", "Text", "StatusBadge", "chalk", "Box", "Text", "useInput", "useStdout", "Spinner", "React", "useCallback", "useEffect", "useMemo", "useRef", "useState", "categoryColors", "getColorForCategory", "categoryId", "stripFrontmatter", "raw", "endIndex", "parseMarkdown", "lines", "tokens", "line", "language", "codeLines", "headingMatch", "listMatch", "indent", "Fragment", "jsx", "jsxs", "FIXED_HEADER_LINES", "BORDER_LINES", "INDICATOR_LINES", "fmt", "s", "chalk", "colors", "formatInline", "text", "_", "t", "tokensToLines", "tokens", "lines", "token", "sym", "symbols", "colorFn", "indent", "line", "MetadataHeader", "React", "skill", "metadata", "categoryColor", "getColorForCategory", "author", "files", "Box", "Text", "SkillDetailPanel", "expanded", "onClose", "onToggleExpand", "content", "loading", "error", "useSkillContent", "stdout", "useStdout", "scrollOffset", "setScrollOffset", "useState", "terminalRows", "formattedLines", "useMemo", "parseMarkdown", "containerHeight", "scrollAreaHeight", "contentVisibleLines", "maxScroll", "canScroll", "scrollPercent", "maxScrollRef", "useRef", "onCloseRef", "onToggleExpandRef", "handleInput", "useCallback", "input", "key", "prev", "useInput", "useEffect", "hasAbove", "hasMore", "visibleSlice", "Spinner", "getTerminalSize", "canShowDetailPanel", "width", "height", "getTerminalSize", "Fragment", "jsx", "jsxs", "MIN_VISIBLE", "CHROME_LINES", "PANEL_WIDTH_RATIO", "getShortcuts", "readOnly", "common", "exitKey", "SkillBrowser", "onInstall", "onExit", "overrideSkills", "fetchedSkills", "fetching", "error", "useSkills", "stdout", "useStdout", "selectedAgents", "useAtomValue", "selectedAgentsAtom", "installedSkills", "installedSkillsAtom", "deprecatedMap", "deprecatedSkillsAtom", "skills", "loading", "query", "setQuery", "filtered", "useFilter", "selectedSet", "setSelectedSet", "useState", "focusArea", "setFocusArea", "listIndex", "setListIndex", "offset", "setOffset", "showSearch", "setShowSearch", "showShortcuts", "setShowShortcuts", "detailSkill", "setDetailSkill", "drawerExpanded", "setDrawerExpanded", "expandedCategory", "setExpandedCategory", "canShowPanel", "canShowDetailPanel", "terminalRows", "terminalCols", "VISIBLE_ITEMS", "panelWidth", "contentAreaHeight", "isSearchExpanded", "groupedMap", "useMemo", "groupSkillsByCategory", "isCategoryExpanded", "categoryName", "toggleCategory", "visualList", "list", "category", "categorySkills", "installedCount", "s", "agents", "a", "skill", "handleToggleShortcuts", "prev", "handleEscape", "handleSelectAll", "allSkillNames", "handleSearchNavigation", "key", "handleUpArrow", "newIndex", "handleDownArrow", "handleSpaceKey", "item", "newSet", "handleEnterKey", "selectedSkills", "handleTabOrRightArrow", "isTab", "handleLeftArrow", "isRegularCharacter", "input", "useInput", "visibleWindow", "hasItemsAbove", "hasItemsBelow", "scrollPercent", "showSkillList", "Box", "Header", "Text", "colors", "symbols", "renderSkillListItem", "index", "realIndex", "isFocused", "CategoryHeader", "isSelected", "isInstalled", "status", "SkillCard", "renderScrollIndicator", "direction", "renderFooterHints", "renderFooterStatus", "KeyboardShortcutsOverlay", "SearchInput", "q", "SkillDetailPanel", "FooterBar", "Box", "Text", "useInput", "Spinner", "useAtomValue", "useEffect", "useMemo", "useState", "init_registry", "jsx", "jsxs", "UpdateView", "selectedAgents", "onExit", "checkingUpdates", "setCheckingUpdates", "useState", "updateCheckComplete", "setUpdateCheckComplete", "installComplete", "setInstallComplete", "internalAgents", "setInternalAgents", "showAgentSelect", "setShowAgentSelect", "updatableSkills", "setUpdatableSkills", "install", "progress", "results", "installing", "useInstaller", "installedSkills", "useAtomValue", "installedSkillsAtom", "deprecatedMap", "deprecatedSkillsAtom", "skills", "loadingSkills", "useSkills", "activeAgents", "installedList", "useMemo", "installedNames", "s", "a", "deprecatedInstalled", "registryNames", "result", "name", "useEffect", "toUpdate", "getUpdatableSkills", "skillsToUpdate", "useInput", "_", "key", "AgentSelector", "agents", "handleUpdate", "selectedSkills", "involvedAgents", "InstallResults", "Box", "Header", "Text", "colors", "Spinner", "symbols", "d", "UpdateSelector", "onUpdate", "items", "filteredAgents", "allValues", "handleSubmit", "selectedNames", "MultiSelectPrompt", "jsx", "jsxs", "InstallWizard", "onExit", "step", "next", "back", "useWizardStep", "selectedAgents", "setSelectedAgents", "useAtom", "selectedAgentsAtom", "selectedSkills", "setSelectedSkills", "selectedSkillsAtom", "refreshInstalledSkills", "useSetAtom", "installedSkillsRefreshAtom", "installedSkills", "useAtomValue", "installedSkillsAtom", "action", "setAction", "useState", "showCredits", "setShowCredits", "showUpdate", "setShowUpdate", "showRemove", "setShowRemove", "installConfig", "setInstallConfig", "skills", "useSkills", "install", "progress", "results", "installing", "useInstaller", "installStarted", "setInstallStarted", "installComplete", "setInstallComplete", "handleAgentSelect", "agents", "handleActionSelect", "act", "handleSkillSelect", "handleConfigConfirm", "config", "visibleSkills", "useMemo", "installedOnSelected", "skillName", "a", "s", "useEffect", "prev", "InstallResults", "Box", "Header", "Text", "colors", "Spinner", "symbols", "UpdateView", "RemoveWizard", "CreditsView", "AgentSelector", "ActionSelector", "SkillBrowser", "UpToDateMessage", "InstallConfig", "onBack", "useInput", "input", "key", "Box", "Text", "useAtomValue", "useMemo", "jsx", "jsxs", "ListView", "onExit", "installedSkills", "useAtomValue", "installedSkillsAtom", "skills", "loadingSkills", "useSkills", "installedList", "useMemo", "installedNames", "s", "Box", "Header", "Text", "colors", "SkillBrowser", "jsx", "jsxs", "App", "command", "exit", "useApp", "arcade", "setArcade", "useState", "activated", "reset", "useKonamiCode", "useEffect", "Box", "CreditsView", "ArcadeMenu", "ListView", "RemoveWizard", "UpdateView", "InstallWizard", "program", "Command", "PACKAGE_VERSION", "skills", "render", "React", "App", "options", "shouldUseInteractiveMode", "runCliInstall", "runCliRemove", "runCliUpdate", "runCliCache", "runCliAudit", "key"]
|
|
7
|
+
}
|