@the-aico/cli 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +3331 -0
- package/dist/index.js.map +1 -0
- package/package.json +76 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/utils/errors.ts","../src/utils/error-suggestions.ts","../src/commands/init.ts","../src/utils/config.ts","../src/schema/config.ts","../src/utils/logger.ts","../src/commands/add.ts","../src/registry/client.ts","../src/schema/employee.ts","../src/schema/skill.ts","../src/schema/registry.ts","../src/registry/local.ts","../src/utils/parse-target.ts","../src/installer/index.ts","../src/installer/platforms/claude-code.ts","../src/installer/platforms/codex.ts","../src/installer/skill-installer.ts","../src/registry/resolver.ts","../src/utils/constraint-docs.ts","../src/commands/remove.ts","../src/commands/list.ts","../src/commands/build.ts","../src/commands/diff.ts","../src/commands/update.ts","../src/utils/version.ts","../src/commands/search.ts","../src/commands/check.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { handleError } from './utils/errors.js';\nimport { init } from './commands/init.js';\nimport { add } from './commands/add.js';\nimport { remove } from './commands/remove.js';\nimport { list } from './commands/list.js';\nimport { build } from './commands/build.js';\nimport { diff } from './commands/diff.js';\nimport { update } from './commands/update.js';\nimport { search } from './commands/search.js';\nimport { check } from './commands/check.js';\n\nconst VERSION = '1.0.0';\n\n// Store global options for access in error handler\nlet globalVerbose = false;\n\nasync function main(): Promise<void> {\n const program = new Command()\n .name('aico')\n .description(\n 'AI employee management tool - Build your AI team in seconds, start working immediately'\n )\n .version(VERSION)\n .option('-v, --verbose', 'Show detailed error information')\n .option('--proxy <url>', 'Use HTTP/HTTPS proxy for requests');\n\n // Hook to capture global options before command execution\n program.hook('preAction', (thisCommand) => {\n const opts = thisCommand.opts();\n globalVerbose = opts.verbose ?? false;\n });\n\n // Register commands\n program.addCommand(init);\n program.addCommand(add);\n program.addCommand(remove);\n program.addCommand(update);\n program.addCommand(list);\n program.addCommand(diff);\n program.addCommand(build);\n program.addCommand(search);\n program.addCommand(check);\n\n await program.parseAsync(process.argv);\n}\n\nmain().catch((error) => {\n handleError(error, { verbose: globalVerbose });\n});\n","import kleur from 'kleur';\nimport { ZodError } from 'zod';\nimport { type AicoErrorCodeType } from './error-codes.js';\nimport { getSuggestion } from './error-suggestions.js';\n\nexport { AicoErrorCode, type AicoErrorCodeType } from './error-codes.js';\n\nexport interface AicoErrorOptions {\n suggestion?: string;\n context?: Record<string, unknown>;\n cause?: unknown;\n}\n\n/**\n * Enhanced AICO Error class with error codes, suggestions, and context.\n */\nexport class AicoError extends Error {\n public readonly code: AicoErrorCodeType;\n public readonly suggestion: string;\n public readonly context?: Record<string, unknown>;\n public override readonly cause?: unknown;\n\n constructor(\n message: string,\n code: AicoErrorCodeType,\n options?: AicoErrorOptions\n ) {\n super(message);\n this.name = 'AicoError';\n this.code = code;\n this.suggestion = options?.suggestion || getSuggestion(code);\n this.context = options?.context;\n this.cause = options?.cause;\n }\n\n toJSON() {\n return {\n name: this.name,\n message: this.message,\n code: this.code,\n suggestion: this.suggestion,\n context: this.context,\n };\n }\n}\n\nexport interface HandleErrorOptions {\n verbose?: boolean;\n exitCode?: number;\n}\n\n/**\n * Unified error handler with formatted output.\n */\nexport function handleError(\n error: unknown,\n options: HandleErrorOptions = {}\n): never {\n const { verbose = false, exitCode = 1 } = options;\n\n console.error('');\n\n if (error instanceof AicoError) {\n // AicoError formatted output\n console.error(kleur.red('✖ Error:'), error.message);\n console.error('');\n console.error(kleur.dim(' Code:'), error.code);\n console.error('');\n console.error(kleur.cyan(' Suggestion:'));\n console.error(` ${error.suggestion}`);\n\n if (error.context && verbose) {\n console.error('');\n console.error(kleur.dim(' Context:'));\n for (const [key, value] of Object.entries(error.context)) {\n console.error(` ${key}: ${JSON.stringify(value)}`);\n }\n }\n\n if (error.cause && verbose) {\n console.error('');\n console.error(kleur.dim(' Caused by:'));\n if (error.cause instanceof Error) {\n console.error(` ${error.cause.message}`);\n } else {\n console.error(` ${String(error.cause)}`);\n }\n }\n } else if (error instanceof ZodError) {\n // Zod validation error friendly display\n console.error(kleur.red('✖ Validation Error:'));\n console.error('');\n for (const issue of error.issues) {\n const path = issue.path.length > 0 ? issue.path.join('.') : 'value';\n console.error(` ${kleur.yellow(path)}: ${issue.message}`);\n }\n console.error('');\n console.error(kleur.cyan(' Suggestion:'));\n console.error(\n ' Check the configuration file format or command arguments.'\n );\n } else if (error instanceof Error) {\n // Standard Error\n console.error(kleur.red('✖ Error:'), error.message);\n\n if (verbose && error.stack) {\n console.error('');\n console.error(kleur.dim(' Stack trace:'));\n const stackLines = error.stack.split('\\n').slice(1);\n for (const line of stackLines.slice(0, 5)) {\n console.error(kleur.dim(line));\n }\n if (stackLines.length > 5) {\n console.error(kleur.dim(` ... ${stackLines.length - 5} more lines`));\n }\n }\n } else {\n // Unknown error\n console.error(kleur.red('✖ Unknown error:'), String(error));\n }\n\n // GitHub Issue link\n console.error('');\n console.error(kleur.dim(' If the problem persists, please open an issue:'));\n console.error(kleur.dim(' https://github.com/yellinzero/aico/issues'));\n console.error('');\n\n process.exit(exitCode);\n}\n\n// ============================================================================\n// Common error factory functions\n// ============================================================================\n\nexport function notInitializedError(): AicoError {\n return new AicoError(\n 'No aico.json found in current directory.',\n 'NOT_INITIALIZED'\n );\n}\n\nexport function configExistsError(): AicoError {\n return new AicoError(\n 'aico.json already exists in current directory.',\n 'CONFIG_EXISTS'\n );\n}\n\nexport function employeeNotFoundError(name: string): AicoError {\n return new AicoError(\n `Employee '${name}' not found in registry.`,\n 'EMPLOYEE_NOT_FOUND',\n { context: { name } }\n );\n}\n\nexport function skillNotFoundError(name: string): AicoError {\n return new AicoError(\n `Skill '${name}' not found in registry.`,\n 'SKILL_NOT_FOUND',\n { context: { name } }\n );\n}\n\nexport function platformNotSupportedError(platform: string): AicoError {\n return new AicoError(\n `Platform '${platform}' is not supported.`,\n 'PLATFORM_NOT_SUPPORTED',\n { context: { platform } }\n );\n}\n\nexport function registryFetchError(url: string, status: number): AicoError {\n return new AicoError(\n `Failed to fetch from registry: ${url} (status: ${status})`,\n 'FETCH_ERROR',\n { context: { url, status } }\n );\n}\n\nexport function fileConflictError(path: string): AicoError {\n return new AicoError(`File already exists: ${path}`, 'FILE_EXISTS', {\n context: { path },\n });\n}\n\nexport function networkError(message: string, cause?: unknown): AicoError {\n return new AicoError(message, 'NETWORK_ERROR', { cause });\n}\n\nexport function timeoutError(url: string, timeoutMs: number): AicoError {\n return new AicoError(\n `Request timeout after ${timeoutMs}ms: ${url}`,\n 'TIMEOUT',\n { context: { url, timeoutMs } }\n );\n}\n\nexport function circularDependencyError(cycle: string[]): AicoError {\n return new AicoError(\n `Circular dependency detected: ${cycle.join(' → ')}`,\n 'CIRCULAR_DEPENDENCY',\n { context: { cycle } }\n );\n}\n\nexport function validationError(\n message: string,\n context?: Record<string, unknown>\n): AicoError {\n return new AicoError(message, 'VALIDATION_ERROR', { context });\n}\n","import type { AicoErrorCodeType } from './error-codes.js';\n\n/**\n * Default suggestions for each error code.\n * These provide actionable guidance for users to resolve errors.\n */\nexport const defaultSuggestions: Record<AicoErrorCodeType, string> = {\n // Network errors\n NETWORK_ERROR:\n 'Check your internet connection or try using a proxy with --proxy option.',\n FETCH_ERROR: 'Verify the registry URL is correct and accessible.',\n TIMEOUT: 'The request timed out. Try again or check your network.',\n REGISTRY_UNAVAILABLE: 'The registry server is unavailable. Try again later.',\n\n // Resource errors\n NOT_FOUND: 'The requested resource was not found.',\n SKILL_NOT_FOUND: 'Use `npx aico list --skills` to see available skills.',\n EMPLOYEE_NOT_FOUND: 'Use `npx aico list` to see available employees.',\n\n // Configuration errors\n NOT_INITIALIZED: 'Run `npx aico init` to initialize the project.',\n CONFIG_INVALID:\n 'Check your aico.json for syntax errors or run `npx aico init --force`.',\n CONFIG_EXISTS: 'Use `npx aico init --force` to overwrite existing config.',\n CONFIG_PARSE_ERROR:\n 'Your aico.json contains invalid JSON. Check for syntax errors.',\n\n // Dependency errors\n DEPENDENCY_MISSING:\n 'Install the missing dependency first, or use `--no-deps` to skip.',\n CIRCULAR_DEPENDENCY: 'Check your skill dependencies for circular references.',\n\n // File errors\n FILE_EXISTS: 'Use `--overwrite` to replace existing files.',\n FILE_NOT_FOUND: 'Verify the file path is correct.',\n PERMISSION_DENIED:\n 'Check file permissions or run with appropriate privileges.',\n WRITE_ERROR: 'Unable to write file. Check disk space and permissions.',\n\n // Platform errors\n PLATFORM_NOT_SUPPORTED: 'Supported platforms: claude-code, codex.',\n\n // Validation errors\n VALIDATION_ERROR: 'Check the input format and try again.',\n INVALID_ARGUMENT: 'Check the command arguments and options.',\n};\n\n/**\n * Get the default suggestion for an error code.\n */\nexport function getSuggestion(code: AicoErrorCodeType): string {\n return defaultSuggestions[code] || 'Please check the error details above.';\n}\n","import { Command } from 'commander';\nimport prompts from 'prompts';\nimport { z } from 'zod';\nimport { configExists, writeConfig } from '../utils/config.js';\nimport { logger, spinner } from '../utils/logger.js';\nimport { handleError } from '../utils/errors.js';\nimport {\n createDefaultConfig,\n platformSchema,\n type Platform,\n} from '../schema/config.js';\n\nconst initOptionsSchema = z.object({\n cwd: z.string(),\n defaultPlatform: platformSchema.optional(),\n force: z.boolean(),\n});\n\ntype InitOptions = z.infer<typeof initOptionsSchema>;\n\nasync function runInit(options: InitOptions): Promise<void> {\n const { cwd, defaultPlatform, force } = options;\n\n // Check if config already exists\n if (await configExists(cwd)) {\n if (!force) {\n const { overwrite } = await prompts({\n type: 'confirm',\n name: 'overwrite',\n message: 'aico.json already exists. Overwrite?',\n initial: false,\n });\n\n if (!overwrite) {\n logger.info('Initialization cancelled.');\n return;\n }\n }\n }\n\n // Determine platform\n const platform: Platform = defaultPlatform ?? 'claude-code';\n\n // Create config\n const config = createDefaultConfig(platform);\n\n // Write config\n const s = spinner('Creating aico.json...').start();\n await writeConfig(cwd, config);\n s.succeed('Created aico.json');\n\n logger.break();\n logger.success('Project initialized!');\n logger.dim(`Default platform: ${platform}`);\n logger.break();\n logger.info('Next steps:');\n logger.log(` ${logger.highlight('npx aico add pm')} Add the PM employee`);\n logger.log(\n ` ${logger.highlight('npx aico list')} View available employees`\n );\n}\n\nexport const init = new Command()\n .name('init')\n .description('Initialize aico in your project')\n .option(\n '-p, --default-platform <platform>',\n 'Default platform (claude-code, codex)'\n )\n .option('-f, --force', 'Overwrite existing configuration', false)\n .option('-c, --cwd <cwd>', 'Working directory', process.cwd())\n .action(async (opts) => {\n try {\n const options = initOptionsSchema.parse({\n cwd: opts.cwd,\n defaultPlatform: opts.defaultPlatform,\n force: opts.force,\n });\n\n await runInit(options);\n } catch (error) {\n handleError(error);\n }\n });\n","import fs from 'fs-extra';\nimport os from 'os';\nimport path from 'path';\nimport {\n configSchema,\n type Config,\n type Platform,\n type SkillState,\n type SharedSkillState,\n} from '../schema/config.js';\n\nconst CONFIG_FILENAME = 'aico.json';\n\n/**\n * Expand ~ to home directory in path\n */\nfunction expandTilde(filePath: string): string {\n if (filePath.startsWith('~/') || filePath === '~') {\n return path.join(os.homedir(), filePath.slice(1));\n }\n return filePath;\n}\n\n/**\n * Get the path to aico.json in the given directory\n */\nexport function getConfigPath(cwd: string): string {\n return path.resolve(cwd, CONFIG_FILENAME);\n}\n\n/**\n * Check if aico.json exists in the given directory\n */\nexport async function configExists(cwd: string): Promise<boolean> {\n const configPath = getConfigPath(cwd);\n return fs.pathExists(configPath);\n}\n\n/**\n * Load and parse aico.json from the given directory\n */\nexport async function getConfig(cwd: string): Promise<Config | null> {\n const configPath = getConfigPath(cwd);\n\n if (!(await fs.pathExists(configPath))) {\n return null;\n }\n\n const raw = await fs.readJson(configPath);\n return configSchema.parse(raw);\n}\n\n/**\n * Write config to aico.json in the given directory\n */\nexport async function writeConfig(cwd: string, config: Config): Promise<void> {\n const configPath = getConfigPath(cwd);\n await fs.writeJson(configPath, config, { spaces: 2 });\n}\n\n/**\n * Update employees field in aico.json\n */\nexport async function updateEmployees(\n cwd: string,\n employeeName: string,\n platforms: Platform[],\n skills?: string[],\n commands?: string[]\n): Promise<void> {\n const config = await getConfig(cwd);\n if (!config) {\n throw new Error('Config not found');\n }\n\n config.employees[employeeName] = {\n platforms,\n installedAt: new Date().toISOString(),\n skills,\n commands,\n };\n\n await writeConfig(cwd, config);\n}\n\n/**\n * Remove employee from aico.json\n */\nexport async function removeEmployee(\n cwd: string,\n employeeName: string\n): Promise<void> {\n const config = await getConfig(cwd);\n if (!config) {\n throw new Error('Config not found');\n }\n\n delete config.employees[employeeName];\n await writeConfig(cwd, config);\n}\n\n/**\n * Resolve paths for a platform\n *\n * Supports:\n * - Relative paths: resolved relative to cwd (e.g., '.claude/skills')\n * - Home directory: ~ expanded to user home (e.g., '~/.codex/skills')\n * - Absolute paths: used as-is\n */\nexport function resolvePlatformPaths(\n cwd: string,\n config: Config,\n platform: Platform\n): { skillsDir: string; commandsDir: string } {\n const paths = config.platforms[platform];\n if (!paths) {\n throw new Error(`Platform ${platform} not configured`);\n }\n\n // Expand ~ and resolve paths\n const skillsPath = expandTilde(paths.skills);\n const commandsPath = expandTilde(paths.commands);\n\n return {\n skillsDir: path.isAbsolute(skillsPath)\n ? skillsPath\n : path.resolve(cwd, skillsPath),\n commandsDir: path.isAbsolute(commandsPath)\n ? commandsPath\n : path.resolve(cwd, commandsPath),\n };\n}\n\n// ============================================================================\n// Skill Management\n// ============================================================================\n\n/**\n * Add or update a standalone skill in config\n */\nexport async function updateSkill(\n cwd: string,\n skillFullName: string,\n version: string,\n platforms: Platform[],\n source: 'standalone' | 'employee' = 'standalone'\n): Promise<void> {\n const config = await getConfig(cwd);\n if (!config) {\n throw new Error('Config not found');\n }\n\n // Ensure skills object exists\n if (!config.skills) {\n config.skills = {};\n }\n\n config.skills[skillFullName] = {\n version,\n installedAt: new Date().toISOString(),\n source,\n platforms,\n };\n\n await writeConfig(cwd, config);\n}\n\n/**\n * Remove a skill from config\n */\nexport async function removeSkill(\n cwd: string,\n skillFullName: string\n): Promise<void> {\n const config = await getConfig(cwd);\n if (!config) {\n throw new Error('Config not found');\n }\n\n if (config.skills) {\n delete config.skills[skillFullName];\n }\n\n await writeConfig(cwd, config);\n}\n\n/**\n * Get installed skill state\n */\nexport async function getSkillState(\n cwd: string,\n skillFullName: string\n): Promise<SkillState | null> {\n const config = await getConfig(cwd);\n if (!config) {\n return null;\n }\n\n return config.skills?.[skillFullName] ?? null;\n}\n\n/**\n * Check if skill is installed (either standalone or as part of employee)\n */\nexport async function isSkillInstalled(\n cwd: string,\n skillFullName: string\n): Promise<boolean> {\n const config = await getConfig(cwd);\n if (!config) {\n return false;\n }\n\n // Check standalone skills\n if (config.skills?.[skillFullName]) {\n return true;\n }\n\n // Check if part of any employee\n for (const empState of Object.values(config.employees)) {\n if (empState.skills?.includes(skillFullName)) {\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * Get all installed skill fullNames\n */\nexport async function getInstalledSkills(cwd: string): Promise<string[]> {\n const config = await getConfig(cwd);\n if (!config) {\n return [];\n }\n\n const skills = new Set<string>();\n\n // Add standalone skills\n if (config.skills) {\n for (const skillName of Object.keys(config.skills)) {\n skills.add(skillName);\n }\n }\n\n // Add skills from employees\n for (const empState of Object.values(config.employees)) {\n if (empState.skills) {\n for (const skillName of empState.skills) {\n skills.add(skillName);\n }\n }\n }\n\n return Array.from(skills);\n}\n\n// ============================================================================\n// Shared Skill Management\n// ============================================================================\n\n/**\n * Add a shared skill reference for an employee.\n * If the shared skill is not installed yet, it will be marked for installation.\n * If already installed, just add the employee to usedBy list.\n */\nexport async function addSharedSkillReference(\n cwd: string,\n sharedSkillFullName: string,\n employeeName: string,\n version: string,\n platforms: Platform[]\n): Promise<{ isNew: boolean }> {\n const config = await getConfig(cwd);\n if (!config) {\n throw new Error('Config not found');\n }\n\n // Ensure sharedSkills object exists\n if (!config.sharedSkills) {\n config.sharedSkills = {};\n }\n\n const existing = config.sharedSkills[sharedSkillFullName];\n\n if (existing) {\n // Shared skill already exists, add employee to usedBy if not present\n if (!existing.usedBy.includes(employeeName)) {\n existing.usedBy.push(employeeName);\n }\n // Merge platforms\n const allPlatforms = new Set([...existing.platforms, ...platforms]);\n existing.platforms = Array.from(allPlatforms) as Platform[];\n await writeConfig(cwd, config);\n return { isNew: false };\n }\n\n // New shared skill\n config.sharedSkills[sharedSkillFullName] = {\n version,\n installedAt: new Date().toISOString(),\n platforms,\n usedBy: [employeeName],\n };\n\n await writeConfig(cwd, config);\n return { isNew: true };\n}\n\n/**\n * Remove a shared skill reference for an employee.\n * Returns true if the shared skill should be uninstalled (no more references).\n */\nexport async function removeSharedSkillReference(\n cwd: string,\n sharedSkillFullName: string,\n employeeName: string\n): Promise<{ shouldUninstall: boolean; remainingUsers: string[] }> {\n const config = await getConfig(cwd);\n if (!config) {\n throw new Error('Config not found');\n }\n\n const existing = config.sharedSkills?.[sharedSkillFullName];\n if (!existing) {\n return { shouldUninstall: false, remainingUsers: [] };\n }\n\n // Remove employee from usedBy\n existing.usedBy = existing.usedBy.filter((e) => e !== employeeName);\n\n if (existing.usedBy.length === 0) {\n // No more references, remove from config\n delete config.sharedSkills[sharedSkillFullName];\n await writeConfig(cwd, config);\n return { shouldUninstall: true, remainingUsers: [] };\n }\n\n // Still has references\n await writeConfig(cwd, config);\n return { shouldUninstall: false, remainingUsers: existing.usedBy };\n}\n\n/**\n * Get shared skill state\n */\nexport async function getSharedSkillState(\n cwd: string,\n sharedSkillFullName: string\n): Promise<SharedSkillState | null> {\n const config = await getConfig(cwd);\n if (!config) {\n return null;\n }\n\n return config.sharedSkills?.[sharedSkillFullName] ?? null;\n}\n\n/**\n * Check if shared skill is installed\n */\nexport async function isSharedSkillInstalled(\n cwd: string,\n sharedSkillFullName: string\n): Promise<boolean> {\n const state = await getSharedSkillState(cwd, sharedSkillFullName);\n return state !== null;\n}\n\n/**\n * Get all employees that use a specific shared skill\n */\nexport async function getSharedSkillUsers(\n cwd: string,\n sharedSkillFullName: string\n): Promise<string[]> {\n const state = await getSharedSkillState(cwd, sharedSkillFullName);\n return state?.usedBy ?? [];\n}\n","import { z } from 'zod';\n\n// Constants\nexport const DEFAULT_REGISTRY_URL = 'https://the-aico.com/r/{name}.json';\nexport const DEFAULT_SCHEMA_URL = 'https://the-aico.com/schema/config.json';\n\nexport const platformSchema = z.enum(['claude-code', 'codex']);\n\nexport type Platform = z.infer<typeof platformSchema>;\n\nexport const languageSchema = z.string().default('en');\n\nexport type Language = z.infer<typeof languageSchema>;\n\nexport const platformPathsSchema = z.object({\n skills: z.string(),\n commands: z.string(),\n});\n\nexport type PlatformPaths = z.infer<typeof platformPathsSchema>;\n\nexport const employeeStateSchema = z.object({\n platforms: z.array(platformSchema),\n installedAt: z.string(),\n version: z.string().optional(),\n // Track installed skills and commands for update detection\n skills: z.array(z.string()).optional(),\n commands: z.array(z.string()).optional(),\n});\n\nexport type EmployeeState = z.infer<typeof employeeStateSchema>;\n\n// Skill state for standalone installed skills\nexport const skillStateSchema = z.object({\n version: z.string(),\n installedAt: z.string(),\n source: z.enum(['standalone', 'employee']), // standalone = single install, employee = part of employee\n platforms: z.array(platformSchema),\n});\n\nexport type SkillState = z.infer<typeof skillStateSchema>;\n\n// Shared skill state - tracks which employees depend on this shared skill\nexport const sharedSkillStateSchema = z.object({\n version: z.string(),\n installedAt: z.string(),\n platforms: z.array(platformSchema),\n // Track which employees depend on this shared skill\n // When this array becomes empty, the shared skill can be removed\n usedBy: z.array(z.string()),\n});\n\nexport type SharedSkillState = z.infer<typeof sharedSkillStateSchema>;\n\nexport const registryConfigSchema = z.union([\n z.string().refine((s) => s.includes('{name}'), {\n message: 'Registry URL must include {name} placeholder',\n }),\n z.object({\n url: z.string().refine((s) => s.includes('{name}'), {\n message: 'Registry URL must include {name} placeholder',\n }),\n headers: z.record(z.string()).optional(),\n }),\n]);\n\nexport type RegistryConfig = z.infer<typeof registryConfigSchema>;\n\nexport const configSchema = z.object({\n $schema: z.string().optional(),\n language: languageSchema.optional(),\n defaultPlatform: platformSchema,\n platforms: z.record(platformSchema, platformPathsSchema),\n employees: z.record(z.string(), employeeStateSchema).default({}),\n skills: z.record(z.string(), skillStateSchema).default({}), // Standalone skills\n sharedSkills: z.record(z.string(), sharedSkillStateSchema).default({}), // Shared skills with reference tracking\n registries: z\n .record(\n z.string().refine((key) => key.startsWith('@'), {\n message: 'Registry key must start with @',\n }),\n registryConfigSchema\n )\n .default({\n '@the-aico': DEFAULT_REGISTRY_URL,\n }),\n});\n\nexport type Config = z.infer<typeof configSchema>;\n\nexport const DEFAULT_PLATFORMS: Record<Platform, PlatformPaths> = {\n 'claude-code': {\n skills: '.claude/skills',\n commands: '.claude/commands',\n },\n // Codex 平台配置:\n // - skills: 项目目录 .codex/skills/(Codex 原生支持项目级 skills)\n // - commands (prompts): 全局 ~/.codex/prompts/(一次安装所有项目可用)\n // 调用方式:/prompts:aico.{employee}.{command}\n // 用户可在 aico.json 中覆盖路径\n codex: {\n skills: '.codex/skills',\n commands: '~/.codex/prompts', // Codex custom prompts (全局)\n },\n};\n\nexport function createDefaultConfig(\n defaultPlatform: Platform = 'claude-code'\n): Config {\n return {\n $schema: DEFAULT_SCHEMA_URL,\n defaultPlatform,\n platforms: DEFAULT_PLATFORMS,\n employees: {},\n skills: {},\n sharedSkills: {},\n registries: {\n '@the-aico': DEFAULT_REGISTRY_URL,\n },\n };\n}\n","import kleur from 'kleur';\nimport ora, { type Ora } from 'ora';\n\nexport const logger = {\n info: (msg: string): void => {\n console.log(kleur.blue('ℹ'), msg);\n },\n\n success: (msg: string): void => {\n console.log(kleur.green('✓'), msg);\n },\n\n warn: (msg: string): void => {\n console.log(kleur.yellow('⚠'), msg);\n },\n\n error: (msg: string): void => {\n console.log(kleur.red('✖'), msg);\n },\n\n log: (msg: string): void => {\n console.log(msg);\n },\n\n break: (): void => {\n console.log();\n },\n\n dim: (msg: string): void => {\n console.log(kleur.dim(msg));\n },\n\n bold: (msg: string): void => {\n console.log(kleur.bold(msg));\n },\n\n highlight: (msg: string): string => {\n return kleur.cyan(msg);\n },\n\n table: (rows: string[][]): void => {\n for (const row of rows) {\n console.log(' ' + row.join(' '));\n }\n },\n\n // Format functions (return string without printing)\n formatSuccess: (msg: string): string => {\n return kleur.green(msg);\n },\n\n formatError: (msg: string): string => {\n return kleur.red(msg);\n },\n\n formatDim: (msg: string): string => {\n return kleur.dim(msg);\n },\n};\n\nexport function spinner(text: string): Ora {\n return ora({\n text,\n spinner: 'dots',\n });\n}\n","import { Command } from 'commander';\nimport prompts from 'prompts';\nimport { z } from 'zod';\nimport {\n getConfig,\n updateEmployees,\n updateSkill,\n addSharedSkillReference,\n isSharedSkillInstalled,\n} from '../utils/config.js';\nimport { logger, spinner } from '../utils/logger.js';\nimport {\n handleError,\n notInitializedError,\n platformNotSupportedError,\n} from '../utils/errors.js';\nimport { platformSchema, type Platform } from '../schema/config.js';\nimport {\n fetchEmployee,\n fetchSkill,\n fetchRegistryIndex,\n} from '../registry/client.js';\nimport {\n checkConflicts,\n confirmOverwrite,\n installEmployee,\n uninstallEmployee,\n} from '../installer/index.js';\nimport { installSkill } from '../installer/skill-installer.js';\nimport { parseTarget, type ParsedTarget } from '../utils/parse-target.js';\nimport {\n DependencyResolver,\n formatDependencyTree,\n} from '../registry/resolver.js';\nimport type { MCPDependency } from '../schema/skill.js';\nimport { parseSkillFrontmatter } from '../schema/skill.js';\nimport {\n checkConstraintDocs,\n showConstraintDocHints,\n} from '../utils/constraint-docs.js';\n\n// Collect MCP dependencies during installation\nconst collectedMCPDeps: Map<string, MCPDependency> = new Map();\n\n// Collect constraint doc info for each employee\nconst constraintDocInfo: Map<\n string,\n { existing: string[]; missing: string[] }\n> = new Map();\n\nconst addOptionsSchema = z.object({\n items: z.array(z.string()),\n cwd: z.string(),\n platforms: z.array(platformSchema).optional(),\n overwrite: z.boolean(),\n yes: z.boolean(),\n noDeps: z.boolean(),\n});\n\ntype AddOptions = z.infer<typeof addOptionsSchema>;\n\n/**\n * Interactive employee selection when no arguments provided\n */\nasync function selectEmployeesInteractively(cwd: string): Promise<string[]> {\n const config = await getConfig(cwd);\n if (!config) {\n throw notInitializedError();\n }\n\n const s = spinner('Fetching available employees...').start();\n\n try {\n const index = await fetchRegistryIndex(config, cwd);\n s.stop();\n\n if (index.employees.length === 0) {\n logger.warn('No employees available in registry.');\n return [];\n }\n\n // Build choices with installed status\n const installedNames = new Set(Object.keys(config.employees));\n const choices = index.employees.map((emp) => ({\n title: installedNames.has(emp.name)\n ? `${emp.name} (${emp.role}) [installed]`\n : `${emp.name} (${emp.role})`,\n value: emp.name,\n description: emp.description,\n disabled: false,\n }));\n\n logger.break();\n logger.info('Available employees:');\n logger.break();\n\n const { selected } = await prompts({\n type: 'multiselect',\n name: 'selected',\n message: 'Select employees to add',\n choices,\n hint: '- Space to select, Enter to confirm',\n instructions: false,\n });\n\n return selected ?? [];\n } catch (error) {\n s.fail('Failed to fetch employee list');\n throw error;\n }\n}\n\nasync function runAdd(options: AddOptions): Promise<void> {\n const { items, cwd, overwrite, yes } = options;\n\n // Load config\n const config = await getConfig(cwd);\n if (!config) {\n throw notInitializedError();\n }\n\n // Determine target platforms\n let platforms: Platform[];\n if (options.platforms && options.platforms.length > 0) {\n platforms = options.platforms;\n } else {\n platforms = [config.defaultPlatform];\n }\n\n // Validate platforms\n for (const platform of platforms) {\n if (!config.platforms[platform]) {\n throw platformNotSupportedError(platform);\n }\n }\n\n // Parse all items to determine type\n const targets = items.map((item) => parseTarget(item));\n const employees = targets.filter((t) => t.type === 'employee');\n const skills = targets.filter((t) => t.type === 'skill');\n\n // Process employees\n for (const target of employees) {\n await addEmployee(target, config, cwd, platforms, overwrite, yes);\n }\n\n // Process standalone skills (with dependency resolution)\n if (skills.length > 0) {\n await addSkillsWithDeps(\n skills,\n config,\n cwd,\n platforms,\n overwrite,\n options.yes,\n options.noDeps\n );\n }\n\n logger.break();\n logger.success('Installation complete!');\n logger.dim(`Installed to: ${platforms.join(', ')}`);\n\n // Show MCP dependency hints if any\n showMCPDependencyHints();\n\n // Show constraint document hints for each employee\n showConstraintDocumentHints();\n}\n\n/**\n * Add a single employee\n */\nasync function addEmployee(\n target: ParsedTarget,\n config: Awaited<ReturnType<typeof getConfig>>,\n cwd: string,\n platforms: Platform[],\n overwrite: boolean,\n yes: boolean\n): Promise<void> {\n if (!config) return;\n\n const s = spinner(`Adding ${target.name}...`).start();\n\n try {\n // Fetch employee from registry\n const employee = await fetchEmployee(target.fullName, config, cwd);\n s.text = `Installing ${employee.name} (${employee.role})...`;\n\n // Check for conflicts\n const conflicts = await checkConflicts(employee, config, cwd, platforms);\n let shouldOverwrite = overwrite;\n\n if (conflicts.length > 0 && !overwrite) {\n s.stop();\n\n if (!yes) {\n logger.warn(`Found ${conflicts.length} existing file(s):`);\n for (const conflict of conflicts.slice(0, 5)) {\n logger.dim(` - ${conflict.path}`);\n }\n if (conflicts.length > 5) {\n logger.dim(` ... and ${conflicts.length - 5} more`);\n }\n\n const confirmed = await confirmOverwrite(conflicts);\n if (!confirmed) {\n logger.info(`Skipped ${target.name}`);\n return;\n }\n // User confirmed overwrite\n shouldOverwrite = true;\n }\n\n s.start();\n }\n\n // If overwriting/updating, uninstall old version first to clean up removed skills/commands\n const isUpdate = config.employees[employee.name] !== undefined;\n if (shouldOverwrite && isUpdate) {\n await uninstallEmployee(employee.name, config, cwd, platforms);\n }\n\n // Install employee\n await installEmployee(employee, config, cwd, platforms, {\n overwrite: shouldOverwrite,\n });\n\n // Install shared skill dependencies\n const installedSharedSkills: string[] = [];\n if (employee.dependencies && employee.dependencies.length > 0) {\n s.text = `Installing shared skills for ${employee.name}...`;\n\n for (const depFullName of employee.dependencies) {\n // Check if already installed\n const alreadyInstalled = await isSharedSkillInstalled(cwd, depFullName);\n\n if (!alreadyInstalled) {\n // Fetch and install the shared skill\n try {\n const sharedSkill = await fetchSkill(depFullName, config, cwd);\n\n for (const platform of platforms) {\n await installSkill(sharedSkill, config, cwd, {\n platform,\n overwrite: shouldOverwrite,\n });\n }\n\n installedSharedSkills.push(depFullName);\n } catch (err) {\n s.warn(`Failed to install shared skill ${depFullName}`);\n logger.dim(\n ` Error: ${err instanceof Error ? err.message : String(err)}`\n );\n continue;\n }\n }\n\n // Update reference tracking (always, even if already installed)\n await addSharedSkillReference(\n cwd,\n depFullName,\n employee.name,\n '1.0.0', // TODO: get version from skill\n platforms\n );\n }\n }\n\n // Update config with skills and commands list\n const skillNames = employee.skills.map((sk) => sk.name);\n const commandNames = employee.commands.map((c) => c.name);\n await updateEmployees(\n cwd,\n employee.name,\n platforms,\n skillNames,\n commandNames\n );\n\n s.succeed(`Added ${employee.name} (${employee.role})`);\n\n // Show installed skills\n logger.dim(` Skills: ${employee.skills.map((sk) => sk.name).join(', ')}`);\n if (employee.commands.length > 0) {\n logger.dim(\n ` Commands: ${employee.commands.map((c) => `/${employee.name}.${c.name}`).join(', ')}`\n );\n }\n\n // Show installed shared skills\n if (installedSharedSkills.length > 0) {\n logger.dim(\n ` Shared skills: ${installedSharedSkills.map((s) => s.split('/').pop()).join(', ')}`\n );\n } else if (employee.dependencies && employee.dependencies.length > 0) {\n // All dependencies were already installed\n logger.dim(\n ` Shared skills: ${employee.dependencies.map((s) => s.split('/').pop()).join(', ')} (already installed)`\n );\n }\n\n // Collect MCP dependencies from employee skills\n for (const skill of employee.skills) {\n const skillFile = skill.files.find((f) => f.path.endsWith('SKILL.md'));\n if (skillFile) {\n const frontmatter = parseSkillFrontmatter(skillFile.content);\n if (frontmatter?.mcpDependencies) {\n for (const dep of frontmatter.mcpDependencies) {\n collectedMCPDeps.set(dep.name, dep);\n }\n }\n }\n }\n\n // Check constraint documents for this employee\n const constraintInfo = await checkConstraintDocs(employee.name, cwd);\n constraintDocInfo.set(employee.name, constraintInfo);\n } catch (error) {\n s.fail(`Failed to add ${target.name}`);\n throw error;\n }\n}\n\n/**\n * Add skills with dependency resolution\n */\nasync function addSkillsWithDeps(\n targets: ParsedTarget[],\n config: Awaited<ReturnType<typeof getConfig>>,\n cwd: string,\n platforms: Platform[],\n overwrite: boolean,\n yes: boolean,\n noDeps: boolean\n): Promise<void> {\n if (!config) return;\n\n const skillNames = targets.map((t) => t.fullName);\n\n if (noDeps) {\n // Skip dependency resolution - install directly\n logger.warn('Skipping dependencies. Some skills may not work correctly.');\n for (const target of targets) {\n await addSingleSkill(target.fullName, config, cwd, platforms, overwrite);\n }\n return;\n }\n\n // Resolve dependencies\n const s = spinner('Resolving dependencies...').start();\n\n try {\n const resolver = new DependencyResolver((name) =>\n fetchSkill(name, config, cwd)\n );\n\n const { skills, tree } = await resolver.resolve(skillNames);\n s.stop();\n\n // Show dependency tree\n logger.break();\n logger.log(formatDependencyTree(tree.dependencies[0]!));\n logger.break();\n\n // Confirm installation\n const depCount = skills.length - skillNames.length;\n if (depCount > 0 && !yes) {\n const { confirmed } = await prompts({\n type: 'confirm',\n name: 'confirmed',\n message: `Install ${skills.length} skill(s) (${depCount} dependencies)?`,\n initial: true,\n });\n\n if (!confirmed) {\n logger.info('Cancelled.');\n return;\n }\n }\n\n // Install all skills in dependency order\n for (const skill of skills) {\n await addSingleSkill(\n skill.fullName,\n config,\n cwd,\n platforms,\n overwrite,\n skill\n );\n }\n } catch (error) {\n s.fail('Failed to resolve dependencies');\n throw error;\n }\n}\n\n/**\n * Add a single skill (no dependency resolution)\n */\nasync function addSingleSkill(\n fullName: string,\n config: Awaited<ReturnType<typeof getConfig>>,\n cwd: string,\n platforms: Platform[],\n overwrite: boolean,\n prefetchedSkill?: Awaited<ReturnType<typeof fetchSkill>>\n): Promise<void> {\n if (!config) return;\n\n const s = spinner(`Adding skill ${fullName}...`).start();\n\n try {\n // Use prefetched skill or fetch from registry\n const skill = prefetchedSkill ?? (await fetchSkill(fullName, config, cwd));\n s.text = `Installing ${skill.name}...`;\n\n // Install skill to each platform\n for (const platform of platforms) {\n const result = await installSkill(skill, config, cwd, {\n platform,\n overwrite,\n });\n\n if (result.skipped && !overwrite) {\n s.warn(\n `Skill ${skill.name} already exists (use --overwrite to replace)`\n );\n return;\n }\n }\n\n // Update config\n await updateSkill(cwd, fullName, skill.version, platforms, 'standalone');\n\n s.succeed(`Added skill ${skill.fullName}`);\n logger.dim(` Version: ${skill.version}`);\n logger.dim(` Category: ${skill.category}`);\n\n // Collect MCP dependencies\n if (skill.mcpDependencies) {\n for (const dep of skill.mcpDependencies) {\n collectedMCPDeps.set(dep.name, dep);\n }\n }\n } catch (error) {\n s.fail(`Failed to add skill ${fullName}`);\n throw error;\n }\n}\n\n/**\n * Show MCP dependency hints after installation\n */\nfunction showMCPDependencyHints(): void {\n if (collectedMCPDeps.size === 0) {\n return;\n }\n\n logger.break();\n logger.warn(`Some skills require MCP servers to be configured:`);\n logger.break();\n\n for (const [name, dep] of collectedMCPDeps) {\n logger.info(` ${name}`);\n logger.dim(` ${dep.description}`);\n logger.dim(` Package: ${dep.package}`);\n logger.dim(` Docs: ${dep.docsUrl}`);\n logger.break();\n }\n\n logger.info(\n 'To configure MCP servers, add them to your claude_desktop_config.json'\n );\n logger.dim('See: https://docs.claude.ai/mcp');\n\n // Clear collected deps for next run\n collectedMCPDeps.clear();\n}\n\n/**\n * Show constraint document hints after installation\n */\nfunction showConstraintDocumentHints(): void {\n if (constraintDocInfo.size === 0) {\n return;\n }\n\n for (const [employeeName, info] of constraintDocInfo) {\n showConstraintDocHints(employeeName, info.existing, info.missing);\n }\n\n // Clear for next run\n constraintDocInfo.clear();\n}\n\nexport const add = new Command()\n .name('add')\n .description('Add employees or skills to your project')\n .argument(\n '[items...]',\n 'Employee or skill names (e.g., pm, @the-aico/pm/brainstorming)'\n )\n .option(\n '-p, --platform <platform>',\n 'Target platform (can be used multiple times)',\n (value, previous: Platform[]) => {\n const result = platformSchema.safeParse(value);\n if (!result.success) {\n throw new Error(\n `Invalid platform: ${value}. Available: claude-code, codex`\n );\n }\n return [...previous, result.data];\n },\n [] as Platform[]\n )\n .option('-o, --overwrite', 'Overwrite existing files', false)\n .option('-y, --yes', 'Skip confirmation prompts', false)\n .option('--no-deps', 'Skip dependency installation', false)\n .option('-c, --cwd <cwd>', 'Working directory', process.cwd())\n .action(async (items: string[], opts) => {\n try {\n let selectedItems = items;\n\n // If no items provided, show interactive selection\n if (items.length === 0) {\n selectedItems = await selectEmployeesInteractively(opts.cwd);\n if (selectedItems.length === 0) {\n logger.info('No employees selected.');\n return;\n }\n }\n\n const options = addOptionsSchema.parse({\n items: selectedItems,\n cwd: opts.cwd,\n platforms: opts.platform.length > 0 ? opts.platform : undefined,\n overwrite: opts.overwrite,\n yes: opts.yes,\n noDeps: opts.noDeps ?? false,\n });\n\n await runAdd(options);\n } catch (error) {\n handleError(error);\n }\n });\n","import path from 'path'\nimport { employeeSchema, registryIndexSchema, type Employee, type RegistryIndex } from '../schema/employee.js'\nimport { skillSchema, type Skill } from '../schema/skill.js'\nimport { skillsIndexSchema, type SkillsIndex } from '../schema/registry.js'\nimport type { Config, RegistryConfig } from '../schema/config.js'\nimport { loadLocalEmployee, loadLocalIndex, loadLocalSkill, loadLocalSkillsIndex } from './local.js'\nimport { employeeNotFoundError, registryFetchError, skillNotFoundError } from '../utils/errors.js'\nimport { parseSkillFullName } from '../utils/parse-target.js'\n\n/**\n * Resolve registry URL for an employee\n */\nfunction resolveRegistryUrl(config: RegistryConfig, employeeName: string): string {\n if (typeof config === 'string') {\n return config.replace('{name}', employeeName)\n }\n return config.url.replace('{name}', employeeName)\n}\n\n/**\n * Get headers for registry request\n */\nfunction getRegistryHeaders(config: RegistryConfig): Record<string, string> {\n if (typeof config === 'object' && config.headers) {\n return config.headers\n }\n return {}\n}\n\n/**\n * Parse registry reference (e.g., \"@the-aico/pm\" -> { registry: \"@the-aico\", name: \"pm\" })\n */\nfunction parseEmployeeRef(ref: string): { registry: string; name: string } {\n if (ref.startsWith('@')) {\n const parts = ref.split('/')\n if (parts.length === 2 && parts[0] && parts[1]) {\n return { registry: parts[0], name: parts[1] }\n }\n }\n return { registry: '@the-aico', name: ref }\n}\n\n/**\n * Fetch employee from registry\n */\nexport async function fetchEmployee(\n employeeRef: string,\n config: Config,\n cwd: string\n): Promise<Employee> {\n const { registry, name } = parseEmployeeRef(employeeRef)\n\n const registryConfig = config.registries[registry]\n if (!registryConfig) {\n throw new Error(`Registry '${registry}' not found in config`)\n }\n\n // Check if it's a local file:// URL\n const url = resolveRegistryUrl(registryConfig, name)\n if (url.startsWith('file://')) {\n // file://./registry/{name}.json -> ./registry/{name}.json\n const localPath = url.replace('file://', '')\n // Resolve relative to cwd\n const resolvedPath = path.isAbsolute(localPath) ? localPath : path.resolve(cwd, localPath)\n // loadLocalEmployee expects directory and name, not full path\n // registry/pm.json -> loadLocalEmployee('registry', 'pm')\n const registryDir = path.dirname(resolvedPath)\n const employee = await loadLocalEmployee(registryDir, name)\n if (!employee) {\n throw employeeNotFoundError(employeeRef)\n }\n return employee\n }\n\n // Fetch from remote\n const headers = getRegistryHeaders(registryConfig)\n const response = await fetch(url, { headers })\n\n if (!response.ok) {\n if (response.status === 404) {\n throw employeeNotFoundError(employeeRef)\n }\n throw registryFetchError(url, response.status)\n }\n\n const json = await response.json()\n return employeeSchema.parse(json)\n}\n\n/**\n * Fetch registry index\n */\nexport async function fetchRegistryIndex(\n config: Config,\n cwd: string,\n registryName = '@the-aico'\n): Promise<RegistryIndex> {\n const registryConfig = config.registries[registryName]\n if (!registryConfig) {\n throw new Error(`Registry '${registryName}' not found in config`)\n }\n\n const url = resolveRegistryUrl(registryConfig, 'index')\n\n // Check if it's a local file:// URL\n if (url.startsWith('file://')) {\n const localPath = url.replace('file://', '').replace('/index.json', '')\n const resolvedPath = path.isAbsolute(localPath) ? localPath : path.resolve(cwd, localPath)\n const index = await loadLocalIndex(resolvedPath)\n if (!index) {\n return { employees: [] }\n }\n return index\n }\n\n // Fetch from remote\n const headers = getRegistryHeaders(registryConfig)\n const response = await fetch(url.replace('{name}.json', 'index.json'), { headers })\n\n if (!response.ok) {\n if (response.status === 404) {\n return { employees: [] }\n }\n throw registryFetchError(url, response.status)\n }\n\n const json = await response.json()\n return registryIndexSchema.parse(json)\n}\n\n// ============================================================================\n// Skill Fetching (New Format)\n// ============================================================================\n\n/**\n * Build URL for skill from registry config\n */\nfunction buildSkillUrl(registryConfig: RegistryConfig, fullName: string): string {\n const parsed = parseSkillFullName(fullName)\n if (!parsed) {\n throw new Error(`Invalid skill full name: ${fullName}`)\n }\n\n const baseUrl = typeof registryConfig === 'string'\n ? registryConfig.replace('{name}.json', '')\n : registryConfig.url.replace('{name}.json', '')\n\n // Build: {baseUrl}/skills/{registry}/{employee}/{skill}.json\n // e.g., https://the-aico.com/r/skills/aico/pm/brainstorming.json\n return `${baseUrl}skills/${parsed.registry.replace('@', '')}/${parsed.employee}/${parsed.skill}.json`\n}\n\n/**\n * Build URL for skills index from registry config\n */\nfunction buildSkillsIndexUrl(registryConfig: RegistryConfig): string {\n const baseUrl = typeof registryConfig === 'string'\n ? registryConfig.replace('{name}.json', '')\n : registryConfig.url.replace('{name}.json', '')\n\n return `${baseUrl}skills/index.json`\n}\n\n/**\n * Fetch a single skill from registry\n */\nexport async function fetchSkill(\n fullName: string,\n config: Config,\n cwd: string\n): Promise<Skill> {\n const parsed = parseSkillFullName(fullName)\n if (!parsed) {\n throw new Error(`Invalid skill full name: ${fullName}`)\n }\n\n const registryConfig = config.registries[parsed.registry]\n if (!registryConfig) {\n throw new Error(`Registry '${parsed.registry}' not found in config`)\n }\n\n // Check if it's a local file:// URL\n const url = buildSkillUrl(registryConfig, fullName)\n if (url.startsWith('file://')) {\n const localPath = url.replace('file://', '')\n const registryDir = path.resolve(cwd, localPath.split('/skills/')[0] ?? '')\n const skill = await loadLocalSkill(registryDir, fullName)\n if (!skill) {\n throw skillNotFoundError(fullName)\n }\n return skill\n }\n\n // Fetch from remote\n const headers = getRegistryHeaders(registryConfig)\n const response = await fetch(url, { headers })\n\n if (!response.ok) {\n if (response.status === 404) {\n throw skillNotFoundError(fullName)\n }\n throw registryFetchError(url, response.status)\n }\n\n const json = await response.json()\n return skillSchema.parse(json)\n}\n\n/**\n * Fetch skills index from registry\n */\nexport async function fetchSkillsIndex(\n config: Config,\n cwd: string,\n registryName = '@the-aico'\n): Promise<SkillsIndex> {\n const registryConfig = config.registries[registryName]\n if (!registryConfig) {\n throw new Error(`Registry '${registryName}' not found in config`)\n }\n\n const url = buildSkillsIndexUrl(registryConfig)\n\n // Check if it's a local file:// URL\n if (url.startsWith('file://')) {\n const localPath = url.replace('file://', '').replace('/skills/index.json', '')\n const resolvedPath = path.isAbsolute(localPath) ? localPath : path.resolve(cwd, localPath)\n const index = await loadLocalSkillsIndex(resolvedPath)\n return index ?? []\n }\n\n // Fetch from remote\n const headers = getRegistryHeaders(registryConfig)\n const response = await fetch(url, { headers })\n\n if (!response.ok) {\n if (response.status === 404) {\n return []\n }\n throw registryFetchError(url, response.status)\n }\n\n const json = await response.json()\n return skillsIndexSchema.parse(json)\n}\n","import { z } from 'zod';\nimport { skillCategorySchema } from './skill.js';\n\nexport const fileTypeSchema = z.enum(['skill', 'command', 'doc']);\n\nexport type FileType = z.infer<typeof fileTypeSchema>;\n\n// Source file schema (content not yet loaded)\nexport const employeeFileSourceSchema = z.object({\n path: z.string().min(1),\n type: fileTypeSchema,\n});\n\nexport type EmployeeFileSource = z.infer<typeof employeeFileSourceSchema>;\n\n// Full file schema (content loaded)\nexport const employeeFileSchema = employeeFileSourceSchema.extend({\n content: z.string().min(1),\n});\n\nexport type EmployeeFile = z.infer<typeof employeeFileSchema>;\n\n// Source schemas (before content loaded)\nexport const skillDefSourceSchema = z.object({\n name: z.string().regex(/^[a-z0-9-]+$/, 'Skill name must be hyphen-case'),\n files: z.array(employeeFileSourceSchema).min(1),\n});\n\nexport const commandDefSourceSchema = z.object({\n name: z.string().regex(/^[a-z0-9-]+$/, 'Command name must be hyphen-case'),\n files: z.array(employeeFileSourceSchema).min(1),\n});\n\nexport const docDefSourceSchema = z.object({\n name: z.string(),\n files: z.array(employeeFileSourceSchema).min(1),\n});\n\nexport const employeeSourceSchema = z.object({\n $schema: z.string().optional(),\n name: z.string().regex(/^[a-z0-9-]+$/, 'Employee name must be hyphen-case'),\n role: z.string().min(1),\n description: z.string().optional(),\n skills: z.array(skillDefSourceSchema).default([]),\n commands: z.array(commandDefSourceSchema).default([]),\n docs: z.array(docDefSourceSchema).default([]),\n dependencies: z.array(z.string()).default([]),\n});\n\nexport type EmployeeSource = z.infer<typeof employeeSourceSchema>;\n\n// Full schemas (content loaded)\nexport const skillDefSchema = z.object({\n name: z.string().regex(/^[a-z0-9-]+$/, 'Skill name must be hyphen-case'),\n files: z.array(employeeFileSchema).min(1),\n});\n\nexport type SkillDef = z.infer<typeof skillDefSchema>;\n\nexport const commandDefSchema = z.object({\n name: z.string().regex(/^[a-z0-9-]+$/, 'Command name must be hyphen-case'),\n files: z.array(employeeFileSchema).min(1),\n});\n\nexport type CommandDef = z.infer<typeof commandDefSchema>;\n\nexport const docDefSchema = z.object({\n name: z.string(),\n files: z.array(employeeFileSchema).min(1),\n});\n\nexport type DocDef = z.infer<typeof docDefSchema>;\n\nexport const employeeSchema = z.object({\n $schema: z.string().optional(),\n name: z.string().regex(/^[a-z0-9-]+$/, 'Employee name must be hyphen-case'),\n role: z.string().min(1),\n description: z.string().optional(),\n skills: z.array(skillDefSchema).default([]),\n commands: z.array(commandDefSchema).default([]),\n docs: z.array(docDefSchema).default([]),\n dependencies: z.array(z.string()).default([]),\n});\n\nexport type Employee = z.infer<typeof employeeSchema>;\n\n// ============================================================================\n// Employee Summary Schema (for index)\n// ============================================================================\n\nexport const employeeSummarySchema = z.object({\n name: z.string(),\n namespace: z.string().optional(),\n fullName: z.string().optional(),\n role: z.string(),\n description: z.string().optional(),\n version: z.string().optional(),\n skillCount: z.number().optional(),\n commandCount: z.number().optional(),\n category: skillCategorySchema.optional(),\n});\n\nexport type EmployeeSummary = z.infer<typeof employeeSummarySchema>;\n\n// ============================================================================\n// Extended Employee Schema (for new registry format)\n// ============================================================================\n\nexport const employeeExtendedSchema = z.object({\n $schema: z.string().optional(),\n name: z.string().regex(/^[a-z0-9-]+$/, 'Employee name must be hyphen-case'),\n namespace: z\n .string()\n .regex(/^@[a-z0-9-]+$/, 'Namespace must be @registry format'),\n fullName: z\n .string()\n .regex(\n /^@[a-z0-9-]+\\/[a-z0-9-]+$/,\n 'Full name must be @registry/employee format'\n ),\n role: z.string().min(1),\n description: z.string().optional(),\n version: z.string().regex(/^\\d+\\.\\d+\\.\\d+$/, 'Version must be semver format'),\n category: skillCategorySchema,\n skills: z.array(z.string()), // Array of skill fullNames: [\"@the-aico/pm/brainstorming\", ...]\n commands: z.array(commandDefSchema).default([]),\n docs: z.array(docDefSchema).default([]),\n});\n\nexport type EmployeeExtended = z.infer<typeof employeeExtendedSchema>;\n\n// ============================================================================\n// Legacy Registry Index Schema (for backward compatibility)\n// ============================================================================\n\nexport const registryIndexSchema = z.object({\n employees: z.array(employeeSummarySchema),\n});\n\nexport type RegistryIndex = z.infer<typeof registryIndexSchema>;\n","import YAML from 'js-yaml';\nimport { z } from 'zod';\nimport { logger } from '../utils/logger.js';\n\n// ============================================================================\n// Skill Frontmatter Schema (from SKILL.md)\n// ============================================================================\n\nexport const skillFrontmatterSchema = z.object({\n name: z.string().regex(/^[a-z0-9-]+$/, 'Skill name must be hyphen-case'),\n description: z.string(),\n version: z.string().optional(),\n category: z\n .enum(['pm', 'frontend', 'backend', 'devops', 'general'])\n .optional(),\n tags: z.array(z.string()).optional(),\n dependencies: z.array(z.string()).optional(),\n mcpDependencies: z\n .array(\n z.object({\n name: z.string(),\n package: z.string(),\n description: z.string(),\n docsUrl: z.string().url(),\n })\n )\n .optional(),\n});\n\nexport type SkillFrontmatter = z.infer<typeof skillFrontmatterSchema>;\n\n// ============================================================================\n// Skill File Schema (for registry)\n// ============================================================================\n\nexport const skillFileTypeSchema = z.enum([\n 'skill',\n 'reference',\n 'asset',\n 'script',\n]);\n\nexport type SkillFileType = z.infer<typeof skillFileTypeSchema>;\n\nexport const skillFileSchema = z.object({\n path: z.string().min(1),\n type: skillFileTypeSchema,\n content: z.string(),\n});\n\nexport type SkillFile = z.infer<typeof skillFileSchema>;\n\n// ============================================================================\n// Skill Category Schema\n// ============================================================================\n\nexport const skillCategorySchema = z.enum([\n 'pm',\n 'frontend',\n 'backend',\n 'devops',\n 'general',\n]);\n\nexport type SkillCategory = z.infer<typeof skillCategorySchema>;\n\n// ============================================================================\n// Full Skill Schema (for registry storage)\n// ============================================================================\n\nexport const skillSchema = z.object({\n name: z.string().regex(/^[a-z0-9-]+$/, 'Skill name must be hyphen-case'),\n namespace: z\n .string()\n .regex(\n /^@[a-z0-9-]+\\/[a-z0-9_-]+$/,\n 'Namespace must be @registry/employee format'\n ),\n fullName: z\n .string()\n .regex(\n /^@[a-z0-9-]+\\/[a-z0-9_-]+\\/[a-z0-9-]+$/,\n 'Full name must be @registry/employee/skill format'\n ),\n version: z.string().regex(/^\\d+\\.\\d+\\.\\d+$/, 'Version must be semver format'),\n description: z.string(),\n category: skillCategorySchema,\n tags: z.array(z.string()).default([]),\n dependencies: z.array(z.string()).default([]),\n mcpDependencies: z\n .array(\n z.object({\n name: z.string(),\n package: z.string(),\n description: z.string(),\n docsUrl: z.string(),\n })\n )\n .optional(),\n files: z.array(skillFileSchema),\n});\n\nexport type Skill = z.infer<typeof skillSchema>;\n\n// ============================================================================\n// Skill Summary Schema (for index)\n// ============================================================================\n\nexport const skillSummarySchema = z.object({\n name: z.string(),\n namespace: z.string(),\n fullName: z.string(),\n version: z.string(),\n description: z.string(),\n category: z.string(),\n tags: z.array(z.string()),\n});\n\nexport type SkillSummary = z.infer<typeof skillSummarySchema>;\n\n// ============================================================================\n// MCP Dependency Schema\n// ============================================================================\n\nexport const mcpDependencySchema = z.object({\n name: z.string(),\n package: z.string(),\n description: z.string(),\n docsUrl: z.string().url(),\n});\n\nexport type MCPDependency = z.infer<typeof mcpDependencySchema>;\n\n// ============================================================================\n// Parsing Functions\n// ============================================================================\n\n/**\n * Remove BOM character from content\n */\nfunction removeBOM(content: string): string {\n if (content.charCodeAt(0) === 0xfeff) {\n return content.slice(1);\n }\n return content;\n}\n\n/**\n * Parse YAML frontmatter from SKILL.md content\n * Uses js-yaml for proper YAML parsing including multiline strings\n */\nexport function parseSkillFrontmatter(\n content: string\n): SkillFrontmatter | null {\n // Preprocess: remove BOM\n content = removeBOM(content);\n\n // Extract frontmatter (supports both LF and CRLF)\n const frontmatterRegex = /^---\\r?\\n([\\s\\S]*?)\\r?\\n---/;\n const match = content.match(frontmatterRegex);\n\n if (!match) {\n return null;\n }\n\n const yamlContent = match[1] ?? '';\n\n // Parse YAML using js-yaml\n let data: unknown;\n try {\n data = YAML.load(yamlContent);\n } catch (error) {\n const yamlError = error as Error;\n logger.error(`Invalid YAML syntax: ${yamlError.message}`);\n return null;\n }\n\n // Validate with Zod schema\n const result = skillFrontmatterSchema.safeParse(data);\n\n if (!result.success) {\n const issues = result.error.issues\n .map((i) => `${i.path.join('.')}: ${i.message}`)\n .join(', ');\n logger.error(`Invalid frontmatter: ${issues}`);\n return null;\n }\n\n return result.data;\n}\n\n/**\n * Parse complete SKILL.md file and return frontmatter + body\n */\nexport function parseSkillFile(content: string): {\n frontmatter: SkillFrontmatter;\n body: string;\n} | null {\n const frontmatter = parseSkillFrontmatter(content);\n if (!frontmatter) {\n return null;\n }\n\n // Extract body (content after frontmatter)\n const bodyMatch = content.match(/^---\\r?\\n[\\s\\S]*?\\r?\\n---\\r?\\n([\\s\\S]*)$/);\n const body = bodyMatch ? (bodyMatch[1]?.trim() ?? '') : '';\n\n return { frontmatter, body };\n}\n\n/**\n * Remove frontmatter from SKILL.md content\n */\nexport function stripFrontmatter(content: string): string {\n return content.replace(/^---\\r?\\n[\\s\\S]*?\\r?\\n---\\r?\\n?/, '');\n}\n","import { z } from 'zod';\nimport { skillSummarySchema } from './skill.js';\nimport { employeeSummarySchema } from './employee.js';\n\n// ============================================================================\n// Skills Index Schema\n// ============================================================================\n\nexport const skillsIndexSchema = z.array(skillSummarySchema);\n\nexport type SkillsIndex = z.infer<typeof skillsIndexSchema>;\n\n// ============================================================================\n// Employees Index Schema\n// ============================================================================\n\nexport const employeesIndexSchema = z.array(employeeSummarySchema);\n\nexport type EmployeesIndex = z.infer<typeof employeesIndexSchema>;\n\n// ============================================================================\n// Full Registry Index Schema (new format)\n// ============================================================================\n\nexport const registryIndexV2Schema = z.object({\n version: z.literal('2.0').default('2.0'),\n skills: skillsIndexSchema,\n employees: employeesIndexSchema,\n});\n\nexport type RegistryIndexV2 = z.infer<typeof registryIndexV2Schema>;\n","import fs from 'fs-extra'\nimport path from 'path'\nimport { employeeSchema, registryIndexSchema, type Employee, type RegistryIndex } from '../schema/employee.js'\nimport { skillSchema, type Skill, type SkillSummary } from '../schema/skill.js'\nimport { skillsIndexSchema, type SkillsIndex } from '../schema/registry.js'\n\n// ============================================================================\n// Legacy Employee Loading (backward compatible)\n// ============================================================================\n\n/**\n * Load employee from local registry directory (legacy format)\n */\nexport async function loadLocalEmployee(\n registryDir: string,\n employeeName: string\n): Promise<Employee | null> {\n const employeePath = path.join(registryDir, `${employeeName}.json`)\n\n if (!(await fs.pathExists(employeePath))) {\n return null\n }\n\n const raw = await fs.readJson(employeePath)\n return employeeSchema.parse(raw)\n}\n\n/**\n * Load registry index from local directory (legacy format)\n */\nexport async function loadLocalIndex(registryDir: string): Promise<RegistryIndex | null> {\n const indexPath = path.join(registryDir, 'index.json')\n\n if (!(await fs.pathExists(indexPath))) {\n return null\n }\n\n const raw = await fs.readJson(indexPath)\n return registryIndexSchema.parse(raw)\n}\n\n// ============================================================================\n// New Skill-based Loading\n// ============================================================================\n\n/**\n * Load skill from local registry directory\n * @param registryDir - Base registry directory\n * @param skillFullName - Full skill name (e.g., \"@the-aico/pm/brainstorming\")\n */\nexport async function loadLocalSkill(\n registryDir: string,\n skillFullName: string\n): Promise<Skill | null> {\n // Parse fullName: @the-aico/pm/brainstorming -> skills/aico/pm/brainstorming.json\n const parts = skillFullName.replace('@', '').split('/')\n if (parts.length !== 3) {\n return null\n }\n\n const [registry, employee, skill] = parts\n const skillPath = path.join(registryDir, 'skills', registry!, employee!, `${skill}.json`)\n\n if (!(await fs.pathExists(skillPath))) {\n return null\n }\n\n const raw = await fs.readJson(skillPath)\n return skillSchema.parse(raw)\n}\n\n/**\n * Load skills index from local registry\n */\nexport async function loadLocalSkillsIndex(registryDir: string): Promise<SkillsIndex | null> {\n const indexPath = path.join(registryDir, 'skills', 'index.json')\n\n if (!(await fs.pathExists(indexPath))) {\n return null\n }\n\n const raw = await fs.readJson(indexPath)\n return skillsIndexSchema.parse(raw)\n}\n\n/**\n * Load all skills for an employee\n */\nexport async function loadLocalEmployeeSkills(\n registryDir: string,\n registryName: string,\n employeeName: string\n): Promise<Skill[]> {\n const skillsDir = path.join(registryDir, 'skills', registryName.replace('@', ''), employeeName)\n\n if (!(await fs.pathExists(skillsDir))) {\n return []\n }\n\n const files = await fs.readdir(skillsDir)\n const skills: Skill[] = []\n\n for (const file of files) {\n if (file.endsWith('.json')) {\n const raw = await fs.readJson(path.join(skillsDir, file))\n skills.push(skillSchema.parse(raw))\n }\n }\n\n return skills\n}\n\n// ============================================================================\n// Registry Utilities\n// ============================================================================\n\n/**\n * Check if local registry exists\n */\nexport async function localRegistryExists(registryDir: string): Promise<boolean> {\n return fs.pathExists(registryDir)\n}\n\n/**\n * Check if new format registry exists (has skills/ directory)\n */\nexport async function isNewFormatRegistry(registryDir: string): Promise<boolean> {\n const skillsDir = path.join(registryDir, 'skills')\n return fs.pathExists(skillsDir)\n}\n\n/**\n * List all available skills from local registry\n */\nexport async function listLocalSkills(registryDir: string): Promise<SkillSummary[]> {\n const index = await loadLocalSkillsIndex(registryDir)\n return index ?? []\n}\n","/**\n * Target parsing utilities for aico CLI\n *\n * Supports parsing both employee and skill references:\n * - Employee: \"pm\", \"@the-aico/pm\"\n * - Skill: \"@the-aico/pm/brainstorming\"\n */\n\nexport type TargetType = 'employee' | 'skill';\n\nexport interface ParsedTarget {\n type: TargetType;\n registry: string; // \"@the-aico\"\n namespace: string; // \"@the-aico/pm\" for skill, \"@the-aico\" for employee\n name: string; // \"brainstorming\" or \"pm\"\n fullName: string; // \"@the-aico/pm/brainstorming\" or \"@the-aico/pm\"\n}\n\n/**\n * Parse user input to determine if it's an employee or skill reference\n *\n * @example\n * parseTarget('pm') // { type: 'employee', registry: '@the-aico', name: 'pm', fullName: '@the-aico/pm' }\n * parseTarget('@the-aico/pm') // { type: 'employee', registry: '@the-aico', name: 'pm', fullName: '@the-aico/pm' }\n * parseTarget('@the-aico/pm/brainstorming') // { type: 'skill', registry: '@the-aico', namespace: '@the-aico/pm', name: 'brainstorming', fullName: '@the-aico/pm/brainstorming' }\n */\nexport function parseTarget(\n input: string,\n defaultRegistry = '@the-aico'\n): ParsedTarget {\n const trimmed = input.trim();\n\n // Check if it starts with @\n if (trimmed.startsWith('@')) {\n const parts = trimmed.split('/');\n\n if (parts.length === 2) {\n // @registry/employee format (e.g., @the-aico/pm)\n const [registry, name] = parts;\n return {\n type: 'employee',\n registry: registry!,\n namespace: registry!,\n name: name!,\n fullName: trimmed,\n };\n } else if (parts.length === 3) {\n // @registry/employee/skill format (e.g., @the-aico/pm/brainstorming)\n const [registry, employee, skill] = parts;\n return {\n type: 'skill',\n registry: registry!,\n namespace: `${registry}/${employee}`,\n name: skill!,\n fullName: trimmed,\n };\n }\n }\n\n // Simple name (e.g., \"pm\") - treat as employee with default registry\n return {\n type: 'employee',\n registry: defaultRegistry,\n namespace: defaultRegistry,\n name: trimmed,\n fullName: `${defaultRegistry}/${trimmed}`,\n };\n}\n\n/**\n * Build a skill full name from components\n */\nexport function buildSkillFullName(\n registry: string,\n employee: string,\n skill: string\n): string {\n return `${registry}/${employee}/${skill}`;\n}\n\n/**\n * Build an employee full name from components\n */\nexport function buildEmployeeFullName(\n registry: string,\n employee: string\n): string {\n return `${registry}/${employee}`;\n}\n\n/**\n * Parse a skill full name into components\n */\nexport function parseSkillFullName(\n fullName: string\n): { registry: string; employee: string; skill: string } | null {\n // Support both regular skills (@the-aico/pm/brainstorming) and\n // shared skills (@the-aico/_shared/code-review)\n const match = fullName.match(/^(@[a-z0-9-]+)\\/([a-z0-9_-]+)\\/([a-z0-9-]+)$/);\n if (!match || !match[1] || !match[2] || !match[3]) {\n return null;\n }\n return {\n registry: match[1],\n employee: match[2],\n skill: match[3],\n };\n}\n\n/**\n * Parse an employee full name into components\n */\nexport function parseEmployeeFullName(\n fullName: string\n): { registry: string; employee: string } | null {\n const match = fullName.match(/^(@[a-z0-9-]+)\\/([a-z0-9_-]+)$/);\n if (!match || !match[1] || !match[2]) {\n return null;\n }\n return {\n registry: match[1],\n employee: match[2],\n };\n}\n\n/**\n * Check if a string is a valid skill full name\n */\nexport function isSkillFullName(input: string): boolean {\n return /^@[a-z0-9-]+\\/[a-z0-9_-]+\\/[a-z0-9-]+$/.test(input);\n}\n\n/**\n * Check if a string is a valid employee full name\n */\nexport function isEmployeeFullName(input: string): boolean {\n return /^@[a-z0-9-]+\\/[a-z0-9_-]+$/.test(input);\n}\n","import fs from 'fs-extra';\nimport path from 'path';\nimport prompts from 'prompts';\nimport type { Config, Platform } from '../schema/config.js';\nimport type { Employee } from '../schema/employee.js';\nimport { resolvePlatformPaths } from '../utils/config.js';\nimport {\n claudeCodeAdapter,\n type PlatformAdapter,\n} from './platforms/claude-code.js';\nimport { codexAdapter } from './platforms/codex.js';\n\n/**\n * Platform adapter mapping\n *\n * Both Claude Code and Codex support skills and commands:\n *\n * Skills (same format):\n * - Claude Code: .claude/skills/{skill}/SKILL.md\n * - Codex: .codex/skills/{skill}/SKILL.md\n *\n * Commands (different mechanisms):\n * - Claude Code: .claude/commands/{employee}.{command}.md → /employee.command\n * - Codex: .codex/prompts/aico.{employee}.{command}.md → /prompts:aico.employee.command\n */\nconst adapters: Record<Platform, PlatformAdapter> = {\n 'claude-code': claudeCodeAdapter,\n codex: codexAdapter,\n};\n\nexport interface InstallOptions {\n overwrite: boolean;\n silent?: boolean;\n}\n\nexport interface ConflictInfo {\n path: string;\n type: 'skill' | 'command' | 'doc';\n}\n\nexport interface InstallResult {\n platform: Platform;\n skillsInstalled: number;\n commandsInstalled: number;\n}\n\n/**\n * Check for file conflicts before installation\n */\nexport async function checkConflicts(\n employee: Employee,\n config: Config,\n cwd: string,\n platforms: Platform[]\n): Promise<ConflictInfo[]> {\n const conflicts: ConflictInfo[] = [];\n\n for (const platform of platforms) {\n const adapter = adapters[platform];\n const { skillsDir, commandsDir } = resolvePlatformPaths(\n cwd,\n config,\n platform\n );\n\n // Check skills\n for (const skill of employee.skills) {\n const skillDirName = adapter.getSkillDirName(employee.name, skill.name);\n const skillPath = path.join(skillsDir, skillDirName);\n if (await fs.pathExists(skillPath)) {\n conflicts.push({ path: skillPath, type: 'skill' });\n }\n }\n\n // Check commands\n for (const command of employee.commands) {\n const commandFileName = adapter.getCommandFileName(\n employee.name,\n command.name\n );\n const commandPath = path.join(commandsDir, commandFileName);\n if (await fs.pathExists(commandPath)) {\n conflicts.push({ path: commandPath, type: 'command' });\n }\n }\n }\n\n return conflicts;\n}\n\n/**\n * Confirm overwrite with user\n */\nexport async function confirmOverwrite(\n conflicts: ConflictInfo[]\n): Promise<boolean> {\n const { proceed } = await prompts({\n type: 'confirm',\n name: 'proceed',\n message: `${conflicts.length} file(s) will be overwritten. Continue?`,\n initial: false,\n });\n\n return proceed;\n}\n\n/**\n * Install employee to specified platforms\n */\nexport async function installEmployee(\n employee: Employee,\n config: Config,\n cwd: string,\n platforms: Platform[],\n options: InstallOptions\n): Promise<InstallResult[]> {\n const results: InstallResult[] = [];\n\n for (const platform of platforms) {\n const result = await installEmployeeToPlatform(\n employee,\n config,\n cwd,\n platform,\n options\n );\n results.push(result);\n }\n\n return results;\n}\n\n/**\n * Install employee to a single platform\n */\nasync function installEmployeeToPlatform(\n employee: Employee,\n config: Config,\n cwd: string,\n platform: Platform,\n _options: InstallOptions\n): Promise<InstallResult> {\n const adapter = adapters[platform];\n const { skillsDir, commandsDir } = resolvePlatformPaths(\n cwd,\n config,\n platform\n );\n\n // Ensure directories exist\n await fs.ensureDir(skillsDir);\n await fs.ensureDir(commandsDir);\n\n let skillsInstalled = 0;\n let commandsInstalled = 0;\n\n // Install skills\n for (const skill of employee.skills) {\n const skillDirName = adapter.getSkillDirName(employee.name, skill.name);\n const skillDir = path.join(skillsDir, skillDirName);\n\n // Create skill directory\n await fs.ensureDir(skillDir);\n\n // Write skill files\n for (const file of skill.files) {\n const filePath = path.join(skillDir, path.basename(file.path));\n\n // Update frontmatter name to match directory name\n let content = file.content;\n if (file.path.endsWith('SKILL.md')) {\n content = updateSkillName(content, skillDirName);\n }\n\n await fs.writeFile(filePath, content, 'utf-8');\n }\n skillsInstalled++;\n }\n\n // Install commands\n // Claude Code: .claude/commands/{employee}.{command}.md\n // Codex: .codex/prompts/aico.{employee}.{command}.md\n for (const command of employee.commands) {\n const commandFileName = adapter.getCommandFileName(\n employee.name,\n command.name\n );\n\n for (const file of command.files) {\n const filePath = path.join(commandsDir, commandFileName);\n await fs.writeFile(filePath, file.content, 'utf-8');\n }\n commandsInstalled++;\n }\n\n return {\n platform,\n skillsInstalled,\n commandsInstalled,\n };\n}\n\n/**\n * Update skill name in SKILL.md frontmatter\n */\nfunction updateSkillName(content: string, newName: string): string {\n return content.replace(/^(---\\n[\\s\\S]*?name:\\s*).+$/m, `$1${newName}`);\n}\n\n/**\n * Remove employee from specified platforms\n */\nexport async function uninstallEmployee(\n employeeName: string,\n config: Config,\n cwd: string,\n platforms: Platform[]\n): Promise<void> {\n for (const platform of platforms) {\n const { skillsDir, commandsDir } = resolvePlatformPaths(\n cwd,\n config,\n platform\n );\n\n // Find and remove skill directories matching aico-{employee}-*\n const skillPrefix = `aico-${employeeName}-`;\n if (await fs.pathExists(skillsDir)) {\n const entries = await fs.readdir(skillsDir);\n for (const entry of entries) {\n if (entry.startsWith(skillPrefix)) {\n await fs.remove(path.join(skillsDir, entry));\n }\n }\n }\n\n // Find and remove command files\n // Claude Code: {employee}.*.md\n // Codex: aico.{employee}.*.md\n if (await fs.pathExists(commandsDir)) {\n const entries = await fs.readdir(commandsDir);\n const commandPrefix =\n platform === 'codex' ? `aico.${employeeName}.` : `${employeeName}.`;\n\n for (const entry of entries) {\n if (entry.startsWith(commandPrefix) && entry.endsWith('.md')) {\n await fs.remove(path.join(commandsDir, entry));\n }\n }\n }\n }\n}\n","import type { Platform } from '../../schema/config.js';\n\nexport interface PlatformAdapter {\n name: Platform;\n getSkillDirName(employeeName: string, skillName: string): string;\n getCommandFileName(employeeName: string, commandName: string): string;\n}\n\nexport const claudeCodeAdapter: PlatformAdapter = {\n name: 'claude-code',\n\n getSkillDirName(employeeName: string, skillName: string): string {\n return `aico-${employeeName}-${skillName}`;\n },\n\n getCommandFileName(employeeName: string, commandName: string): string {\n return `${employeeName}.${commandName}.md`;\n },\n};\n","import type { PlatformAdapter } from './claude-code.js';\n\n/**\n * Codex platform adapter\n *\n * Codex has native support for skills since December 2025, with the same format as Claude Code.\n *\n * Skills:\n * - Location: .codex/skills/{skill-name}/SKILL.md\n * - Format: Identical to Claude Code\n * - Trigger: Auto-detect or $skill-name\n *\n * Commands (Custom Prompts):\n * - Location: .codex/prompts/{prompt-name}.md\n * - Invocation: /prompts:aico.{employee}.{command}\n * - Format: Markdown (same as Claude Code commands)\n *\n * References:\n * - Skills: https://developers.openai.com/codex/skills/\n * - Custom Prompts: https://developers.openai.com/codex/custom-prompts/\n * - Slash Commands: https://developers.openai.com/codex/cli/slash-commands/\n */\n\nexport const codexAdapter: PlatformAdapter = {\n name: 'codex',\n\n /**\n * Codex skill directory name\n * Uses the same naming convention as Claude Code: aico-{employee}-{skill}\n */\n getSkillDirName(employeeName: string, skillName: string): string {\n return `aico-${employeeName}-${skillName}`;\n },\n\n /**\n * Codex command file name (Custom Prompts)\n *\n * Codex custom prompts are located in .codex/prompts/ directory\n * The file name (without .md) becomes the command name\n *\n * Naming convention: aico.{employee}.{command}.md\n * Invocation: /prompts:aico.{employee}.{command}\n *\n * Example:\n * - File: .codex/prompts/aico.pm.plan.md\n * - Invocation: /prompts:aico.pm.plan\n */\n getCommandFileName(employeeName: string, commandName: string): string {\n return `aico.${employeeName}.${commandName}.md`;\n },\n};\n","import fs from 'fs-extra';\nimport path from 'path';\nimport type { Config, Platform } from '../schema/config.js';\nimport type { Skill } from '../schema/skill.js';\nimport { resolvePlatformPaths } from '../utils/config.js';\n\nexport interface InstallSkillOptions {\n platform: Platform;\n overwrite?: boolean;\n}\n\nexport interface InstallSkillResult {\n skill: Skill;\n installed: boolean;\n skipped: boolean;\n reason?: string;\n path?: string;\n}\n\nexport interface UninstallSkillOptions {\n platform: Platform;\n dryRun?: boolean;\n}\n\nexport interface UninstallSkillResult {\n skillName: string;\n removed: boolean;\n files: string[];\n}\n\n/**\n * Get skill directory name from skill fullName or name\n * @example \"@the-aico/pm/brainstorming\" -> \"the-aico-pm-brainstorming\"\n * @example \"@the-aico/_shared/code-review\" -> \"aico-code-review\" (shared skills use aico- prefix)\n */\nexport function getSkillDirName(fullNameOrName: string): string {\n if (fullNameOrName.startsWith('@')) {\n // Check if it's a shared skill\n if (fullNameOrName.includes('/_shared/')) {\n // Shared skills: @the-aico/_shared/code-review -> aico-code-review\n const skillName = fullNameOrName.split('/').pop() || '';\n return `aico-${skillName}`;\n }\n // Regular skills: @the-aico/pm/brainstorming -> the-aico-pm-brainstorming\n const normalized = fullNameOrName.replace(/^@/, '').replace(/\\//g, '-');\n return normalized;\n }\n // Simple name: already hyphen-case\n return fullNameOrName;\n}\n\n/**\n * Install a single skill to the platform directory\n */\nexport async function installSkill(\n skill: Skill,\n config: Config,\n cwd: string,\n options: InstallSkillOptions\n): Promise<InstallSkillResult> {\n const { skillsDir } = resolvePlatformPaths(cwd, config, options.platform);\n const skillDirName = getSkillDirName(skill.fullName);\n const skillDir = path.join(skillsDir, skillDirName);\n\n // Check if already exists\n if (await fs.pathExists(skillDir)) {\n if (!options.overwrite) {\n return {\n skill,\n installed: false,\n skipped: true,\n reason: 'Already exists',\n path: skillDir,\n };\n }\n // Remove existing directory\n await fs.remove(skillDir);\n }\n\n // Create skill directory\n await fs.ensureDir(skillDir);\n\n // Write skill files\n for (const file of skill.files) {\n const filePath = path.join(skillDir, file.path);\n\n // Update frontmatter name to match directory name\n let content = file.content;\n if (file.path === 'SKILL.md' || file.path.endsWith('/SKILL.md')) {\n content = updateSkillFrontmatterName(content, skillDirName);\n }\n\n await fs.writeFile(filePath, content, 'utf-8');\n }\n\n return {\n skill,\n installed: true,\n skipped: false,\n path: skillDir,\n };\n}\n\n/**\n * Update skill name in SKILL.md frontmatter\n */\nfunction updateSkillFrontmatterName(content: string, newName: string): string {\n return content.replace(/^(---\\n[\\s\\S]*?name:\\s*).+$/m, `$1${newName}`);\n}\n\n/**\n * Uninstall a single skill from the platform directory\n */\nexport async function uninstallSkill(\n skillFullName: string,\n config: Config,\n cwd: string,\n options: UninstallSkillOptions\n): Promise<UninstallSkillResult> {\n const { skillsDir } = resolvePlatformPaths(cwd, config, options.platform);\n const skillDirName = getSkillDirName(skillFullName);\n const skillDir = path.join(skillsDir, skillDirName);\n\n // Check if directory exists\n if (!(await fs.pathExists(skillDir))) {\n return {\n skillName: skillFullName,\n removed: false,\n files: [],\n };\n }\n\n // List files that would be removed\n const files: string[] = [];\n const entries = await fs.readdir(skillDir);\n for (const entry of entries) {\n files.push(path.join(skillDir, entry));\n }\n\n // Dry run - only return file list\n if (options.dryRun) {\n return {\n skillName: skillFullName,\n removed: false,\n files,\n };\n }\n\n // Actually remove the directory\n await fs.remove(skillDir);\n\n return {\n skillName: skillFullName,\n removed: true,\n files,\n };\n}\n\n/**\n * Check if a skill is installed\n */\nexport async function isSkillInstalled(\n skillFullName: string,\n config: Config,\n cwd: string,\n platform: Platform\n): Promise<boolean> {\n const { skillsDir } = resolvePlatformPaths(cwd, config, platform);\n const skillDirName = getSkillDirName(skillFullName);\n const skillDir = path.join(skillsDir, skillDirName);\n return fs.pathExists(skillDir);\n}\n\n/**\n * Get installed skill path\n */\nexport function getSkillPath(\n skillFullName: string,\n config: Config,\n cwd: string,\n platform: Platform\n): string {\n const { skillsDir } = resolvePlatformPaths(cwd, config, platform);\n const skillDirName = getSkillDirName(skillFullName);\n return path.join(skillsDir, skillDirName);\n}\n","import type { Skill } from '../schema/skill.js'\nimport { AicoError } from '../utils/errors.js'\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface ResolveResult {\n skills: Skill[] // Skills in installation order (dependencies first)\n tree: DependencyTree // Dependency tree for display\n}\n\nexport interface DependencyTree {\n root: string // Root skill fullName\n dependencies: DependencyNode[]\n}\n\nexport interface DependencyNode {\n fullName: string\n version: string\n children: DependencyNode[]\n depth: number\n}\n\n// ============================================================================\n// Dependency Resolver\n// ============================================================================\n\nexport class DependencyResolver {\n private cache: Map<string, Skill> = new Map()\n\n constructor(\n private fetchSkill: (fullName: string) => Promise<Skill>\n ) {}\n\n /**\n * Resolve all dependencies for given skills\n * Returns skills in topological order (dependencies first)\n */\n async resolve(skillNames: string[]): Promise<ResolveResult> {\n // 1. Fetch all skills and their dependencies recursively\n const allSkills: Skill[] = []\n const visited = new Set<string>()\n\n for (const name of skillNames) {\n const skills = await this.fetchWithDependencies(name, visited)\n allSkills.push(...skills)\n }\n\n // 2. Deduplicate\n const uniqueSkills = this.deduplicateSkills(allSkills)\n\n // 3. Topological sort\n const sortedSkills = this.topologicalSort(uniqueSkills)\n\n // 4. Build dependency tree for display\n const skillMap = new Map(uniqueSkills.map(s => [s.fullName, s]))\n const trees: DependencyTree[] = skillNames.map(name => ({\n root: name,\n dependencies: [this.buildDependencyTree(name, skillMap)],\n }))\n\n return {\n skills: sortedSkills,\n tree: trees[0]!,\n }\n }\n\n /**\n * Recursively fetch a skill and all its dependencies\n */\n private async fetchWithDependencies(\n skillName: string,\n visited: Set<string> = new Set(),\n path: string[] = []\n ): Promise<Skill[]> {\n // Detect circular dependency\n if (path.includes(skillName)) {\n const cycle = [...path, skillName].join(' → ')\n throw new AicoError(\n `Circular dependency detected: ${cycle}`,\n 'CIRCULAR_DEPENDENCY',\n { suggestion: 'Check skill dependencies for cycles.' }\n )\n }\n\n // Skip if already visited\n if (visited.has(skillName)) {\n return []\n }\n visited.add(skillName)\n\n // Fetch skill (use cache if available)\n let skill = this.cache.get(skillName)\n if (!skill) {\n skill = await this.fetchSkill(skillName)\n this.cache.set(skillName, skill)\n }\n\n // Recursively fetch dependencies\n const allSkills: Skill[] = []\n for (const dep of skill.dependencies) {\n const depSkills = await this.fetchWithDependencies(\n dep,\n visited,\n [...path, skillName]\n )\n allSkills.push(...depSkills)\n }\n\n // Add current skill last (after dependencies)\n allSkills.push(skill)\n return allSkills\n }\n\n /**\n * Remove duplicate skills (keep first occurrence)\n */\n private deduplicateSkills(skills: Skill[]): Skill[] {\n const seen = new Map<string, Skill>()\n for (const skill of skills) {\n if (!seen.has(skill.fullName)) {\n seen.set(skill.fullName, skill)\n }\n }\n return Array.from(seen.values())\n }\n\n /**\n * Topological sort using Kahn's algorithm\n * Returns skills in dependency order (install dependencies first)\n */\n private topologicalSort(skills: Skill[]): Skill[] {\n // Build in-degree map and adjacency list\n const inDegree = new Map<string, number>()\n const graph = new Map<string, string[]>()\n const skillMap = new Map<string, Skill>()\n\n // Initialize\n for (const skill of skills) {\n skillMap.set(skill.fullName, skill)\n if (!inDegree.has(skill.fullName)) {\n inDegree.set(skill.fullName, 0)\n }\n if (!graph.has(skill.fullName)) {\n graph.set(skill.fullName, [])\n }\n }\n\n // Build graph edges\n for (const skill of skills) {\n for (const dep of skill.dependencies) {\n // Only consider dependencies that are in our skill set\n if (skillMap.has(dep)) {\n const edges = graph.get(dep) ?? []\n edges.push(skill.fullName)\n graph.set(dep, edges)\n inDegree.set(skill.fullName, (inDegree.get(skill.fullName) ?? 0) + 1)\n }\n }\n }\n\n // BFS from nodes with 0 in-degree\n const queue: string[] = []\n for (const [name, degree] of inDegree.entries()) {\n if (degree === 0) {\n queue.push(name)\n }\n }\n\n const result: Skill[] = []\n while (queue.length > 0) {\n const node = queue.shift()!\n const skill = skillMap.get(node)\n if (skill) {\n result.push(skill)\n }\n\n for (const neighbor of graph.get(node) ?? []) {\n const newDegree = (inDegree.get(neighbor) ?? 1) - 1\n inDegree.set(neighbor, newDegree)\n if (newDegree === 0) {\n queue.push(neighbor)\n }\n }\n }\n\n // Check for cycles (shouldn't happen if fetchWithDependencies worked correctly)\n if (result.length !== skills.length) {\n throw new AicoError(\n 'Circular dependency detected in skill graph',\n 'CIRCULAR_DEPENDENCY',\n { suggestion: 'Check skill dependencies for cycles.' }\n )\n }\n\n return result\n }\n\n /**\n * Build dependency tree for display\n */\n private buildDependencyTree(\n skillName: string,\n skillMap: Map<string, Skill>,\n depth: number = 0,\n visited: Set<string> = new Set()\n ): DependencyNode {\n const skill = skillMap.get(skillName)\n if (!skill) {\n return {\n fullName: skillName,\n version: 'unknown',\n children: [],\n depth,\n }\n }\n\n // Avoid infinite loops for circular deps (shouldn't happen but safety first)\n if (visited.has(skillName)) {\n return {\n fullName: skillName + ' (circular)',\n version: skill.version,\n children: [],\n depth,\n }\n }\n visited.add(skillName)\n\n const children = skill.dependencies\n .filter(dep => skillMap.has(dep))\n .map(dep => this.buildDependencyTree(dep, skillMap, depth + 1, new Set(visited)))\n\n return {\n fullName: skillName,\n version: skill.version,\n children,\n depth,\n }\n }\n}\n\n// ============================================================================\n// Formatting\n// ============================================================================\n\n/**\n * Format dependency tree as ASCII tree\n */\nexport function formatDependencyTree(node: DependencyNode, prefix = ''): string {\n const lines: string[] = []\n\n lines.push(`${node.fullName} (${node.version})`)\n\n node.children.forEach((child, index) => {\n const isLast = index === node.children.length - 1\n const connector = isLast ? '└── ' : '├── '\n const extension = isLast ? ' ' : '│ '\n\n lines.push(`${prefix}${connector}${child.fullName} (${child.version})`)\n\n if (child.children.length > 0) {\n const childLines = formatDependencyTreeRecursive(child.children, prefix + extension)\n lines.push(...childLines)\n }\n })\n\n return lines.join('\\n')\n}\n\nfunction formatDependencyTreeRecursive(nodes: DependencyNode[], prefix: string): string[] {\n const lines: string[] = []\n\n nodes.forEach((node, index) => {\n const isLast = index === nodes.length - 1\n const connector = isLast ? '└── ' : '├── '\n const extension = isLast ? ' ' : '│ '\n\n lines.push(`${prefix}${connector}${node.fullName} (${node.version})`)\n\n if (node.children.length > 0) {\n lines.push(...formatDependencyTreeRecursive(node.children, prefix + extension))\n }\n })\n\n return lines\n}\n","import fs from 'fs-extra';\nimport path from 'path';\nimport { logger } from './logger.js';\n\n/**\n * Constraint document mapping for each employee\n */\nconst CONSTRAINT_DOCS: Record<string, string[]> = {\n pm: ['docs/reference/pm/constitution.md'],\n frontend: ['docs/reference/frontend/constraints.md'],\n backend: ['docs/reference/backend/constraints.md'],\n};\n\n/**\n * Check if constraint documents exist for an employee\n */\nexport async function checkConstraintDocs(\n employeeName: string,\n cwd: string\n): Promise<{ existing: string[]; missing: string[] }> {\n const docs = CONSTRAINT_DOCS[employeeName] || [];\n const existing: string[] = [];\n const missing: string[] = [];\n\n for (const doc of docs) {\n const fullPath = path.join(cwd, doc);\n if (await fs.pathExists(fullPath)) {\n existing.push(doc);\n } else {\n missing.push(doc);\n }\n }\n\n return { existing, missing };\n}\n\n/**\n * Show constraint document hints after installation\n */\nexport function showConstraintDocHints(\n employeeName: string,\n existing: string[],\n missing: string[]\n): void {\n if (missing.length === 0 && existing.length === 0) {\n return;\n }\n\n // Get the init command name for this employee\n const initCommand = `/${employeeName}.init`;\n\n if (missing.length > 0) {\n logger.break();\n logger.info(`💡 Tip: Run ${initCommand} to create constraint documents:`);\n for (const doc of missing) {\n logger.dim(` - ${doc}`);\n }\n }\n\n if (existing.length > 0) {\n logger.break();\n logger.info('📄 Existing constraint documents:');\n for (const doc of existing) {\n logger.dim(` - ${doc}`);\n }\n logger.dim(` Run ${initCommand} to update these if needed.`);\n }\n}\n","import { Command } from 'commander';\nimport prompts from 'prompts';\nimport { z } from 'zod';\nimport {\n getConfig,\n removeEmployee as removeEmployeeFromConfig,\n removeSkill as removeSkillFromConfig,\n removeSharedSkillReference,\n} from '../utils/config.js';\nimport { logger, spinner } from '../utils/logger.js';\nimport { handleError, notInitializedError } from '../utils/errors.js';\nimport { platformSchema, type Platform } from '../schema/config.js';\nimport { uninstallEmployee } from '../installer/index.js';\nimport { uninstallSkill } from '../installer/skill-installer.js';\nimport { parseTarget, type ParsedTarget } from '../utils/parse-target.js';\nimport { fetchEmployee } from '../registry/client.js';\n\nconst removeOptionsSchema = z.object({\n items: z.array(z.string()),\n cwd: z.string(),\n platforms: z.array(platformSchema).optional(),\n yes: z.boolean(),\n force: z.boolean(),\n dryRun: z.boolean(),\n});\n\ntype RemoveOptions = z.infer<typeof removeOptionsSchema>;\n\nasync function runRemove(options: RemoveOptions): Promise<void> {\n const { items, cwd, yes, force, dryRun } = options;\n\n // Load config\n const config = await getConfig(cwd);\n if (!config) {\n throw notInitializedError();\n }\n\n // Parse all items to determine type\n const targets = items.map((item) => parseTarget(item));\n const employees = targets.filter((t) => t.type === 'employee');\n const skills = targets.filter((t) => t.type === 'skill');\n\n // Process employees\n for (const target of employees) {\n await removeEmployeeItem(\n target,\n config,\n cwd,\n options.platforms,\n yes,\n dryRun\n );\n }\n\n // Process skills\n for (const target of skills) {\n await removeSkillItem(\n target,\n config,\n cwd,\n options.platforms,\n yes,\n force,\n dryRun\n );\n }\n\n logger.break();\n if (dryRun) {\n logger.info('Dry run complete. No files were removed.');\n } else {\n logger.success('Removal complete!');\n }\n}\n\n/**\n * Remove a single employee\n */\nasync function removeEmployeeItem(\n target: ParsedTarget,\n config: Awaited<ReturnType<typeof getConfig>>,\n cwd: string,\n platformsOpt: Platform[] | undefined,\n yes: boolean,\n dryRun: boolean\n): Promise<void> {\n if (!config) return;\n\n const employeeName = target.name;\n const installedState = config.employees[employeeName];\n\n // Determine target platforms\n let platforms: Platform[];\n if (installedState) {\n if (platformsOpt && platformsOpt.length > 0) {\n platforms = platformsOpt.filter((p) =>\n installedState.platforms.includes(p)\n );\n if (platforms.length === 0) {\n logger.warn(\n `Employee '${employeeName}' is not installed on specified platform(s). Skipping.`\n );\n return;\n }\n } else {\n platforms = installedState.platforms as Platform[];\n }\n } else {\n if (platformsOpt && platformsOpt.length > 0) {\n platforms = platformsOpt;\n } else {\n platforms = Object.keys(config.platforms) as Platform[];\n }\n logger.dim(\n `Employee '${employeeName}' not in config, will attempt to remove files from: ${platforms.join(', ')}`\n );\n }\n\n // Confirm removal\n if (!yes && !dryRun) {\n const { proceed } = await prompts({\n type: 'confirm',\n name: 'proceed',\n message: `Remove ${employeeName} from ${platforms.join(', ')}?`,\n initial: true,\n });\n\n if (!proceed) {\n logger.info(`Skipped ${employeeName}`);\n return;\n }\n }\n\n if (dryRun) {\n logger.info(`Would remove employee: ${employeeName}`);\n logger.dim(` Platforms: ${platforms.join(', ')}`);\n return;\n }\n\n const s = spinner(`Removing ${employeeName}...`).start();\n\n try {\n await uninstallEmployee(employeeName, config, cwd, platforms);\n\n // Handle shared skill references\n // Try to get employee definition to know its dependencies\n let employeeDeps: string[] = [];\n try {\n const employee = await fetchEmployee(target.fullName, config, cwd);\n employeeDeps = employee.dependencies || [];\n } catch {\n // If we can't fetch employee, check config for shared skills referencing this employee\n if (config.sharedSkills) {\n for (const [skillName, state] of Object.entries(config.sharedSkills)) {\n if (state.usedBy.includes(employeeName)) {\n employeeDeps.push(skillName);\n }\n }\n }\n }\n\n // Process shared skill references\n const removedSharedSkills: string[] = [];\n const keptSharedSkills: { name: string; users: string[] }[] = [];\n\n for (const depFullName of employeeDeps) {\n const { shouldUninstall, remainingUsers } =\n await removeSharedSkillReference(cwd, depFullName, employeeName);\n\n if (shouldUninstall) {\n // No more references, remove the shared skill files\n for (const platform of platforms) {\n await uninstallSkill(depFullName, config, cwd, { platform });\n }\n removedSharedSkills.push(depFullName);\n } else if (remainingUsers.length > 0) {\n keptSharedSkills.push({ name: depFullName, users: remainingUsers });\n }\n }\n\n if (installedState) {\n await removeEmployeeFromConfig(cwd, employeeName);\n }\n\n s.succeed(`Removed ${employeeName}`);\n logger.dim(` Removed from: ${platforms.join(', ')}`);\n\n // Show shared skill status\n if (removedSharedSkills.length > 0) {\n logger.dim(\n ` Removed shared skills: ${removedSharedSkills.map((s) => s.split('/').pop()).join(', ')}`\n );\n }\n if (keptSharedSkills.length > 0) {\n for (const { name, users } of keptSharedSkills) {\n logger.dim(\n ` Kept shared skill '${name.split('/').pop()}' (still used by: ${users.join(', ')})`\n );\n }\n }\n } catch (error) {\n s.fail(`Failed to remove ${employeeName}`);\n throw error;\n }\n}\n\n/**\n * Remove a single skill\n */\nasync function removeSkillItem(\n target: ParsedTarget,\n config: Awaited<ReturnType<typeof getConfig>>,\n cwd: string,\n platformsOpt: Platform[] | undefined,\n yes: boolean,\n force: boolean,\n dryRun: boolean\n): Promise<void> {\n if (!config) return;\n\n const skillFullName = target.fullName;\n const installedState = config.skills?.[skillFullName];\n\n // Check if skill is part of an employee\n let parentEmployee: string | null = null;\n for (const [empName, empState] of Object.entries(config.employees)) {\n if (empState.skills?.includes(target.name)) {\n parentEmployee = empName;\n break;\n }\n }\n\n if (parentEmployee && !force) {\n logger.warn(\n `Skill '${skillFullName}' is part of employee '${parentEmployee}'.`\n );\n logger.dim(\n 'Use --force to remove it anyway, or remove the entire employee.'\n );\n return;\n }\n\n // Determine target platforms\n let platforms: Platform[];\n if (installedState) {\n if (platformsOpt && platformsOpt.length > 0) {\n platforms = platformsOpt.filter((p) =>\n installedState.platforms.includes(p)\n );\n if (platforms.length === 0) {\n logger.warn(\n `Skill '${skillFullName}' is not installed on specified platform(s). Skipping.`\n );\n return;\n }\n } else {\n platforms = installedState.platforms as Platform[];\n }\n } else {\n if (platformsOpt && platformsOpt.length > 0) {\n platforms = platformsOpt;\n } else {\n platforms = [config.defaultPlatform];\n }\n }\n\n // Confirm removal\n if (!yes && !dryRun) {\n const { proceed } = await prompts({\n type: 'confirm',\n name: 'proceed',\n message: `Remove skill ${skillFullName} from ${platforms.join(', ')}?`,\n initial: true,\n });\n\n if (!proceed) {\n logger.info(`Skipped ${skillFullName}`);\n return;\n }\n }\n\n // Dry run - show what would be removed\n if (dryRun) {\n for (const platform of platforms) {\n const result = await uninstallSkill(skillFullName, config, cwd, {\n platform,\n dryRun: true,\n });\n logger.info(`Would remove skill: ${skillFullName}`);\n logger.dim(` Platform: ${platform}`);\n logger.dim(` Files: ${result.files.length}`);\n for (const file of result.files) {\n logger.dim(` - ${file}`);\n }\n }\n return;\n }\n\n const s = spinner(`Removing skill ${skillFullName}...`).start();\n\n try {\n for (const platform of platforms) {\n const result = await uninstallSkill(skillFullName, config, cwd, {\n platform,\n });\n if (!result.removed) {\n logger.dim(` Skill not found on ${platform}`);\n }\n }\n\n // Update config\n if (installedState) {\n await removeSkillFromConfig(cwd, skillFullName);\n }\n\n s.succeed(`Removed skill ${skillFullName}`);\n logger.dim(` Removed from: ${platforms.join(', ')}`);\n } catch (error) {\n s.fail(`Failed to remove skill ${skillFullName}`);\n throw error;\n }\n}\n\nexport const remove = new Command()\n .name('remove')\n .description('Remove employees or skills from your project')\n .argument('[items...]', 'Employee or skill names to remove')\n .option(\n '-p, --platform <platform>',\n 'Remove from specific platform only',\n (value, previous: Platform[]) => {\n const result = platformSchema.safeParse(value);\n if (!result.success) {\n throw new Error(\n `Invalid platform: ${value}. Available: claude-code, codex`\n );\n }\n return [...previous, result.data];\n },\n [] as Platform[]\n )\n .option('-y, --yes', 'Skip confirmation prompts', false)\n .option('-f, --force', 'Force remove (ignore dependency warnings)', false)\n .option('--dry-run', 'Preview changes without removing', false)\n .option('-c, --cwd <cwd>', 'Working directory', process.cwd())\n .action(async (items: string[], opts) => {\n try {\n if (items.length === 0) {\n logger.error(\n 'Please specify at least one employee or skill to remove.'\n );\n logger.dim('Examples:');\n logger.dim(\n ' npx aico remove pm # Remove employee'\n );\n logger.dim(\n ' npx aico remove @the-aico/pm/brainstorming # Remove skill'\n );\n process.exit(1);\n }\n\n const options = removeOptionsSchema.parse({\n items,\n cwd: opts.cwd,\n platforms: opts.platform.length > 0 ? opts.platform : undefined,\n yes: opts.yes,\n force: opts.force,\n dryRun: opts.dryRun,\n });\n\n await runRemove(options);\n } catch (error) {\n handleError(error);\n }\n });\n","import { Command } from 'commander';\nimport { z } from 'zod';\nimport { getConfig } from '../utils/config.js';\nimport { logger } from '../utils/logger.js';\nimport { handleError, notInitializedError } from '../utils/errors.js';\nimport { fetchRegistryIndex } from '../registry/client.js';\n\nconst listOptionsSchema = z.object({\n cwd: z.string(),\n installed: z.boolean(),\n});\n\ntype ListOptions = z.infer<typeof listOptionsSchema>;\n\nasync function runList(options: ListOptions): Promise<void> {\n const { cwd, installed } = options;\n\n // Load config\n const config = await getConfig(cwd);\n if (!config) {\n throw notInitializedError();\n }\n\n if (installed) {\n // Show installed employees\n const employees = Object.entries(config.employees);\n\n if (employees.length === 0) {\n logger.info('No employees installed.');\n logger.dim('Run `npx aico add <employee>` to add an employee.');\n return;\n }\n\n logger.bold('Installed employees:');\n logger.break();\n\n for (const [name, state] of employees) {\n const platforms = state.platforms.join(', ');\n const date = new Date(state.installedAt).toLocaleDateString();\n logger.log(\n ` ${logger.highlight(name.padEnd(15))} ${platforms.padEnd(20)} ${date}`\n );\n }\n } else {\n // Show available employees from registry\n logger.info('Fetching employee list...');\n\n try {\n const index = await fetchRegistryIndex(config, cwd);\n\n if (index.employees.length === 0) {\n logger.warn('No employees found in registry.');\n return;\n }\n\n logger.break();\n logger.bold('Available employees:');\n logger.break();\n\n for (const employee of index.employees) {\n const installed = config.employees[employee.name] ? '✓' : ' ';\n const desc = employee.description ?? employee.role;\n logger.log(\n ` ${installed} ${logger.highlight(employee.name.padEnd(15))} ${desc}`\n );\n }\n\n logger.break();\n logger.dim('Use `npx aico add <employee>` to add an employee.');\n logger.dim('Use `npx aico list --installed` to see installed employees.');\n } catch {\n // If registry is unavailable, show only installed\n logger.warn(\n 'Could not fetch registry. Showing installed employees only.'\n );\n logger.break();\n\n const employees = Object.entries(config.employees);\n if (employees.length === 0) {\n logger.info('No employees installed.');\n return;\n }\n\n for (const [name, state] of employees) {\n logger.log(\n ` ${logger.highlight(name.padEnd(15))} ${state.platforms.join(', ')}`\n );\n }\n }\n }\n}\n\nexport const list = new Command()\n .name('list')\n .description('List available or installed employees')\n .option('-i, --installed', 'Show only installed employees', false)\n .option('-c, --cwd <cwd>', 'Working directory', process.cwd())\n .action(async (opts) => {\n try {\n const options = listOptionsSchema.parse({\n cwd: opts.cwd,\n installed: opts.installed,\n });\n\n await runList(options);\n } catch (error) {\n handleError(error);\n }\n });\n","import { Command } from 'commander';\nimport fs from 'fs-extra';\nimport path from 'path';\nimport glob from 'fast-glob';\nimport { z } from 'zod';\nimport {\n employeeSourceSchema,\n type Employee,\n type EmployeeSummary,\n} from '../schema/employee.js';\nimport {\n parseSkillFrontmatter,\n type Skill,\n type SkillSummary,\n type SkillCategory,\n} from '../schema/skill.js';\nimport { logger, spinner } from '../utils/logger.js';\nimport { handleError } from '../utils/errors.js';\n\nconst buildOptionsSchema = z.object({\n cwd: z.string(),\n employeesDir: z.string(),\n outputDir: z.string(),\n registry: z.string(),\n version: z.string(),\n});\n\ntype BuildOptions = z.infer<typeof buildOptionsSchema>;\n\n/**\n * Infer category from employee name\n */\nfunction inferCategory(employeeName: string): SkillCategory {\n const categoryMap: Record<string, SkillCategory> = {\n pm: 'pm',\n frontend: 'frontend',\n backend: 'backend',\n devops: 'devops',\n _shared: 'general',\n };\n return categoryMap[employeeName] ?? 'general';\n}\n\n/**\n * Build shared skills from _shared directory\n * Shared skills use naming format: aico-{skill} (no employee prefix)\n */\nasync function buildSharedSkills(\n employeesPath: string,\n outputPath: string,\n registry: string,\n version: string,\n skillsIndex: SkillSummary[]\n): Promise<number> {\n const sharedDir = path.join(employeesPath, '_shared', 'skills');\n\n if (!(await fs.pathExists(sharedDir))) {\n return 0;\n }\n\n // Find all skill directories in _shared/skills\n const skillDirs = await glob('*/SKILL.md', {\n cwd: sharedDir,\n });\n\n if (skillDirs.length === 0) {\n return 0;\n }\n\n // Use @aico/_shared as namespace for shared skills\n const namespace = `${registry}/_shared`;\n\n for (const skillPath of skillDirs) {\n const skillName = path.dirname(skillPath);\n const skillFullName = `${namespace}/${skillName}`;\n const skillFilePath = path.join(sharedDir, skillPath);\n\n // Read SKILL.md content\n const content = await fs.readFile(skillFilePath, 'utf-8');\n const frontmatter = parseSkillFrontmatter(content);\n\n if (!frontmatter) {\n logger.warn(`Shared skill ${skillName} missing frontmatter, skipping`);\n continue;\n }\n\n // Build skill object\n const fullSkill: Skill = {\n name: skillName,\n namespace,\n fullName: skillFullName,\n version,\n description: frontmatter.description,\n category: 'general',\n tags: [],\n dependencies: [],\n files: [\n {\n path: 'SKILL.md',\n type: 'skill',\n content,\n },\n ],\n };\n\n // Write individual skill JSON to registry/skills/aico/_shared/\n const skillOutputDir = path.join(\n outputPath,\n 'skills',\n registry.replace('@', ''),\n '_shared'\n );\n await fs.ensureDir(skillOutputDir);\n await fs.writeJson(\n path.join(skillOutputDir, `${skillName}.json`),\n fullSkill,\n { spaces: 2 }\n );\n\n // Add to skills index\n skillsIndex.push({\n name: skillName,\n namespace,\n fullName: skillFullName,\n version,\n description: frontmatter.description,\n category: 'general',\n tags: [],\n });\n }\n\n return skillDirs.length;\n}\n\nasync function runBuild(options: BuildOptions): Promise<void> {\n const { cwd, employeesDir, outputDir, registry, version } = options;\n\n const employeesPath = path.resolve(cwd, employeesDir);\n const outputPath = path.resolve(cwd, outputDir);\n\n // Clean output directory before building\n if (await fs.pathExists(outputPath)) {\n await fs.emptyDir(outputPath);\n }\n\n // Find all employee.json files (excluding _template)\n const employeeFiles = await glob('*/employee.json', {\n cwd: employeesPath,\n ignore: ['_template/**'],\n });\n\n if (employeeFiles.length === 0) {\n logger.warn('No employees found to build.');\n return;\n }\n\n const s = spinner(`Building ${employeeFiles.length} employee(s)...`).start();\n\n // Indexes for new format\n const skillsIndex: SkillSummary[] = [];\n const employeesIndex: EmployeeSummary[] = [];\n\n // Legacy format index\n const legacyIndex: EmployeeSummary[] = [];\n\n for (const employeeFile of employeeFiles) {\n const employeeName = path.dirname(employeeFile);\n const employeeDir = path.join(employeesPath, employeeName);\n\n try {\n // Read employee.json\n const employeeJson = await fs.readJson(\n path.join(employeeDir, 'employee.json')\n );\n const employeeSource = employeeSourceSchema.parse(employeeJson);\n\n const category = inferCategory(employeeName);\n const namespace = `${registry}/${employeeName}`;\n const employeeFullName = `${registry}/${employeeName}`;\n\n // Create employee with content to be populated (legacy format)\n const employee = {\n ...employeeSource,\n skills: employeeSource.skills.map((sk) => ({\n ...sk,\n files: sk.files.map((f) => ({ ...f, content: '' })),\n })),\n commands: employeeSource.commands.map((c) => ({\n ...c,\n files: c.files.map((f) => ({ ...f, content: '' })),\n })),\n docs: employeeSource.docs.map((d) => ({\n ...d,\n files: d.files.map((f) => ({ ...f, content: '' })),\n })),\n } as Employee;\n\n // Track skill fullNames for employee\n const skillFullNames: string[] = [];\n\n // Read all skill files and build skill registry\n for (const skill of employee.skills) {\n const skillFullName = `${namespace}/${skill.name}`;\n skillFullNames.push(skillFullName);\n\n const skillFiles: Skill['files'] = [];\n let skillDescription = '';\n\n for (const file of skill.files) {\n const filePath = path.join(employeeDir, file.path);\n if (await fs.pathExists(filePath)) {\n const content = await fs.readFile(filePath, 'utf-8');\n file.content = content;\n\n // Extract description from frontmatter\n if (file.path.endsWith('SKILL.md')) {\n const frontmatter = parseSkillFrontmatter(content);\n if (frontmatter) {\n skillDescription = frontmatter.description;\n }\n }\n\n skillFiles.push({\n path: path.basename(file.path),\n type: file.type === 'skill' ? 'skill' : 'reference',\n content,\n });\n } else {\n throw new Error(`Skill file not found: ${file.path}`);\n }\n }\n\n // Build full skill object\n const fullSkill: Skill = {\n name: skill.name,\n namespace,\n fullName: skillFullName,\n version,\n description: skillDescription,\n category,\n tags: [],\n dependencies: [],\n files: skillFiles,\n };\n\n // Write individual skill JSON\n const skillOutputDir = path.join(\n outputPath,\n 'skills',\n registry.replace('@', ''),\n employeeName\n );\n await fs.ensureDir(skillOutputDir);\n await fs.writeJson(\n path.join(skillOutputDir, `${skill.name}.json`),\n fullSkill,\n { spaces: 2 }\n );\n\n // Add to skills index\n skillsIndex.push({\n name: skill.name,\n namespace,\n fullName: skillFullName,\n version,\n description: skillDescription,\n category,\n tags: [],\n });\n }\n\n // Read all command files\n for (const command of employee.commands) {\n for (const file of command.files) {\n const filePath = path.join(employeeDir, file.path);\n if (await fs.pathExists(filePath)) {\n file.content = await fs.readFile(filePath, 'utf-8');\n } else {\n throw new Error(`Command file not found: ${file.path}`);\n }\n }\n }\n\n // Read all doc files\n for (const doc of employee.docs) {\n for (const file of doc.files) {\n const filePath = path.join(employeeDir, file.path);\n if (await fs.pathExists(filePath)) {\n file.content = await fs.readFile(filePath, 'utf-8');\n } else {\n throw new Error(`Doc file not found: ${file.path}`);\n }\n }\n }\n\n // Write legacy employee JSON to output (for backward compatibility)\n const legacyOutputPath = path.join(outputPath, `${employee.name}.json`);\n await fs.ensureDir(outputPath);\n await fs.writeJson(legacyOutputPath, employee, { spaces: 2 });\n\n // Write new format employee JSON\n const employeeExtended = {\n $schema: 'https://the-aico.com/schema/employee.json',\n name: employee.name,\n namespace: registry,\n fullName: employeeFullName,\n role: employee.role,\n description: employee.description,\n version,\n category,\n skills: skillFullNames,\n commands: employee.commands,\n docs: employee.docs,\n };\n const employeesOutputDir = path.join(outputPath, 'employees');\n await fs.ensureDir(employeesOutputDir);\n await fs.writeJson(\n path.join(employeesOutputDir, `${employee.name}.json`),\n employeeExtended,\n { spaces: 2 }\n );\n\n // Add to employees index\n employeesIndex.push({\n name: employee.name,\n namespace: registry,\n fullName: employeeFullName,\n role: employee.role,\n description: employee.description,\n version,\n skillCount: employee.skills.length,\n commandCount: employee.commands.length,\n category,\n });\n\n // Add to legacy index\n legacyIndex.push({\n name: employee.name,\n role: employee.role,\n description: employee.description,\n });\n\n s.text = `Built ${employee.name}`;\n } catch (error) {\n s.fail(`Failed to build ${employeeName}`);\n throw error;\n }\n }\n\n // Build shared skills from _shared directory\n s.text = 'Building shared skills...';\n const sharedSkillCount = await buildSharedSkills(\n employeesPath,\n outputPath,\n registry,\n version,\n skillsIndex\n );\n if (sharedSkillCount > 0) {\n s.text = `Built ${sharedSkillCount} shared skill(s)`;\n }\n\n // Write skills index\n const skillsIndexPath = path.join(outputPath, 'skills', 'index.json');\n await fs.ensureDir(path.dirname(skillsIndexPath));\n await fs.writeJson(skillsIndexPath, skillsIndex, { spaces: 2 });\n\n // Write employees index (new format)\n const employeesIndexPath = path.join(outputPath, 'employees', 'index.json');\n await fs.ensureDir(path.dirname(employeesIndexPath));\n await fs.writeJson(employeesIndexPath, employeesIndex, { spaces: 2 });\n\n // Write legacy index.json (for backward compatibility)\n const legacyIndexPath = path.join(outputPath, 'index.json');\n await fs.writeJson(\n legacyIndexPath,\n { employees: legacyIndex },\n { spaces: 2 }\n );\n\n s.succeed(`Built ${employeeFiles.length} employee(s) to ${outputDir}/`);\n\n logger.break();\n logger.success('Registry build complete!');\n logger.dim(` Skills: ${skillsIndex.length} (${sharedSkillCount} shared)`);\n logger.dim(` Employees: ${employeesIndex.length}`);\n logger.break();\n for (const emp of employeesIndex) {\n logger.dim(` - ${emp.name}: ${emp.role} (${emp.skillCount} skills)`);\n }\n}\n\nexport const build = new Command()\n .name('build')\n .description('Build registry from employees directory')\n .option(\n '-e, --employees-dir <dir>',\n 'Employees source directory',\n 'employees'\n )\n .option('-o, --output-dir <dir>', 'Output directory', 'registry')\n .option('-r, --registry <name>', 'Registry namespace', '@the-aico')\n .option('-v, --version <version>', 'Version number', '1.0.0')\n .option('-c, --cwd <cwd>', 'Working directory', process.cwd())\n .action(async (opts) => {\n try {\n const options = buildOptionsSchema.parse({\n cwd: opts.cwd,\n employeesDir: opts.employeesDir,\n outputDir: opts.outputDir,\n registry: opts.registry,\n version: opts.version,\n });\n\n await runBuild(options);\n } catch (error) {\n handleError(error);\n }\n });\n","import fs from 'fs-extra';\nimport path from 'path';\nimport { Command } from 'commander';\nimport { diffLines, type Change } from 'diff';\nimport { z } from 'zod';\nimport { getConfig, resolvePlatformPaths } from '../utils/config.js';\nimport { logger, spinner } from '../utils/logger.js';\nimport { handleError, notInitializedError } from '../utils/errors.js';\nimport type { Platform } from '../schema/config.js';\nimport type { Employee } from '../schema/employee.js';\nimport { fetchEmployee } from '../registry/client.js';\nimport {\n claudeCodeAdapter,\n type PlatformAdapter,\n} from '../installer/platforms/claude-code.js';\nimport { codexAdapter } from '../installer/platforms/codex.js';\n\nconst adapters: Record<Platform, PlatformAdapter> = {\n 'claude-code': claudeCodeAdapter,\n codex: codexAdapter,\n};\n\nconst diffOptionsSchema = z.object({\n employee: z.string().optional(),\n cwd: z.string(),\n});\n\ntype DiffOptions = z.infer<typeof diffOptionsSchema>;\n\ninterface FileChange {\n filePath: string;\n type: 'added' | 'removed' | 'modified';\n patch?: Change[];\n}\n\ninterface EmployeeDiff {\n name: string;\n hasChanges: boolean;\n skillsAdded: string[];\n skillsRemoved: string[];\n commandsAdded: string[];\n commandsRemoved: string[];\n fileChanges: FileChange[];\n}\n\n/**\n * Compare local file with registry content\n * Returns patch showing what changes FROM local TO registry (what update would do)\n */\nasync function compareFile(\n localPath: string,\n registryContent: string\n): Promise<Change[] | null> {\n if (!(await fs.pathExists(localPath))) {\n return null;\n }\n\n const localContent = await fs.readFile(localPath, 'utf-8');\n // Compare local (current) to registry (new) - shows what would change\n const patch = diffLines(localContent, registryContent);\n\n // Check if there are actual changes (more than just the content itself)\n const hasChanges = patch.some((part) => part.added || part.removed);\n return hasChanges ? patch : null;\n}\n\n/**\n * Get diff for a single employee\n */\nasync function diffEmployee(\n employeeName: string,\n cwd: string,\n config: Awaited<ReturnType<typeof getConfig>>\n): Promise<EmployeeDiff | null> {\n if (!config) return null;\n\n const installedState = config.employees[employeeName];\n if (!installedState) {\n return null;\n }\n\n // Fetch latest from registry\n let registryEmployee: Employee;\n try {\n registryEmployee = await fetchEmployee(employeeName, config, cwd);\n } catch {\n return null;\n }\n\n const platform = installedState.platforms[0] || config.defaultPlatform;\n const adapter = adapters[platform];\n const { skillsDir, commandsDir } = resolvePlatformPaths(\n cwd,\n config,\n platform\n );\n\n const installedSkills = installedState.skills || [];\n const installedCommands = installedState.commands || [];\n const registrySkills = registryEmployee.skills.map((s) => s.name);\n const registryCommands = registryEmployee.commands.map((c) => c.name);\n\n // Find added/removed skills\n const skillsAdded = registrySkills.filter(\n (s) => !installedSkills.includes(s)\n );\n const skillsRemoved = installedSkills.filter(\n (s) => !registrySkills.includes(s)\n );\n\n // Find added/removed commands\n const commandsAdded = registryCommands.filter(\n (c) => !installedCommands.includes(c)\n );\n const commandsRemoved = installedCommands.filter(\n (c) => !registryCommands.includes(c)\n );\n\n const fileChanges: FileChange[] = [];\n\n // Check skill files for modifications\n for (const skill of registryEmployee.skills) {\n const skillDirName = adapter.getSkillDirName(employeeName, skill.name);\n\n for (const file of skill.files) {\n const localPath = path.join(\n skillsDir,\n skillDirName,\n path.basename(file.path)\n );\n\n // Update skill name in content for comparison\n let registryContent = file.content;\n if (file.path.endsWith('SKILL.md')) {\n registryContent = registryContent.replace(\n /^(---\\n[\\s\\S]*?name:\\s*).+$/m,\n `$1${skillDirName}`\n );\n }\n\n if (!(await fs.pathExists(localPath))) {\n if (!skillsAdded.includes(skill.name)) {\n fileChanges.push({\n filePath: localPath,\n type: 'added',\n });\n }\n } else {\n const patch = await compareFile(localPath, registryContent);\n if (patch) {\n fileChanges.push({\n filePath: localPath,\n type: 'modified',\n patch,\n });\n }\n }\n }\n }\n\n // Check command files for modifications\n for (const command of registryEmployee.commands) {\n const commandFileName = adapter.getCommandFileName(\n employeeName,\n command.name\n );\n\n for (const file of command.files) {\n const localPath = path.join(commandsDir, commandFileName);\n\n if (!(await fs.pathExists(localPath))) {\n if (!commandsAdded.includes(command.name)) {\n fileChanges.push({\n filePath: localPath,\n type: 'added',\n });\n }\n } else {\n const patch = await compareFile(localPath, file.content);\n if (patch) {\n fileChanges.push({\n filePath: localPath,\n type: 'modified',\n patch,\n });\n }\n }\n }\n }\n\n // Mark removed skill files\n for (const skillName of skillsRemoved) {\n const skillDirName = adapter.getSkillDirName(employeeName, skillName);\n const skillPath = path.join(skillsDir, skillDirName);\n if (await fs.pathExists(skillPath)) {\n fileChanges.push({\n filePath: skillPath,\n type: 'removed',\n });\n }\n }\n\n // Mark removed command files\n for (const commandName of commandsRemoved) {\n const commandFileName = adapter.getCommandFileName(\n employeeName,\n commandName\n );\n const commandPath = path.join(commandsDir, commandFileName);\n if (await fs.pathExists(commandPath)) {\n fileChanges.push({\n filePath: commandPath,\n type: 'removed',\n });\n }\n }\n\n const hasChanges =\n skillsAdded.length > 0 ||\n skillsRemoved.length > 0 ||\n commandsAdded.length > 0 ||\n commandsRemoved.length > 0 ||\n fileChanges.length > 0;\n\n return {\n name: employeeName,\n hasChanges,\n skillsAdded,\n skillsRemoved,\n commandsAdded,\n commandsRemoved,\n fileChanges,\n };\n}\n\n/**\n * Print colored diff output\n */\nfunction printDiff(patch: Change[]): void {\n for (const part of patch) {\n if (part.added) {\n process.stdout.write(logger.formatSuccess(part.value));\n } else if (part.removed) {\n process.stdout.write(logger.formatError(part.value));\n } else {\n process.stdout.write(part.value);\n }\n }\n}\n\nasync function runDiff(options: DiffOptions): Promise<void> {\n const { cwd, employee } = options;\n\n const config = await getConfig(cwd);\n if (!config) {\n throw notInitializedError();\n }\n\n const installedEmployees = Object.keys(config.employees);\n if (installedEmployees.length === 0) {\n logger.info('No employees installed.');\n return;\n }\n\n // If specific employee specified, show detailed diff\n if (employee) {\n if (!config.employees[employee]) {\n logger.error(`Employee '${employee}' is not installed.`);\n logger.dim(`Installed employees: ${installedEmployees.join(', ')}`);\n process.exit(1);\n }\n\n const s = spinner(`Checking ${employee} for updates...`).start();\n const diff = await diffEmployee(employee, cwd, config);\n s.stop();\n\n if (!diff) {\n logger.error(`Failed to check updates for ${employee}`);\n return;\n }\n\n if (!diff.hasChanges) {\n logger.success(`${employee} is up to date.`);\n return;\n }\n\n logger.info(`Changes for ${employee}:`);\n logger.break();\n\n // Show skill changes\n if (diff.skillsAdded.length > 0) {\n logger.success(` New skills: ${diff.skillsAdded.join(', ')}`);\n }\n if (diff.skillsRemoved.length > 0) {\n logger.warn(` Removed skills: ${diff.skillsRemoved.join(', ')}`);\n }\n\n // Show command changes\n if (diff.commandsAdded.length > 0) {\n logger.success(` New commands: ${diff.commandsAdded.join(', ')}`);\n }\n if (diff.commandsRemoved.length > 0) {\n logger.warn(` Removed commands: ${diff.commandsRemoved.join(', ')}`);\n }\n\n // Show file changes\n for (const change of diff.fileChanges) {\n const relativePath = path.relative(cwd, change.filePath);\n\n if (change.type === 'modified') {\n logger.info(` Modified: ${relativePath}`);\n if (change.patch) {\n logger.break();\n printDiff(change.patch);\n logger.break();\n }\n }\n }\n\n logger.break();\n logger.dim(`Run 'aico add ${employee} --overwrite' to update.`);\n return;\n }\n\n // Show summary for all installed employees\n const s = spinner('Checking for updates...').start();\n\n const employeesWithUpdates: EmployeeDiff[] = [];\n\n for (const employeeName of installedEmployees) {\n const diff = await diffEmployee(employeeName, cwd, config);\n if (diff?.hasChanges) {\n employeesWithUpdates.push(diff);\n }\n }\n\n s.stop();\n\n if (employeesWithUpdates.length === 0) {\n logger.success('All employees are up to date.');\n return;\n }\n\n logger.info('The following employees have updates available:');\n logger.break();\n\n for (const diff of employeesWithUpdates) {\n logger.log(` ${diff.name}`);\n if (diff.skillsAdded.length > 0) {\n logger.dim(` + ${diff.skillsAdded.length} new skill(s)`);\n }\n if (diff.skillsRemoved.length > 0) {\n logger.dim(` - ${diff.skillsRemoved.length} removed skill(s)`);\n }\n if (diff.commandsAdded.length > 0) {\n logger.dim(` + ${diff.commandsAdded.length} new command(s)`);\n }\n if (diff.commandsRemoved.length > 0) {\n logger.dim(` - ${diff.commandsRemoved.length} removed command(s)`);\n }\n const modifiedCount = diff.fileChanges.filter(\n (f) => f.type === 'modified'\n ).length;\n if (modifiedCount > 0) {\n logger.dim(` ~ ${modifiedCount} modified file(s)`);\n }\n }\n\n logger.break();\n logger.dim(`Run 'aico diff <employee>' to see detailed changes.`);\n logger.dim(`Run 'aico add <employee> --overwrite' to update.`);\n}\n\nexport const diff = new Command()\n .name('diff')\n .description('Check for updates against the registry')\n .argument('[employee]', 'Employee name to check')\n .option('-c, --cwd <cwd>', 'Working directory', process.cwd())\n .action(async (employee: string | undefined, opts) => {\n try {\n const options = diffOptionsSchema.parse({\n employee,\n cwd: opts.cwd,\n });\n\n await runDiff(options);\n } catch (error) {\n handleError(error);\n }\n });\n","import { Command } from 'commander';\nimport prompts from 'prompts';\nimport { z } from 'zod';\nimport kleur from 'kleur';\nimport { getConfig, updateSkill, getInstalledSkills } from '../utils/config.js';\nimport { logger, spinner } from '../utils/logger.js';\nimport { handleError, notInitializedError } from '../utils/errors.js';\nimport { fetchSkill } from '../registry/client.js';\nimport { installSkill, uninstallSkill } from '../installer/skill-installer.js';\nimport { parseTarget } from '../utils/parse-target.js';\nimport { hasUpdate, formatVersionChange } from '../utils/version.js';\n\nconst updateOptionsSchema = z.object({\n skills: z.array(z.string()),\n cwd: z.string(),\n yes: z.boolean(),\n dryRun: z.boolean(),\n});\n\ntype UpdateOptions = z.infer<typeof updateOptionsSchema>;\n\ninterface UpdateCheckResult {\n skillName: string;\n currentVersion: string;\n latestVersion: string;\n hasUpdate: boolean;\n}\n\nasync function runUpdate(options: UpdateOptions): Promise<void> {\n const { skills, cwd, yes, dryRun } = options;\n\n // Load config\n const config = await getConfig(cwd);\n if (!config) {\n throw notInitializedError();\n }\n\n logger.info('Checking for updates...');\n\n // Determine which skills to check\n let skillsToCheck: string[];\n if (skills.length > 0) {\n // Parse provided skill names\n skillsToCheck = skills.map((s) => parseTarget(s).fullName);\n } else {\n // Check all installed skills\n skillsToCheck = await getInstalledSkills(cwd);\n }\n\n if (skillsToCheck.length === 0) {\n logger.info('No skills installed.');\n return;\n }\n\n const s = spinner('Fetching latest versions...').start();\n\n // Check updates for each skill\n const updateResults: UpdateCheckResult[] = [];\n\n for (const skillName of skillsToCheck) {\n try {\n const currentState = config.skills?.[skillName];\n const currentVersion = currentState?.version ?? '0.0.0';\n\n // Fetch latest version\n const latestSkill = await fetchSkill(skillName, config, cwd);\n\n updateResults.push({\n skillName,\n currentVersion,\n latestVersion: latestSkill.version,\n hasUpdate: hasUpdate(currentVersion, latestSkill.version),\n });\n } catch {\n logger.dim(` Could not check ${skillName}`);\n }\n }\n\n s.stop();\n\n // Filter skills that have updates\n const updatesAvailable = updateResults.filter((r) => r.hasUpdate);\n\n if (updatesAvailable.length === 0) {\n logger.success('All skills are up to date!');\n return;\n }\n\n // Display update table\n logger.break();\n logger.log(formatUpdateTable(updateResults));\n logger.break();\n\n // Dry run mode\n if (dryRun) {\n logger.info(`${updatesAvailable.length} update(s) available.`);\n return;\n }\n\n // Confirm updates\n if (!yes) {\n const { confirmed } = await prompts({\n type: 'confirm',\n name: 'confirmed',\n message: `Update ${updatesAvailable.length} skill(s)?`,\n initial: true,\n });\n\n if (!confirmed) {\n logger.info('Cancelled.');\n return;\n }\n }\n\n // Execute updates\n for (const result of updatesAvailable) {\n const updateSpinner = spinner(`Updating ${result.skillName}...`).start();\n\n try {\n // Fetch latest skill\n const latestSkill = await fetchSkill(result.skillName, config, cwd);\n const platform = config.defaultPlatform;\n\n // Uninstall old version\n await uninstallSkill(result.skillName, config, cwd, { platform });\n\n // Install new version\n await installSkill(latestSkill, config, cwd, {\n platform,\n overwrite: true,\n });\n\n // Update config\n await updateSkill(\n cwd,\n result.skillName,\n latestSkill.version,\n [platform],\n 'standalone'\n );\n\n updateSpinner.succeed(\n `Updated ${result.skillName} (${formatVersionChange(result.currentVersion, result.latestVersion)})`\n );\n } catch (error) {\n updateSpinner.fail(`Failed to update ${result.skillName}`);\n throw error;\n }\n }\n\n logger.break();\n logger.success('Update complete!');\n}\n\n/**\n * Format update results as a table\n */\nfunction formatUpdateTable(results: UpdateCheckResult[]): string {\n const maxNameLen = Math.max(...results.map((r) => r.skillName.length), 20);\n const maxVerLen = 10;\n\n const lines: string[] = [];\n\n // Header\n const header = [\n 'Skill'.padEnd(maxNameLen),\n 'Current'.padEnd(maxVerLen),\n 'Latest'.padEnd(maxVerLen),\n 'Status',\n ].join(' │ ');\n\n const separator = [\n '─'.repeat(maxNameLen),\n '─'.repeat(maxVerLen),\n '─'.repeat(maxVerLen),\n '─'.repeat(16),\n ].join('─┼─');\n\n lines.push('┌' + separator.replace(/─┼─/g, '─┬─') + '┐');\n lines.push('│ ' + header + ' │');\n lines.push('├' + separator + '┤');\n\n // Rows\n for (const r of results) {\n const status = r.hasUpdate\n ? kleur.yellow('update available')\n : kleur.green('up to date');\n\n const row = [\n r.skillName.padEnd(maxNameLen),\n r.currentVersion.padEnd(maxVerLen),\n r.latestVersion.padEnd(maxVerLen),\n status,\n ].join(' │ ');\n\n lines.push('│ ' + row + ' │');\n }\n\n lines.push('└' + separator.replace(/─┼─/g, '─┴─') + '┘');\n\n return lines.join('\\n');\n}\n\nexport const update = new Command()\n .name('update')\n .description('Update installed skills to latest versions')\n .argument('[skills...]', 'Skill names to update (all if empty)')\n .option('--dry-run', 'Preview updates without applying', false)\n .option('-y, --yes', 'Skip confirmation', false)\n .option('-c, --cwd <cwd>', 'Working directory', process.cwd())\n .action(async (skills: string[], opts) => {\n try {\n const options = updateOptionsSchema.parse({\n skills,\n cwd: opts.cwd,\n yes: opts.yes,\n dryRun: opts.dryRun,\n });\n\n await runUpdate(options);\n } catch (error) {\n handleError(error);\n }\n });\n","/**\n * Version comparison utilities\n */\n\n/**\n * Compare two semantic versions\n * @returns -1 if a < b, 0 if a == b, 1 if a > b\n */\nexport function compareVersions(a: string, b: string): number {\n const partsA = a.split('.').map(Number);\n const partsB = b.split('.').map(Number);\n\n for (let i = 0; i < 3; i++) {\n const partA = partsA[i] ?? 0;\n const partB = partsB[i] ?? 0;\n if (partA < partB) return -1;\n if (partA > partB) return 1;\n }\n\n return 0;\n}\n\n/**\n * Check if there's an update available\n */\nexport function hasUpdate(current: string, latest: string): boolean {\n return compareVersions(current, latest) < 0;\n}\n\n/**\n * Format version change for display\n */\nexport function formatVersionChange(current: string, latest: string): string {\n if (hasUpdate(current, latest)) {\n return `${current} → ${latest}`;\n }\n return `${current} (up to date)`;\n}\n\n/**\n * Parse version string\n */\nexport function parseVersion(\n version: string\n): { major: number; minor: number; patch: number } | null {\n const match = version.match(/^(\\d+)\\.(\\d+)\\.(\\d+)$/);\n if (!match) return null;\n\n return {\n major: parseInt(match[1]!, 10),\n minor: parseInt(match[2]!, 10),\n patch: parseInt(match[3]!, 10),\n };\n}\n\n/**\n * Validate version string\n */\nexport function isValidVersion(version: string): boolean {\n return /^\\d+\\.\\d+\\.\\d+$/.test(version);\n}\n","/**\n * aico search - Search for skills and employees in the registry.\n */\n\nimport { Command } from 'commander';\nimport kleur from 'kleur';\nimport { getConfig } from '../utils/config.js';\nimport { logger } from '../utils/logger.js';\nimport { handleError, notInitializedError } from '../utils/errors.js';\nimport { fetchRegistryIndex } from '../registry/client.js';\n\ninterface SearchableItem {\n name: string;\n fullName: string;\n description: string;\n category?: string;\n tags?: string[];\n type: 'skill' | 'employee';\n}\n\n/**\n * Search items by query.\n */\nfunction searchItems(query: string, items: SearchableItem[]): SearchableItem[] {\n const q = query.toLowerCase();\n\n return items.filter((item) => {\n // Search name\n if (item.name.toLowerCase().includes(q)) return true;\n\n // Search full name\n if (item.fullName.toLowerCase().includes(q)) return true;\n\n // Search description\n if (item.description.toLowerCase().includes(q)) return true;\n\n // Search tags\n if (item.tags?.some((tag) => tag.toLowerCase().includes(q))) return true;\n\n // Search category\n if (item.category?.toLowerCase().includes(q)) return true;\n\n return false;\n });\n}\n\n/**\n * Calculate relevance score for an item.\n */\nfunction scoreItem(item: SearchableItem, query: string): number {\n const q = query.toLowerCase();\n let score = 0;\n\n // Exact name match\n if (item.name.toLowerCase() === q) {\n score += 100;\n }\n // Name contains query\n else if (item.name.toLowerCase().includes(q)) {\n score += 50;\n }\n\n // Tag exact match\n if (item.tags?.some((tag) => tag.toLowerCase() === q)) {\n score += 30;\n }\n\n // Category match\n if (item.category?.toLowerCase() === q) {\n score += 20;\n }\n\n // Description contains query\n if (item.description.toLowerCase().includes(q)) {\n score += 10;\n }\n\n return score;\n}\n\n/**\n * Sort items by relevance score.\n */\nfunction sortByRelevance(\n items: SearchableItem[],\n query: string\n): SearchableItem[] {\n return items\n .map((item) => ({ ...item, score: scoreItem(item, query) }))\n .sort((a, b) => b.score - a.score);\n}\n\n/**\n * Filter by category.\n */\nfunction filterByCategory(\n items: SearchableItem[],\n category: string\n): SearchableItem[] {\n return items.filter((item) => item.category === category);\n}\n\n/**\n * Filter by type.\n */\nfunction filterByType(\n items: SearchableItem[],\n type: 'skill' | 'employee'\n): SearchableItem[] {\n return items.filter((item) => item.type === type);\n}\n\n/**\n * Format results as table.\n */\nfunction formatTable(items: SearchableItem[]): string {\n if (items.length === 0) {\n return kleur.yellow('No results found.');\n }\n\n // Calculate column widths\n const nameWidth = Math.max(\n 'Name'.length,\n ...items.map((i) => i.fullName.length)\n );\n const typeWidth = Math.max('Type'.length, ...items.map((i) => i.type.length));\n const catWidth = Math.max(\n 'Category'.length,\n ...items.map((i) => (i.category || '-').length)\n );\n const descWidth = 40;\n\n // Header\n const header = [\n 'Name'.padEnd(nameWidth),\n 'Type'.padEnd(typeWidth),\n 'Category'.padEnd(catWidth),\n 'Description',\n ].join(' │ ');\n\n const separator = [\n '─'.repeat(nameWidth),\n '─'.repeat(typeWidth),\n '─'.repeat(catWidth),\n '─'.repeat(descWidth),\n ].join('─┼─');\n\n // Rows\n const rows = items.map((item) => {\n const desc =\n item.description.length > descWidth\n ? item.description.slice(0, descWidth - 3) + '...'\n : item.description;\n\n return [\n item.fullName.padEnd(nameWidth),\n item.type.padEnd(typeWidth),\n (item.category || '-').padEnd(catWidth),\n desc,\n ].join(' │ ');\n });\n\n return [kleur.bold(header), separator, ...rows].join('\\n');\n}\n\n/**\n * Format results as JSON.\n */\nfunction formatJSON(items: SearchableItem[]): string {\n const output = {\n count: items.length,\n results: items.map((item) => ({\n name: item.name,\n fullName: item.fullName,\n type: item.type,\n category: item.category,\n description: item.description,\n tags: item.tags,\n install:\n item.type === 'employee'\n ? `npx aico add ${item.name}`\n : `npx aico add ${item.fullName}`,\n })),\n };\n\n return JSON.stringify(output, null, 2);\n}\n\nexport const search = new Command()\n .name('search')\n .description('Search for skills and employees')\n .argument('<query>', 'Search query')\n .option(\n '-c, --category <category>',\n 'Filter by category (pm, frontend, backend)'\n )\n .option('-t, --type <type>', 'Filter by type (skill, employee)')\n .option('--json', 'Output as JSON')\n .option('--limit <n>', 'Limit results', '10')\n .option('--cwd <cwd>', 'Working directory', process.cwd())\n .action(async (query: string, opts) => {\n try {\n const config = await getConfig(opts.cwd);\n if (!config) {\n throw notInitializedError();\n }\n\n logger.info('Searching...');\n\n // Fetch registry index\n const index = await fetchRegistryIndex(config, opts.cwd);\n\n // Build searchable items\n const items: SearchableItem[] = [\n ...index.employees.map((emp) => ({\n name: emp.name,\n fullName: emp.fullName || emp.name,\n description: emp.description || '',\n category: emp.category,\n type: 'employee' as const,\n })),\n ];\n\n // Search\n let results = searchItems(query, items);\n\n // Filter by category\n if (opts.category) {\n results = filterByCategory(results, opts.category);\n }\n\n // Filter by type\n if (opts.type) {\n results = filterByType(results, opts.type as 'skill' | 'employee');\n }\n\n // Sort by relevance\n results = sortByRelevance(results, query);\n\n // Limit\n const limit = parseInt(opts.limit, 10);\n results = results.slice(0, limit);\n\n // Output\n logger.break();\n if (opts.json) {\n logger.log(formatJSON(results));\n } else {\n logger.log(\n kleur.cyan(`Found ${results.length} result(s) for \"${query}\":`)\n );\n logger.break();\n logger.log(formatTable(results));\n logger.break();\n\n if (results.length > 0) {\n logger.dim('Install: npx aico add <name>');\n }\n }\n } catch (error) {\n handleError(error);\n }\n });\n","/**\n * aico check - Check environment and configuration.\n */\n\nimport { Command } from 'commander';\nimport kleur from 'kleur';\nimport { existsSync, readdirSync, statSync } from 'fs';\nimport { join } from 'path';\nimport { getConfig } from '../utils/config.js';\nimport { handleError } from '../utils/errors.js';\nimport { logger } from '../utils/logger.js';\nimport type { Config, Platform } from '../schema/config.js';\n\nexport interface CheckResult {\n name: string;\n status: 'pass' | 'fail' | 'warn' | 'skip';\n message: string;\n children?: CheckResult[];\n}\n\n/**\n * Check Node.js version.\n */\nfunction checkNodeVersion(): CheckResult {\n const version = process.version;\n const major = parseInt(version.slice(1).split('.')[0] ?? '0', 10);\n\n if (major >= 20) {\n return {\n name: 'Node.js',\n status: 'pass',\n message: version,\n };\n }\n\n if (major >= 18) {\n return {\n name: 'Node.js',\n status: 'warn',\n message: `${version} (recommend >= 20)`,\n };\n }\n\n return {\n name: 'Node.js',\n status: 'fail',\n message: `${version} (requires >= 18)`,\n };\n}\n\n/**\n * Check configuration file.\n */\nasync function checkConfig(cwd: string): Promise<CheckResult> {\n const configPath = join(cwd, 'aico.json');\n\n if (!existsSync(configPath)) {\n return {\n name: 'aico.json',\n status: 'fail',\n message: 'not found',\n };\n }\n\n try {\n const config = await getConfig(cwd);\n\n if (!config) {\n return {\n name: 'aico.json',\n status: 'fail',\n message: 'invalid',\n };\n }\n\n if (!config.defaultPlatform) {\n return {\n name: 'aico.json',\n status: 'warn',\n message: 'missing defaultPlatform',\n };\n }\n\n return {\n name: 'aico.json',\n status: 'pass',\n message: 'valid',\n };\n } catch {\n return {\n name: 'aico.json',\n status: 'fail',\n message: 'parse error',\n };\n }\n}\n\n/**\n * Check platform directories.\n */\nfunction checkPlatformDirs(\n cwd: string,\n platform: Platform,\n platformConfig: { skills: string; commands: string }\n): CheckResult {\n const children: CheckResult[] = [];\n\n // Check skills directory\n const skillsPath = join(cwd, platformConfig.skills);\n if (existsSync(skillsPath)) {\n children.push({\n name: platformConfig.skills,\n status: 'pass',\n message: 'exists',\n });\n } else {\n children.push({\n name: platformConfig.skills,\n status: 'warn',\n message: 'not found (will be created)',\n });\n }\n\n // Check commands directory\n const commandsPath = join(cwd, platformConfig.commands);\n if (existsSync(commandsPath)) {\n children.push({\n name: platformConfig.commands,\n status: 'pass',\n message: 'exists',\n });\n } else {\n children.push({\n name: platformConfig.commands,\n status: 'warn',\n message: 'not found (will be created)',\n });\n }\n\n const allPass = children.every((c) => c.status === 'pass');\n const hasError = children.some((c) => c.status === 'fail');\n\n return {\n name: `Platform: ${platform}`,\n status: hasError ? 'fail' : allPass ? 'pass' : 'warn',\n message: '',\n children,\n };\n}\n\n/**\n * Check registry connectivity.\n */\nasync function checkRegistry(\n registries: Record<\n string,\n string | { url: string; headers?: Record<string, string> }\n >\n): Promise<CheckResult> {\n const children: CheckResult[] = [];\n\n for (const [name, registry] of Object.entries(registries)) {\n // Build test URL\n const urlTemplate = typeof registry === 'string' ? registry : registry.url;\n const testUrl = urlTemplate.replace('{name}', 'index');\n\n try {\n const response = await fetch(testUrl, {\n method: 'HEAD',\n signal: AbortSignal.timeout(5000),\n });\n\n if (response.ok) {\n children.push({\n name,\n status: 'pass',\n message: 'reachable',\n });\n } else {\n children.push({\n name,\n status: 'fail',\n message: `HTTP ${response.status}`,\n });\n }\n } catch {\n children.push({\n name,\n status: 'fail',\n message: 'unreachable',\n });\n }\n }\n\n const hasError = children.some((c) => c.status === 'fail');\n\n return {\n name: 'Registry',\n status: hasError ? 'fail' : 'pass',\n message: '',\n children,\n };\n}\n\n/**\n * Count items in a directory.\n */\nfunction countDirectory(dir: string): number {\n if (!existsSync(dir)) return 0;\n\n try {\n return readdirSync(dir).filter((item) => {\n const itemPath = join(dir, item);\n try {\n return statSync(itemPath).isDirectory() || item.endsWith('.md');\n } catch {\n return false;\n }\n }).length;\n } catch {\n return 0;\n }\n}\n\n/**\n * Check installed content.\n */\nfunction checkInstalled(\n cwd: string,\n platformConfig: { skills: string; commands: string }\n): CheckResult {\n const skillsCount = countDirectory(join(cwd, platformConfig.skills));\n const commandsCount = countDirectory(join(cwd, platformConfig.commands));\n\n const message = `${skillsCount} skills, ${commandsCount} commands`;\n\n return {\n name: 'Installed',\n status: skillsCount > 0 || commandsCount > 0 ? 'pass' : 'skip',\n message,\n };\n}\n\n/**\n * Get symbol for status.\n */\nfunction getSymbol(status: CheckResult['status']): string {\n const symbols = {\n pass: kleur.green('●'),\n fail: kleur.red('✖'),\n warn: kleur.yellow('◐'),\n skip: kleur.gray('○'),\n };\n return symbols[status];\n}\n\n/**\n * Format results as tree.\n */\nfunction formatResults(results: CheckResult[]): string {\n const lines: string[] = [];\n\n results.forEach((result, index) => {\n const isLast = index === results.length - 1;\n const connector = isLast ? '└── ' : '├── ';\n const extension = isLast ? ' ' : '│ ';\n\n const symbol = getSymbol(result.status);\n const message = result.message ? kleur.dim(` (${result.message})`) : '';\n\n lines.push(`${connector}${symbol} ${result.name}${message}`);\n\n if (result.children) {\n result.children.forEach((child, childIndex) => {\n const childIsLast = childIndex === result.children!.length - 1;\n const childConnector = childIsLast ? '└── ' : '├── ';\n\n const childSymbol = getSymbol(child.status);\n const childMessage = child.message\n ? kleur.dim(` (${child.message})`)\n : '';\n\n lines.push(\n `${extension}${childConnector}${childSymbol} ${child.name}${childMessage}`\n );\n });\n }\n });\n\n return lines.join('\\n');\n}\n\nexport const check = new Command()\n .name('check')\n .description('Check environment and configuration')\n .option('--json', 'Output as JSON')\n .option('--cwd <cwd>', 'Working directory', process.cwd())\n .action(async (opts) => {\n try {\n const cwd = opts.cwd;\n\n logger.break();\n logger.bold(kleur.cyan('AICO Environment Check'));\n logger.break();\n\n const results: CheckResult[] = [];\n\n // 1. Node.js version\n results.push(checkNodeVersion());\n\n // 2. Configuration file\n const configResult = await checkConfig(cwd);\n results.push(configResult);\n\n // If config is invalid, skip remaining checks\n if (configResult.status === 'fail') {\n results.push({\n name: 'Platform',\n status: 'skip',\n message: 'skipped (no config)',\n });\n results.push({\n name: 'Registry',\n status: 'skip',\n message: 'skipped (no config)',\n });\n results.push({\n name: 'Installed',\n status: 'skip',\n message: 'skipped (no config)',\n });\n } else {\n const config = (await getConfig(cwd)) as Config;\n\n // 3. Platform directories\n const platformConfig = config.platforms[config.defaultPlatform];\n if (platformConfig) {\n results.push(\n checkPlatformDirs(cwd, config.defaultPlatform, platformConfig)\n );\n\n // 4. Registry connectivity\n results.push(await checkRegistry(config.registries));\n\n // 5. Installed content\n results.push(checkInstalled(cwd, platformConfig));\n } else {\n results.push({\n name: 'Platform',\n status: 'fail',\n message: 'default platform not found in config',\n });\n results.push({\n name: 'Registry',\n status: 'skip',\n message: 'skipped (platform missing)',\n });\n results.push({\n name: 'Installed',\n status: 'skip',\n message: 'skipped (platform missing)',\n });\n }\n }\n\n // Output\n if (opts.json) {\n logger.log(JSON.stringify(results, null, 2));\n } else {\n logger.log(formatResults(results));\n logger.break();\n\n // Summary\n const hasError = results.some((r) => r.status === 'fail');\n const hasWarn = results.some((r) => r.status === 'warn');\n\n if (hasError) {\n logger.log(\n kleur.red('✖ Some checks failed. Run `npx aico init` to fix.')\n );\n } else if (hasWarn) {\n logger.log(\n kleur.yellow('◐ Some checks have warnings. AICO should work.')\n );\n } else {\n logger.log(kleur.green('✓ All checks passed! AICO is ready to use.'));\n }\n logger.break();\n }\n } catch (error) {\n handleError(error);\n }\n });\n"],"mappings":"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","names":["Command","path","z","kleur","z","Command","prompts","z","path","z","z","z","z","z","z","fs","path","path","fs","path","path","fs","path","prompts","path","fs","prompts","fs","path","path","fs","fetchSkill","path","fs","path","path","fs","z","prompts","s","Command","Command","prompts","z","z","prompts","s","Command","Command","z","z","installed","Command","Command","fs","path","z","z","path","fs","Command","fs","path","Command","z","adapters","z","fs","path","s","diff","Command","Command","prompts","z","kleur","z","s","prompts","kleur","Command","Command","kleur","kleur","Command","Command","kleur","kleur","Command","Command"]}
|