@synapsync/cli 0.1.2 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../node_modules/tsup/assets/esm_shims.js","../src/version.ts","../src/index.ts","../src/cli.ts","../src/core/constants.ts","../src/ui/repl.ts","../src/ui/banner.ts","../src/ui/logo.ts","../src/utils/logger.ts","../src/commands/info.ts","../src/commands/init.ts","../src/services/config/manager.ts","../src/services/config/schema.ts","../src/commands/config.ts","../src/commands/status.ts","../src/commands/providers.ts","../src/commands/search.ts","../src/services/registry/client.ts","../src/commands/install.ts","../src/services/sync/engine.ts","../src/services/scanner/scanner.ts","../src/services/scanner/parser.ts","../src/services/manifest/manager.ts","../src/services/manifest/types.ts","../src/services/symlink/manager.ts","../src/commands/list.ts","../src/commands/uninstall.ts","../src/commands/sync.ts","../src/commands/update.ts","../src/services/maintenance/update-checker.ts","../src/commands/doctor.ts","../src/services/maintenance/doctor.ts","../src/commands/clean.ts","../src/services/maintenance/cleaner.ts","../src/commands/help.ts","../src/commands/version.ts"],"sourcesContent":["// Shim globals in esm bundle\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nconst getFilename = () => fileURLToPath(import.meta.url)\nconst getDirname = () => path.dirname(getFilename())\n\nexport const __dirname = /* @__PURE__ */ getDirname()\nexport const __filename = /* @__PURE__ */ getFilename()\n","/**\n * CLI version - extracted from package.json\n */\n\n// This will be replaced during build or read from package.json\nexport const version = '0.1.0';\n","/**\n * SynapSync CLI - Entry point\n */\n\nimport { runCLI } from './cli.js';\nimport { logger } from './utils/logger.js';\n\nrunCLI().catch((error) => {\n logger.error(`Fatal error: ${error}`);\n process.exit(1);\n});\n","/**\n * CLI setup with Commander.js\n */\n\nimport { Command } from 'commander';\nimport { CLI_NAME, CLI_DESCRIPTION } from './core/constants.js';\nimport { startInteractiveMode } from './ui/repl.js';\nimport { version } from './version.js';\nimport { logger } from './utils/logger.js';\n\n// Import commands\nimport { registerHelpCommand } from './commands/help.js';\nimport { registerVersionCommand } from './commands/version.js';\nimport { registerInfoCommand } from './commands/info.js';\nimport { registerInitCommand } from './commands/init.js';\nimport { registerConfigCommand } from './commands/config.js';\nimport { registerStatusCommand } from './commands/status.js';\nimport { registerProvidersCommand } from './commands/providers.js';\nimport { registerSearchCommand } from './commands/search.js';\nimport { registerInstallCommand } from './commands/install.js';\nimport { registerListCommand } from './commands/list.js';\nimport { registerUninstallCommand } from './commands/uninstall.js';\nimport { registerSyncCommand } from './commands/sync.js';\nimport { registerUpdateCommand } from './commands/update.js';\nimport { registerDoctorCommand } from './commands/doctor.js';\nimport { registerCleanCommand } from './commands/clean.js';\n\nexport function createCLI(): Command {\n const program = new Command();\n\n program\n .name(CLI_NAME)\n .description(CLI_DESCRIPTION)\n .version(version, '-v, --version', 'Show CLI version')\n .option('--verbose', 'Enable verbose output')\n .option('--no-color', 'Disable colored output')\n .hook('preAction', (_thisCommand, _actionCommand) => {\n // Global pre-action hook for logging, etc.\n });\n\n // Enter interactive mode when no command is provided\n program.action(() => {\n startInteractiveMode();\n });\n\n // Register commands\n registerHelpCommand(program);\n registerVersionCommand(program);\n registerInfoCommand(program);\n registerInitCommand(program);\n registerConfigCommand(program);\n registerStatusCommand(program);\n registerProvidersCommand(program);\n registerSearchCommand(program);\n registerInstallCommand(program);\n registerListCommand(program);\n registerUninstallCommand(program);\n registerSyncCommand(program);\n registerUpdateCommand(program);\n registerDoctorCommand(program);\n registerCleanCommand(program);\n\n // TODO: Register more commands as they are implemented\n // These commands will work both via CLI (synapsync init)\n // and in interactive mode (/init)\n // registerInitCommand(program);\n // registerConfigCommand(program);\n // registerConnectCommand(program);\n // registerProvidersCommand(program);\n // registerSearchCommand(program);\n // registerInstallCommand(program);\n // registerListCommand(program);\n // registerInfoCommand(program);\n // registerUninstallCommand(program);\n // registerSyncCommand(program);\n // registerStatusCommand(program);\n\n return program;\n}\n\nexport async function runCLI(args: string[] = process.argv): Promise<void> {\n const program = createCLI();\n\n try {\n await program.parseAsync(args);\n } catch (error) {\n if (error instanceof Error) {\n logger.error(`Error: ${error.message}`);\n logger.debug(error.stack ?? '');\n }\n process.exit(1);\n }\n}\n","/**\n * Core constants for SynapSync CLI\n */\n\n// ============================================\n// Cognitive Types - The types of AI cognitives managed\n// Cognitives are the building blocks of AI capabilities:\n// skills, agents, prompts, workflows, and tools\n// ============================================\nexport const COGNITIVE_TYPES = ['skill', 'agent', 'prompt', 'workflow', 'tool'] as const;\nexport type CognitiveType = (typeof COGNITIVE_TYPES)[number];\n\n// File extensions per cognitive type (used for detection/scanning)\nexport const COGNITIVE_FILE_EXTENSIONS: Record<CognitiveType, string> = {\n skill: '.md',\n agent: '.md',\n prompt: '.md',\n workflow: '.yaml',\n tool: '.md',\n};\n\n// Sync mode per cognitive type:\n// - 'folder': Sync entire folder (for cognitives with assets, like skills)\n// - 'file': Sync as flat file (for simple cognitives like agents)\nexport const COGNITIVE_SYNC_MODE: Record<CognitiveType, 'folder' | 'file'> = {\n skill: 'folder', // Skills have SKILL.md + assets/ folder\n agent: 'file', // Agents are single .md files\n prompt: 'file', // Prompts are single .md files\n workflow: 'file', // Workflows are single .yaml files\n tool: 'file', // Tools are single .md files\n};\n\n// Legacy: Default file names per cognitive type (for backward compatibility)\n// New cognitives should use their original filename\nexport const COGNITIVE_FILE_NAMES: Record<CognitiveType, string> = {\n skill: 'SKILL.md',\n agent: 'AGENT.md',\n prompt: 'PROMPT.md',\n workflow: 'WORKFLOW.yaml',\n tool: 'TOOL.md',\n};\n\n// ============================================\n// Storage Paths\n// ============================================\nexport const DEFAULT_SYNAPSYNC_DIR = process.env['SYNAPSYNC_DIR'] ?? '.synapsync';\nexport const MANIFEST_FILE_NAME = 'manifest.json';\nexport const CONFIG_FILE_NAME = 'synapsync.config.yaml';\nexport const LOCK_FILE_NAME = 'synapsync.lock';\n\n// Legacy support (will be deprecated)\nexport const DEFAULT_AGENTS_DIR = process.env['SYNAPSYNC_AGENTS_DIR'] ?? '.agents';\nexport const DEFAULT_SKILLS_SUBDIR = process.env['SYNAPSYNC_SKILLS_SUBDIR'] ?? 'skills';\n\n// ============================================\n// Categories for resource organization\n// ============================================\nexport const CATEGORIES = [\n 'frontend',\n 'backend',\n 'database',\n 'devops',\n 'security',\n 'testing',\n 'analytics',\n 'automation',\n 'general',\n] as const;\n\nexport type Category = (typeof CATEGORIES)[number] | string;\n\n// ============================================\n// Provider Configuration\n// ============================================\nexport const SUPPORTED_PROVIDERS = [\n 'claude',\n 'openai',\n 'gemini',\n 'cursor',\n 'windsurf',\n 'copilot',\n] as const;\nexport type SupportedProvider = (typeof SUPPORTED_PROVIDERS)[number];\n\n// Provider paths for syncing cognitives\nexport const PROVIDER_PATHS: Record<SupportedProvider, Record<CognitiveType, string>> = {\n claude: {\n skill: '.claude/skills',\n agent: '.claude/agents',\n prompt: '.claude/prompts',\n workflow: '.claude/workflows',\n tool: '.claude/tools',\n },\n openai: {\n skill: '.openai/skills',\n agent: '.openai/agents',\n prompt: '.openai/prompts',\n workflow: '.openai/workflows',\n tool: '.openai/tools',\n },\n gemini: {\n skill: '.gemini/skills',\n agent: '.gemini/agents',\n prompt: '.gemini/prompts',\n workflow: '.gemini/workflows',\n tool: '.gemini/tools',\n },\n cursor: {\n skill: '.cursor/skills',\n agent: '.cursor/agents',\n prompt: '.cursor/prompts',\n workflow: '.cursor/workflows',\n tool: '.cursor/tools',\n },\n windsurf: {\n skill: '.windsurf/skills',\n agent: '.windsurf/agents',\n prompt: '.windsurf/prompts',\n workflow: '.windsurf/workflows',\n tool: '.windsurf/tools',\n },\n copilot: {\n skill: '.github/skills',\n agent: '.github/agents',\n prompt: '.github/prompts',\n workflow: '.github/workflows',\n tool: '.github/tools',\n },\n};\n\n// ============================================\n// CLI Metadata\n// ============================================\nexport const CLI_NAME = 'synapsync';\nexport const CLI_DESCRIPTION =\n 'Neural AI Orchestration Platform - Manage AI cognitives (skills, agents, prompts, tools) across providers';\n\n// ============================================\n// Registry Configuration\n// ============================================\nexport const REGISTRY_BASE_URL =\n process.env['SYNAPSYNC_REGISTRY_URL'] ??\n 'https://raw.githubusercontent.com/SynapSync/synapse-registry/main';\nexport const REGISTRY_INDEX_FILE = 'registry.json';\nexport const REGISTRY_MANIFEST_FILE = 'manifest.json';\n\n// ============================================\n// ANSI Escape Codes\n// ============================================\nexport const RESET = '\\x1b[0m';\nexport const DIM = '\\x1b[2m';\nexport const BOLD = '\\x1b[1m';\n","/**\n * Interactive REPL (Read-Eval-Print Loop) for SynapSync CLI\n * Allows users to run commands interactively without leaving the CLI\n */\n\nimport * as readline from 'readline';\nimport pc from 'picocolors';\nimport { showBanner, showError, showInfo } from './banner.js';\nimport { CLI_NAME } from '../core/constants.js';\nimport { logger } from '../utils/logger.js';\nimport { executeInfoCommand } from '../commands/info.js';\nimport { executeInitCommand } from '../commands/init.js';\nimport { executeConfigCommand } from '../commands/config.js';\nimport { executeStatusCommand } from '../commands/status.js';\nimport { executeProvidersCommand } from '../commands/providers.js';\nimport { executeSearchCommand } from '../commands/search.js';\nimport { executeInstallCommand } from '../commands/install.js';\nimport { executeListCommand } from '../commands/list.js';\nimport { executeUninstallCommand } from '../commands/uninstall.js';\nimport { executeSyncCommand, executeSyncStatusCommand } from '../commands/sync.js';\nimport { executeUpdateCommand } from '../commands/update.js';\nimport { executeDoctorCommand } from '../commands/doctor.js';\nimport { executeCleanCommand } from '../commands/clean.js';\n\n// Command definition with usage info\ninterface CommandDef {\n description: string;\n usage?: string;\n options?: Array<{ flag: string; description: string }>;\n examples?: string[];\n handler: (args: string) => void | Promise<void>;\n}\n\n// Available commands in interactive mode\nconst COMMANDS: Record<string, CommandDef> = {};\n\n// Register a command for interactive mode\nexport function registerInteractiveCommand(\n name: string,\n description: string,\n handler: (args: string) => void | Promise<void>,\n options?: {\n usage?: string;\n options?: Array<{ flag: string; description: string }>;\n examples?: string[];\n }\n): void {\n const def: CommandDef = { description, handler };\n if (options?.usage !== undefined) def.usage = options.usage;\n if (options?.options !== undefined) def.options = options.options;\n if (options?.examples !== undefined) def.examples = options.examples;\n COMMANDS[name] = def;\n}\n\n// Show detailed help for a specific command\nfunction showCommandHelp(commandName: string): void {\n const cmd = COMMANDS[commandName];\n if (!cmd) {\n showError(`Unknown command: /${commandName}`);\n return;\n }\n\n logger.line();\n logger.log(pc.bold(pc.cyan(` /${commandName}`)) + pc.dim(` - ${cmd.description}`));\n logger.line();\n\n if (cmd.usage) {\n logger.log(pc.bold(' Usage:'));\n logger.log(` ${pc.cyan(cmd.usage)}`);\n logger.line();\n }\n\n if (cmd.options && cmd.options.length > 0) {\n logger.log(pc.bold(' Options:'));\n for (const opt of cmd.options) {\n logger.log(` ${pc.yellow(opt.flag.padEnd(16))} ${pc.dim(opt.description)}`);\n }\n logger.line();\n }\n\n if (cmd.examples && cmd.examples.length > 0) {\n logger.log(pc.bold(' Examples:'));\n for (const example of cmd.examples) {\n logger.log(` ${pc.dim('$')} ${pc.cyan(example)}`);\n }\n logger.line();\n }\n}\n\n// ============================================\n// Built-in Commands\n// ============================================\n\nregisterInteractiveCommand(\n 'help',\n 'Show available commands or help for a specific command',\n (args) => {\n const commandName = args.trim().toLowerCase().replace(/^\\//, '');\n\n // If a command name is provided, show detailed help\n if (commandName) {\n showCommandHelp(commandName);\n return;\n }\n\n // Show general help\n logger.line();\n logger.bold(' Available Commands:');\n logger.line();\n\n // Built-in commands\n logger.log(` ${pc.cyan('/help [command]')} ${pc.dim('Show help (or help for a command)')}`);\n logger.log(` ${pc.cyan('/clear')} ${pc.dim('Clear the screen')}`);\n logger.log(` ${pc.cyan('/exit')} ${pc.dim('Exit interactive mode')}`);\n logger.line();\n\n // Registered commands by category\n const categories: Record<string, string[]> = {\n 'Information': ['info', 'version'],\n 'Project': ['init', 'config', 'status'],\n 'Providers': ['providers'],\n 'Cognitives': ['search', 'install', 'list', 'uninstall', 'create'],\n 'Sync': ['sync', 'push', 'pull'],\n 'Maintenance': ['update', 'doctor', 'clean'],\n };\n\n for (const [category, cmds] of Object.entries(categories)) {\n const availableCmds = cmds.filter((name) => COMMANDS[name]);\n if (availableCmds.length > 0) {\n logger.bold(` ${category}:`);\n for (const name of availableCmds) {\n const cmd = COMMANDS[name];\n const hasOptions = cmd?.options !== undefined && cmd.options.length > 0;\n const paddedName = `/${name}`.padEnd(18);\n const optionsHint = hasOptions ? pc.yellow(' [options]') : '';\n logger.log(` ${pc.cyan(paddedName)} ${pc.dim(cmd?.description ?? '')}${optionsHint}`);\n }\n logger.line();\n }\n }\n\n logger.hint('Tip: Use /help <command> for detailed help. Example: /help info');\n logger.line();\n },\n {\n usage: '/help [command]',\n examples: ['/help', '/help info', '/help install'],\n }\n);\n\nregisterInteractiveCommand('clear', 'Clear the screen', (_args) => {\n logger.clear();\n showBanner();\n});\n\nregisterInteractiveCommand('exit', 'Exit interactive mode', (_args) => {\n logger.line();\n showInfo('Goodbye! Run `synapsync` to start again.');\n logger.line();\n process.exit(0);\n});\n\nregisterInteractiveCommand(\n 'info',\n 'Show information about SynapSync concepts',\n (args) => {\n executeInfoCommand(args);\n },\n {\n usage: '/info [--topic]',\n options: [\n { flag: '--cognitives', description: 'Types of AI cognitives (skills, agents, etc.)' },\n { flag: '--install', description: 'How to install from registry, GitHub, local' },\n { flag: '--providers', description: 'Supported AI providers' },\n { flag: '--categories', description: 'Cognitive organization categories' },\n { flag: '--sync', description: 'How synchronization works' },\n { flag: '--structure', description: 'Project directory structure' },\n ],\n examples: ['/info', '/info --cognitives', '/info --install'],\n }\n);\n\n// ============================================\n// Project Commands\n// ============================================\n\nregisterInteractiveCommand(\n 'init',\n 'Initialize a new SynapSync project',\n async (_args) => {\n await executeInitCommand();\n },\n {\n usage: '/init [options]',\n options: [\n { flag: '-n, --name', description: 'Project name' },\n { flag: '-y, --yes', description: 'Skip prompts, use defaults' },\n ],\n examples: ['/init', '/init --name my-project', '/init --yes'],\n }\n);\n\nregisterInteractiveCommand(\n 'config',\n 'Manage project configuration',\n (args) => {\n executeConfigCommand(args);\n },\n {\n usage: '/config [list|get|set] [key] [value]',\n options: [\n { flag: 'list', description: 'Show all configuration values' },\n { flag: 'get <key>', description: 'Get a specific value' },\n { flag: 'set <key> <value>', description: 'Set a configuration value' },\n ],\n examples: ['/config', '/config list', '/config get cli.theme', '/config set cli.theme dark'],\n }\n);\n\nregisterInteractiveCommand(\n 'status',\n 'Show project status',\n (_args) => {\n executeStatusCommand();\n },\n {\n usage: '/status',\n examples: ['/status'],\n }\n);\n\n// ============================================\n// Provider Commands\n// ============================================\n\nregisterInteractiveCommand(\n 'providers',\n 'Manage provider configuration',\n (args) => {\n executeProvidersCommand(args);\n },\n {\n usage: '/providers [list|enable|disable|path] [args]',\n options: [\n { flag: 'list', description: 'List all providers and status (default)' },\n { flag: 'enable <provider>', description: 'Enable a provider' },\n { flag: 'disable <provider>', description: 'Disable a provider' },\n { flag: 'path <provider> <path>', description: 'Set custom sync path' },\n ],\n examples: [\n '/providers',\n '/providers enable openai',\n '/providers disable cursor',\n '/providers path claude .claude-code/',\n ],\n }\n);\n\n// ============================================\n// Asset Commands (skills, agents, prompts, etc.)\n// ============================================\n\nregisterInteractiveCommand(\n 'search',\n 'Search for cognitives in the registry',\n async (args) => {\n // Parse args to extract query and options\n const parts = args.split(/\\s+/);\n let query: string | undefined;\n const options: Record<string, string | boolean> = {};\n\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i];\n if (part === undefined || part === '') continue;\n\n if (part === '--type' || part === '-t') {\n options['type'] = parts[++i] ?? '';\n } else if (part === '--category' || part === '-c') {\n options['category'] = parts[++i] ?? '';\n } else if (part === '--tag') {\n options['tag'] = parts[++i] ?? '';\n } else if (part === '--limit' || part === '-l') {\n options['limit'] = parts[++i] ?? '20';\n } else if (part === '--json') {\n options['json'] = true;\n } else if (!part.startsWith('-')) {\n query = part;\n }\n }\n\n await executeSearchCommand(query, options);\n },\n {\n usage: '/search [query] [options]',\n options: [\n { flag: '-t, --type <type>', description: 'Filter by type (skill, agent, prompt, etc.)' },\n { flag: '-c, --category <cat>', description: 'Filter by category' },\n { flag: '--tag <tag>', description: 'Filter by tag' },\n { flag: '-l, --limit <n>', description: 'Limit results (default: 20)' },\n { flag: '--json', description: 'Output as JSON' },\n ],\n examples: ['/search', '/search react', '/search --type skill', '/search api --category backend'],\n }\n);\n\nregisterInteractiveCommand(\n 'install',\n 'Install a cognitive from registry, local path, or GitHub',\n async (args) => {\n const parts = args.split(/\\s+/);\n let source: string | undefined;\n const options: Record<string, string | boolean> = {};\n\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i];\n if (part === undefined || part === '') continue;\n\n if (part === '--type' || part === '-t') {\n options['type'] = parts[++i] ?? '';\n } else if (part === '--category' || part === '-c') {\n options['category'] = parts[++i] ?? '';\n } else if (part === '--force' || part === '-f') {\n options['force'] = true;\n } else if (part === '--sync' || part === '-s') {\n options['sync'] = true;\n } else if (!part.startsWith('-')) {\n source = part;\n }\n }\n\n if (source === undefined || source === '') {\n logger.error('Please specify a cognitive to install.');\n logger.hint('Usage: /install <name|path|github:user/repo>');\n return;\n }\n\n await executeInstallCommand(source, options);\n },\n {\n usage: '/install <source> [options]',\n options: [\n { flag: '-t, --type <type>', description: 'Cognitive type (skill, agent, etc.)' },\n { flag: '-c, --category <cat>', description: 'Category (overrides default)' },\n { flag: '-f, --force', description: 'Overwrite if already installed' },\n { flag: '-s, --sync', description: 'Sync to providers after installation' },\n ],\n examples: [\n '/install skill-creator',\n '/install skill-creator --sync',\n '/install ./my-skill',\n '/install github:user/repo',\n '/install skill-creator --force',\n ],\n }\n);\n\nregisterInteractiveCommand(\n 'list',\n 'List installed cognitives or browse registry',\n async (args) => {\n const parts = args.split(/\\s+/);\n const options: Record<string, string | boolean> = {};\n\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i];\n if (part === undefined || part === '') continue;\n\n if (part === '--type' || part === '-t') {\n options['type'] = parts[++i] ?? '';\n } else if (part === '--category' || part === '-c') {\n options['category'] = parts[++i] ?? '';\n } else if (part === '--remote' || part === '-r') {\n options['remote'] = true;\n } else if (part === '--json') {\n options['json'] = true;\n }\n }\n\n await executeListCommand(options);\n },\n {\n usage: '/list [options]',\n options: [\n { flag: '-t, --type <type>', description: 'Filter by type (skill, agent, prompt, etc.)' },\n { flag: '-c, --category <cat>', description: 'Filter by category' },\n { flag: '-r, --remote', description: 'Browse all cognitives in registry' },\n { flag: '--json', description: 'Output as JSON' },\n ],\n examples: ['/list', '/list --remote', '/list --type skill', '/list --category backend'],\n }\n);\n\nregisterInteractiveCommand(\n 'uninstall',\n 'Uninstall a cognitive',\n (args) => {\n const parts = args.split(/\\s+/);\n let name: string | undefined;\n const options: Record<string, boolean> = {};\n\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i];\n if (part === undefined || part === '') continue;\n\n if (part === '--force' || part === '-f') {\n options['force'] = true;\n } else if (part === '--keep-files') {\n options['keepFiles'] = true;\n } else if (!part.startsWith('-')) {\n name = part;\n }\n }\n\n if (name === undefined || name === '') {\n logger.error('Please specify a cognitive to uninstall.');\n logger.hint('Usage: /uninstall <name> [--force]');\n return;\n }\n\n executeUninstallCommand(name, options);\n },\n {\n usage: '/uninstall <name> [options]',\n options: [\n { flag: '-f, --force', description: 'Skip confirmation' },\n { flag: '--keep-files', description: 'Remove from manifest but keep files' },\n ],\n examples: ['/uninstall skill-creator', '/uninstall my-agent --force'],\n }\n);\n\nregisterInteractiveCommand('create', 'Create a new asset', (_args) => {\n showInfo('Command not yet implemented. Coming in Phase 2.');\n});\n\n// ============================================\n// Sync Commands\n// ============================================\n\nregisterInteractiveCommand(\n 'sync',\n 'Sync cognitives to providers',\n (args) => {\n const parts = args.split(/\\s+/);\n const options: Record<string, string | boolean> = {};\n let subcommand: string | undefined;\n\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i];\n if (part === undefined || part === '') continue;\n\n if (part === 'status') {\n subcommand = 'status';\n } else if (part === '--dry-run' || part === '-n') {\n options['dryRun'] = true;\n } else if (part === '--type' || part === '-t') {\n options['type'] = parts[++i] ?? '';\n } else if (part === '--category' || part === '-c') {\n options['category'] = parts[++i] ?? '';\n } else if (part === '--provider' || part === '-p') {\n options['provider'] = parts[++i] ?? '';\n } else if (part === '--copy') {\n options['copy'] = true;\n } else if (part === '--force' || part === '-f') {\n options['force'] = true;\n } else if (part === '--verbose' || part === '-v') {\n options['verbose'] = true;\n } else if (part === '--json') {\n options['json'] = true;\n }\n }\n\n // Call the appropriate function based on subcommand\n if (subcommand === 'status') {\n executeSyncStatusCommand({ json: options['json'] === true });\n } else {\n executeSyncCommand(options);\n }\n },\n {\n usage: '/sync [status] [options]',\n options: [\n { flag: 'status', description: 'Show sync status without applying changes' },\n { flag: '-n, --dry-run', description: 'Preview changes without applying' },\n { flag: '-t, --type <type>', description: 'Sync only a specific type' },\n { flag: '-c, --category <cat>', description: 'Sync only a specific category' },\n { flag: '-p, --provider <name>', description: 'Sync only to a specific provider' },\n { flag: '--copy', description: 'Use file copy instead of symlinks' },\n { flag: '-f, --force', description: 'Force sync even if already synced' },\n { flag: '-v, --verbose', description: 'Show detailed output' },\n { flag: '--json', description: 'Output as JSON' },\n ],\n examples: ['/sync', '/sync status', '/sync --dry-run', '/sync --provider claude'],\n }\n);\n\nregisterInteractiveCommand('push', 'Push local cognitives to registry', (_args) => {\n showInfo('Command not yet implemented. Coming in Phase 3.');\n});\n\nregisterInteractiveCommand('pull', 'Pull latest cognitives from registry', (_args) => {\n showInfo('Command not yet implemented. Coming in Phase 3.');\n});\n\n// ============================================\n// Maintenance Commands\n// ============================================\n\nregisterInteractiveCommand(\n 'update',\n 'Update installed cognitives',\n async (args) => {\n const parts = args.split(/\\s+/);\n let name: string | undefined;\n const options: Record<string, string | boolean> = {};\n\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i];\n if (part === undefined || part === '') continue;\n\n if (part === '--all' || part === '-a') {\n options['all'] = true;\n } else if (part === '--force' || part === '-f') {\n options['force'] = true;\n } else if (part === '--dry-run' || part === '-n') {\n options['dryRun'] = true;\n } else if (part === '--json') {\n options['json'] = true;\n } else if (!part.startsWith('-')) {\n name = part;\n }\n }\n\n await executeUpdateCommand(name, options);\n },\n {\n usage: '/update [name] [options]',\n options: [\n { flag: '-a, --all', description: 'Update all cognitives' },\n { flag: '-f, --force', description: 'Force update even if current' },\n { flag: '-n, --dry-run', description: 'Preview updates without applying' },\n { flag: '--json', description: 'Output as JSON' },\n ],\n examples: ['/update skill-creator', '/update --all', '/update --dry-run'],\n }\n);\n\nregisterInteractiveCommand(\n 'doctor',\n 'Check project health and diagnose issues',\n async (args) => {\n const parts = args.split(/\\s+/);\n const options: Record<string, boolean> = {};\n\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i];\n if (part === undefined || part === '') continue;\n\n if (part === '--fix') {\n options['fix'] = true;\n } else if (part === '--verbose' || part === '-v') {\n options['verbose'] = true;\n } else if (part === '--json') {\n options['json'] = true;\n }\n }\n\n await executeDoctorCommand(options);\n },\n {\n usage: '/doctor [options]',\n options: [\n { flag: '--fix', description: 'Attempt to fix issues automatically' },\n { flag: '-v, --verbose', description: 'Show detailed output' },\n { flag: '--json', description: 'Output as JSON' },\n ],\n examples: ['/doctor', '/doctor --fix', '/doctor --verbose'],\n }\n);\n\nregisterInteractiveCommand(\n 'clean',\n 'Remove orphaned files and fix broken symlinks',\n (args) => {\n const parts = args.split(/\\s+/);\n const options: Record<string, boolean> = {};\n\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i];\n if (part === undefined || part === '') continue;\n\n if (part === '--dry-run' || part === '-n') {\n options['dryRun'] = true;\n } else if (part === '--force' || part === '-f') {\n options['force'] = true;\n } else if (part === '--verbose' || part === '-v') {\n options['verbose'] = true;\n } else if (part === '--json') {\n options['json'] = true;\n }\n }\n\n executeCleanCommand(options);\n },\n {\n usage: '/clean [options]',\n options: [\n { flag: '-n, --dry-run', description: 'Preview what would be cleaned' },\n { flag: '-f, --force', description: 'Skip confirmation' },\n { flag: '-v, --verbose', description: 'Show detailed output' },\n { flag: '--json', description: 'Output as JSON' },\n ],\n examples: ['/clean', '/clean --dry-run', '/clean --force'],\n }\n);\n\n// ============================================\n// Utility Commands\n// ============================================\n\nregisterInteractiveCommand('version', 'Show version information', async (_args) => {\n const { version } = await import('../version.js');\n logger.line();\n logger.log(`${pc.bold('SynapSync CLI')} ${pc.cyan(`v${version}`)}`);\n logger.line();\n logger.label('Node.js', process.version);\n logger.label('Platform', `${process.platform} ${process.arch}`);\n logger.line();\n});\n\n/**\n * Parse command input and execute\n */\nasync function executeCommand(input: string): Promise<void> {\n const trimmed = input.trim();\n\n if (!trimmed) {\n return;\n }\n\n // Commands must start with /\n if (!trimmed.startsWith('/')) {\n showError(`Unknown input. Commands must start with /`);\n logger.log(`${pc.dim('Type')} ${pc.cyan('/help')} ${pc.dim('for available commands.')}`);\n return;\n }\n\n // Parse command and arguments\n const parts = trimmed.slice(1).split(/\\s+/);\n const commandName = parts[0]?.toLowerCase();\n const args = parts.slice(1).join(' ');\n\n if (!commandName) {\n return;\n }\n\n const command = COMMANDS[commandName];\n\n if (!command) {\n showError(`Unknown command: /${commandName}`);\n logger.log(`${pc.dim('Type')} ${pc.cyan('/help')} ${pc.dim('for available commands.')}`);\n return;\n }\n\n try {\n await command.handler(args);\n } catch (error) {\n if (error instanceof Error) {\n showError(error.message);\n } else {\n showError('An unexpected error occurred');\n }\n }\n}\n\n/**\n * Start the interactive REPL\n */\nexport function startInteractiveMode(): void {\n // Show banner first\n showBanner();\n\n logger.log(\n `${pc.dim('Type')} ${pc.cyan('/help')} ${pc.dim('for commands,')} ${pc.cyan('/exit')} ${pc.dim('to quit.')}`\n );\n logger.line();\n\n // Create readline interface\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n prompt: `${pc.green(CLI_NAME)} ${pc.dim('>')} `,\n terminal: true,\n });\n\n // Handle line input\n rl.on('line', (line) => {\n void executeCommand(line).then(() => {\n rl.prompt();\n });\n });\n\n // Handle close (Ctrl+C, Ctrl+D)\n rl.on('close', () => {\n logger.line();\n showInfo('Goodbye!');\n process.exit(0);\n });\n\n // Handle SIGINT (Ctrl+C)\n rl.on('SIGINT', () => {\n logger.line();\n logger.hint('(Use /exit to quit or Ctrl+D)');\n rl.prompt();\n });\n\n // Start the prompt\n rl.prompt();\n}\n","/**\n * Welcome banner for SynapSync CLI\n */\n\nimport pc from 'picocolors';\nimport { showLogo } from './logo.js';\nimport { version } from '../version.js';\nimport { logger } from '../utils/logger.js';\n\n/**\n * Show the full welcome banner\n */\nexport function showBanner(): void {\n showLogo();\n logger.line();\n logger.dim(`Neural AI Orchestration Platform`);\n logger.dim(`Version ${version}`);\n logger.line();\n\n // Quick start commands\n logger.bold(' Quick Start:');\n logger.line();\n logger.command('synapsync init', 'Initialize a new project');\n logger.command('synapsync connect', 'Connect to AI providers');\n logger.command('synapsync search', 'Search registry for assets');\n logger.command('synapsync install <name>', 'Install skill, agent, or prompt');\n logger.command('synapsync sync', 'Sync assets to providers');\n logger.line();\n\n // Help hint\n logger.log(` ${pc.dim('Run')} ${pc.cyan('synapsync --help')} ${pc.dim('for all commands')}`);\n logger.line();\n}\n\n/**\n * Show a minimal header (for command output)\n */\nexport function showHeader(title: string): void {\n logger.header(title);\n}\n\n/**\n * Show success message\n */\nexport function showSuccess(message: string): void {\n logger.success(message);\n}\n\n/**\n * Show error message\n */\nexport function showError(message: string): void {\n logger.error(message);\n}\n\n/**\n * Show warning message\n */\nexport function showWarning(message: string): void {\n logger.warning(message);\n}\n\n/**\n * Show info message\n */\nexport function showInfo(message: string): void {\n logger.info(message);\n}\n","/**\n * ASCII Logo with gradient colors\n * Inspired by vercel-labs/skills pattern\n */\n\nimport { logger } from '../utils/logger.js';\n\n// SynapSync ASCII art logo\nconst LOGO_LINES = [\n '███████╗██╗ ██╗███╗ ██╗ █████╗ ██████╗ ███████╗██╗ ██╗███╗ ██╗ ██████╗',\n '██╔════╝╚██╗ ██╔╝████╗ ██║██╔══██╗██╔══██╗██╔════╝╚██╗ ██╔╝████╗ ██║██╔════╝',\n '███████╗ ╚████╔╝ ██╔██╗ ██║███████║██████╔╝███████╗ ╚████╔╝ ██╔██╗ ██║██║ ',\n '╚════██║ ╚██╔╝ ██║╚██╗██║██╔══██║██╔═══╝ ╚════██║ ╚██╔╝ ██║╚██╗██║██║ ',\n '███████║ ██║ ██║ ╚████║██║ ██║██║ ███████║ ██║ ██║ ╚████║╚██████╗',\n '╚══════╝ ╚═╝ ╚═╝ ╚═══╝╚═╝ ╚═╝╚═╝ ╚══════╝ ╚═╝ ╚═╝ ╚═══╝ ╚═════╝',\n];\n\n// Gradient colors: Blue -> Cyan -> Green\nconst GRADIENT_COLORS = [\n '\\x1b[38;5;39m', // Bright blue\n '\\x1b[38;5;38m', // Blue-cyan\n '\\x1b[38;5;37m', // Cyan\n '\\x1b[38;5;36m', // Cyan-green\n '\\x1b[38;5;35m', // Green-cyan\n '\\x1b[38;5;34m', // Green\n];\n\n// Alternative compact logo for smaller terminals\nconst COMPACT_LOGO_LINES = [\n '╔═╗┬ ┬┌┐┌┌─┐┌─┐╔═╗┬ ┬┌┐┌┌─┐',\n '╚═╗└┬┘│││├─┤├─┘╚═╗└┬┘││││ ',\n '╚═╝ ┴ ┘└┘┴ ┴┴ ╚═╝ ┴ ┘└┘└─┘',\n];\n\nconst COMPACT_COLORS = ['\\x1b[38;5;39m', '\\x1b[38;5;37m', '\\x1b[38;5;34m'];\n\nconst RESET = '\\x1b[0m';\n\n/**\n * Get terminal width, defaulting to 80 if unavailable\n */\nfunction getTerminalWidth(): number {\n return process.stdout.columns ?? 80;\n}\n\n/**\n * Show the full ASCII logo with gradient\n */\nexport function showLogo(): void {\n const termWidth = getTerminalWidth();\n const useCompact = termWidth < 85;\n\n logger.line();\n\n if (useCompact) {\n COMPACT_LOGO_LINES.forEach((line, index) => {\n const color = COMPACT_COLORS[index % COMPACT_COLORS.length] ?? '';\n logger.gradient(line, color);\n });\n } else {\n LOGO_LINES.forEach((line, index) => {\n const color = GRADIENT_COLORS[index % GRADIENT_COLORS.length] ?? '';\n logger.gradient(line, color);\n });\n }\n}\n\n/**\n * Get logo as string array (for custom rendering)\n */\nexport function getLogoLines(): string[] {\n const termWidth = getTerminalWidth();\n const useCompact = termWidth < 85;\n const lines = useCompact ? COMPACT_LOGO_LINES : LOGO_LINES;\n const colors = useCompact ? COMPACT_COLORS : GRADIENT_COLORS;\n\n return lines.map((line, index) => {\n const color = colors[index % colors.length];\n return `${color}${line}${RESET}`;\n });\n}\n","/**\n * Logger utility for consistent CLI output\n * Centralizes all console output with styling via picocolors\n */\n\nimport pc from 'picocolors';\nimport ora, { type Ora } from 'ora';\n\nexport interface Logger {\n // Basic output\n log(message?: string): void;\n line(): void;\n clear(): void;\n\n // Status messages with icons\n info(message: string): void;\n success(message: string): void;\n warning(message: string): void;\n error(message: string): void;\n debug(message: string): void;\n\n // Formatted output\n bold(message: string): void;\n dim(message: string): void;\n section(title: string): void;\n header(title: string): void;\n list(items: string[]): void;\n\n // Utility output\n label(key: string, value: string): void;\n hint(message: string): void;\n command(cmd: string, description: string): void;\n gradient(line: string, color: string): void;\n\n // Spinner\n spinner(text: string): Ora;\n}\n\nexport const logger: Logger = {\n /**\n * Log raw message\n */\n log(message = ''): void {\n console.log(message);\n },\n\n /**\n * Print empty line\n */\n line(): void {\n console.log();\n },\n\n /**\n * Clear console\n */\n clear(): void {\n console.clear();\n },\n\n /**\n * Info message with icon\n */\n info(message: string): void {\n console.log(`${pc.blue('ℹ')} ${message}`);\n },\n\n /**\n * Success message with icon\n */\n success(message: string): void {\n console.log(`${pc.green('✓')} ${message}`);\n },\n\n /**\n * Warning message with icon\n */\n warning(message: string): void {\n console.log(`${pc.yellow('⚠')} ${message}`);\n },\n\n /**\n * Error message with icon\n */\n error(message: string): void {\n console.error(`${pc.red('✖')} ${message}`);\n },\n\n /**\n * Debug message (only if DEBUG env is set)\n */\n debug(message: string): void {\n if (process.env['DEBUG']) {\n console.log(`${pc.dim('⋯')} ${pc.dim(message)}`);\n }\n },\n\n /**\n * Bold text\n */\n bold(message: string): void {\n console.log(pc.bold(message));\n },\n\n /**\n * Dim text\n */\n dim(message: string): void {\n console.log(pc.dim(message));\n },\n\n /**\n * Section title (bold cyan)\n */\n section(title: string): void {\n console.log();\n console.log(pc.bold(pc.cyan(title)));\n },\n\n /**\n * Header with underline\n */\n header(title: string): void {\n console.log();\n console.log(pc.bold(pc.cyan(` ${title}`)));\n console.log(pc.dim(' ' + '─'.repeat(title.length + 2)));\n console.log();\n },\n\n /**\n * Bullet list\n */\n list(items: string[]): void {\n items.forEach((item) => console.log(`${pc.dim(' •')} ${item}`));\n },\n\n /**\n * Label: value format (for version info, etc.)\n */\n label(key: string, value: string): void {\n console.log(`${pc.dim(`${key}:`)}${' '.repeat(Math.max(1, 10 - key.length))}${value}`);\n },\n\n /**\n * Hint text (dim)\n */\n hint(message: string): void {\n console.log(pc.dim(message));\n },\n\n /**\n * Command display with description\n */\n command(cmd: string, description: string): void {\n console.log(` ${pc.dim('$')} ${pc.white(cmd)} ${pc.dim(description)}`);\n },\n\n /**\n * Gradient line (for logo)\n */\n gradient(line: string, color: string): void {\n const RESET = '\\x1b[0m';\n console.log(`${color}${line}${RESET}`);\n },\n\n /**\n * Create and start a spinner\n */\n spinner(text: string): Ora {\n return ora(text).start();\n },\n};\n\nexport default logger;\n","/**\n * Info command - Documentation and help about SynapSync concepts\n */\n\nimport type { Command } from 'commander';\nimport pc from 'picocolors';\nimport { logger } from '../utils/logger.js';\n\n// ============================================\n// Info Topics\n// ============================================\n\ninterface InfoTopic {\n name: string;\n description: string;\n content: () => void;\n}\n\nconst INFO_TOPICS: Record<string, InfoTopic> = {\n cognitives: {\n name: 'Cognitives',\n description: 'Types of AI cognitives managed by SynapSync',\n content: showCognitivesInfo,\n },\n install: {\n name: 'Install',\n description: 'How to install cognitives from different sources',\n content: showInstallInfo,\n },\n providers: {\n name: 'Providers',\n description: 'Supported AI providers',\n content: showProvidersInfo,\n },\n categories: {\n name: 'Categories',\n description: 'Cognitive organization categories',\n content: showCategoriesInfo,\n },\n sync: {\n name: 'Sync',\n description: 'How synchronization works',\n content: showSyncInfo,\n },\n structure: {\n name: 'Structure',\n description: 'Project directory structure',\n content: showStructureInfo,\n },\n};\n\n// ============================================\n// Topic Content Functions\n// ============================================\n\nfunction showCognitivesInfo(): void {\n logger.line();\n logger.log(pc.bold(pc.cyan(' Cognitive Types')));\n logger.line();\n logger.dim(\n ' SynapSync manages multiple types of AI cognitives that can be installed,'\n );\n logger.dim(' synced across providers, and shared via the registry.');\n logger.line();\n\n // Cognitives table\n const cognitives = [\n {\n type: 'skill',\n file: 'SKILL.md',\n description: 'Reusable instruction sets for AI assistants',\n color: pc.blue,\n },\n {\n type: 'agent',\n file: 'AGENT.md',\n description: 'Autonomous AI entities with specific behaviors',\n color: pc.yellow,\n },\n {\n type: 'prompt',\n file: 'PROMPT.md',\n description: 'Reusable prompt templates with variables',\n color: pc.magenta,\n },\n {\n type: 'workflow',\n file: 'WORKFLOW.yaml',\n description: 'Multi-step processes combining agents and prompts',\n color: pc.green,\n },\n {\n type: 'tool',\n file: 'TOOL.md',\n description: 'External integrations and functions',\n color: pc.cyan,\n },\n ];\n\n // Header\n logger.log(\n ` ${pc.dim('Type')} ${pc.dim('File')} ${pc.dim('Description')}`\n );\n logger.log(pc.dim(' ' + '─'.repeat(70)));\n\n // Rows\n for (const cognitive of cognitives) {\n const typeCol = cognitive.color(cognitive.type.padEnd(10));\n const fileCol = pc.white(cognitive.file.padEnd(16));\n const descCol = pc.dim(cognitive.description);\n logger.log(` ${typeCol} ${fileCol} ${descCol}`);\n }\n\n logger.line();\n\n // Usage examples\n logger.log(pc.bold(' Usage Examples:'));\n logger.line();\n logger.log(` ${pc.dim('$')} ${pc.cyan('synapsync install')} code-reviewer ${pc.dim('# Install a skill')}`);\n logger.log(` ${pc.dim('$')} ${pc.cyan('synapsync install')} ci-agent ${pc.dim('# Install an agent')}`);\n logger.log(` ${pc.dim('$')} ${pc.cyan('synapsync list')} --type agent ${pc.dim('# List only agents')}`);\n logger.log(` ${pc.dim('$')} ${pc.cyan('synapsync sync')} --type skill ${pc.dim('# Sync only skills')}`);\n logger.line();\n\n // Storage hint\n logger.log(pc.bold(' Storage:'));\n logger.line();\n logger.dim(' Cognitives are stored in .synapsync/{type}s/{category}/{name}/');\n logger.dim(' Example: .synapsync/skills/frontend/react-patterns/SKILL.md');\n logger.line();\n\n // Detection\n logger.log(pc.bold(' Type Detection:'));\n logger.line();\n logger.dim(' When installing, SynapSync detects the cognitive type automatically:');\n logger.line();\n logger.log(` ${pc.cyan('1.')} ${pc.white('Flag')} ${pc.dim('--type skill (explicit, highest priority)')}`);\n logger.log(` ${pc.cyan('2.')} ${pc.white('Registry')} ${pc.dim('Metadata from the registry')}`);\n logger.log(` ${pc.cyan('3.')} ${pc.white('File')} ${pc.dim('Detects SKILL.md, AGENT.md, etc.')}`);\n logger.log(` ${pc.cyan('4.')} ${pc.white('Prompt')} ${pc.dim('Asks you if cannot detect')}`);\n logger.line();\n}\n\nfunction showInstallInfo(): void {\n logger.line();\n logger.log(pc.bold(pc.cyan(' Installation Sources')));\n logger.line();\n logger.dim(' SynapSync can install cognitives from multiple sources:');\n logger.line();\n\n // Sources table\n logger.log(pc.bold(' Supported Sources:'));\n logger.line();\n\n const sources = [\n {\n source: 'Registry',\n format: 'synapsync install code-reviewer',\n description: 'From the SynapSync registry',\n },\n {\n source: 'Local',\n format: 'synapsync install ./path/to/cognitive',\n description: 'From local file system',\n },\n {\n source: 'GitHub',\n format: 'synapsync install github:user/repo',\n description: 'From a GitHub repository',\n },\n {\n source: 'GitHub Path',\n format: 'synapsync install github:user/repo/cognitives/skill',\n description: 'Specific path in repo',\n },\n {\n source: 'GitHub Branch',\n format: 'synapsync install github:user/repo#develop',\n description: 'Specific branch or tag',\n },\n {\n source: 'GitHub URL',\n format: 'synapsync install https://github.com/user/repo',\n description: 'Full GitHub URL',\n },\n ];\n\n for (const src of sources) {\n logger.log(` ${pc.green(src.source.padEnd(14))} ${pc.dim(src.description)}`);\n logger.log(` ${' '.repeat(14)} ${pc.cyan(src.format)}`);\n logger.line();\n }\n\n // Type detection\n logger.log(pc.bold(' Type Detection:'));\n logger.line();\n logger.dim(' SynapSync automatically detects the cognitive type using:');\n logger.line();\n\n logger.log(` ${pc.cyan('1.')} ${pc.white('Explicit flag')} ${pc.dim('synapsync install code-reviewer --type skill')}`);\n logger.log(` ${pc.cyan('2.')} ${pc.white('Registry lookup')} ${pc.dim('Registry provides type metadata')}`);\n logger.log(` ${pc.cyan('3.')} ${pc.white('File detection')} ${pc.dim('Scans for SKILL.md, AGENT.md, etc.')}`);\n logger.log(` ${pc.cyan('4.')} ${pc.white('Interactive')} ${pc.dim('Prompts you to select if unknown')}`);\n logger.line();\n\n // Version\n logger.log(pc.bold(' Version Specification:'));\n logger.line();\n logger.log(` ${pc.dim('$')} ${pc.cyan('synapsync install')} code-reviewer ${pc.dim('# Latest version')}`);\n logger.log(` ${pc.dim('$')} ${pc.cyan('synapsync install')} code-reviewer@1.2.0 ${pc.dim('# Specific version')}`);\n logger.log(` ${pc.dim('$')} ${pc.cyan('synapsync install')} code-reviewer@^1.0.0 ${pc.dim('# Version range')}`);\n logger.line();\n\n // Options\n logger.log(pc.bold(' Common Options:'));\n logger.line();\n logger.log(` ${pc.yellow('--type <type>')} ${pc.dim('Explicit cognitive type (skill, agent, prompt, workflow, tool)')}`);\n logger.log(` ${pc.yellow('--category <cat>')} ${pc.dim('Explicit category (frontend, backend, etc.)')}`);\n logger.log(` ${pc.yellow('--global')} ${pc.dim('Install globally for all projects')}`);\n logger.log(` ${pc.yellow('--force')} ${pc.dim('Force reinstall even if exists')}`);\n logger.line();\n}\n\nfunction showProvidersInfo(): void {\n logger.line();\n logger.log(pc.bold(pc.cyan(' Supported Providers')));\n logger.line();\n logger.dim(' SynapSync can sync your cognitives to multiple AI providers.');\n logger.dim(' Each provider has its own directory structure for cognitives.');\n logger.line();\n\n const providers = [\n { name: 'claude', vendor: 'Anthropic', path: '.claude/', color: pc.yellow },\n { name: 'openai', vendor: 'OpenAI', path: '.openai/', color: pc.green },\n { name: 'gemini', vendor: 'Google', path: '.gemini/', color: pc.blue },\n { name: 'cursor', vendor: 'Cursor IDE', path: '.cursor/', color: pc.magenta },\n { name: 'windsurf', vendor: 'Codeium', path: '.windsurf/', color: pc.cyan },\n { name: 'copilot', vendor: 'GitHub', path: '.github/', color: pc.white },\n ];\n\n // Header\n logger.log(` ${pc.dim('Provider')} ${pc.dim('Vendor')} ${pc.dim('Path')}`);\n logger.log(pc.dim(' ' + '─'.repeat(45)));\n\n // Rows\n for (const provider of providers) {\n const nameCol = provider.color(provider.name.padEnd(11));\n const vendorCol = pc.white(provider.vendor.padEnd(12));\n const pathCol = pc.dim(provider.path);\n logger.log(` ${nameCol} ${vendorCol} ${pathCol}`);\n }\n\n logger.line();\n\n // Usage\n logger.log(pc.bold(' Usage:'));\n logger.line();\n logger.log(` ${pc.dim('$')} ${pc.cyan('synapsync connect')} claude ${pc.dim('# Connect to Claude')}`);\n logger.log(` ${pc.dim('$')} ${pc.cyan('synapsync providers')} ${pc.dim('# List connected providers')}`);\n logger.log(` ${pc.dim('$')} ${pc.cyan('synapsync sync')} --provider claude ${pc.dim('# Sync to specific provider')}`);\n logger.line();\n}\n\nfunction showCategoriesInfo(): void {\n logger.line();\n logger.log(pc.bold(pc.cyan(' Cognitive Categories')));\n logger.line();\n logger.dim(' Cognitives are organized by category for better management.');\n logger.dim(' Categories help group related cognitives together.');\n logger.line();\n\n const categories = [\n { name: 'frontend', description: 'UI, components, styling, React, Vue, etc.', color: pc.yellow },\n { name: 'backend', description: 'APIs, servers, authentication, databases', color: pc.blue },\n { name: 'database', description: 'Queries, schemas, migrations, optimization', color: pc.yellow },\n { name: 'devops', description: 'CI/CD, Docker, Kubernetes, infrastructure', color: pc.magenta },\n { name: 'security', description: 'Audits, vulnerabilities, authentication', color: pc.red },\n { name: 'testing', description: 'Unit tests, E2E, test generation', color: pc.green },\n { name: 'analytics', description: 'Metrics, tracking, data analysis', color: pc.cyan },\n { name: 'automation', description: 'Scripts, workflows, task automation', color: pc.green },\n { name: 'general', description: 'General purpose, code review, docs', color: pc.white },\n ];\n\n // Header\n logger.log(` ${pc.dim('Category')} ${pc.dim('Description')}`);\n logger.log(pc.dim(' ' + '─'.repeat(55)));\n\n // Rows\n for (const cat of categories) {\n const nameCol = cat.color(cat.name.padEnd(13));\n const descCol = pc.dim(cat.description);\n logger.log(` ${nameCol} ${descCol}`);\n }\n\n logger.line();\n\n // Usage\n logger.log(pc.bold(' Usage:'));\n logger.line();\n logger.log(` ${pc.dim('$')} ${pc.cyan('synapsync install')} react-patterns ${pc.dim('--category frontend')}`);\n logger.log(` ${pc.dim('$')} ${pc.cyan('synapsync list')} --category devops`);\n logger.log(` ${pc.dim('$')} ${pc.cyan('synapsync search')} --category security`);\n logger.line();\n}\n\nfunction showSyncInfo(): void {\n logger.line();\n logger.log(pc.bold(pc.cyan(' Synchronization')));\n logger.line();\n logger.dim(' Sync copies or links your cognitives to provider directories.');\n logger.dim(' This makes them available to each AI provider.');\n logger.line();\n\n logger.log(pc.bold(' Sync Methods:'));\n logger.line();\n logger.log(` ${pc.green('symlink')} ${pc.dim('(recommended)')}`);\n logger.dim(' Creates symbolic links to the central storage.');\n logger.dim(' Changes reflect immediately in all providers.');\n logger.dim(' Single source of truth, less disk space.');\n logger.line();\n logger.log(` ${pc.yellow('copy')}`);\n logger.dim(' Creates independent copies in each provider folder.');\n logger.dim(' Works on systems without symlink support.');\n logger.dim(' Requires re-sync after changes.');\n logger.line();\n\n logger.log(pc.bold(' How it works:'));\n logger.line();\n logger.log(pc.dim(' Central storage:'));\n logger.log(` ${pc.cyan('.synapsync/skills/frontend/react-patterns/SKILL.md')}`);\n logger.line();\n logger.log(pc.dim(' After sync (symlink):'));\n logger.log(` ${pc.green('.claude/skills/react-patterns/')} -> ${pc.dim('../../.synapsync/skills/frontend/react-patterns/')}`);\n logger.log(` ${pc.green('.openai/skills/react-patterns/')} -> ${pc.dim('../../.synapsync/skills/frontend/react-patterns/')}`);\n logger.line();\n\n logger.log(pc.bold(' Commands:'));\n logger.line();\n logger.log(` ${pc.dim('$')} ${pc.cyan('synapsync sync')} ${pc.dim('# Sync all cognitives to all providers')}`);\n logger.log(` ${pc.dim('$')} ${pc.cyan('synapsync sync')} --provider claude ${pc.dim('# Sync to specific provider')}`);\n logger.log(` ${pc.dim('$')} ${pc.cyan('synapsync sync')} --type skill ${pc.dim('# Sync only skills')}`);\n logger.log(` ${pc.dim('$')} ${pc.cyan('synapsync sync')} --copy ${pc.dim('# Force copy mode')}`);\n logger.log(` ${pc.dim('$')} ${pc.cyan('synapsync sync')} --dry-run ${pc.dim('# Preview without changes')}`);\n logger.line();\n}\n\nfunction showStructureInfo(): void {\n logger.line();\n logger.log(pc.bold(pc.cyan(' Project Structure')));\n logger.line();\n logger.dim(' After running `synapsync init`, your project will have:');\n logger.line();\n\n const structure = `\n ${pc.cyan('.synapsync/')} ${pc.dim('# Central cognitive storage')}\n ${pc.dim('├──')} ${pc.white('manifest.json')} ${pc.dim('# Installed cognitives manifest')}\n ${pc.dim('├──')} ${pc.cyan('skills/')} ${pc.dim('# Skills by category')}\n ${pc.dim('│ ├──')} ${pc.cyan('frontend/')}\n ${pc.dim('│ ├──')} ${pc.cyan('backend/')}\n ${pc.dim('│ └──')} ${pc.cyan('general/')}\n ${pc.dim('├──')} ${pc.cyan('agents/')} ${pc.dim('# Agents by category')}\n ${pc.dim('├──')} ${pc.cyan('prompts/')} ${pc.dim('# Prompts by category')}\n ${pc.dim('├──')} ${pc.cyan('workflows/')} ${pc.dim('# Workflows by category')}\n ${pc.dim('└──')} ${pc.cyan('tools/')} ${pc.dim('# Tools by category')}\n\n ${pc.green('synapsync.config.yaml')} ${pc.dim('# Project configuration')}\n\n ${pc.yellow('.claude/')} ${pc.dim('# Claude provider (after sync)')}\n ${pc.dim('├──')} ${pc.white('skills/')} ${pc.dim('# Symlinks to .synapsync/skills/*')}\n ${pc.dim('├──')} ${pc.white('agents/')} ${pc.dim('# Symlinks to .synapsync/agents/*')}\n ${pc.dim('└──')} ${pc.white('prompts/')} ${pc.dim('# Symlinks to .synapsync/prompts/*')}\n`;\n\n logger.log(structure);\n logger.line();\n}\n\n// ============================================\n// Show all topics (default)\n// ============================================\n\nfunction showAllTopics(): void {\n logger.line();\n logger.log(pc.bold(pc.cyan(' SynapSync Info')));\n logger.line();\n logger.dim(' Use /info with a topic flag to learn more:');\n logger.line();\n\n const topics = [\n { flag: '--cognitives', desc: 'Types of AI cognitives (skills, agents, prompts, etc.)' },\n { flag: '--install', desc: 'How to install from registry, GitHub, local' },\n { flag: '--providers', desc: 'Supported AI providers (Claude, OpenAI, etc.)' },\n { flag: '--categories', desc: 'Cognitive organization categories' },\n { flag: '--sync', desc: 'How synchronization works' },\n { flag: '--structure', desc: 'Project directory structure' },\n ];\n\n for (const topic of topics) {\n logger.log(` ${pc.cyan('/info ' + topic.flag.padEnd(14))} ${pc.dim(topic.desc)}`);\n }\n\n logger.line();\n logger.dim(' Example: /info --cognitives');\n logger.line();\n}\n\n// ============================================\n// Parse flags from args string\n// ============================================\n\nfunction parseInfoArgs(argsString: string): string | null {\n const args = argsString.trim().toLowerCase();\n\n if (!args) {\n return null;\n }\n\n // Check for --flag format\n const flagMatch = args.match(/^--(\\w+)/);\n if (flagMatch?.[1]) {\n return flagMatch[1];\n }\n\n // Check for direct topic name\n if (INFO_TOPICS[args]) {\n return args;\n }\n\n return null;\n}\n\n// ============================================\n// Execute info command (for REPL)\n// ============================================\n\nexport function executeInfoCommand(args: string): void {\n const topic = parseInfoArgs(args);\n\n if (!topic) {\n showAllTopics();\n return;\n }\n\n const topicInfo = INFO_TOPICS[topic];\n if (topicInfo) {\n topicInfo.content();\n } else {\n logger.error(`Unknown topic: ${topic}`);\n logger.line();\n showAllTopics();\n }\n}\n\n// ============================================\n// Register CLI command\n// ============================================\n\nexport function registerInfoCommand(program: Command): void {\n program\n .command('info')\n .description('Show information about SynapSync concepts')\n .option('--cognitives', 'Show cognitive types information')\n .option('--install', 'Show installation sources and detection')\n .option('--providers', 'Show supported providers')\n .option('--categories', 'Show cognitive categories')\n .option('--sync', 'Show sync information')\n .option('--structure', 'Show project structure')\n .action((options: Record<string, boolean>) => {\n // Find which flag was passed\n const topic = Object.keys(options).find((key) => options[key] === true);\n\n if (topic && INFO_TOPICS[topic]) {\n INFO_TOPICS[topic].content();\n } else {\n showAllTopics();\n }\n });\n}\n","/**\n * Init Command\n *\n * Initialize a new SynapSync project in the current directory\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as p from '@clack/prompts';\nimport pc from 'picocolors';\nimport type { Command } from 'commander';\nimport { ConfigManager } from '../services/config/manager.js';\nimport {\n COGNITIVE_TYPES,\n SUPPORTED_PROVIDERS,\n DEFAULT_SYNAPSYNC_DIR,\n CONFIG_FILE_NAME,\n} from '../core/constants.js';\nimport type { SupportedProvider } from '../core/constants.js';\nimport { logger } from '../utils/logger.js';\n\n// ============================================\n// Types\n// ============================================\n\ninterface InitOptions {\n name?: string;\n description?: string;\n providers?: SupportedProvider[];\n yes?: boolean; // Skip prompts, use defaults\n}\n\ninterface InitResult {\n success: boolean;\n projectPath: string;\n configPath: string;\n storagePath: string;\n}\n\n// ============================================\n// Main Function\n// ============================================\n\n/**\n * Execute the init command\n */\nexport async function executeInitCommand(options: InitOptions = {}): Promise<InitResult | null> {\n const projectRoot = process.cwd();\n const configPath = path.join(projectRoot, CONFIG_FILE_NAME);\n const storagePath = path.join(projectRoot, DEFAULT_SYNAPSYNC_DIR);\n\n // Check if already initialized\n if (ConfigManager.isProjectInitialized(projectRoot)) {\n logger.line();\n logger.warning('Project already initialized.');\n logger.log(` ${pc.dim('Config:')} ${configPath}`);\n logger.log(` ${pc.dim('Storage:')} ${storagePath}`);\n logger.line();\n logger.hint('Use /config to view or modify settings.');\n return null;\n }\n\n // Non-interactive mode\n if (options.yes === true) {\n return initializeProject({\n name: options.name ?? path.basename(projectRoot),\n ...(options.description !== undefined && { description: options.description }),\n providers: options.providers ?? ['claude'],\n });\n }\n\n // Interactive mode\n logger.line();\n p.intro(pc.bgCyan(pc.black(' Initialize SynapSync Project ')));\n\n const result = await p.group(\n {\n name: () => {\n const defaultName = path.basename(projectRoot);\n return p.text({\n message: 'Project name',\n placeholder: defaultName,\n defaultValue: defaultName,\n validate: (value) => {\n // Use defaultValue if empty (user pressed Enter)\n const finalValue = value.trim() === '' ? defaultName : value;\n if (!/^[a-z0-9-_]+$/i.test(finalValue)) {\n return 'Project name can only contain letters, numbers, hyphens, and underscores';\n }\n return undefined;\n },\n });\n },\n description: () =>\n p.text({\n message: 'Description (optional)',\n placeholder: 'A brief description of your project',\n }),\n providers: () =>\n p.multiselect({\n message: 'Select AI providers to enable',\n options: SUPPORTED_PROVIDERS.map((provider) => ({\n value: provider,\n label: getProviderLabel(provider),\n hint: getProviderHint(provider),\n })),\n initialValues: ['claude'],\n required: false,\n }),\n },\n {\n onCancel: () => {\n p.cancel('Project initialization cancelled.');\n return process.exit(0);\n },\n }\n );\n\n // Type guard for cancelled state\n if (p.isCancel(result)) {\n return null;\n }\n\n return initializeProject({\n name: result.name,\n description: result.description,\n providers: result.providers as SupportedProvider[],\n });\n}\n\n// ============================================\n// Project Initialization\n// ============================================\n\ninterface ProjectSetup {\n name: string;\n description?: string;\n providers: SupportedProvider[];\n}\n\nfunction initializeProject(setup: ProjectSetup): InitResult {\n const projectRoot = process.cwd();\n const configPath = path.join(projectRoot, CONFIG_FILE_NAME);\n const storagePath = path.join(projectRoot, DEFAULT_SYNAPSYNC_DIR);\n\n const s = p.spinner();\n s.start('Creating project structure...');\n\n try {\n // 1. Create storage directory with cognitive type subdirectories\n createStorageStructure(storagePath);\n\n // 2. Create and save configuration\n const configManager = new ConfigManager(projectRoot);\n configManager.create(setup.name, setup.description);\n\n // Enable selected providers\n for (const provider of setup.providers) {\n configManager.set(`sync.providers.${provider}.enabled`, true);\n }\n\n configManager.save();\n\n // 3. Create empty manifest\n createManifest(storagePath);\n\n // 4. Update .gitignore if exists\n updateGitignore(projectRoot);\n\n s.stop('Project structure created!');\n\n // Show success message\n showSuccessMessage(setup, configPath, storagePath);\n\n return {\n success: true,\n projectPath: projectRoot,\n configPath,\n storagePath,\n };\n } catch (error) {\n s.stop('Failed to create project.');\n logger.line();\n if (error instanceof Error) {\n logger.error(error.message);\n }\n throw error;\n }\n}\n\n/**\n * Create the .synapsync directory structure\n */\nfunction createStorageStructure(storagePath: string): void {\n // Create main directory\n fs.mkdirSync(storagePath, { recursive: true });\n\n // Create subdirectory for each cognitive type\n for (const cognitiveType of COGNITIVE_TYPES) {\n const typePath = path.join(storagePath, `${cognitiveType}s`);\n fs.mkdirSync(typePath, { recursive: true });\n\n // Create a .gitkeep to preserve empty directories\n const gitkeepPath = path.join(typePath, '.gitkeep');\n fs.writeFileSync(gitkeepPath, '');\n }\n}\n\n/**\n * Create empty manifest.json\n */\nfunction createManifest(storagePath: string): void {\n const manifestPath = path.join(storagePath, 'manifest.json');\n const manifest = {\n version: '1.0.0',\n lastUpdated: new Date().toISOString(),\n cognitives: {},\n syncs: {},\n };\n\n fs.writeFileSync(manifestPath, JSON.stringify(manifest, null, 2));\n}\n\n/**\n * Update .gitignore to include SynapSync entries\n */\nfunction updateGitignore(projectRoot: string): void {\n const gitignorePath = path.join(projectRoot, '.gitignore');\n const synapsyncEntries = `\n# SynapSync\n.synapsync/manifest.json\n*.local.yaml\n`;\n\n if (fs.existsSync(gitignorePath)) {\n const content = fs.readFileSync(gitignorePath, 'utf-8');\n\n // Check if already has SynapSync entries\n if (!content.includes('# SynapSync')) {\n fs.appendFileSync(gitignorePath, synapsyncEntries);\n }\n } else {\n // Create new .gitignore\n fs.writeFileSync(gitignorePath, synapsyncEntries.trim() + '\\n');\n }\n}\n\n// ============================================\n// UI Helpers\n// ============================================\n\nfunction getProviderLabel(provider: SupportedProvider): string {\n const labels: Record<SupportedProvider, string> = {\n claude: 'Claude (Anthropic)',\n openai: 'OpenAI (GPT)',\n gemini: 'Gemini (Google)',\n cursor: 'Cursor IDE',\n windsurf: 'Windsurf IDE',\n copilot: 'GitHub Copilot',\n };\n return labels[provider];\n}\n\nfunction getProviderHint(provider: SupportedProvider): string {\n const hints: Record<SupportedProvider, string> = {\n claude: 'Claude Code, Claude Desktop',\n openai: 'ChatGPT, API',\n gemini: 'Google AI Studio',\n cursor: 'AI-first code editor',\n windsurf: 'AI-powered IDE',\n copilot: 'VS Code integration',\n };\n return hints[provider];\n}\n\nfunction showSuccessMessage(\n setup: ProjectSetup,\n configPath: string,\n storagePath: string\n): void {\n logger.line();\n p.note(\n [\n `${pc.dim('Config:')} ${pc.cyan(configPath)}`,\n `${pc.dim('Storage:')} ${pc.cyan(storagePath)}`,\n '',\n `${pc.dim('Providers:')} ${setup.providers.map((p) => pc.green(p)).join(', ') || pc.dim('none')}`,\n ].join('\\n'),\n `Project \"${setup.name}\" initialized!`\n );\n\n logger.line();\n logger.bold(' Next Steps:');\n logger.line();\n logger.log(` ${pc.cyan('1.')} Connect to providers:`);\n logger.log(` ${pc.dim('$')} synapsync connect claude`);\n logger.line();\n logger.log(` ${pc.cyan('2.')} Install cognitives:`);\n logger.log(` ${pc.dim('$')} synapsync install code-reviewer`);\n logger.log(` ${pc.dim('$')} synapsync install github:user/my-skill`);\n logger.line();\n logger.log(` ${pc.cyan('3.')} Sync to providers:`);\n logger.log(` ${pc.dim('$')} synapsync sync`);\n logger.line();\n\n p.outro(pc.green('Happy syncing!'));\n}\n\n// ============================================\n// Command Registration\n// ============================================\n\n/**\n * Register init command with Commander\n */\nexport function registerInitCommand(program: Command): void {\n program\n .command('init')\n .description('Initialize a new SynapSync project')\n .option('-n, --name <name>', 'Project name')\n .option('-d, --description <desc>', 'Project description')\n .option('-p, --provider <providers...>', 'Enable providers (claude, openai, etc.)')\n .option('-y, --yes', 'Skip prompts and use defaults')\n .action(async (options: { name?: string; description?: string; provider?: string[]; yes?: boolean }) => {\n await executeInitCommand({\n ...(options.name !== undefined && { name: options.name }),\n ...(options.description !== undefined && { description: options.description }),\n ...(options.provider !== undefined && { providers: options.provider as SupportedProvider[] }),\n ...(options.yes !== undefined && { yes: options.yes }),\n });\n });\n}\n","/**\n * Configuration Manager\n *\n * Handles reading, writing, and manipulating synapsync.config.yaml\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as yaml from 'yaml';\nimport { CONFIG_FILE_NAME, DEFAULT_SYNAPSYNC_DIR } from '../../core/constants.js';\nimport {\n type ProjectConfig,\n createDefaultConfig,\n validateConfig,\n getNestedValue,\n setNestedValue,\n type ValidationError,\n} from './schema.js';\n\n// ============================================\n// ConfigManager Class\n// ============================================\n\nexport class ConfigManager {\n private config: ProjectConfig | null = null;\n private configPath: string;\n private projectRoot: string;\n\n constructor(projectRoot?: string) {\n this.projectRoot = projectRoot ?? process.cwd();\n this.configPath = path.join(this.projectRoot, CONFIG_FILE_NAME);\n }\n\n // ============================================\n // Static Factory Methods\n // ============================================\n\n /**\n * Find and load config from current directory or parents\n */\n static findConfig(startDir?: string): ConfigManager | null {\n let dir = startDir ?? process.cwd();\n\n while (dir !== path.dirname(dir)) {\n const configPath = path.join(dir, CONFIG_FILE_NAME);\n if (fs.existsSync(configPath)) {\n const manager = new ConfigManager(dir);\n manager.load();\n return manager;\n }\n dir = path.dirname(dir);\n }\n\n return null;\n }\n\n /**\n * Check if a project is initialized in the given directory\n */\n static isProjectInitialized(dir?: string): boolean {\n const projectRoot = dir ?? process.cwd();\n const configPath = path.join(projectRoot, CONFIG_FILE_NAME);\n const synapSyncDir = path.join(projectRoot, DEFAULT_SYNAPSYNC_DIR);\n\n return fs.existsSync(configPath) && fs.existsSync(synapSyncDir);\n }\n\n // ============================================\n // Core Methods\n // ============================================\n\n /**\n * Check if config file exists\n */\n exists(): boolean {\n return fs.existsSync(this.configPath);\n }\n\n /**\n * Load configuration from file\n */\n load(): ProjectConfig {\n if (!this.exists()) {\n throw new Error(`Configuration file not found: ${this.configPath}`);\n }\n\n const content = fs.readFileSync(this.configPath, 'utf-8');\n const parsed = yaml.parse(content) as unknown;\n\n // Validate\n const errors = validateConfig(parsed);\n if (errors.length > 0) {\n throw new ConfigValidationError(errors);\n }\n\n this.config = parsed as ProjectConfig;\n return this.config;\n }\n\n /**\n * Save configuration to file\n */\n save(): void {\n if (this.config === null) {\n throw new Error('No configuration to save. Call load() or create() first.');\n }\n\n const content = yaml.stringify(this.config, {\n indent: 2,\n lineWidth: 100,\n });\n\n fs.writeFileSync(this.configPath, content, 'utf-8');\n }\n\n /**\n * Create a new configuration\n */\n create(name: string, description?: string): ProjectConfig {\n this.config = createDefaultConfig(name, description);\n return this.config;\n }\n\n /**\n * Get the current configuration\n */\n getConfig(): ProjectConfig {\n if (this.config === null) {\n throw new Error('No configuration loaded. Call load() or create() first.');\n }\n return this.config;\n }\n\n /**\n * Get project root directory\n */\n getProjectRoot(): string {\n return this.projectRoot;\n }\n\n /**\n * Get synapsync directory path\n */\n getSynapSyncDir(): string {\n const dir = this.config?.storage?.dir ?? DEFAULT_SYNAPSYNC_DIR;\n return path.isAbsolute(dir) ? dir : path.join(this.projectRoot, dir);\n }\n\n // ============================================\n // Value Access Methods\n // ============================================\n\n /**\n * Get a configuration value by dot-notation path\n * Example: get('cli.theme') -> 'auto'\n */\n get(keyPath: string): unknown {\n if (this.config === null) {\n throw new Error('No configuration loaded. Call load() or create() first.');\n }\n return getNestedValue(this.config as unknown as Record<string, unknown>, keyPath);\n }\n\n /**\n * Set a configuration value by dot-notation path\n * Example: set('cli.theme', 'dark')\n */\n set(keyPath: string, value: unknown): void {\n if (this.config === null) {\n throw new Error('No configuration loaded. Call load() or create() first.');\n }\n setNestedValue(this.config as unknown as Record<string, unknown>, keyPath, value);\n }\n\n /**\n * Check if a configuration key exists\n */\n has(keyPath: string): boolean {\n return this.get(keyPath) !== undefined;\n }\n\n /**\n * Get all configuration as a flat object with dot-notation keys\n */\n flatten(): Record<string, unknown> {\n if (this.config === null) {\n throw new Error('No configuration loaded. Call load() or create() first.');\n }\n\n const result: Record<string, unknown> = {};\n\n function flattenObject(obj: Record<string, unknown>, prefix = ''): void {\n for (const [key, value] of Object.entries(obj)) {\n const fullKey = prefix !== '' ? `${prefix}.${key}` : key;\n\n if (value !== null && typeof value === 'object' && !Array.isArray(value)) {\n flattenObject(value as Record<string, unknown>, fullKey);\n } else {\n result[fullKey] = value;\n }\n }\n }\n\n flattenObject(this.config as unknown as Record<string, unknown>);\n return result;\n }\n}\n\n// ============================================\n// Custom Errors\n// ============================================\n\nexport class ConfigValidationError extends Error {\n constructor(public errors: ValidationError[]) {\n const messages = errors.map((e) => ` - ${e.path}: ${e.message}`).join('\\n');\n super(`Configuration validation failed:\\n${messages}`);\n this.name = 'ConfigValidationError';\n }\n}\n\nexport class ConfigNotFoundError extends Error {\n constructor(searchPath: string) {\n super(`No synapsync.config.yaml found in ${searchPath} or parent directories`);\n this.name = 'ConfigNotFoundError';\n }\n}\n","/**\n * Configuration Schema and Defaults\n */\n\nimport type { CognitiveType, SupportedProvider } from '../../core/constants.js';\nimport { SUPPORTED_PROVIDERS, PROVIDER_PATHS, DEFAULT_SYNAPSYNC_DIR } from '../../core/constants.js';\n\n// ============================================\n// Configuration Types\n// ============================================\n\nexport interface CLIConfig {\n theme: 'auto' | 'light' | 'dark';\n color: boolean;\n verbose: boolean;\n}\n\nexport interface StorageConfig {\n dir: string;\n}\n\nexport interface ProviderSyncConfig {\n enabled: boolean;\n paths?: Partial<Record<CognitiveType, string>>;\n}\n\nexport interface SyncConfig {\n method: 'symlink' | 'copy';\n providers: Partial<Record<SupportedProvider, ProviderSyncConfig>>;\n}\n\nexport interface ProjectConfig {\n name: string;\n description?: string;\n version: string;\n cli: CLIConfig;\n storage: StorageConfig;\n sync: SyncConfig;\n}\n\n// ============================================\n// Default Configuration\n// ============================================\n\nexport const DEFAULT_CLI_CONFIG: CLIConfig = {\n theme: 'auto',\n color: true,\n verbose: false,\n};\n\nexport const DEFAULT_STORAGE_CONFIG: StorageConfig = {\n dir: DEFAULT_SYNAPSYNC_DIR,\n};\n\nexport const DEFAULT_SYNC_CONFIG: SyncConfig = {\n method: 'symlink',\n providers: {\n claude: {\n enabled: true,\n paths: PROVIDER_PATHS.claude,\n },\n openai: {\n enabled: false,\n paths: PROVIDER_PATHS.openai,\n },\n cursor: {\n enabled: false,\n paths: PROVIDER_PATHS.cursor,\n },\n },\n};\n\nexport function createDefaultConfig(name: string, description?: string): ProjectConfig {\n const config: ProjectConfig = {\n name,\n version: '1.0.0',\n cli: { ...DEFAULT_CLI_CONFIG },\n storage: { ...DEFAULT_STORAGE_CONFIG },\n sync: {\n method: DEFAULT_SYNC_CONFIG.method,\n providers: JSON.parse(JSON.stringify(DEFAULT_SYNC_CONFIG.providers)) as SyncConfig['providers'],\n },\n };\n if (description !== undefined) {\n config.description = description;\n }\n return config;\n}\n\n// ============================================\n// Validation\n// ============================================\n\nexport interface ValidationError {\n path: string;\n message: string;\n}\n\nexport function validateConfig(config: unknown): ValidationError[] {\n const errors: ValidationError[] = [];\n\n if (typeof config !== 'object' || config === null) {\n errors.push({ path: '', message: 'Configuration must be an object' });\n return errors;\n }\n\n const cfg = config as Record<string, unknown>;\n\n // Required fields\n if (typeof cfg['name'] !== 'string' || cfg['name'].trim() === '') {\n errors.push({ path: 'name', message: 'Project name is required' });\n }\n\n // CLI config validation\n if (cfg['cli'] !== undefined) {\n if (typeof cfg['cli'] !== 'object' || cfg['cli'] === null) {\n errors.push({ path: 'cli', message: 'cli must be an object' });\n } else {\n const cli = cfg['cli'] as Record<string, unknown>;\n if (cli['theme'] !== undefined && !['auto', 'light', 'dark'].includes(cli['theme'] as string)) {\n errors.push({ path: 'cli.theme', message: 'theme must be auto, light, or dark' });\n }\n }\n }\n\n // Sync config validation\n if (cfg['sync'] !== undefined) {\n if (typeof cfg['sync'] !== 'object' || cfg['sync'] === null) {\n errors.push({ path: 'sync', message: 'sync must be an object' });\n } else {\n const sync = cfg['sync'] as Record<string, unknown>;\n if (sync['method'] !== undefined && !['symlink', 'copy'].includes(sync['method'] as string)) {\n errors.push({ path: 'sync.method', message: 'method must be symlink or copy' });\n }\n\n // Validate providers\n if (sync['providers'] !== undefined) {\n if (typeof sync['providers'] !== 'object' || sync['providers'] === null) {\n errors.push({ path: 'sync.providers', message: 'providers must be an object' });\n } else {\n const providers = sync['providers'] as Record<string, unknown>;\n for (const [key, value] of Object.entries(providers)) {\n if (!SUPPORTED_PROVIDERS.includes(key as SupportedProvider)) {\n errors.push({\n path: `sync.providers.${key}`,\n message: `Unknown provider: ${key}. Supported: ${SUPPORTED_PROVIDERS.join(', ')}`,\n });\n }\n if (typeof value !== 'object' || value === null) {\n errors.push({ path: `sync.providers.${key}`, message: 'Provider config must be an object' });\n }\n }\n }\n }\n }\n }\n\n return errors;\n}\n\n// ============================================\n// Path Utilities\n// ============================================\n\n/**\n * Get a nested value from config using dot notation\n * Example: getNestedValue(config, 'cli.theme') -> 'auto'\n */\nexport function getNestedValue(obj: Record<string, unknown>, path: string): unknown {\n const parts = path.split('.');\n let current: unknown = obj;\n\n for (const part of parts) {\n if (current === null || current === undefined) {\n return undefined;\n }\n if (typeof current !== 'object') {\n return undefined;\n }\n current = (current as Record<string, unknown>)[part];\n }\n\n return current;\n}\n\n/**\n * Set a nested value in config using dot notation\n * Example: setNestedValue(config, 'cli.theme', 'dark')\n */\nexport function setNestedValue(obj: Record<string, unknown>, path: string, value: unknown): void {\n const parts = path.split('.');\n let current: Record<string, unknown> = obj;\n\n for (let i = 0; i < parts.length - 1; i++) {\n const part = parts[i];\n if (part === undefined) continue;\n\n if (current[part] === undefined || typeof current[part] !== 'object') {\n current[part] = {};\n }\n current = current[part] as Record<string, unknown>;\n }\n\n const lastPart = parts[parts.length - 1];\n if (lastPart !== undefined) {\n current[lastPart] = value;\n }\n}\n","/**\n * Config Command\n *\n * Manage SynapSync project configuration\n */\n\nimport type { Command } from 'commander';\nimport pc from 'picocolors';\nimport { ConfigManager } from '../services/config/manager.js';\nimport { logger } from '../utils/logger.js';\n\n// ============================================\n// Types\n// ============================================\n\ntype ConfigAction = 'list' | 'get' | 'set';\n\ninterface ConfigOptions {\n action: ConfigAction;\n key?: string;\n value?: string;\n}\n\n// ============================================\n// Main Functions\n// ============================================\n\n/**\n * Execute the config command\n */\nexport function executeConfigCommand(args: string): void {\n const options = parseConfigArgs(args);\n\n // Find config file\n const configManager = ConfigManager.findConfig();\n\n if (configManager === null) {\n logger.line();\n logger.error('No SynapSync project found.');\n logger.hint('Run /init to initialize a project.');\n return;\n }\n\n switch (options.action) {\n case 'list':\n showConfigList(configManager);\n break;\n case 'get':\n showConfigValue(configManager, options.key ?? '');\n break;\n case 'set':\n setConfigValue(configManager, options.key ?? '', options.value ?? '');\n break;\n }\n}\n\n// ============================================\n// Config Actions\n// ============================================\n\n/**\n * Show all configuration values\n */\nfunction showConfigList(configManager: ConfigManager): void {\n const flatConfig = configManager.flatten();\n\n logger.line();\n logger.bold(' Configuration');\n logger.line();\n\n // Group by top-level key\n const groups: Record<string, Record<string, unknown>> = {};\n\n for (const [key, value] of Object.entries(flatConfig)) {\n const parts = key.split('.');\n const group = parts[0] ?? 'other';\n\n groups[group] ??= {};\n groups[group][key] = value;\n }\n\n // Display each group\n for (const [group, values] of Object.entries(groups)) {\n logger.log(` ${pc.cyan(group)}:`);\n\n for (const [key, value] of Object.entries(values)) {\n const displayKey = key.replace(`${group}.`, '');\n const displayValue = formatValue(value);\n logger.log(` ${pc.dim(displayKey.padEnd(30))} ${displayValue}`);\n }\n\n logger.line();\n }\n\n logger.hint(`Config file: ${configManager.getProjectRoot()}/synapsync.config.yaml`);\n}\n\n/**\n * Show a specific configuration value\n */\nfunction showConfigValue(configManager: ConfigManager, key: string): void {\n if (key === '') {\n logger.line();\n logger.error('Key is required.');\n logger.hint('Usage: /config get <key>');\n logger.hint('Example: /config get cli.theme');\n return;\n }\n\n const value = configManager.get(key);\n\n logger.line();\n\n if (value === undefined) {\n logger.warning(`Key not found: ${pc.cyan(key)}`);\n logger.line();\n logger.hint('Use /config list to see all available keys.');\n } else {\n logger.log(` ${pc.cyan(key)} = ${formatValue(value)}`);\n }\n}\n\n/**\n * Set a configuration value\n */\nfunction setConfigValue(configManager: ConfigManager, key: string, value: string): void {\n if (key === '') {\n logger.line();\n logger.error('Key is required.');\n logger.hint('Usage: /config set <key> <value>');\n logger.hint('Example: /config set cli.theme dark');\n return;\n }\n\n if (value === '') {\n logger.line();\n logger.error('Value is required.');\n logger.hint('Usage: /config set <key> <value>');\n return;\n }\n\n // Check if key exists (warning for new keys)\n const existingValue = configManager.get(key);\n const isNewKey = existingValue === undefined;\n\n // Parse value (handle booleans and numbers)\n const parsedValue = parseValue(value);\n\n // Set the value\n configManager.set(key, parsedValue);\n configManager.save();\n\n logger.line();\n\n if (isNewKey) {\n logger.warning(`Created new key: ${pc.cyan(key)}`);\n }\n\n logger.success(`${pc.cyan(key)} = ${formatValue(parsedValue)}`);\n}\n\n// ============================================\n// Argument Parsing\n// ============================================\n\nfunction parseConfigArgs(args: string): ConfigOptions {\n const parts = args.trim().split(/\\s+/);\n const action = (parts[0] ?? 'list').toLowerCase();\n\n // Default to list if no action\n if (action === '' || action === 'list') {\n return { action: 'list' };\n }\n\n if (action === 'get') {\n return {\n action: 'get',\n key: parts[1] ?? '',\n };\n }\n\n if (action === 'set') {\n return {\n action: 'set',\n key: parts[1] ?? '',\n value: parts.slice(2).join(' '),\n };\n }\n\n // Treat unknown action as a key (shorthand for get)\n return {\n action: 'get',\n key: action,\n };\n}\n\n// ============================================\n// Value Formatting\n// ============================================\n\nfunction formatValue(value: unknown): string {\n if (value === null || value === undefined) {\n return pc.dim('(not set)');\n }\n\n if (typeof value === 'boolean') {\n return value ? pc.green('true') : pc.red('false');\n }\n\n if (typeof value === 'number') {\n return pc.yellow(String(value));\n }\n\n if (typeof value === 'string') {\n return pc.white(`\"${value}\"`);\n }\n\n if (Array.isArray(value)) {\n return pc.dim(`[${value.join(', ')}]`);\n }\n\n return pc.dim(JSON.stringify(value));\n}\n\nfunction parseValue(value: string): unknown {\n // Boolean\n if (value.toLowerCase() === 'true') return true;\n if (value.toLowerCase() === 'false') return false;\n\n // Number\n const num = Number(value);\n if (!isNaN(num) && value.trim() !== '') return num;\n\n // String\n return value;\n}\n\n// ============================================\n// Command Registration\n// ============================================\n\n/**\n * Register config command with Commander\n */\nexport function registerConfigCommand(program: Command): void {\n const configCmd = program\n .command('config')\n .description('Manage project configuration');\n\n configCmd\n .command('list')\n .description('Show all configuration values')\n .action(() => {\n executeConfigCommand('list');\n });\n\n configCmd\n .command('get <key>')\n .description('Get a configuration value')\n .action((key: string) => {\n executeConfigCommand(`get ${key}`);\n });\n\n configCmd\n .command('set <key> <value>')\n .description('Set a configuration value')\n .action((key: string, value: string) => {\n executeConfigCommand(`set ${key} ${value}`);\n });\n\n // Default action (no subcommand)\n configCmd.action(() => {\n executeConfigCommand('list');\n });\n}\n","/**\n * Status Command\n *\n * Show the current status of the SynapSync project\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport type { Command } from 'commander';\nimport pc from 'picocolors';\nimport { ConfigManager } from '../services/config/manager.js';\nimport {\n COGNITIVE_TYPES,\n SUPPORTED_PROVIDERS,\n} from '../core/constants.js';\nimport type { CognitiveType, SupportedProvider } from '../core/constants.js';\nimport { logger } from '../utils/logger.js';\n\n// ============================================\n// Types\n// ============================================\n\ninterface ProjectStatus {\n initialized: boolean;\n projectName?: string;\n projectRoot?: string;\n configPath?: string;\n storagePath?: string;\n cognitives: Record<CognitiveType, number>;\n providers: ProviderStatus[];\n lastSync?: string;\n}\n\ninterface ProviderStatus {\n name: SupportedProvider;\n enabled: boolean;\n connected: boolean;\n cognitivesCount: number;\n}\n\n// ============================================\n// Main Function\n// ============================================\n\n/**\n * Execute the status command\n */\nexport function executeStatusCommand(_args: string = ''): void {\n const status = getProjectStatus();\n\n logger.line();\n\n if (!status.initialized) {\n showNotInitialized();\n return;\n }\n\n showProjectStatus(status);\n}\n\n// ============================================\n// Status Collection\n// ============================================\n\nfunction getProjectStatus(): ProjectStatus {\n const configManager = ConfigManager.findConfig();\n\n if (configManager === null) {\n return {\n initialized: false,\n cognitives: createEmptyCognitiveCount(),\n providers: [],\n };\n }\n\n const config = configManager.getConfig();\n const projectRoot = configManager.getProjectRoot();\n const storagePath = configManager.getSynapSyncDir();\n\n // Count cognitives by type\n const cognitives = countCognitives(storagePath);\n\n // Get provider status\n const providers = getProviderStatuses(config, projectRoot);\n\n // Get last sync from manifest\n const lastSync = getLastSyncTime(storagePath);\n\n const status: ProjectStatus = {\n initialized: true,\n projectName: config.name,\n projectRoot,\n configPath: path.join(projectRoot, 'synapsync.config.yaml'),\n storagePath,\n cognitives,\n providers,\n };\n if (lastSync !== undefined) {\n status.lastSync = lastSync;\n }\n return status;\n}\n\nfunction createEmptyCognitiveCount(): Record<CognitiveType, number> {\n const counts: Record<CognitiveType, number> = {} as Record<CognitiveType, number>;\n for (const type of COGNITIVE_TYPES) {\n counts[type] = 0;\n }\n return counts;\n}\n\nfunction countCognitives(storagePath: string): Record<CognitiveType, number> {\n const counts = createEmptyCognitiveCount();\n\n for (const type of COGNITIVE_TYPES) {\n const typePath = path.join(storagePath, `${type}s`);\n\n if (fs.existsSync(typePath)) {\n try {\n const entries = fs.readdirSync(typePath, { withFileTypes: true });\n // Count directories (each cognitive is a directory)\n counts[type] = entries.filter(\n (e) => e.isDirectory() || (e.isSymbolicLink() && !e.name.startsWith('.'))\n ).length;\n } catch {\n counts[type] = 0;\n }\n }\n }\n\n return counts;\n}\n\nfunction getProviderStatuses(\n config: ReturnType<ConfigManager['getConfig']>,\n projectRoot: string\n): ProviderStatus[] {\n const statuses: ProviderStatus[] = [];\n\n for (const provider of SUPPORTED_PROVIDERS) {\n const providerConfig = config.sync?.providers?.[provider];\n const enabled = providerConfig?.enabled ?? false;\n\n // Check if provider directory exists and has cognitives\n const providerPath = path.join(projectRoot, `.${provider}`);\n let cognitivesCount = 0;\n\n if (fs.existsSync(providerPath)) {\n try {\n // Count all items in provider subdirectories\n const subdirs = ['skills', 'agents', 'prompts', 'workflows', 'tools'];\n for (const subdir of subdirs) {\n const subdirPath = path.join(providerPath, subdir);\n if (fs.existsSync(subdirPath)) {\n const entries = fs.readdirSync(subdirPath);\n cognitivesCount += entries.filter((e) => !e.startsWith('.')).length;\n }\n }\n } catch {\n // Ignore errors\n }\n }\n\n statuses.push({\n name: provider,\n enabled,\n connected: false, // TODO: Check actual connection status\n cognitivesCount,\n });\n }\n\n return statuses;\n}\n\nfunction getLastSyncTime(storagePath: string): string | undefined {\n const manifestPath = path.join(storagePath, 'manifest.json');\n\n if (!fs.existsSync(manifestPath)) {\n return undefined;\n }\n\n try {\n const content = fs.readFileSync(manifestPath, 'utf-8');\n const manifest = JSON.parse(content) as { lastUpdated?: string };\n return manifest.lastUpdated;\n } catch {\n return undefined;\n }\n}\n\n// ============================================\n// Display Functions\n// ============================================\n\nfunction showNotInitialized(): void {\n logger.bold(' Project Status');\n logger.line();\n logger.log(` ${pc.red('●')} ${pc.dim('Not initialized')}`);\n logger.line();\n logger.hint('Run /init to initialize a SynapSync project.');\n}\n\nfunction showProjectStatus(status: ProjectStatus): void {\n // Header\n logger.bold(` ${status.projectName ?? 'SynapSync Project'}`);\n logger.line();\n\n // Project info\n logger.log(` ${pc.green('●')} ${pc.dim('Initialized')}`);\n logger.log(` ${pc.dim('Root:')} ${status.projectRoot}`);\n logger.line();\n\n // Cognitives summary\n logger.bold(' Cognitives');\n const totalCognitives = Object.values(status.cognitives).reduce((a, b) => a + b, 0);\n\n if (totalCognitives === 0) {\n logger.log(` ${pc.dim('No cognitives installed')}`);\n } else {\n for (const type of COGNITIVE_TYPES) {\n const count = status.cognitives[type];\n if (count > 0) {\n const icon = getCognitiveIcon(type);\n logger.log(` ${icon} ${pc.white(count.toString().padStart(3))} ${type}s`);\n }\n }\n logger.log(` ${pc.dim('───')}`);\n logger.log(` ${pc.bold(totalCognitives.toString().padStart(5))} total`);\n }\n logger.line();\n\n // Providers\n logger.bold(' Providers');\n const enabledProviders = status.providers.filter((p) => p.enabled);\n\n if (enabledProviders.length === 0) {\n logger.log(` ${pc.dim('No providers enabled')}`);\n } else {\n for (const provider of enabledProviders) {\n const icon = provider.cognitivesCount > 0 ? pc.green('●') : pc.yellow('○');\n const syncStatus =\n provider.cognitivesCount > 0\n ? pc.dim(`(${provider.cognitivesCount} synced)`)\n : pc.dim('(not synced)');\n logger.log(` ${icon} ${pc.white(provider.name)} ${syncStatus}`);\n }\n }\n logger.line();\n\n // Last sync\n if (status.lastSync !== undefined) {\n const syncDate = new Date(status.lastSync);\n const relativeTime = getRelativeTime(syncDate);\n logger.log(` ${pc.dim('Last updated:')} ${relativeTime}`);\n logger.line();\n }\n\n // Quick actions\n logger.hint('Run /help for available commands.');\n}\n\nfunction getCognitiveIcon(type: CognitiveType): string {\n const icons: Record<CognitiveType, string> = {\n skill: pc.blue('◆'),\n agent: pc.magenta('◆'),\n prompt: pc.yellow('◆'),\n workflow: pc.cyan('◆'),\n tool: pc.green('◆'),\n };\n return icons[type];\n}\n\nfunction getRelativeTime(date: Date): string {\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n const diffMins = Math.floor(diffMs / 60000);\n const diffHours = Math.floor(diffMins / 60);\n const diffDays = Math.floor(diffHours / 24);\n\n if (diffMins < 1) return 'just now';\n if (diffMins < 60) return `${diffMins} minute${diffMins === 1 ? '' : 's'} ago`;\n if (diffHours < 24) return `${diffHours} hour${diffHours === 1 ? '' : 's'} ago`;\n if (diffDays < 7) return `${diffDays} day${diffDays === 1 ? '' : 's'} ago`;\n\n return date.toLocaleDateString();\n}\n\n// ============================================\n// Command Registration\n// ============================================\n\n/**\n * Register status command with Commander\n */\nexport function registerStatusCommand(program: Command): void {\n program\n .command('status')\n .description('Show project status')\n .action(() => {\n executeStatusCommand();\n });\n}\n","/**\n * Providers Command\n *\n * Manage provider configuration for SynapSync\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport type { Command } from 'commander';\nimport pc from 'picocolors';\nimport { ConfigManager } from '../services/config/manager.js';\nimport { SUPPORTED_PROVIDERS, PROVIDER_PATHS } from '../core/constants.js';\nimport type { SupportedProvider } from '../core/constants.js';\nimport { logger } from '../utils/logger.js';\n\n// ============================================\n// Types\n// ============================================\n\ninterface ProviderInfo {\n name: SupportedProvider;\n enabled: boolean;\n path: string;\n exists: boolean;\n}\n\n// ============================================\n// Main Functions\n// ============================================\n\n/**\n * Execute the providers command\n */\nexport function executeProvidersCommand(args: string): void {\n const parts = args.trim().split(/\\s+/);\n const subcommand = parts[0]?.toLowerCase() ?? '';\n\n // Find config\n const configManager = ConfigManager.findConfig();\n\n if (configManager === null) {\n logger.line();\n logger.error('No SynapSync project found.');\n logger.hint('Run /init to initialize a project.');\n return;\n }\n\n switch (subcommand) {\n case '':\n case 'list':\n listProviders(configManager);\n break;\n case 'enable':\n enableProvider(configManager, parts[1]);\n break;\n case 'disable':\n disableProvider(configManager, parts[1]);\n break;\n case 'path':\n setProviderPath(configManager, parts[1], parts[2]);\n break;\n default:\n // Check if it's a provider name (shortcut for info)\n if (SUPPORTED_PROVIDERS.includes(subcommand as SupportedProvider)) {\n showProviderInfo(configManager, subcommand as SupportedProvider);\n } else {\n logger.line();\n logger.error(`Unknown subcommand: ${subcommand}`);\n logger.hint('Usage: /providers [list|enable|disable|path]');\n }\n }\n}\n\n// ============================================\n// Provider Actions\n// ============================================\n\n/**\n * List all providers and their status\n */\nfunction listProviders(configManager: ConfigManager): void {\n const providers = getProvidersInfo(configManager);\n\n logger.line();\n logger.bold(' Providers');\n logger.line();\n\n // Table header\n logger.log(\n ` ${pc.dim('Provider'.padEnd(12))} ${pc.dim('Status'.padEnd(10))} ${pc.dim('Path'.padEnd(20))} ${pc.dim('Directory')}`\n );\n logger.log(` ${pc.dim('─'.repeat(60))}`);\n\n // Provider rows\n for (const provider of providers) {\n const statusIcon = provider.enabled ? pc.green('●') : pc.dim('○');\n const statusText = provider.enabled ? pc.green('enabled') : pc.dim('disabled');\n const pathText = pc.cyan(provider.path);\n const existsText = provider.exists ? pc.green('✓ exists') : pc.dim('✗ missing');\n\n logger.log(\n ` ${statusIcon} ${pc.white(provider.name.padEnd(10))} ${statusText.padEnd(19)} ${pathText.padEnd(29)} ${existsText}`\n );\n }\n\n logger.line();\n\n // Summary\n const enabledCount = providers.filter((p) => p.enabled).length;\n logger.log(` ${pc.dim('Enabled:')} ${enabledCount} of ${providers.length} providers`);\n logger.line();\n\n logger.hint('Use /providers enable <name> or /providers disable <name>');\n}\n\n/**\n * Enable a provider\n */\nfunction enableProvider(configManager: ConfigManager, providerName: string | undefined): void {\n if (providerName === undefined || providerName === '') {\n logger.line();\n logger.error('Provider name is required.');\n logger.hint('Usage: /providers enable <provider>');\n logger.hint(`Available: ${SUPPORTED_PROVIDERS.join(', ')}`);\n return;\n }\n\n const provider = providerName.toLowerCase();\n\n if (!SUPPORTED_PROVIDERS.includes(provider as SupportedProvider)) {\n logger.line();\n logger.error(`Unknown provider: ${provider}`);\n logger.hint(`Available: ${SUPPORTED_PROVIDERS.join(', ')}`);\n return;\n }\n\n // Check if already enabled\n const currentValue = configManager.get(`sync.providers.${provider}.enabled`);\n if (currentValue === true) {\n logger.line();\n logger.info(`Provider '${provider}' is already enabled.`);\n return;\n }\n\n // Enable the provider\n configManager.set(`sync.providers.${provider}.enabled`, true);\n\n // Set default paths if not set\n const defaultPaths = PROVIDER_PATHS[provider as SupportedProvider];\n const currentPaths = configManager.get(`sync.providers.${provider}.paths`);\n if (currentPaths === undefined) {\n configManager.set(`sync.providers.${provider}.paths`, defaultPaths);\n }\n\n configManager.save();\n\n logger.line();\n logger.success(`Provider '${pc.cyan(provider)}' enabled`);\n logger.log(` ${pc.dim('Path:')} ${defaultPaths.skill.split('/')[0]}/`);\n logger.line();\n logger.hint('Run /sync to synchronize cognitives to this provider.');\n}\n\n/**\n * Disable a provider\n */\nfunction disableProvider(configManager: ConfigManager, providerName: string | undefined): void {\n if (providerName === undefined || providerName === '') {\n logger.line();\n logger.error('Provider name is required.');\n logger.hint('Usage: /providers disable <provider>');\n return;\n }\n\n const provider = providerName.toLowerCase();\n\n if (!SUPPORTED_PROVIDERS.includes(provider as SupportedProvider)) {\n logger.line();\n logger.error(`Unknown provider: ${provider}`);\n logger.hint(`Available: ${SUPPORTED_PROVIDERS.join(', ')}`);\n return;\n }\n\n // Check if already disabled\n const currentValue = configManager.get(`sync.providers.${provider}.enabled`);\n if (currentValue !== true) {\n logger.line();\n logger.info(`Provider '${provider}' is already disabled.`);\n return;\n }\n\n // Disable the provider\n configManager.set(`sync.providers.${provider}.enabled`, false);\n configManager.save();\n\n logger.line();\n logger.success(`Provider '${pc.cyan(provider)}' disabled`);\n}\n\n/**\n * Set custom path for a provider\n */\nfunction setProviderPath(\n configManager: ConfigManager,\n providerName: string | undefined,\n newPath: string | undefined\n): void {\n if (providerName === undefined || providerName === '') {\n logger.line();\n logger.error('Provider name is required.');\n logger.hint('Usage: /providers path <provider> <path>');\n return;\n }\n\n if (newPath === undefined || newPath === '') {\n logger.line();\n logger.error('Path is required.');\n logger.hint('Usage: /providers path <provider> <path>');\n logger.hint('Example: /providers path claude .claude-code/');\n return;\n }\n\n const provider = providerName.toLowerCase();\n\n if (!SUPPORTED_PROVIDERS.includes(provider as SupportedProvider)) {\n logger.line();\n logger.error(`Unknown provider: ${provider}`);\n logger.hint(`Available: ${SUPPORTED_PROVIDERS.join(', ')}`);\n return;\n }\n\n // Normalize path (ensure it ends with /)\n const normalizedPath = newPath.endsWith('/') ? newPath : `${newPath}/`;\n\n // Update all cognitive type paths\n const cognitiveTypes = ['skill', 'agent', 'prompt', 'workflow', 'tool'] as const;\n for (const type of cognitiveTypes) {\n configManager.set(`sync.providers.${provider}.paths.${type}`, `${normalizedPath}${type}s`);\n }\n\n configManager.save();\n\n logger.line();\n logger.success(`Updated paths for '${pc.cyan(provider)}'`);\n logger.log(` ${pc.dim('Base path:')} ${pc.cyan(normalizedPath)}`);\n logger.line();\n}\n\n/**\n * Show detailed info for a specific provider\n */\nfunction showProviderInfo(configManager: ConfigManager, provider: SupportedProvider): void {\n const config = configManager.getConfig();\n const projectRoot = configManager.getProjectRoot();\n const providerConfig = config.sync?.providers?.[provider];\n const enabled = providerConfig?.enabled ?? false;\n const paths = providerConfig?.paths ?? PROVIDER_PATHS[provider];\n\n logger.line();\n logger.bold(` ${getProviderDisplayName(provider)}`);\n logger.line();\n\n // Status\n const statusIcon = enabled ? pc.green('●') : pc.dim('○');\n const statusText = enabled ? pc.green('Enabled') : pc.dim('Disabled');\n logger.log(` ${pc.dim('Status:')} ${statusIcon} ${statusText}`);\n logger.line();\n\n // Paths\n logger.log(` ${pc.dim('Paths:')}`);\n const cognitiveTypes = ['skill', 'agent', 'prompt', 'workflow', 'tool'] as const;\n for (const type of cognitiveTypes) {\n const typePath = paths[type] ?? '';\n const fullPath = path.join(projectRoot, typePath);\n const exists = fs.existsSync(fullPath);\n const existsIcon = exists ? pc.green('✓') : pc.dim('✗');\n logger.log(` ${pc.dim(type.padEnd(10))} ${pc.cyan(typePath)} ${existsIcon}`);\n }\n\n logger.line();\n}\n\n// ============================================\n// Helper Functions\n// ============================================\n\nfunction getProvidersInfo(configManager: ConfigManager): ProviderInfo[] {\n const config = configManager.getConfig();\n const projectRoot = configManager.getProjectRoot();\n const providers: ProviderInfo[] = [];\n\n for (const provider of SUPPORTED_PROVIDERS) {\n const providerConfig = config.sync?.providers?.[provider];\n const enabled = providerConfig?.enabled ?? false;\n const basePath = providerConfig?.paths?.skill?.split('/')[0] ?? `.${provider}`;\n const fullPath = path.join(projectRoot, basePath);\n const exists = fs.existsSync(fullPath);\n\n providers.push({\n name: provider,\n enabled,\n path: `${basePath}/`,\n exists,\n });\n }\n\n return providers;\n}\n\nfunction getProviderDisplayName(provider: SupportedProvider): string {\n const names: Record<SupportedProvider, string> = {\n claude: 'Claude (Anthropic)',\n openai: 'OpenAI (GPT)',\n gemini: 'Gemini (Google)',\n cursor: 'Cursor IDE',\n windsurf: 'Windsurf IDE',\n copilot: 'GitHub Copilot',\n };\n return names[provider];\n}\n\n// ============================================\n// Command Registration\n// ============================================\n\n/**\n * Register providers command with Commander\n */\nexport function registerProvidersCommand(program: Command): void {\n const providersCmd = program\n .command('providers')\n .description('Manage provider configuration');\n\n // List (default)\n providersCmd\n .command('list', { isDefault: true })\n .description('List all providers and their status')\n .action(() => {\n executeProvidersCommand('list');\n });\n\n // Enable\n providersCmd\n .command('enable <provider>')\n .description('Enable a provider')\n .action((provider: string) => {\n executeProvidersCommand(`enable ${provider}`);\n });\n\n // Disable\n providersCmd\n .command('disable <provider>')\n .description('Disable a provider')\n .action((provider: string) => {\n executeProvidersCommand(`disable ${provider}`);\n });\n\n // Path\n providersCmd\n .command('path <provider> <path>')\n .description('Set custom sync path for a provider')\n .action((provider: string, newPath: string) => {\n executeProvidersCommand(`path ${provider} ${newPath}`);\n });\n\n // Default action\n providersCmd.action(() => {\n executeProvidersCommand('list');\n });\n}\n","/**\n * Search Command\n *\n * Search for cognitives in the SynapSync registry\n */\n\nimport type { Command } from 'commander';\nimport pc from 'picocolors';\nimport { RegistryClient, RegistryError } from '../services/registry/client.js';\nimport type { SearchOptions } from '../services/registry/client.js';\nimport { COGNITIVE_TYPES, CATEGORIES } from '../core/constants.js';\nimport type { CognitiveType, Category } from '../core/constants.js';\nimport type { RegistryCognitiveEntry } from '../types/index.js';\nimport { logger } from '../utils/logger.js';\n\n// ============================================\n// Types\n// ============================================\n\ninterface SearchCommandOptions {\n type?: string;\n category?: string;\n tag?: string;\n limit?: string;\n json?: boolean;\n}\n\n// ============================================\n// Main Function\n// ============================================\n\n/**\n * Execute the search command\n */\nexport async function executeSearchCommand(\n query: string | undefined,\n options: SearchCommandOptions\n): Promise<void> {\n logger.line();\n\n // Validate options\n const validatedOptions = validateOptions(options);\n if (validatedOptions === null) {\n return;\n }\n\n // Show searching indicator\n const searchingText = query !== undefined && query.trim() !== ''\n ? `Searching for \"${query}\"...`\n : 'Fetching cognitives from registry...';\n logger.log(` ${pc.dim(searchingText)}`);\n\n try {\n const client = new RegistryClient();\n\n // Check connectivity\n const isReachable = await client.ping();\n if (!isReachable) {\n logger.line();\n logger.error('Unable to reach the registry. Check your internet connection.');\n return;\n }\n\n // Search\n const searchOpts: SearchOptions = {};\n if (validatedOptions.type !== undefined) searchOpts.type = validatedOptions.type;\n if (validatedOptions.category !== undefined) searchOpts.category = validatedOptions.category;\n if (validatedOptions.tag !== undefined) searchOpts.tag = validatedOptions.tag;\n if (validatedOptions.limit !== undefined) searchOpts.limit = validatedOptions.limit;\n const result = await client.search(query, searchOpts);\n\n // Clear the searching line\n process.stdout.write('\\x1b[1A\\x1b[2K');\n\n if (options.json === true) {\n // JSON output\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n // Display results\n displaySearchResults(result.cognitives, query, result.total);\n } catch (error) {\n logger.line();\n if (error instanceof RegistryError) {\n logger.error(`Registry error: ${error.message}`);\n } else if (error instanceof Error) {\n logger.error(`Search failed: ${error.message}`);\n } else {\n logger.error('Search failed with unknown error');\n }\n }\n}\n\n// ============================================\n// Validation\n// ============================================\n\ninterface ValidatedOptions {\n type?: CognitiveType;\n category?: Category;\n tag?: string;\n limit?: number;\n}\n\nfunction validateOptions(options: SearchCommandOptions): ValidatedOptions | null {\n const validated: ValidatedOptions = {};\n\n // Validate type\n if (options.type !== undefined) {\n if (!COGNITIVE_TYPES.includes(options.type as CognitiveType)) {\n logger.error(`Invalid type: ${options.type}`);\n logger.hint(`Valid types: ${COGNITIVE_TYPES.join(', ')}`);\n return null;\n }\n validated.type = options.type as CognitiveType;\n }\n\n // Validate category\n if (options.category !== undefined) {\n if (!(CATEGORIES as readonly string[]).includes(options.category)) {\n logger.error(`Invalid category: ${options.category}`);\n logger.hint(`Valid categories: ${CATEGORIES.join(', ')}`);\n return null;\n }\n validated.category = options.category as Category;\n }\n\n // Validate tag\n if (options.tag !== undefined) {\n validated.tag = options.tag;\n }\n\n // Validate limit\n if (options.limit !== undefined) {\n const limit = parseInt(options.limit, 10);\n if (isNaN(limit) || limit < 1) {\n logger.error('Limit must be a positive number');\n return null;\n }\n validated.limit = limit;\n }\n\n return validated;\n}\n\n// ============================================\n// Display Functions\n// ============================================\n\nfunction displaySearchResults(\n cognitives: RegistryCognitiveEntry[],\n query: string | undefined,\n total: number\n): void {\n // Header\n if (query !== undefined && query.trim() !== '') {\n logger.bold(` Search Results for \"${query}\"`);\n } else {\n logger.bold(' Registry Cognitives');\n }\n logger.line();\n\n if (cognitives.length === 0) {\n logger.log(` ${pc.dim('No cognitives found')}`);\n logger.line();\n logger.hint('Try a different search query or remove filters.');\n return;\n }\n\n // Results count\n if (cognitives.length < total) {\n logger.log(` ${pc.dim(`Showing ${cognitives.length} of ${total} results`)}`);\n } else {\n logger.log(` ${pc.dim(`Found ${total} cognitive${total === 1 ? '' : 's'}`)}`);\n }\n logger.line();\n\n // Display each cognitive\n for (const cognitive of cognitives) {\n displayCognitive(cognitive);\n }\n\n logger.line();\n logger.hint('Run synapsync install <name> to install a cognitive.');\n}\n\nfunction displayCognitive(cognitive: RegistryCognitiveEntry): void {\n const typeIcon = getCognitiveIcon(cognitive.type);\n const typeLabel = pc.dim(`[${cognitive.type}]`);\n\n // Name and type\n logger.log(` ${typeIcon} ${pc.bold(pc.white(cognitive.name))} ${typeLabel}`);\n\n // Description\n logger.log(` ${pc.dim(truncate(cognitive.description, 60))}`);\n\n // Metadata line\n const meta: string[] = [];\n meta.push(pc.dim(`v${cognitive.version}`));\n meta.push(pc.dim(cognitive.category));\n if (cognitive.downloads > 0) {\n meta.push(pc.dim(`${cognitive.downloads} downloads`));\n }\n logger.log(` ${meta.join(' · ')}`);\n\n // Tags\n if (cognitive.tags.length > 0) {\n const tags = cognitive.tags.slice(0, 5).map((t) => pc.cyan(t)).join(' ');\n logger.log(` ${tags}`);\n }\n\n logger.line();\n}\n\nfunction getCognitiveIcon(type: CognitiveType): string {\n const icons: Record<CognitiveType, string> = {\n skill: pc.blue('◆'),\n agent: pc.magenta('◆'),\n prompt: pc.yellow('◆'),\n workflow: pc.cyan('◆'),\n tool: pc.green('◆'),\n };\n return icons[type];\n}\n\nfunction truncate(text: string, maxLength: number): string {\n if (text.length <= maxLength) return text;\n return text.slice(0, maxLength - 3) + '...';\n}\n\n// ============================================\n// Command Registration\n// ============================================\n\n/**\n * Register search command with Commander\n */\nexport function registerSearchCommand(program: Command): void {\n program\n .command('search [query]')\n .description('Search for cognitives in the registry')\n .option('-t, --type <type>', 'Filter by type (skill, agent, prompt, workflow, tool)')\n .option('-c, --category <category>', 'Filter by category')\n .option('--tag <tag>', 'Filter by tag')\n .option('-l, --limit <number>', 'Limit results', '20')\n .option('--json', 'Output as JSON')\n .action(async (query: string | undefined, options: SearchCommandOptions) => {\n await executeSearchCommand(query, options);\n });\n}\n","/**\n * Registry Client\n *\n * Handles fetching and querying the SynapSync public registry\n */\n\nimport {\n REGISTRY_BASE_URL,\n REGISTRY_INDEX_FILE,\n REGISTRY_MANIFEST_FILE,\n} from '../../core/constants.js';\nimport type {\n RegistryIndex,\n RegistryCognitiveEntry,\n CognitiveManifest,\n RegistrySearchResult,\n DownloadedCognitive,\n CognitiveType,\n Category,\n} from '../../types/index.js';\n\n// ============================================\n// Types\n// ============================================\n\nexport interface SearchOptions {\n type?: CognitiveType;\n category?: Category;\n tag?: string;\n limit?: number;\n}\n\nexport interface RegistryClientOptions {\n baseUrl?: string;\n cacheDir?: string;\n cacheTtl?: number; // milliseconds\n}\n\n// ============================================\n// RegistryClient Class\n// ============================================\n\nexport class RegistryClient {\n private baseUrl: string;\n private indexCache: RegistryIndex | null = null;\n private indexCacheTime: number = 0;\n private cacheTtl: number;\n\n constructor(options: RegistryClientOptions = {}) {\n this.baseUrl = options.baseUrl ?? REGISTRY_BASE_URL;\n this.cacheTtl = options.cacheTtl ?? 5 * 60 * 1000; // 5 minutes default\n }\n\n // ============================================\n // Index Operations\n // ============================================\n\n /**\n * Fetch the registry index\n */\n async getIndex(forceRefresh = false): Promise<RegistryIndex> {\n const now = Date.now();\n\n // Return cached if still valid\n if (!forceRefresh && this.indexCache !== null && now - this.indexCacheTime < this.cacheTtl) {\n return this.indexCache;\n }\n\n const url = `${this.baseUrl}/${REGISTRY_INDEX_FILE}`;\n const response = await this.fetch(url);\n\n if (!response.ok) {\n throw new RegistryError(`Failed to fetch registry index: ${response.status} ${response.statusText}`, url);\n }\n\n const index = (await response.json()) as RegistryIndex;\n this.indexCache = index;\n this.indexCacheTime = now;\n\n return index;\n }\n\n /**\n * Get total count of cognitives in registry\n */\n async getCount(): Promise<number> {\n const index = await this.getIndex();\n return index.totalCognitives;\n }\n\n // ============================================\n // Search Operations\n // ============================================\n\n /**\n * Search for cognitives in the registry\n */\n async search(query?: string, options: SearchOptions = {}): Promise<RegistrySearchResult> {\n const index = await this.getIndex();\n let results = [...index.cognitives];\n\n // Filter by query (searches name, description, tags)\n if (query !== undefined && query.trim() !== '') {\n const q = query.toLowerCase();\n results = results.filter(\n (c) =>\n c.name.toLowerCase().includes(q) ||\n c.description.toLowerCase().includes(q) ||\n c.tags.some((t) => t.toLowerCase().includes(q))\n );\n }\n\n // Filter by type\n if (options.type !== undefined) {\n results = results.filter((c) => c.type === options.type);\n }\n\n // Filter by category\n if (options.category !== undefined) {\n results = results.filter((c) => c.category === options.category);\n }\n\n // Filter by tag\n if (options.tag !== undefined) {\n const tag = options.tag.toLowerCase();\n results = results.filter((c) => c.tags.some((t) => t.toLowerCase() === tag));\n }\n\n // Apply limit\n const total = results.length;\n if (options.limit !== undefined && options.limit > 0) {\n results = results.slice(0, options.limit);\n }\n\n const filters: { type?: CognitiveType; category?: Category; tag?: string } = {};\n if (options.type !== undefined) filters.type = options.type;\n if (options.category !== undefined) filters.category = options.category;\n if (options.tag !== undefined) filters.tag = options.tag;\n\n return {\n cognitives: results,\n total,\n ...(query !== undefined ? { query } : {}),\n filters,\n };\n }\n\n /**\n * Find a cognitive by name\n */\n async findByName(name: string): Promise<RegistryCognitiveEntry | null> {\n const index = await this.getIndex();\n return index.cognitives.find((c) => c.name === name) ?? null;\n }\n\n /**\n * List all cognitives\n */\n async list(options: SearchOptions = {}): Promise<RegistryCognitiveEntry[]> {\n const result = await this.search(undefined, options);\n return result.cognitives;\n }\n\n // ============================================\n // Download Operations\n // ============================================\n\n /**\n * Get the manifest for a cognitive\n */\n async getManifest(cognitiveEntry: RegistryCognitiveEntry): Promise<CognitiveManifest> {\n const url = `${this.baseUrl}/${cognitiveEntry.path}/${REGISTRY_MANIFEST_FILE}`;\n const response = await this.fetch(url);\n\n if (!response.ok) {\n throw new RegistryError(\n `Failed to fetch manifest for ${cognitiveEntry.name}: ${response.status} ${response.statusText}`,\n url\n );\n }\n\n return (await response.json()) as CognitiveManifest;\n }\n\n /**\n * Get the content file for a cognitive\n */\n async getContent(cognitiveEntry: RegistryCognitiveEntry, manifest: CognitiveManifest): Promise<string> {\n const url = `${this.baseUrl}/${cognitiveEntry.path}/${manifest.file}`;\n const response = await this.fetch(url);\n\n if (!response.ok) {\n throw new RegistryError(\n `Failed to fetch content for ${cognitiveEntry.name}: ${response.status} ${response.statusText}`,\n url\n );\n }\n\n return response.text();\n }\n\n /**\n * Download a cognitive (manifest + content)\n */\n async download(name: string): Promise<DownloadedCognitive> {\n // Find in registry\n const entry = await this.findByName(name);\n if (entry === null) {\n throw new CognitiveNotFoundError(name);\n }\n\n // Get manifest\n const manifest = await this.getManifest(entry);\n\n // Get content\n const content = await this.getContent(entry, manifest);\n\n return {\n manifest,\n content,\n path: entry.path,\n };\n }\n\n /**\n * Download additional assets for a cognitive\n */\n async downloadAsset(cognitiveEntry: RegistryCognitiveEntry, assetPath: string): Promise<string> {\n const url = `${this.baseUrl}/${cognitiveEntry.path}/${assetPath}`;\n const response = await this.fetch(url);\n\n if (!response.ok) {\n throw new RegistryError(\n `Failed to fetch asset ${assetPath} for ${cognitiveEntry.name}: ${response.status} ${response.statusText}`,\n url\n );\n }\n\n return response.text();\n }\n\n // ============================================\n // Utility Methods\n // ============================================\n\n /**\n * Check if registry is reachable\n */\n async ping(): Promise<boolean> {\n try {\n const url = `${this.baseUrl}/${REGISTRY_INDEX_FILE}`;\n const response = await this.fetch(url, { method: 'HEAD' });\n return response.ok;\n } catch {\n return false;\n }\n }\n\n /**\n * Clear the cache\n */\n clearCache(): void {\n this.indexCache = null;\n this.indexCacheTime = 0;\n }\n\n /**\n * Get the base URL\n */\n getBaseUrl(): string {\n return this.baseUrl;\n }\n\n // ============================================\n // Private Methods\n // ============================================\n\n private async fetch(url: string, options?: RequestInit): Promise<Response> {\n try {\n return await fetch(url, {\n ...options,\n headers: {\n 'User-Agent': 'SynapSync-CLI',\n ...options?.headers,\n },\n });\n } catch (error) {\n if (error instanceof Error) {\n throw new RegistryError(`Network error: ${error.message}`, url);\n }\n throw new RegistryError('Network error', url);\n }\n }\n}\n\n// ============================================\n// Custom Errors\n// ============================================\n\nexport class RegistryError extends Error {\n constructor(\n message: string,\n public url: string\n ) {\n super(message);\n this.name = 'RegistryError';\n }\n}\n\nexport class CognitiveNotFoundError extends Error {\n constructor(public cognitiveName: string) {\n super(`Cognitive '${cognitiveName}' not found in registry`);\n this.name = 'CognitiveNotFoundError';\n }\n}\n","/**\n * Install Command\n *\n * Install cognitives from registry, local path, or GitHub\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport type { Command } from 'commander';\nimport pc from 'picocolors';\nimport { RegistryClient, CognitiveNotFoundError, RegistryError } from '../services/registry/client.js';\nimport { ConfigManager } from '../services/config/manager.js';\nimport { SyncEngine } from '../services/sync/engine.js';\nimport {\n COGNITIVE_TYPES,\n COGNITIVE_FILE_NAMES,\n} from '../core/constants.js';\nimport type { CognitiveType, Category } from '../core/constants.js';\nimport type { InstalledCognitive, CognitiveManifest } from '../types/index.js';\nimport { logger } from '../utils/logger.js';\n\n// ============================================\n// Types\n// ============================================\n\ninterface InstallCommandOptions {\n type?: string;\n category?: string;\n force?: boolean;\n global?: boolean;\n sync?: boolean;\n}\n\ninterface InstallSource {\n type: 'registry' | 'local' | 'github';\n name: string;\n path?: string;\n url?: string;\n branch?: string;\n}\n\n// ============================================\n// Main Function\n// ============================================\n\n/**\n * Execute the install command\n */\nexport async function executeInstallCommand(\n source: string,\n options: InstallCommandOptions\n): Promise<void> {\n logger.line();\n\n // Check if project is initialized\n const configManager = ConfigManager.findConfig();\n if (configManager === null) {\n logger.error('No SynapSync project found.');\n logger.hint('Run synapsync init to initialize a project first.');\n return;\n }\n\n // Parse the source\n const parsedSource = parseSource(source);\n logger.log(` ${pc.dim(`Installing from ${parsedSource.type}...`)}`);\n\n let success = false;\n\n try {\n switch (parsedSource.type) {\n case 'registry':\n success = await installFromRegistry(parsedSource.name, options, configManager);\n break;\n case 'local':\n if (parsedSource.path !== undefined) {\n success = installFromLocal(parsedSource.path, options, configManager);\n }\n break;\n case 'github':\n success = installFromGitHub(parsedSource, options, configManager);\n break;\n }\n\n // Auto-sync if --sync flag is provided and installation succeeded\n if (success && options.sync === true) {\n logger.log(` ${pc.dim('Syncing to providers...')}`);\n const synapSyncDir = configManager.getSynapSyncDir();\n const projectRoot = configManager.getProjectRoot();\n const config = configManager.getConfig();\n const syncEngine = new SyncEngine(synapSyncDir, projectRoot, config);\n const result = syncEngine.sync({ force: options.force ?? false });\n\n if (result.providerResults && result.providerResults.length > 0) {\n for (const pr of result.providerResults) {\n const created = pr.created.filter(c => c.success).length;\n const skipped = pr.skipped.length;\n if (created > 0) {\n logger.log(` ${pc.green('✓')} Synced to ${pr.provider} (${created} created)`);\n } else if (skipped > 0) {\n logger.log(` ${pc.green('✓')} Synced to ${pr.provider} (already up to date)`);\n }\n }\n }\n logger.line();\n }\n } catch (error) {\n logger.line();\n if (error instanceof CognitiveNotFoundError) {\n logger.error(`Cognitive '${error.cognitiveName}' not found in registry.`);\n logger.hint('Run synapsync search to find available cognitives.');\n } else if (error instanceof RegistryError) {\n logger.error(`Registry error: ${error.message}`);\n } else if (error instanceof Error) {\n logger.error(`Installation failed: ${error.message}`);\n } else {\n logger.error('Installation failed with unknown error');\n }\n }\n}\n\n// ============================================\n// Source Parsing\n// ============================================\n\nfunction parseSource(source: string): InstallSource {\n // Local path: starts with ./ or / or contains path separators\n if (source.startsWith('./') || source.startsWith('/') || source.startsWith('../')) {\n return {\n type: 'local',\n name: path.basename(source),\n path: source,\n };\n }\n\n // GitHub shorthand: github:user/repo or github:user/repo#branch\n if (source.startsWith('github:')) {\n const rest = source.slice(7);\n const [repoPath, branch] = rest.split('#');\n const parts = repoPath?.split('/') ?? [];\n\n return {\n type: 'github',\n name: parts[parts.length - 1] ?? repoPath ?? source,\n url: `https://github.com/${repoPath}`,\n branch: branch ?? 'main',\n };\n }\n\n // GitHub URL: https://github.com/user/repo\n if (source.startsWith('https://github.com/')) {\n const urlPath = source.replace('https://github.com/', '');\n const [repoPath, branch] = urlPath.split('#');\n const parts = repoPath?.split('/') ?? [];\n\n return {\n type: 'github',\n name: parts[parts.length - 1] ?? repoPath ?? source,\n url: `https://github.com/${repoPath}`,\n branch: branch ?? 'main',\n };\n }\n\n // Default: registry name\n return {\n type: 'registry',\n name: source,\n };\n}\n\n// ============================================\n// Registry Installation\n// ============================================\n\nasync function installFromRegistry(\n name: string,\n options: InstallCommandOptions,\n configManager: ConfigManager\n): Promise<boolean> {\n const client = new RegistryClient();\n\n // Download cognitive\n const downloaded = await client.download(name);\n const manifest = downloaded.manifest;\n\n // Determine category\n const category = options.category ?? manifest.category;\n\n // Check if already installed\n const targetDir = getTargetDir(configManager, manifest.type, category, manifest.name);\n\n if (fs.existsSync(targetDir) && options.force !== true) {\n logger.line();\n logger.error(`Cognitive '${manifest.name}' is already installed.`);\n logger.hint('Use --force to overwrite.');\n return false;\n }\n\n // Download assets if any (check for assets folder)\n const assets = await downloadAssets(client, name, manifest);\n\n // Save files\n saveCognitive(targetDir, manifest, downloaded.content, assets);\n\n // Update manifest.json\n updateProjectManifest(configManager, manifest, 'registry');\n\n // Success\n logger.line();\n logger.log(` ${pc.green('✓')} Installed ${pc.bold(manifest.name)} ${pc.dim(`v${manifest.version}`)}`);\n logger.log(` ${pc.dim('Type:')} ${manifest.type}`);\n logger.log(` ${pc.dim('Category:')} ${category}`);\n logger.log(` ${pc.dim('Location:')} ${path.relative(process.cwd(), targetDir)}`);\n\n if (options.sync !== true) {\n logger.line();\n logger.hint('Run synapsync sync to sync to your providers.');\n }\n\n return true;\n}\n\nasync function downloadAssets(\n client: RegistryClient,\n name: string,\n _manifest: CognitiveManifest\n): Promise<Map<string, string>> {\n const assets = new Map<string, string>();\n\n // Find the cognitive entry first\n const entry = await client.findByName(name);\n if (entry === null) return assets;\n\n // Try to download common asset files\n const assetFiles = [\n 'assets/SKILL-TEMPLATE-BASIC.md',\n 'assets/SKILL-TEMPLATE-ADVANCED.md',\n ];\n\n for (const assetPath of assetFiles) {\n try {\n const content = await client.downloadAsset(entry, assetPath);\n assets.set(assetPath, content);\n } catch {\n // Asset doesn't exist, skip\n }\n }\n\n return assets;\n}\n\n// ============================================\n// Local Installation\n// ============================================\n\nfunction installFromLocal(\n sourcePath: string,\n options: InstallCommandOptions,\n configManager: ConfigManager\n): boolean {\n const absolutePath = path.resolve(process.cwd(), sourcePath);\n\n if (!fs.existsSync(absolutePath)) {\n throw new Error(`Path not found: ${absolutePath}`);\n }\n\n // Detect cognitive type and filename\n const detected = detectCognitiveType(absolutePath);\n\n if (detected === null && options.type === undefined) {\n throw new Error(\n 'Could not detect cognitive type. Please specify with --type flag.'\n );\n }\n\n const cognitiveType = (options.type as CognitiveType) ?? detected?.type ?? 'skill';\n const fileName = detected?.fileName ?? COGNITIVE_FILE_NAMES[cognitiveType];\n\n // Read the cognitive file\n const filePath = path.join(absolutePath, fileName);\n\n if (!fs.existsSync(filePath)) {\n throw new Error(`Cognitive file not found: ${filePath}`);\n }\n\n const content = fs.readFileSync(filePath, 'utf-8');\n const metadata = parseMetadata(content);\n const name = (metadata['name'] as string) ?? path.basename(absolutePath);\n const category = (options.category as Category) ?? (metadata['category'] as Category) ?? 'general';\n\n // Create manifest from metadata - use original filename\n const manifest: CognitiveManifest = {\n name,\n type: cognitiveType,\n version: (metadata['version'] as string) ?? '1.0.0',\n description: (metadata['description'] as string) ?? '',\n author: (metadata['author'] as string) ?? 'local',\n license: (metadata['license'] as string) ?? 'MIT',\n category,\n tags: (metadata['tags'] as string[]) ?? [],\n providers: ((metadata['providers'] as string[]) ?? []) as CognitiveManifest['providers'],\n file: fileName, // Use the original filename\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n };\n\n // Check if already installed\n const targetDir = getTargetDir(configManager, cognitiveType, category, name);\n\n if (fs.existsSync(targetDir) && options.force !== true) {\n logger.line();\n logger.error(`Cognitive '${name}' is already installed.`);\n logger.hint('Use --force to overwrite.');\n return false;\n }\n\n // Copy all files from source\n const assets = new Map<string, string>();\n const assetsDir = path.join(absolutePath, 'assets');\n if (fs.existsSync(assetsDir)) {\n const assetFiles = fs.readdirSync(assetsDir);\n for (const file of assetFiles) {\n const assetContent = fs.readFileSync(path.join(assetsDir, file), 'utf-8');\n assets.set(`assets/${file}`, assetContent);\n }\n }\n\n // Save files\n saveCognitive(targetDir, manifest, content, assets);\n\n // Update manifest.json\n updateProjectManifest(configManager, manifest, 'local');\n\n // Success\n logger.line();\n logger.log(` ${pc.green('✓')} Installed ${pc.bold(name)} ${pc.dim(`v${manifest.version}`)}`);\n logger.log(` ${pc.dim('Type:')} ${cognitiveType}`);\n logger.log(` ${pc.dim('Category:')} ${category}`);\n logger.log(` ${pc.dim('Source:')} local`);\n logger.log(` ${pc.dim('Location:')} ${path.relative(process.cwd(), targetDir)}`);\n\n if (options.sync !== true) {\n logger.line();\n logger.hint('Run synapsync sync to sync to your providers.');\n }\n\n return true;\n}\n\n/**\n * Detect cognitive type from directory contents\n * Checks for legacy fixed filenames first, then by extension\n */\nfunction detectCognitiveType(dirPath: string): { type: CognitiveType; fileName: string } | null {\n // First check for legacy fixed filenames\n for (const type of COGNITIVE_TYPES) {\n const fileName = COGNITIVE_FILE_NAMES[type];\n if (fs.existsSync(path.join(dirPath, fileName))) {\n return { type, fileName };\n }\n }\n\n // If not found, check for files by extension\n if (!fs.existsSync(dirPath)) return null;\n\n const files = fs.readdirSync(dirPath);\n\n // Check for workflow first (yaml extension)\n for (const file of files) {\n if (file.endsWith('.yaml') && !file.startsWith('.')) {\n return { type: 'workflow', fileName: file };\n }\n }\n\n // Check for markdown files (could be skill, agent, prompt, or tool)\n // We need to parse frontmatter to determine the type\n for (const file of files) {\n if (file.endsWith('.md') && !file.startsWith('.')) {\n const content = fs.readFileSync(path.join(dirPath, file), 'utf-8');\n const metadata = parseMetadata(content);\n const detectedType = (metadata['type'] as CognitiveType) ?? 'skill'; // Default to skill\n if (COGNITIVE_TYPES.includes(detectedType)) {\n return { type: detectedType, fileName: file };\n }\n }\n }\n\n return null;\n}\n\nfunction parseMetadata(content: string): Record<string, unknown> {\n // Parse YAML frontmatter\n const match = content.match(/^---\\n([\\s\\S]*?)\\n---/);\n if (match?.[1] === undefined) {\n return {};\n }\n\n try {\n // Simple YAML parsing (key: value)\n const result: Record<string, unknown> = {};\n const lines = match[1].split('\\n');\n\n for (const line of lines) {\n const colonIndex = line.indexOf(':');\n if (colonIndex > 0) {\n const key = line.slice(0, colonIndex).trim();\n let value: unknown = line.slice(colonIndex + 1).trim();\n\n // Remove quotes\n if (typeof value === 'string') {\n if ((value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))) {\n value = value.slice(1, -1);\n }\n }\n\n result[key] = value;\n }\n }\n\n return result;\n } catch {\n return {};\n }\n}\n\n// ============================================\n// GitHub Installation\n// ============================================\n\nfunction installFromGitHub(\n _source: InstallSource,\n _options: InstallCommandOptions,\n _configManager: ConfigManager\n): boolean {\n // For now, we'll use raw GitHub URLs similar to registry\n // This is a simplified implementation\n logger.line();\n logger.error('GitHub installation is not yet fully implemented.');\n logger.hint('For now, clone the repo locally and use: synapsync install ./path/to/cognitive');\n return false;\n}\n\n// ============================================\n// File Operations\n// ============================================\n\nfunction getTargetDir(\n configManager: ConfigManager,\n type: CognitiveType,\n category: Category,\n name: string\n): string {\n const synapSyncDir = configManager.getSynapSyncDir();\n return path.join(synapSyncDir, `${type}s`, category, name);\n}\n\nfunction saveCognitive(\n targetDir: string,\n manifest: CognitiveManifest,\n content: string,\n assets: Map<string, string>\n): void {\n // Create directory structure\n fs.mkdirSync(targetDir, { recursive: true });\n\n // Save main file\n const mainFilePath = path.join(targetDir, manifest.file);\n fs.writeFileSync(mainFilePath, content, 'utf-8');\n\n // Save assets\n for (const [assetPath, assetContent] of assets) {\n const fullPath = path.join(targetDir, assetPath);\n const assetDir = path.dirname(fullPath);\n fs.mkdirSync(assetDir, { recursive: true });\n fs.writeFileSync(fullPath, assetContent, 'utf-8');\n }\n}\n\nfunction updateProjectManifest(\n configManager: ConfigManager,\n manifest: CognitiveManifest,\n source: 'registry' | 'local' | 'github'\n): void {\n const synapSyncDir = configManager.getSynapSyncDir();\n const manifestPath = path.join(synapSyncDir, 'manifest.json');\n\n // Read existing manifest or create new one\n let projectManifest: {\n version: string;\n lastUpdated: string;\n cognitives: Record<string, InstalledCognitive>;\n syncs: Record<string, unknown>;\n };\n\n if (fs.existsSync(manifestPath)) {\n const content = fs.readFileSync(manifestPath, 'utf-8');\n projectManifest = JSON.parse(content) as typeof projectManifest;\n } else {\n projectManifest = {\n version: '1.0.0',\n lastUpdated: new Date().toISOString(),\n cognitives: {},\n syncs: {},\n };\n }\n\n // Add or update cognitive entry\n const mappedSource = source === 'github' ? 'git' as const : source;\n const entry: InstalledCognitive = {\n name: manifest.name,\n type: manifest.type,\n category: manifest.category,\n version: manifest.version,\n installedAt: new Date(),\n source: mappedSource,\n };\n if (source === 'registry') {\n entry.sourceUrl = 'https://github.com/SynapSync/synapse-registry';\n }\n projectManifest.cognitives[manifest.name] = entry;\n\n projectManifest.lastUpdated = new Date().toISOString();\n\n // Save manifest\n fs.writeFileSync(manifestPath, JSON.stringify(projectManifest, null, 2), 'utf-8');\n}\n\n// ============================================\n// Command Registration\n// ============================================\n\n/**\n * Register install command with Commander\n */\nexport function registerInstallCommand(program: Command): void {\n program\n .command('install <source>')\n .description('Install a cognitive from registry, local path, or GitHub')\n .option('-t, --type <type>', 'Cognitive type (skill, agent, prompt, workflow, tool)')\n .option('-c, --category <category>', 'Category (overrides default)')\n .option('-f, --force', 'Overwrite if already installed')\n .option('-s, --sync', 'Sync to providers after installation')\n .option('-g, --global', 'Install globally (not yet implemented)')\n .action(async (source: string, options: InstallCommandOptions) => {\n await executeInstallCommand(source, options);\n });\n}\n","/**\n * Sync Engine\n *\n * Synchronizes the filesystem with the manifest.json and providers\n * Phase 1: filesystem ↔ manifest reconciliation\n * Phase 2: manifest ↔ provider symlinks\n */\n\nimport * as path from 'path';\nimport type {\n SyncResult,\n SyncOptions,\n SyncAction,\n SyncError,\n SyncProgressCallback,\n} from './types.js';\nimport { CognitiveScanner } from '../scanner/scanner.js';\nimport { ManifestManager } from '../manifest/manager.js';\nimport { SymlinkManager } from '../symlink/manager.js';\nimport type { ScannedCognitive } from '../scanner/types.js';\nimport type { ProviderSyncResult } from '../symlink/types.js';\nimport type { SupportedProvider } from '../../core/constants.js';\nimport type { ProjectConfig } from '../config/schema.js';\n\nexport class SyncEngine {\n private scanner: CognitiveScanner;\n private manifest: ManifestManager;\n private symlink: SymlinkManager;\n private projectRoot: string;\n private config: ProjectConfig | null;\n\n constructor(synapSyncDir: string, projectRoot?: string, config?: ProjectConfig) {\n this.projectRoot = projectRoot ?? path.dirname(synapSyncDir);\n this.config = config ?? null;\n this.scanner = new CognitiveScanner(synapSyncDir);\n this.manifest = new ManifestManager(synapSyncDir);\n this.symlink = new SymlinkManager(this.projectRoot, synapSyncDir);\n }\n\n /**\n * Perform a full sync of filesystem to manifest and providers\n */\n sync(options: SyncOptions = {}, onProgress?: SyncProgressCallback): SyncResult {\n const startTime = Date.now();\n const actions: SyncAction[] = [];\n const errors: SyncError[] = [];\n let providerResults: ProviderSyncResult[] | undefined;\n\n try {\n // Phase 1: Scan filesystem\n onProgress?.({\n phase: 'scanning',\n message: 'Scanning filesystem for cognitives...',\n });\n\n const scanOpts: import('../scanner/types.js').ScanOptions = {};\n if (options.types !== undefined) scanOpts.types = options.types;\n if (options.categories !== undefined) scanOpts.categories = options.categories;\n const scanned = this.scanner.scan(scanOpts);\n\n onProgress?.({\n phase: 'scanning',\n message: `Found ${scanned.length} cognitives in filesystem`,\n total: scanned.length,\n });\n\n // Phase 2: Compare with manifest\n onProgress?.({\n phase: 'comparing',\n message: 'Comparing with manifest...',\n });\n\n const manifestCognitives = this.manifest.getCognitives();\n const comparison = this.scanner.compare(scanned, manifestCognitives);\n\n // Build list of actions\n for (const cognitive of comparison.new) {\n actions.push({\n operation: 'add',\n cognitive,\n reason: 'New cognitive found in filesystem',\n });\n }\n\n for (const cognitive of comparison.modified) {\n actions.push({\n operation: 'update',\n cognitive,\n reason: 'Cognitive content has changed',\n });\n }\n\n for (const name of comparison.removed) {\n actions.push({\n operation: 'remove',\n cognitive: name,\n reason: 'Cognitive no longer exists in filesystem',\n });\n }\n\n onProgress?.({\n phase: 'comparing',\n message: `Found ${actions.length} changes to sync`,\n });\n\n // Phase 3: Apply manifest changes (unless dry run)\n if (options.dryRun !== true && actions.length > 0) {\n onProgress?.({\n phase: 'reconciling',\n message: 'Applying changes to manifest...',\n total: actions.length,\n processed: 0,\n });\n\n let processed = 0;\n for (const action of actions) {\n try {\n this.applyAction(action);\n processed++;\n onProgress?.({\n phase: 'reconciling',\n message: `Applied ${action.operation} for ${this.getActionName(action)}`,\n total: actions.length,\n processed,\n current: this.getActionName(action),\n });\n } catch (error) {\n errors.push({\n cognitive: this.getActionName(action),\n message: error instanceof Error ? error.message : 'Unknown error',\n code: 'UNKNOWN',\n });\n }\n }\n\n // Save manifest\n onProgress?.({\n phase: 'saving',\n message: 'Saving manifest...',\n });\n\n this.manifest.save();\n }\n\n // Phase 4: Provider sync (unless manifestOnly)\n if (options.manifestOnly !== true) {\n providerResults = this.syncProviders(scanned, options, onProgress);\n\n // Add provider errors to main errors\n for (const result of providerResults) {\n for (const error of result.errors) {\n errors.push({\n cognitive: error.path,\n message: error.message,\n code: 'UNKNOWN',\n });\n }\n }\n\n // Update provider sync state in manifest\n if (options.dryRun !== true) {\n this.updateProviderSyncState(providerResults, scanned);\n this.manifest.save();\n }\n }\n\n onProgress?.({\n phase: 'complete',\n message: options.dryRun === true ? 'Dry run complete' : 'Sync complete',\n });\n\n const duration = Date.now() - startTime;\n\n const result: SyncResult = {\n success: errors.length === 0,\n added: comparison.new.length,\n removed: comparison.removed.length,\n updated: comparison.modified.length,\n unchanged: comparison.unchanged,\n total: this.manifest.getCognitiveCount(),\n errors,\n actions,\n duration,\n };\n if (providerResults !== undefined) {\n result.providerResults = providerResults;\n }\n return result;\n } catch (error) {\n errors.push({\n message: error instanceof Error ? error.message : 'Unknown error',\n code: 'SCAN_FAILED',\n });\n\n const result: SyncResult = {\n success: false,\n added: 0,\n removed: 0,\n updated: 0,\n unchanged: 0,\n total: this.manifest.getCognitiveCount(),\n errors,\n actions,\n duration: Date.now() - startTime,\n };\n if (providerResults !== undefined) {\n result.providerResults = providerResults;\n }\n return result;\n }\n }\n\n /**\n * Sync cognitives to providers\n */\n private syncProviders(\n cognitives: ScannedCognitive[],\n options: SyncOptions,\n onProgress?: SyncProgressCallback\n ): ProviderSyncResult[] {\n const results: ProviderSyncResult[] = [];\n const enabledProviders = this.getEnabledProviders(options.provider);\n\n if (enabledProviders.length === 0) {\n return results;\n }\n\n onProgress?.({\n phase: 'reconciling',\n message: `Syncing to ${enabledProviders.length} provider(s)...`,\n });\n\n for (const provider of enabledProviders) {\n onProgress?.({\n phase: 'reconciling',\n message: `Syncing to ${provider}...`,\n current: provider,\n });\n\n const symlinkOpts: import('../symlink/types.js').SymlinkOptions = {};\n if (options.copy !== undefined) symlinkOpts.copy = options.copy;\n if (options.dryRun !== undefined) symlinkOpts.dryRun = options.dryRun;\n if (options.force !== undefined) symlinkOpts.force = options.force;\n const result = this.symlink.syncProvider(provider, cognitives, symlinkOpts);\n\n results.push(result);\n }\n\n return results;\n }\n\n /**\n * Get enabled providers from config\n */\n private getEnabledProviders(filterProvider?: SupportedProvider): SupportedProvider[] {\n if (this.config === null) {\n // No config, return empty (no providers configured)\n return [];\n }\n\n const providers = this.config.sync?.providers ?? {};\n const enabled: SupportedProvider[] = [];\n\n for (const [name, config] of Object.entries(providers)) {\n const providerConfig = config;\n if (providerConfig.enabled === true) {\n // If filtering by provider, only include that one\n if (filterProvider !== undefined && filterProvider !== name) {\n continue;\n }\n enabled.push(name as SupportedProvider);\n }\n }\n\n return enabled;\n }\n\n /**\n * Update provider sync state in manifest\n */\n private updateProviderSyncState(\n results: ProviderSyncResult[],\n cognitives: ScannedCognitive[]\n ): void {\n for (const result of results) {\n this.manifest.setProviderSync(result.provider, {\n lastSync: new Date().toISOString(),\n method: result.method,\n cognitives: cognitives.map((c) => c.name),\n });\n }\n }\n\n /**\n * Get a preview of what sync would do without making changes\n */\n preview(options: SyncOptions = {}): SyncResult {\n return this.sync({ ...options, dryRun: true });\n }\n\n /**\n * Get current sync status (what's in manifest vs filesystem)\n */\n getStatus(): {\n manifest: number;\n filesystem: number;\n inSync: boolean;\n newInFilesystem: number;\n removedFromFilesystem: number;\n modified: number;\n } {\n const scanned = this.scanner.scan();\n const manifestCognitives = this.manifest.getCognitives();\n const comparison = this.scanner.compare(scanned, manifestCognitives);\n\n return {\n manifest: manifestCognitives.length,\n filesystem: scanned.length,\n inSync:\n comparison.new.length === 0 &&\n comparison.removed.length === 0 &&\n comparison.modified.length === 0,\n newInFilesystem: comparison.new.length,\n removedFromFilesystem: comparison.removed.length,\n modified: comparison.modified.length,\n };\n }\n\n /**\n * Get provider sync status\n */\n getProviderStatus(provider: SupportedProvider): {\n valid: number;\n broken: number;\n orphaned: number;\n } {\n const { valid, broken, orphaned } = this.symlink.verifyProvider(provider);\n return {\n valid: valid.length,\n broken: broken.length,\n orphaned: orphaned.length,\n };\n }\n\n /**\n * Apply a single sync action\n */\n private applyAction(action: SyncAction): void {\n switch (action.operation) {\n case 'add': {\n const scanned = action.cognitive as ScannedCognitive;\n const manifestCognitive = this.scanner.toManifestCognitive(scanned);\n this.manifest.addCognitive(manifestCognitive);\n break;\n }\n case 'update': {\n const scanned = action.cognitive as ScannedCognitive;\n const manifestCognitive = this.scanner.toManifestCognitive(scanned);\n this.manifest.updateCognitive(scanned.name, manifestCognitive);\n break;\n }\n case 'remove': {\n const name = action.cognitive as string;\n this.manifest.removeCognitive(name);\n break;\n }\n }\n }\n\n /**\n * Get the name of the cognitive in an action\n */\n private getActionName(action: SyncAction): string {\n if (typeof action.cognitive === 'string') {\n return action.cognitive;\n }\n return action.cognitive.name;\n }\n\n /**\n * Get the manifest manager (for external access)\n */\n getManifest(): ManifestManager {\n return this.manifest;\n }\n\n /**\n * Get the scanner (for external access)\n */\n getScanner(): CognitiveScanner {\n return this.scanner;\n }\n\n /**\n * Get the symlink manager (for external access)\n */\n getSymlinkManager(): SymlinkManager {\n return this.symlink;\n }\n}\n","/**\n * Cognitive Scanner\n *\n * Scans the .synapsync directory for cognitives\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as crypto from 'crypto';\nimport type { ScannedCognitive, ScanResult, ScanOptions } from './types.js';\nimport { parseFrontmatter, extractVersion, extractName } from './parser.js';\nimport {\n COGNITIVE_TYPES,\n COGNITIVE_FILE_NAMES,\n COGNITIVE_FILE_EXTENSIONS,\n} from '../../core/constants.js';\nimport type { CognitiveType, Category } from '../../core/constants.js';\nimport type { ManifestCognitive } from '../manifest/types.js';\n\nexport class CognitiveScanner {\n private synapSyncDir: string;\n\n constructor(synapSyncDir: string) {\n this.synapSyncDir = synapSyncDir;\n }\n\n /**\n * Scan the filesystem for cognitives\n */\n scan(options: ScanOptions = {}): ScannedCognitive[] {\n const cognitives: ScannedCognitive[] = [];\n const errors: Array<{ path: string; error: string }> = [];\n\n const typesToScan = options.types ?? COGNITIVE_TYPES;\n\n for (const type of typesToScan) {\n const typeDir = path.join(this.synapSyncDir, `${type}s`);\n\n if (!fs.existsSync(typeDir)) {\n continue;\n }\n\n // Scan categories\n const categories = this.listDirectories(typeDir);\n\n for (const category of categories) {\n // Skip if filtering by category and this isn't included\n if (\n options.categories !== undefined &&\n !options.categories.includes(category)\n ) {\n continue;\n }\n\n const categoryDir = path.join(typeDir, category);\n const cognitiveDirs = this.listDirectories(categoryDir);\n\n for (const cognitiveDir of cognitiveDirs) {\n try {\n const cognitive = this.scanCognitive(\n path.join(categoryDir, cognitiveDir),\n type,\n category\n );\n if (cognitive !== null) {\n cognitives.push(cognitive);\n }\n } catch (error) {\n errors.push({\n path: path.join(categoryDir, cognitiveDir),\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n }\n }\n }\n }\n\n return cognitives;\n }\n\n /**\n * Scan a single cognitive directory\n */\n private scanCognitive(\n cognitiveDir: string,\n type: CognitiveType,\n category: Category\n ): ScannedCognitive | null {\n // Find the cognitive file (check legacy name first, then any matching extension)\n const filePath = this.findCognitiveFile(cognitiveDir, type);\n\n if (filePath === null) {\n return null;\n }\n\n const content = fs.readFileSync(filePath, 'utf-8');\n const metadata = parseFrontmatter(content);\n const dirName = path.basename(cognitiveDir);\n const fileName = path.basename(filePath);\n\n const name = extractName(metadata, dirName, content);\n const version = extractVersion(metadata, content);\n const hash = this.computeHash(content);\n\n return {\n name,\n type,\n category: (metadata.category as Category) ?? category,\n path: cognitiveDir,\n filePath,\n fileName, // Add original filename\n hash,\n metadata: {\n ...metadata,\n name,\n version,\n },\n };\n }\n\n /**\n * Find the cognitive file in a directory\n * Checks for legacy fixed filename first, then any file with matching extension\n */\n private findCognitiveFile(cognitiveDir: string, type: CognitiveType): string | null {\n // First, check for legacy fixed filename (SKILL.md, AGENT.md, etc.)\n const legacyFileName = COGNITIVE_FILE_NAMES[type];\n const legacyPath = path.join(cognitiveDir, legacyFileName);\n if (fs.existsSync(legacyPath)) {\n return legacyPath;\n }\n\n // If not found, look for any file with the correct extension\n const extension = COGNITIVE_FILE_EXTENSIONS[type];\n if (!fs.existsSync(cognitiveDir)) {\n return null;\n }\n\n const files = fs.readdirSync(cognitiveDir);\n for (const file of files) {\n if (file.endsWith(extension) && !file.startsWith('.')) {\n const fullPath = path.join(cognitiveDir, file);\n const stat = fs.statSync(fullPath);\n if (stat.isFile()) {\n return fullPath;\n }\n }\n }\n\n return null;\n }\n\n /**\n * Compare scanned cognitives with manifest and return differences\n */\n compare(\n scanned: ScannedCognitive[],\n manifestCognitives: ManifestCognitive[]\n ): ScanResult {\n const result: ScanResult = {\n found: scanned,\n new: [],\n removed: [],\n modified: [],\n unchanged: 0,\n errors: [],\n };\n\n // Create map of manifest cognitives\n const manifestMap = new Map<string, ManifestCognitive>();\n for (const cognitive of manifestCognitives) {\n manifestMap.set(cognitive.name, cognitive);\n }\n\n // Create map of scanned cognitives\n const scannedMap = new Map<string, ScannedCognitive>();\n for (const cognitive of scanned) {\n scannedMap.set(cognitive.name, cognitive);\n }\n\n // Find new and modified cognitives\n for (const scannedCognitive of scanned) {\n const manifestCognitive = manifestMap.get(scannedCognitive.name);\n\n if (manifestCognitive === undefined) {\n // New cognitive (in filesystem but not in manifest)\n result.new.push(scannedCognitive);\n } else if (\n manifestCognitive.hash !== undefined &&\n manifestCognitive.hash !== scannedCognitive.hash\n ) {\n // Modified cognitive\n result.modified.push(scannedCognitive);\n } else {\n result.unchanged++;\n }\n }\n\n // Find removed cognitives (in manifest but not in filesystem)\n for (const manifestCognitive of manifestCognitives) {\n if (!scannedMap.has(manifestCognitive.name)) {\n result.removed.push(manifestCognitive.name);\n }\n }\n\n return result;\n }\n\n /**\n * Convert a scanned cognitive to a manifest cognitive\n */\n toManifestCognitive(scanned: ScannedCognitive): ManifestCognitive {\n return {\n name: scanned.name,\n type: scanned.type,\n category: scanned.category,\n version: scanned.metadata.version ?? '1.0.0',\n installedAt: new Date().toISOString(),\n source: 'local',\n hash: scanned.hash,\n };\n }\n\n /**\n * Compute content hash for change detection\n */\n private computeHash(content: string): string {\n return crypto.createHash('sha256').update(content).digest('hex').slice(0, 16);\n }\n\n /**\n * List directories in a path\n */\n private listDirectories(dirPath: string): string[] {\n if (!fs.existsSync(dirPath)) {\n return [];\n }\n\n return fs\n .readdirSync(dirPath, { withFileTypes: true })\n .filter((dirent) => dirent.isDirectory())\n .filter((dirent) => !dirent.name.startsWith('.'))\n .map((dirent) => dirent.name);\n }\n\n /**\n * Detect cognitive type from directory contents\n */\n detectType(cognitiveDir: string): CognitiveType | null {\n for (const type of COGNITIVE_TYPES) {\n const fileName = COGNITIVE_FILE_NAMES[type];\n const filePath = path.join(cognitiveDir, fileName);\n if (fs.existsSync(filePath)) {\n return type;\n }\n }\n return null;\n }\n\n /**\n * Get cognitive count by type\n */\n countByType(cognitives: ScannedCognitive[]): Record<CognitiveType, number> {\n const counts: Record<CognitiveType, number> = {\n skill: 0,\n agent: 0,\n prompt: 0,\n workflow: 0,\n tool: 0,\n };\n\n for (const cognitive of cognitives) {\n counts[cognitive.type]++;\n }\n\n return counts;\n }\n}\n","/**\n * Frontmatter Parser\n *\n * Parse YAML frontmatter from cognitive files\n */\n\nimport type { CognitiveMetadata } from './types.js';\n\n/**\n * Parse YAML frontmatter from a markdown file content\n */\nexport function parseFrontmatter(content: string): CognitiveMetadata {\n // Match YAML frontmatter between ---\n const match = content.match(/^---\\n([\\s\\S]*?)\\n---/);\n\n if (match?.[1] === undefined) {\n return {};\n }\n\n try {\n return parseYaml(match[1]);\n } catch {\n return {};\n }\n}\n\n/**\n * Simple YAML parser for frontmatter\n * Handles basic key: value, arrays, and nested objects\n */\nfunction parseYaml(yaml: string): CognitiveMetadata {\n const result: CognitiveMetadata = {};\n const lines = yaml.split('\\n');\n\n let currentKey: string | null = null;\n let currentArray: string[] | null = null;\n\n for (const line of lines) {\n // Skip empty lines and comments\n if (line.trim() === '' || line.trim().startsWith('#')) {\n continue;\n }\n\n // Check for array item\n if (line.match(/^\\s+-\\s+/)) {\n const value = line.replace(/^\\s+-\\s+/, '').trim();\n if (currentArray !== null) {\n currentArray.push(cleanValue(value));\n }\n continue;\n }\n\n // Check for key: value\n const colonIndex = line.indexOf(':');\n if (colonIndex > 0) {\n const key = line.slice(0, colonIndex).trim();\n const rawValue = line.slice(colonIndex + 1).trim();\n\n // Save previous array if exists\n if (currentKey !== null && currentArray !== null) {\n setNestedValue(result, currentKey, currentArray);\n currentArray = null;\n }\n\n currentKey = key;\n\n if (rawValue === '' || rawValue === '|' || rawValue === '>') {\n // Start of array or multiline\n currentArray = [];\n } else if (rawValue.startsWith('[') && rawValue.endsWith(']')) {\n // Inline array\n const arrayContent = rawValue.slice(1, -1);\n const items = arrayContent.split(',').map((item) => cleanValue(item.trim()));\n setNestedValue(result, key, items);\n currentKey = null;\n } else {\n // Simple value\n setNestedValue(result, key, cleanValue(rawValue));\n currentKey = null;\n }\n }\n }\n\n // Save final array if exists\n if (currentKey !== null && currentArray !== null) {\n setNestedValue(result, currentKey, currentArray);\n }\n\n return result;\n}\n\n/**\n * Clean a YAML value (remove quotes, handle booleans, etc.)\n */\nfunction cleanValue(value: string): string {\n // Remove surrounding quotes\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n return value.slice(1, -1);\n }\n return value;\n}\n\n/**\n * Set a value in the result object, supporting nested keys\n */\nfunction setNestedValue(obj: CognitiveMetadata, key: string, value: unknown): void {\n // For now, just set flat keys\n // Could be extended to support nested objects like author.name\n (obj as Record<string, unknown>)[key] = value;\n}\n\n/**\n * Extract version from frontmatter or content\n */\nexport function extractVersion(metadata: CognitiveMetadata, content: string): string {\n // Check frontmatter first\n if (metadata.version !== undefined) {\n return metadata.version;\n }\n\n // Try to find version in content\n const versionMatch = content.match(/version:\\s*['\"]?([0-9]+\\.[0-9]+\\.[0-9]+)['\"]?/i);\n if (versionMatch?.[1] !== undefined) {\n return versionMatch[1];\n }\n\n return '1.0.0';\n}\n\n/**\n * Extract name from frontmatter, directory, or content\n */\nexport function extractName(\n metadata: CognitiveMetadata,\n dirName: string,\n content: string\n): string {\n // Check frontmatter first\n if (metadata.name !== undefined) {\n return metadata.name;\n }\n\n // Try to find name in content (# Title)\n const titleMatch = content.match(/^#\\s+(.+)$/m);\n if (titleMatch?.[1] !== undefined) {\n // Convert title to kebab-case\n return titleMatch[1]\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-|-$/g, '');\n }\n\n // Fall back to directory name\n return dirName;\n}\n","/**\n * Manifest Manager\n *\n * Service for reading, writing, and managing the manifest.json file\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport type {\n SynapSyncManifest,\n ManifestCognitive,\n ProviderSyncState,\n ReconciliationResult,\n} from './types.js';\nimport { DEFAULT_MANIFEST } from './types.js';\nimport type { SupportedProvider } from '../../core/constants.js';\n\nexport class ManifestManager {\n private manifestPath: string;\n private manifest: SynapSyncManifest;\n\n constructor(synapSyncDir: string) {\n this.manifestPath = path.join(synapSyncDir, 'manifest.json');\n this.manifest = this.load();\n }\n\n /**\n * Load manifest from disk\n */\n private load(): SynapSyncManifest {\n if (!fs.existsSync(this.manifestPath)) {\n return { ...DEFAULT_MANIFEST };\n }\n\n try {\n const content = fs.readFileSync(this.manifestPath, 'utf-8');\n const parsed = JSON.parse(content) as SynapSyncManifest;\n\n // Ensure all required fields exist\n return {\n version: parsed.version ?? DEFAULT_MANIFEST.version,\n lastUpdated: parsed.lastUpdated ?? DEFAULT_MANIFEST.lastUpdated,\n cognitives: parsed.cognitives ?? {},\n syncs: parsed.syncs ?? {},\n };\n } catch {\n return { ...DEFAULT_MANIFEST };\n }\n }\n\n /**\n * Save manifest to disk\n */\n save(): void {\n this.manifest.lastUpdated = new Date().toISOString();\n const content = JSON.stringify(this.manifest, null, 2);\n fs.writeFileSync(this.manifestPath, content, 'utf-8');\n }\n\n /**\n * Get the current manifest\n */\n getManifest(): SynapSyncManifest {\n return this.manifest;\n }\n\n /**\n * Get all cognitives from manifest\n */\n getCognitives(): ManifestCognitive[] {\n return Object.values(this.manifest.cognitives);\n }\n\n /**\n * Get a specific cognitive by name\n */\n getCognitive(name: string): ManifestCognitive | undefined {\n return this.manifest.cognitives[name];\n }\n\n /**\n * Check if a cognitive exists in manifest\n */\n hasCognitive(name: string): boolean {\n return this.manifest.cognitives[name] !== undefined;\n }\n\n /**\n * Add a cognitive to manifest\n */\n addCognitive(cognitive: ManifestCognitive): void {\n this.manifest.cognitives[cognitive.name] = cognitive;\n }\n\n /**\n * Update a cognitive in manifest\n */\n updateCognitive(name: string, updates: Partial<ManifestCognitive>): void {\n const existing = this.manifest.cognitives[name];\n if (existing !== undefined) {\n this.manifest.cognitives[name] = { ...existing, ...updates };\n }\n }\n\n /**\n * Remove a cognitive from manifest\n */\n removeCognitive(name: string): boolean {\n if (this.manifest.cognitives[name] !== undefined) {\n delete this.manifest.cognitives[name];\n return true;\n }\n return false;\n }\n\n /**\n * Reconcile manifest with scanned cognitives\n * Returns what was added, removed, and updated\n */\n reconcile(scannedCognitives: ManifestCognitive[]): ReconciliationResult {\n const result: ReconciliationResult = {\n added: [],\n removed: [],\n updated: [],\n unchanged: 0,\n };\n\n // Create a map of scanned cognitives for quick lookup\n const scannedMap = new Map<string, ManifestCognitive>();\n for (const cognitive of scannedCognitives) {\n scannedMap.set(cognitive.name, cognitive);\n }\n\n // Find removed cognitives (in manifest but not in filesystem)\n for (const name of Object.keys(this.manifest.cognitives)) {\n if (!scannedMap.has(name)) {\n result.removed.push(name);\n }\n }\n\n // Find added and updated cognitives\n for (const scanned of scannedCognitives) {\n const existing = this.manifest.cognitives[scanned.name];\n\n if (existing === undefined) {\n // New cognitive\n result.added.push(scanned);\n } else if (scanned.hash !== undefined && existing.hash !== scanned.hash) {\n // Modified cognitive\n result.updated.push(scanned);\n } else {\n result.unchanged++;\n }\n }\n\n return result;\n }\n\n /**\n * Apply reconciliation result to manifest\n */\n applyReconciliation(result: ReconciliationResult): void {\n // Remove deleted cognitives\n for (const name of result.removed) {\n delete this.manifest.cognitives[name];\n }\n\n // Add new cognitives\n for (const cognitive of result.added) {\n this.manifest.cognitives[cognitive.name] = cognitive;\n }\n\n // Update modified cognitives\n for (const cognitive of result.updated) {\n const existing = this.manifest.cognitives[cognitive.name];\n if (existing !== undefined) {\n const updated: ManifestCognitive = {\n ...existing,\n ...cognitive,\n // Keep original installation info\n installedAt: existing.installedAt,\n source: existing.source,\n };\n if (existing.sourceUrl !== undefined) {\n updated.sourceUrl = existing.sourceUrl;\n }\n this.manifest.cognitives[cognitive.name] = updated;\n }\n }\n }\n\n /**\n * Get provider sync state\n */\n getProviderSync(provider: SupportedProvider): ProviderSyncState | undefined {\n return this.manifest.syncs[provider];\n }\n\n /**\n * Update provider sync state\n */\n setProviderSync(provider: SupportedProvider, state: ProviderSyncState): void {\n this.manifest.syncs[provider] = state;\n }\n\n /**\n * Get all synced cognitives for a provider\n */\n getSyncedCognitives(provider: SupportedProvider): string[] {\n return this.manifest.syncs[provider]?.cognitives ?? [];\n }\n\n /**\n * Get cognitive count\n */\n getCognitiveCount(): number {\n return Object.keys(this.manifest.cognitives).length;\n }\n\n /**\n * Get cognitives by type\n */\n getCognitivesByType(type: string): ManifestCognitive[] {\n return Object.values(this.manifest.cognitives).filter((c) => c.type === type);\n }\n\n /**\n * Get cognitives by source\n */\n getCognitivesBySource(source: 'registry' | 'local' | 'github'): ManifestCognitive[] {\n return Object.values(this.manifest.cognitives).filter((c) => c.source === source);\n }\n}\n","/**\n * Manifest Types\n *\n * Type definitions for the SynapSync manifest.json file\n */\n\nimport type { CognitiveType, Category, SupportedProvider } from '../../core/constants.js';\n\n/**\n * Installed cognitive entry in the manifest\n */\nexport interface ManifestCognitive {\n name: string;\n type: CognitiveType;\n category: Category;\n version: string;\n installedAt: string;\n source: 'registry' | 'local' | 'github';\n sourceUrl?: string;\n hash?: string;\n}\n\n/**\n * Provider sync state\n */\nexport interface ProviderSyncState {\n lastSync: string;\n method: 'symlink' | 'copy';\n cognitives: string[];\n}\n\n/**\n * The main manifest structure\n */\nexport interface SynapSyncManifest {\n version: string;\n lastUpdated: string;\n cognitives: Record<string, ManifestCognitive>;\n syncs: Partial<Record<SupportedProvider, ProviderSyncState>>;\n}\n\n/**\n * Default empty manifest\n */\nexport const DEFAULT_MANIFEST: SynapSyncManifest = {\n version: '1.0.0',\n lastUpdated: new Date().toISOString(),\n cognitives: {},\n syncs: {},\n};\n\n/**\n * Manifest reconciliation result\n */\nexport interface ReconciliationResult {\n added: ManifestCognitive[];\n removed: string[];\n updated: ManifestCognitive[];\n unchanged: number;\n}\n","/**\n * Symlink Manager\n *\n * Manages symlinks and copies between .synapsync and provider directories\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport type {\n SymlinkCreateResult,\n ProviderSyncResult,\n SymlinkInfo,\n SymlinkOptions,\n CognitiveSymlinkMapping,\n} from './types.js';\nimport type { SupportedProvider, CognitiveType } from '../../core/constants.js';\nimport { PROVIDER_PATHS, COGNITIVE_TYPES, COGNITIVE_SYNC_MODE } from '../../core/constants.js';\nimport type { ScannedCognitive } from '../scanner/types.js';\n\nexport class SymlinkManager {\n private projectRoot: string;\n private synapSyncDir: string;\n private supportsSymlinks: boolean | null = null;\n\n constructor(projectRoot: string, synapSyncDir: string) {\n this.projectRoot = projectRoot;\n this.synapSyncDir = synapSyncDir;\n }\n\n /**\n * Check if the system supports symlinks\n */\n checkSymlinkSupport(): boolean {\n if (this.supportsSymlinks !== null) {\n return this.supportsSymlinks;\n }\n\n // On Windows, symlinks require admin privileges or developer mode\n if (process.platform === 'win32') {\n try {\n const testSource = path.join(this.synapSyncDir, '.symlink-test');\n const testTarget = path.join(this.synapSyncDir, '.symlink-test-target');\n\n // Create a test file\n fs.writeFileSync(testTarget, 'test', 'utf-8');\n\n // Try to create a symlink\n fs.symlinkSync(testTarget, testSource);\n\n // Clean up\n fs.unlinkSync(testSource);\n fs.unlinkSync(testTarget);\n\n this.supportsSymlinks = true;\n } catch {\n this.supportsSymlinks = false;\n }\n } else {\n // Unix-like systems generally support symlinks\n this.supportsSymlinks = true;\n }\n\n return this.supportsSymlinks;\n }\n\n /**\n * Sync cognitives to a provider\n */\n syncProvider(\n provider: SupportedProvider,\n cognitives: ScannedCognitive[],\n options: SymlinkOptions = {}\n ): ProviderSyncResult {\n const result: ProviderSyncResult = {\n provider,\n created: [],\n skipped: [],\n removed: [],\n errors: [],\n method: this.getMethod(options),\n };\n\n const providerPaths = PROVIDER_PATHS[provider];\n if (providerPaths === undefined) {\n result.errors.push({\n path: provider,\n operation: 'create',\n message: `Unknown provider: ${provider}`,\n });\n return result;\n }\n\n // Get mappings for all cognitives\n const mappings = this.getMappings(provider, cognitives);\n\n // Get existing symlinks/copies in provider directories\n const existingLinks = this.getExistingLinks(provider);\n\n // Create set of expected links\n const expectedNames = new Set(mappings.map((m) => `${m.cognitiveType}/${m.cognitiveName}`));\n\n // Find orphaned links (exist but cognitive no longer present)\n for (const link of existingLinks) {\n const key = `${link.cognitiveType}/${link.cognitiveName}`;\n if (!expectedNames.has(key)) {\n if (options.dryRun !== true) {\n try {\n this.removeLink(link.path);\n result.removed.push(link.cognitiveName);\n } catch (error) {\n result.errors.push({\n path: link.path,\n operation: 'remove',\n message: error instanceof Error ? error.message : 'Unknown error',\n });\n }\n } else {\n result.removed.push(link.cognitiveName);\n }\n }\n }\n\n // Create map of existing links for quick lookup\n const existingMap = new Map<string, SymlinkInfo>();\n for (const link of existingLinks) {\n existingMap.set(`${link.cognitiveType}/${link.cognitiveName}`, link);\n }\n\n // Process each mapping\n for (const mapping of mappings) {\n const key = `${mapping.cognitiveType}/${mapping.cognitiveName}`;\n const existing = existingMap.get(key);\n\n if (existing !== undefined && existing.isValid && options.force !== true) {\n // Already exists and valid\n result.skipped.push(mapping.cognitiveName);\n continue;\n }\n\n // Create the link\n if (options.dryRun !== true) {\n const createResult = this.createLink(mapping, options);\n result.created.push(createResult);\n\n if (!createResult.success && createResult.error !== undefined) {\n result.errors.push({\n path: mapping.targetPath,\n operation: 'create',\n message: createResult.error,\n });\n }\n } else {\n // Dry run - just report what would happen\n result.created.push({\n success: true,\n source: mapping.sourcePath,\n target: mapping.targetPath,\n method: result.method,\n });\n }\n }\n\n return result;\n }\n\n /**\n * Get mappings for cognitives to provider paths\n * Skills sync as folders (contain SKILL.md + assets/)\n * Other cognitives sync as flat files\n */\n private getMappings(\n provider: SupportedProvider,\n cognitives: ScannedCognitive[]\n ): CognitiveSymlinkMapping[] {\n const providerPaths = PROVIDER_PATHS[provider];\n const mappings: CognitiveSymlinkMapping[] = [];\n\n for (const cognitive of cognitives) {\n const typeDir = providerPaths[cognitive.type];\n if (typeDir === undefined) continue;\n\n const syncMode = COGNITIVE_SYNC_MODE[cognitive.type];\n\n if (syncMode === 'folder') {\n // Folder sync: symlink the entire cognitive directory\n // e.g., .claude/skills/skill-name/ -> .synapsync/skills/general/skill-name/\n mappings.push({\n cognitiveName: cognitive.name,\n cognitiveType: cognitive.type,\n sourcePath: cognitive.path, // Directory path\n targetPath: path.join(this.projectRoot, typeDir, cognitive.name),\n isFile: false,\n });\n } else {\n // File sync: symlink the cognitive file directly\n // e.g., .claude/agents/agent-name.md -> .synapsync/agents/general/agent-name/agent-name.md\n const fileName = cognitive.fileName ?? `${cognitive.name}.md`;\n mappings.push({\n cognitiveName: cognitive.name,\n cognitiveType: cognitive.type,\n sourcePath: cognitive.filePath, // File path\n targetPath: path.join(this.projectRoot, typeDir, fileName),\n isFile: true,\n });\n }\n }\n\n return mappings;\n }\n\n /**\n * Get existing links in provider directories\n * Scans for both files and directories (for backward compatibility)\n */\n getExistingLinks(provider: SupportedProvider): SymlinkInfo[] {\n const providerPaths = PROVIDER_PATHS[provider];\n const links: SymlinkInfo[] = [];\n\n for (const cognitiveType of COGNITIVE_TYPES) {\n const typeDir = providerPaths[cognitiveType];\n if (typeDir === undefined) continue;\n\n const fullPath = path.join(this.projectRoot, typeDir);\n if (!fs.existsSync(fullPath)) continue;\n\n const entries = fs.readdirSync(fullPath, { withFileTypes: true });\n\n for (const entry of entries) {\n if (entry.name.startsWith('.')) continue;\n\n const entryPath = path.join(fullPath, entry.name);\n\n // Include files (new flat structure) and directories/symlinks (legacy)\n if (entry.isFile() || entry.isDirectory() || entry.isSymbolicLink()) {\n const info = this.getLinkInfo(entryPath, cognitiveType);\n if (info !== null) {\n links.push(info);\n }\n }\n }\n }\n\n return links;\n }\n\n /**\n * Get information about a link\n */\n private getLinkInfo(linkPath: string, cognitiveType: CognitiveType): SymlinkInfo | null {\n try {\n const stats = fs.lstatSync(linkPath);\n const isSymlink = stats.isSymbolicLink();\n const baseName = path.basename(linkPath);\n\n // For symlinks, check what type it points to\n let isDirectory = stats.isDirectory();\n if (isSymlink) {\n try {\n const realStats = fs.statSync(linkPath);\n isDirectory = realStats.isDirectory();\n } catch {\n // Target doesn't exist, assume based on extension\n isDirectory = !baseName.match(/\\.(md|yaml)$/i);\n }\n }\n\n // Only strip extension for files, not directories\n // Folders: \"skill-name\" stays \"skill-name\"\n // Files: \"agent-name.md\" becomes \"agent-name\"\n const cognitiveName = isDirectory ? baseName : baseName.replace(/\\.(md|yaml)$/i, '');\n\n let target = '';\n let isValid = false;\n\n if (isSymlink) {\n target = fs.readlinkSync(linkPath);\n // Resolve relative to the link's directory\n const resolvedTarget = path.resolve(path.dirname(linkPath), target);\n isValid = fs.existsSync(resolvedTarget);\n } else if (stats.isDirectory()) {\n // It's a directory copy (legacy)\n target = linkPath;\n isValid = true;\n } else if (stats.isFile()) {\n // It's a file copy\n target = linkPath;\n isValid = true;\n }\n\n return {\n path: linkPath,\n target,\n exists: true,\n isSymlink,\n isValid,\n cognitiveName,\n cognitiveType,\n };\n } catch {\n return null;\n }\n }\n\n /**\n * Create a symlink or copy\n */\n private createLink(mapping: CognitiveSymlinkMapping, options: SymlinkOptions): SymlinkCreateResult {\n const method = this.getMethod(options);\n const isFile = mapping.isFile ?? false;\n\n try {\n // Ensure parent directory exists\n const targetDir = path.dirname(mapping.targetPath);\n if (!fs.existsSync(targetDir)) {\n fs.mkdirSync(targetDir, { recursive: true });\n }\n\n // Remove existing if force\n if (fs.existsSync(mapping.targetPath)) {\n if (options.force === true) {\n this.removeLink(mapping.targetPath);\n } else {\n return {\n success: false,\n source: mapping.sourcePath,\n target: mapping.targetPath,\n method,\n error: 'Target already exists',\n };\n }\n }\n\n if (method === 'symlink') {\n // Calculate relative path for symlink\n const relativePath = path.relative(targetDir, mapping.sourcePath);\n // Use 'file' type for file symlinks, 'dir' for directory symlinks\n fs.symlinkSync(relativePath, mapping.targetPath, isFile ? 'file' : 'dir');\n } else {\n // Copy file or directory\n if (isFile) {\n fs.copyFileSync(mapping.sourcePath, mapping.targetPath);\n } else {\n this.copyDirectory(mapping.sourcePath, mapping.targetPath);\n }\n }\n\n return {\n success: true,\n source: mapping.sourcePath,\n target: mapping.targetPath,\n method,\n };\n } catch (error) {\n // If symlink fails, try copy as fallback\n if (method === 'symlink' && options.copy !== true) {\n try {\n if (isFile) {\n fs.copyFileSync(mapping.sourcePath, mapping.targetPath);\n } else {\n this.copyDirectory(mapping.sourcePath, mapping.targetPath);\n }\n return {\n success: true,\n source: mapping.sourcePath,\n target: mapping.targetPath,\n method: 'copy',\n };\n } catch (copyError) {\n return {\n success: false,\n source: mapping.sourcePath,\n target: mapping.targetPath,\n method: 'copy',\n error: copyError instanceof Error ? copyError.message : 'Copy failed',\n };\n }\n }\n\n return {\n success: false,\n source: mapping.sourcePath,\n target: mapping.targetPath,\n method,\n error: error instanceof Error ? error.message : 'Unknown error',\n };\n }\n }\n\n /**\n * Remove a symlink, file, or directory\n */\n private removeLink(linkPath: string): void {\n const stats = fs.lstatSync(linkPath);\n\n if (stats.isSymbolicLink() || stats.isFile()) {\n fs.unlinkSync(linkPath);\n } else if (stats.isDirectory()) {\n fs.rmSync(linkPath, { recursive: true });\n }\n }\n\n /**\n * Copy a directory recursively\n */\n private copyDirectory(source: string, target: string): void {\n fs.mkdirSync(target, { recursive: true });\n\n const entries = fs.readdirSync(source, { withFileTypes: true });\n\n for (const entry of entries) {\n const sourcePath = path.join(source, entry.name);\n const targetPath = path.join(target, entry.name);\n\n if (entry.isDirectory()) {\n this.copyDirectory(sourcePath, targetPath);\n } else {\n fs.copyFileSync(sourcePath, targetPath);\n }\n }\n }\n\n /**\n * Get the sync method to use\n */\n private getMethod(options: SymlinkOptions): 'symlink' | 'copy' {\n if (options.copy === true) {\n return 'copy';\n }\n\n if (!this.checkSymlinkSupport()) {\n return 'copy';\n }\n\n return 'symlink';\n }\n\n /**\n * Verify all symlinks for a provider are valid\n */\n verifyProvider(provider: SupportedProvider): {\n valid: SymlinkInfo[];\n broken: SymlinkInfo[];\n orphaned: SymlinkInfo[];\n } {\n const existingLinks = this.getExistingLinks(provider);\n const valid: SymlinkInfo[] = [];\n const broken: SymlinkInfo[] = [];\n const orphaned: SymlinkInfo[] = [];\n\n for (const link of existingLinks) {\n if (!link.isValid) {\n broken.push(link);\n } else {\n // Check if the target is within .synapsync\n if (link.isSymlink) {\n const resolvedTarget = path.resolve(path.dirname(link.path), link.target);\n if (!resolvedTarget.includes(path.basename(this.synapSyncDir))) {\n orphaned.push(link);\n } else {\n valid.push(link);\n }\n } else {\n valid.push(link);\n }\n }\n }\n\n return { valid, broken, orphaned };\n }\n\n /**\n * Clean up orphaned and broken symlinks\n */\n cleanProvider(provider: SupportedProvider, dryRun = false): string[] {\n const { broken, orphaned } = this.verifyProvider(provider);\n const removed: string[] = [];\n\n for (const link of [...broken, ...orphaned]) {\n if (!dryRun) {\n try {\n this.removeLink(link.path);\n removed.push(link.cognitiveName);\n } catch {\n // Ignore errors during cleanup\n }\n } else {\n removed.push(link.cognitiveName);\n }\n }\n\n return removed;\n }\n}\n","/**\n * List Command\n *\n * List installed cognitives or browse registry\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport type { Command } from 'commander';\nimport pc from 'picocolors';\nimport { ConfigManager } from '../services/config/manager.js';\nimport { RegistryClient } from '../services/registry/client.js';\nimport { COGNITIVE_TYPES, CATEGORIES } from '../core/constants.js';\nimport type { CognitiveType, Category } from '../core/constants.js';\nimport type { InstalledCognitive, RegistryCognitiveEntry } from '../types/index.js';\nimport { logger } from '../utils/logger.js';\n\n// ============================================\n// Types\n// ============================================\n\ninterface ListCommandOptions {\n type?: string;\n category?: string;\n json?: boolean;\n remote?: boolean;\n}\n\ninterface ProjectManifest {\n version: string;\n lastUpdated: string;\n cognitives: Record<string, InstalledCognitive>;\n syncs: Record<string, unknown>;\n}\n\n// ============================================\n// Main Function\n// ============================================\n\n/**\n * Execute the list command\n */\nexport async function executeListCommand(options: ListCommandOptions): Promise<void> {\n logger.line();\n\n // Remote mode: list all cognitives from registry\n if (options.remote === true) {\n await listRemoteCognitives(options);\n return;\n }\n\n // Check if project is initialized\n const configManager = ConfigManager.findConfig();\n if (configManager === null) {\n logger.error('No SynapSync project found.');\n logger.hint('Run synapsync init to initialize a project first.');\n return;\n }\n\n // Validate options\n const validatedOptions = validateOptions(options);\n if (validatedOptions === null) {\n return;\n }\n\n // Read manifest\n const manifest = readManifest(configManager);\n\n if (options.json === true) {\n // JSON output\n const cognitives = Object.values(manifest.cognitives);\n const filtered = filterCognitives(cognitives, validatedOptions);\n console.log(JSON.stringify(filtered, null, 2));\n return;\n }\n\n // Display results\n displayCognitives(manifest, validatedOptions);\n}\n\n// ============================================\n// Remote Registry Listing\n// ============================================\n\nasync function listRemoteCognitives(options: ListCommandOptions): Promise<void> {\n const client = new RegistryClient();\n\n logger.log(` ${pc.dim('Fetching registry...')}`);\n\n try {\n const cognitives = await client.list();\n\n // Validate and filter\n const validatedOptions = validateOptions(options);\n if (validatedOptions === null) {\n return;\n }\n\n const filtered = filterRemoteCognitives(cognitives, validatedOptions);\n\n if (options.json === true) {\n console.log(JSON.stringify(filtered, null, 2));\n return;\n }\n\n // Display results\n displayRemoteCognitives(filtered);\n } catch (error) {\n logger.error(`Failed to fetch registry: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n}\n\nfunction filterRemoteCognitives(\n cognitives: RegistryCognitiveEntry[],\n options: ValidatedOptions\n): RegistryCognitiveEntry[] {\n return cognitives.filter((c) => {\n if (options.type !== undefined && c.type !== options.type) {\n return false;\n }\n if (options.category !== undefined && c.category !== options.category) {\n return false;\n }\n return true;\n });\n}\n\nfunction displayRemoteCognitives(cognitives: RegistryCognitiveEntry[]): void {\n logger.line();\n logger.bold(' Available Cognitives (Registry)');\n logger.line();\n\n if (cognitives.length === 0) {\n logger.log(` ${pc.dim('No cognitives found in registry.')}`);\n return;\n }\n\n // Group by type\n const grouped: Record<string, RegistryCognitiveEntry[]> = {};\n for (const cognitive of cognitives) {\n grouped[cognitive.type] ??= [];\n (grouped[cognitive.type] as RegistryCognitiveEntry[]).push(cognitive);\n }\n\n for (const [type, items] of Object.entries(grouped)) {\n const typeIcon = getCognitiveIcon(type as CognitiveType);\n const typeLabel = `${type}s`;\n logger.log(` ${typeIcon} ${pc.bold(typeLabel.charAt(0).toUpperCase() + typeLabel.slice(1))} (${items.length})`);\n logger.line();\n\n for (const cognitive of items) {\n // Name and version\n logger.log(` ${pc.white(cognitive.name)} ${pc.dim(`v${cognitive.version}`)}`);\n\n // Description (truncated)\n if (cognitive.description) {\n const desc = cognitive.description.length > 60\n ? cognitive.description.slice(0, 57) + '...'\n : cognitive.description;\n logger.log(` ${pc.dim(desc)}`);\n }\n\n // Details\n const details: string[] = [];\n details.push(pc.dim(cognitive.category));\n if (cognitive.author) {\n details.push(pc.dim(`by ${cognitive.author}`));\n }\n logger.log(` ${details.join(' · ')}`);\n\n // Tags\n if (cognitive.tags !== undefined && cognitive.tags.length > 0) {\n const tagsStr = cognitive.tags.slice(0, 5).join(' ');\n logger.log(` ${pc.cyan(tagsStr)}`);\n }\n\n logger.line();\n }\n }\n\n // Summary\n logger.log(` ${pc.dim(`Total: ${cognitives.length} cognitive${cognitives.length === 1 ? '' : 's'} available`)}`);\n logger.line();\n logger.hint('Run synapsync install <name> to install a cognitive.');\n}\n\n// ============================================\n// Validation\n// ============================================\n\ninterface ValidatedOptions {\n type?: CognitiveType;\n category?: Category;\n}\n\nfunction validateOptions(options: ListCommandOptions): ValidatedOptions | null {\n const validated: ValidatedOptions = {};\n\n // Validate type\n if (options.type !== undefined) {\n if (!COGNITIVE_TYPES.includes(options.type as CognitiveType)) {\n logger.error(`Invalid type: ${options.type}`);\n logger.hint(`Valid types: ${COGNITIVE_TYPES.join(', ')}`);\n return null;\n }\n validated.type = options.type as CognitiveType;\n }\n\n // Validate category\n if (options.category !== undefined) {\n if (!(CATEGORIES as readonly string[]).includes(options.category)) {\n logger.error(`Invalid category: ${options.category}`);\n logger.hint(`Valid categories: ${CATEGORIES.join(', ')}`);\n return null;\n }\n validated.category = options.category as Category;\n }\n\n return validated;\n}\n\n// ============================================\n// Manifest Reading\n// ============================================\n\nfunction readManifest(configManager: ConfigManager): ProjectManifest {\n const synapSyncDir = configManager.getSynapSyncDir();\n const manifestPath = path.join(synapSyncDir, 'manifest.json');\n\n if (!fs.existsSync(manifestPath)) {\n return {\n version: '1.0.0',\n lastUpdated: new Date().toISOString(),\n cognitives: {},\n syncs: {},\n };\n }\n\n try {\n const content = fs.readFileSync(manifestPath, 'utf-8');\n return JSON.parse(content) as ProjectManifest;\n } catch {\n return {\n version: '1.0.0',\n lastUpdated: new Date().toISOString(),\n cognitives: {},\n syncs: {},\n };\n }\n}\n\nfunction filterCognitives(\n cognitives: InstalledCognitive[],\n options: ValidatedOptions\n): InstalledCognitive[] {\n return cognitives.filter((c) => {\n if (options.type !== undefined && c.type !== options.type) {\n return false;\n }\n if (options.category !== undefined && c.category !== options.category) {\n return false;\n }\n return true;\n });\n}\n\n// ============================================\n// Display Functions\n// ============================================\n\nfunction displayCognitives(manifest: ProjectManifest, options: ValidatedOptions): void {\n const cognitives = Object.values(manifest.cognitives);\n const filtered = filterCognitives(cognitives, options);\n\n // Header\n logger.bold(' Installed Cognitives');\n logger.line();\n\n if (filtered.length === 0) {\n if (cognitives.length === 0) {\n logger.log(` ${pc.dim('No cognitives installed yet.')}`);\n logger.line();\n logger.hint('Run synapsync search to find cognitives to install.');\n } else {\n logger.log(` ${pc.dim('No cognitives match the specified filters.')}`);\n logger.line();\n logger.hint('Try removing filters to see all installed cognitives.');\n }\n return;\n }\n\n // Group by type\n const grouped = groupByType(filtered);\n\n for (const [type, items] of Object.entries(grouped)) {\n const typeIcon = getCognitiveIcon(type as CognitiveType);\n const typeLabel = `${type}s`;\n logger.log(` ${typeIcon} ${pc.bold(typeLabel.charAt(0).toUpperCase() + typeLabel.slice(1))} (${items.length})`);\n logger.line();\n\n for (const cognitive of items) {\n displayCognitive(cognitive);\n }\n }\n\n // Summary\n logger.line();\n logger.log(` ${pc.dim(`Total: ${filtered.length} cognitive${filtered.length === 1 ? '' : 's'}`)}`);\n logger.line();\n logger.hint('Run synapsync uninstall <name> to remove a cognitive.');\n}\n\nfunction groupByType(cognitives: InstalledCognitive[]): Record<string, InstalledCognitive[]> {\n const grouped: Record<string, InstalledCognitive[]> = {};\n\n for (const cognitive of cognitives) {\n grouped[cognitive.type] ??= [];\n (grouped[cognitive.type] as InstalledCognitive[]).push(cognitive);\n }\n\n return grouped;\n}\n\nfunction displayCognitive(cognitive: InstalledCognitive): void {\n // Name and version\n logger.log(` ${pc.white(cognitive.name)} ${pc.dim(`v${cognitive.version}`)}`);\n\n // Details\n const details: string[] = [];\n details.push(pc.dim(cognitive.category));\n details.push(pc.dim(`from ${cognitive.source}`));\n\n if (cognitive.installedAt !== undefined) {\n const date = new Date(cognitive.installedAt);\n details.push(pc.dim(`installed ${formatDate(date)}`));\n }\n\n logger.log(` ${details.join(' · ')}`);\n logger.line();\n}\n\nfunction getCognitiveIcon(type: CognitiveType): string {\n const icons: Record<CognitiveType, string> = {\n skill: pc.blue('◆'),\n agent: pc.magenta('◆'),\n prompt: pc.yellow('◆'),\n workflow: pc.cyan('◆'),\n tool: pc.green('◆'),\n };\n return icons[type];\n}\n\nfunction formatDate(date: Date): string {\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24));\n\n if (diffDays === 0) {\n return 'today';\n } else if (diffDays === 1) {\n return 'yesterday';\n } else if (diffDays < 7) {\n return `${diffDays} days ago`;\n } else if (diffDays < 30) {\n const weeks = Math.floor(diffDays / 7);\n return `${weeks} week${weeks === 1 ? '' : 's'} ago`;\n } else {\n return date.toLocaleDateString();\n }\n}\n\n// ============================================\n// Command Registration\n// ============================================\n\n/**\n * Register list command with Commander\n */\nexport function registerListCommand(program: Command): void {\n program\n .command('list')\n .alias('ls')\n .description('List installed cognitives or browse registry')\n .option('-t, --type <type>', 'Filter by type (skill, agent, prompt, workflow, tool)')\n .option('-c, --category <category>', 'Filter by category')\n .option('-r, --remote', 'List all cognitives available in the registry')\n .option('--json', 'Output as JSON')\n .action(async (options: ListCommandOptions) => {\n await executeListCommand(options);\n });\n}\n","/**\n * Uninstall Command\n *\n * Remove installed cognitives from the project\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport type { Command } from 'commander';\nimport pc from 'picocolors';\nimport { ConfigManager } from '../services/config/manager.js';\nimport type { InstalledCognitive } from '../types/index.js';\nimport { logger } from '../utils/logger.js';\n\n// ============================================\n// Types\n// ============================================\n\ninterface UninstallCommandOptions {\n force?: boolean;\n keepFiles?: boolean;\n}\n\ninterface ProjectManifest {\n version: string;\n lastUpdated: string;\n cognitives: Record<string, InstalledCognitive>;\n syncs: Record<string, unknown>;\n}\n\n// ============================================\n// Main Function\n// ============================================\n\n/**\n * Execute the uninstall command\n */\nexport function executeUninstallCommand(\n name: string,\n options: UninstallCommandOptions\n): void {\n logger.line();\n\n // Check if project is initialized\n const configManager = ConfigManager.findConfig();\n if (configManager === null) {\n logger.error('No SynapSync project found.');\n logger.hint('Run synapsync init to initialize a project first.');\n return;\n }\n\n // Read manifest\n const manifest = readManifest(configManager);\n const cognitive = manifest.cognitives[name];\n\n if (cognitive === undefined) {\n logger.error(`Cognitive '${name}' is not installed.`);\n logger.hint('Run synapsync list to see installed cognitives.');\n return;\n }\n\n // Confirm uninstall (unless --force)\n if (options.force !== true) {\n logger.log(` ${pc.yellow('!')} About to uninstall ${pc.bold(name)}`);\n logger.log(` ${pc.dim('Type:')} ${cognitive.type}`);\n logger.log(` ${pc.dim('Category:')} ${cognitive.category}`);\n logger.log(` ${pc.dim('Version:')} ${cognitive.version}`);\n logger.line();\n logger.hint('Use --force to skip confirmation and uninstall directly.');\n logger.log(` ${pc.dim('To confirm, run:')} synapsync uninstall ${name} --force`);\n return;\n }\n\n try {\n // Remove files (unless --keep-files)\n if (options.keepFiles !== true) {\n const cognitiveDir = getCognitiveDir(configManager, cognitive);\n if (fs.existsSync(cognitiveDir)) {\n fs.rmSync(cognitiveDir, { recursive: true, force: true });\n logger.log(` ${pc.dim('Removed files from')} ${path.relative(process.cwd(), cognitiveDir)}`);\n }\n }\n\n // Update manifest\n delete manifest.cognitives[name];\n manifest.lastUpdated = new Date().toISOString();\n saveManifest(configManager, manifest);\n\n // Success\n logger.line();\n logger.log(` ${pc.green('✓')} Uninstalled ${pc.bold(name)}`);\n logger.line();\n\n // Check for provider symlinks that might need cleanup\n logger.hint('Note: Provider symlinks may need manual cleanup if sync was run.');\n } catch (error) {\n logger.line();\n if (error instanceof Error) {\n logger.error(`Uninstall failed: ${error.message}`);\n } else {\n logger.error('Uninstall failed with unknown error');\n }\n }\n}\n\n// ============================================\n// Manifest Operations\n// ============================================\n\nfunction readManifest(configManager: ConfigManager): ProjectManifest {\n const synapSyncDir = configManager.getSynapSyncDir();\n const manifestPath = path.join(synapSyncDir, 'manifest.json');\n\n if (!fs.existsSync(manifestPath)) {\n return {\n version: '1.0.0',\n lastUpdated: new Date().toISOString(),\n cognitives: {},\n syncs: {},\n };\n }\n\n try {\n const content = fs.readFileSync(manifestPath, 'utf-8');\n return JSON.parse(content) as ProjectManifest;\n } catch {\n return {\n version: '1.0.0',\n lastUpdated: new Date().toISOString(),\n cognitives: {},\n syncs: {},\n };\n }\n}\n\nfunction saveManifest(configManager: ConfigManager, manifest: ProjectManifest): void {\n const synapSyncDir = configManager.getSynapSyncDir();\n const manifestPath = path.join(synapSyncDir, 'manifest.json');\n fs.writeFileSync(manifestPath, JSON.stringify(manifest, null, 2), 'utf-8');\n}\n\nfunction getCognitiveDir(configManager: ConfigManager, cognitive: InstalledCognitive): string {\n const synapSyncDir = configManager.getSynapSyncDir();\n return path.join(synapSyncDir, `${cognitive.type}s`, cognitive.category, cognitive.name);\n}\n\n// ============================================\n// Command Registration\n// ============================================\n\n/**\n * Register uninstall command with Commander\n */\nexport function registerUninstallCommand(program: Command): void {\n program\n .command('uninstall <name>')\n .alias('rm')\n .description('Uninstall a cognitive')\n .option('-f, --force', 'Skip confirmation')\n .option('--keep-files', 'Remove from manifest but keep files')\n .action((name: string, options: UninstallCommandOptions) => {\n executeUninstallCommand(name, options);\n });\n}\n","/**\n * Sync Command\n *\n * Synchronize the filesystem with the manifest.json and providers\n * Phase 1: Detects locally-created cognitives and updates manifest\n * Phase 2: Creates symlinks in provider directories\n */\n\nimport type { Command } from 'commander';\nimport pc from 'picocolors';\nimport { ConfigManager } from '../services/config/manager.js';\nimport { SyncEngine } from '../services/sync/engine.js';\nimport type { SyncResult, SyncAction, SyncOptions } from '../services/sync/types.js';\nimport type { ProviderSyncResult } from '../services/symlink/types.js';\nimport { COGNITIVE_TYPES, CATEGORIES, SUPPORTED_PROVIDERS } from '../core/constants.js';\nimport type { CognitiveType, Category, SupportedProvider } from '../core/constants.js';\nimport { logger } from '../utils/logger.js';\n\n// ============================================\n// Types\n// ============================================\n\ninterface SyncCommandOptions {\n dryRun?: boolean;\n type?: string;\n category?: string;\n provider?: string;\n copy?: boolean;\n force?: boolean;\n json?: boolean;\n verbose?: boolean;\n}\n\n// ============================================\n// Main Function\n// ============================================\n\n/**\n * Execute the sync command\n */\nexport function executeSyncCommand(options: SyncCommandOptions): void {\n logger.line();\n\n // Check if project is initialized\n const configManager = ConfigManager.findConfig();\n if (configManager === null) {\n logger.error('No SynapSync project found.');\n logger.hint('Run synapsync init to initialize a project first.');\n return;\n }\n\n // Validate options\n const validatedOptions = validateOptions(options);\n if (validatedOptions === null) {\n return;\n }\n\n // Create sync engine with config\n const synapSyncDir = configManager.getSynapSyncDir();\n const projectRoot = configManager.getProjectRoot();\n const config = configManager.getConfig();\n const syncEngine = new SyncEngine(synapSyncDir, projectRoot, config);\n\n // Show header\n if (options.json !== true) {\n if (options.dryRun === true) {\n logger.bold(' Sync Preview (Dry Run)');\n } else {\n logger.bold(' Syncing Cognitives');\n }\n logger.line();\n }\n\n // Perform sync\n const syncOpts: SyncOptions = {};\n if (options.dryRun !== undefined) syncOpts.dryRun = options.dryRun;\n if (validatedOptions.types !== undefined) syncOpts.types = validatedOptions.types;\n if (validatedOptions.categories !== undefined) syncOpts.categories = validatedOptions.categories;\n if (validatedOptions.provider !== undefined) syncOpts.provider = validatedOptions.provider;\n if (options.copy !== undefined) syncOpts.copy = options.copy;\n if (options.force !== undefined) syncOpts.force = options.force;\n if (options.verbose !== undefined) syncOpts.verbose = options.verbose;\n const result = syncEngine.sync(\n syncOpts,\n options.json !== true\n ? (status) => {\n if (options.verbose === true) {\n logger.log(` ${pc.dim(status.message)}`);\n }\n }\n : undefined\n );\n\n // Output results\n if (options.json === true) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n displayResults(result, options);\n}\n\n// ============================================\n// Validation\n// ============================================\n\ninterface ValidatedSyncOptions {\n types?: CognitiveType[];\n categories?: Category[];\n provider?: SupportedProvider;\n}\n\nfunction validateOptions(options: SyncCommandOptions): ValidatedSyncOptions | null {\n const validated: ValidatedSyncOptions = {};\n\n // Validate type\n if (options.type !== undefined) {\n if (!COGNITIVE_TYPES.includes(options.type as CognitiveType)) {\n logger.error(`Invalid type: ${options.type}`);\n logger.hint(`Valid types: ${COGNITIVE_TYPES.join(', ')}`);\n return null;\n }\n validated.types = [options.type as CognitiveType];\n }\n\n // Validate category\n if (options.category !== undefined) {\n if (!(CATEGORIES as readonly string[]).includes(options.category)) {\n logger.error(`Invalid category: ${options.category}`);\n logger.hint(`Valid categories: ${CATEGORIES.join(', ')}`);\n return null;\n }\n validated.categories = [options.category as Category];\n }\n\n // Validate provider\n if (options.provider !== undefined) {\n if (!SUPPORTED_PROVIDERS.includes(options.provider as SupportedProvider)) {\n logger.error(`Invalid provider: ${options.provider}`);\n logger.hint(`Valid providers: ${SUPPORTED_PROVIDERS.join(', ')}`);\n return null;\n }\n validated.provider = options.provider as SupportedProvider;\n }\n\n return validated;\n}\n\n// ============================================\n// Display Functions\n// ============================================\n\nfunction displayResults(result: SyncResult, options: SyncCommandOptions): void {\n const hasManifestChanges = result.added > 0 || result.removed > 0 || result.updated > 0;\n const hasProviderResults = result.providerResults !== undefined && result.providerResults.length > 0;\n\n // Check if there are any provider changes\n const hasProviderChanges = hasProviderResults && result.providerResults?.some(\n (pr) => pr.created.length > 0 || pr.removed.length > 0\n );\n\n if (!hasManifestChanges && hasProviderChanges !== true) {\n logger.log(` ${pc.green('✓')} Everything is in sync`);\n logger.line();\n logger.log(` ${pc.dim(`${result.total} cognitives in manifest`)}`);\n if (hasProviderResults && result.providerResults !== undefined) {\n const syncedProviders = result.providerResults.filter((pr) => pr.skipped.length > 0 || pr.created.length > 0);\n if (syncedProviders.length > 0) {\n logger.log(` ${pc.dim(`${syncedProviders.length} provider(s) synced`)}`);\n }\n }\n logger.line();\n return;\n }\n\n // Display manifest actions\n if (result.actions.length > 0 && (options.verbose === true || options.dryRun === true)) {\n logger.bold(' Manifest Changes:');\n logger.line();\n displayActions(result.actions, options.dryRun === true);\n logger.line();\n }\n\n // Display manifest summary\n if (hasManifestChanges) {\n if (options.dryRun === true) {\n logger.bold(' Manifest changes to apply:');\n } else {\n logger.bold(' Manifest sync:');\n }\n logger.line();\n\n if (result.added > 0) {\n logger.log(` ${pc.green('+')} ${result.added} added`);\n }\n if (result.updated > 0) {\n logger.log(` ${pc.yellow('~')} ${result.updated} updated`);\n }\n if (result.removed > 0) {\n logger.log(` ${pc.red('-')} ${result.removed} removed`);\n }\n if (result.unchanged > 0) {\n logger.log(` ${pc.dim('○')} ${result.unchanged} unchanged`);\n }\n logger.line();\n }\n\n // Display provider results\n if (hasProviderResults) {\n logger.bold(' Provider sync:');\n logger.line();\n\n for (const providerResult of result.providerResults ?? []) {\n displayProviderResult(providerResult, options);\n }\n }\n\n // Summary\n logger.log(` ${pc.dim(`Total: ${result.total} cognitives | Duration: ${result.duration}ms`)}`);\n logger.line();\n\n // Errors\n if (result.errors.length > 0) {\n logger.line();\n logger.bold(` ${pc.red('Errors:')}`);\n logger.line();\n for (const error of result.errors) {\n logger.log(` ${pc.red('✗')} ${error.cognitive ?? 'Unknown'}: ${error.message}`);\n }\n logger.line();\n }\n\n // Hints\n if (options.dryRun === true) {\n logger.hint('Run synapsync sync without --dry-run to apply changes.');\n } else {\n logger.hint('Run synapsync list to see all installed cognitives.');\n }\n}\n\nfunction displayActions(actions: SyncAction[], isDryRun: boolean): void {\n const verb = isDryRun ? 'Would' : 'Did';\n\n for (const action of actions) {\n const name = typeof action.cognitive === 'string' ? action.cognitive : action.cognitive.name;\n\n switch (action.operation) {\n case 'add':\n logger.log(` ${pc.green('+')} ${verb} add: ${pc.white(name)}`);\n break;\n case 'update':\n logger.log(` ${pc.yellow('~')} ${verb} update: ${pc.white(name)}`);\n break;\n case 'remove':\n logger.log(` ${pc.red('-')} ${verb} remove: ${pc.white(name)}`);\n break;\n }\n }\n}\n\nfunction displayProviderResult(result: ProviderSyncResult, options: SyncCommandOptions): void {\n const created = result.created.filter((c) => c.success).length;\n const skipped = result.skipped.length;\n const removed = result.removed.length;\n const errors = result.errors.length;\n\n const methodLabel = result.method === 'symlink' ? 'symlinks' : 'copies';\n const hasChanges = created > 0 || removed > 0;\n\n logger.log(` ${pc.cyan(result.provider)}:`);\n\n if (hasChanges || options.verbose === true) {\n if (created > 0) {\n logger.log(` ${pc.green('✓')} ${created} ${methodLabel} created`);\n }\n if (skipped > 0) {\n logger.log(` ${pc.dim('○')} ${skipped} already synced`);\n }\n if (removed > 0) {\n logger.log(` ${pc.red('-')} ${removed} orphaned removed`);\n }\n if (errors > 0) {\n logger.log(` ${pc.red('✗')} ${errors} errors`);\n }\n } else {\n logger.log(` ${pc.green('✓')} ${skipped + created} ${methodLabel} synced`);\n }\n\n logger.line();\n}\n\n// ============================================\n// Status Subcommand\n// ============================================\n\n/**\n * Execute the sync status subcommand\n */\nexport function executeSyncStatusCommand(options: { json?: boolean }): void {\n logger.line();\n\n // Check if project is initialized\n const configManager = ConfigManager.findConfig();\n if (configManager === null) {\n logger.error('No SynapSync project found.');\n logger.hint('Run synapsync init to initialize a project first.');\n return;\n }\n\n // Create sync engine with config\n const synapSyncDir = configManager.getSynapSyncDir();\n const projectRoot = configManager.getProjectRoot();\n const config = configManager.getConfig();\n const syncEngine = new SyncEngine(synapSyncDir, projectRoot, config);\n\n // Get status\n const status = syncEngine.getStatus();\n\n // Get provider status\n const providers = config.sync?.providers ?? {};\n const enabledProviders = Object.entries(providers)\n .filter(([, cfg]) => (cfg as { enabled?: boolean }).enabled === true)\n .map(([name]) => name as SupportedProvider);\n\n const providerStatuses: Record<string, { valid: number; broken: number; orphaned: number }> = {};\n for (const provider of enabledProviders) {\n providerStatuses[provider] = syncEngine.getProviderStatus(provider);\n }\n\n if (options.json === true) {\n console.log(JSON.stringify({ ...status, providers: providerStatuses }, null, 2));\n return;\n }\n\n // Display status\n logger.bold(' Sync Status');\n logger.line();\n\n if (status.inSync) {\n logger.log(` ${pc.green('✓')} Filesystem and manifest are in sync`);\n } else {\n logger.log(` ${pc.yellow('!')} Out of sync`);\n }\n\n logger.line();\n logger.log(` ${pc.dim('Manifest:')} ${status.manifest} cognitives`);\n logger.log(` ${pc.dim('Filesystem:')} ${status.filesystem} cognitives`);\n\n if (!status.inSync) {\n logger.line();\n\n if (status.newInFilesystem > 0) {\n logger.log(` ${pc.green('+')} ${status.newInFilesystem} new in filesystem`);\n }\n if (status.removedFromFilesystem > 0) {\n logger.log(` ${pc.red('-')} ${status.removedFromFilesystem} removed from filesystem`);\n }\n if (status.modified > 0) {\n logger.log(` ${pc.yellow('~')} ${status.modified} modified`);\n }\n }\n\n // Provider status\n if (enabledProviders.length > 0) {\n logger.line();\n logger.bold(' Provider Status:');\n logger.line();\n\n for (const provider of enabledProviders) {\n const pStatus = providerStatuses[provider];\n if (pStatus === undefined) continue;\n\n const total = pStatus.valid + pStatus.broken + pStatus.orphaned;\n const hasIssues = pStatus.broken > 0 || pStatus.orphaned > 0;\n\n logger.log(` ${pc.cyan(provider)}:`);\n if (hasIssues) {\n logger.log(` ${pc.green('✓')} ${pStatus.valid} valid`);\n if (pStatus.broken > 0) {\n logger.log(` ${pc.red('✗')} ${pStatus.broken} broken`);\n }\n if (pStatus.orphaned > 0) {\n logger.log(` ${pc.yellow('?')} ${pStatus.orphaned} orphaned`);\n }\n } else if (total > 0) {\n logger.log(` ${pc.green('✓')} ${total} symlinks valid`);\n } else {\n logger.log(` ${pc.dim('○')} No symlinks yet`);\n }\n }\n }\n\n logger.line();\n\n if (!status.inSync || Object.values(providerStatuses).some((s) => s.broken > 0 || s.orphaned > 0)) {\n logger.hint('Run synapsync sync to synchronize.');\n }\n}\n\n// ============================================\n// Command Registration\n// ============================================\n\n/**\n * Register sync command with Commander\n */\nexport function registerSyncCommand(program: Command): void {\n const syncCommand = program\n .command('sync')\n .description('Synchronize cognitives with manifest and providers')\n .option('-n, --dry-run', 'Preview changes without applying them')\n .option('-t, --type <type>', 'Sync only specific type (skill, agent, prompt, workflow, tool)')\n .option('-c, --category <category>', 'Sync only specific category')\n .option('-p, --provider <provider>', 'Sync only to specific provider (claude, cursor, etc.)')\n .option('--copy', 'Use file copy instead of symlinks')\n .option('-f, --force', 'Force sync even if already synced')\n .option('-v, --verbose', 'Show detailed output')\n .option('--json', 'Output as JSON')\n .action((options: SyncCommandOptions) => {\n executeSyncCommand(options);\n });\n\n // Status subcommand\n syncCommand\n .command('status')\n .description('Show sync status between filesystem, manifest, and providers')\n .option('--json', 'Output as JSON')\n .action((options: { json?: boolean }) => {\n executeSyncStatusCommand(options);\n });\n}\n","/**\n * Update Command\n *\n * Update installed cognitives to their latest versions\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport type { Command } from 'commander';\nimport pc from 'picocolors';\nimport { ConfigManager } from '../services/config/manager.js';\nimport { ManifestManager } from '../services/manifest/manager.js';\nimport { UpdateChecker } from '../services/maintenance/update-checker.js';\nimport { RegistryClient } from '../services/registry/client.js';\nimport { SyncEngine } from '../services/sync/engine.js';\nimport type { UpdateCheckResult } from '../services/maintenance/types.js';\nimport { COGNITIVE_FILE_NAMES } from '../core/constants.js';\nimport { logger } from '../utils/logger.js';\n\n// ============================================\n// Types\n// ============================================\n\ninterface UpdateCommandOptions {\n all?: boolean;\n force?: boolean;\n dryRun?: boolean;\n json?: boolean;\n}\n\n// ============================================\n// Main Function\n// ============================================\n\n/**\n * Execute the update command\n */\nexport async function executeUpdateCommand(\n cognitiveName?: string,\n options: UpdateCommandOptions = {}\n): Promise<void> {\n logger.line();\n\n // Check if project is initialized\n const configManager = ConfigManager.findConfig();\n if (configManager === null) {\n logger.error('No SynapSync project found.');\n logger.hint('Run synapsync init to initialize a project first.');\n return;\n }\n\n const synapSyncDir = configManager.getSynapSyncDir();\n const projectRoot = configManager.getProjectRoot();\n const manifest = new ManifestManager(synapSyncDir);\n const registry = new RegistryClient();\n const checker = new UpdateChecker(registry);\n\n // Header\n if (options.json !== true) {\n if (options.dryRun === true) {\n logger.bold(' Update Preview (Dry Run)');\n } else {\n logger.bold(' Checking for Updates');\n }\n logger.line();\n }\n\n // Get installed cognitives\n const installed = manifest.getCognitives();\n\n if (installed.length === 0) {\n if (options.json === true) {\n console.log(JSON.stringify({ message: 'No cognitives installed' }));\n } else {\n logger.log(` ${pc.dim('No cognitives installed.')}`);\n logger.hint('Run synapsync install <name> to install a cognitive.');\n }\n return;\n }\n\n // Check for updates\n let checkResult: UpdateCheckResult;\n\n if (cognitiveName !== undefined && options.all !== true) {\n // Check specific cognitive\n const cognitive = installed.find((c) => c.name === cognitiveName);\n if (cognitive === undefined) {\n logger.error(`Cognitive '${cognitiveName}' is not installed.`);\n logger.hint('Run synapsync list to see installed cognitives.');\n return;\n }\n\n if (cognitive.source !== 'registry') {\n logger.error(`Cognitive '${cognitiveName}' was installed locally and cannot be updated from registry.`);\n return;\n }\n\n const updateInfo = await checker.checkOne(cognitive);\n checkResult = {\n checked: 1,\n updatesAvailable: updateInfo.hasUpdate ? [updateInfo] : [],\n upToDate: updateInfo.hasUpdate ? [] : [updateInfo],\n errors: [],\n checkTime: new Date().toISOString(),\n };\n } else {\n // Check all\n checkResult = await checker.checkAll(installed);\n }\n\n // JSON output\n if (options.json === true) {\n console.log(JSON.stringify(checkResult, null, 2));\n return;\n }\n\n // Display check results\n displayCheckResults(checkResult);\n\n // If no updates available, we're done\n if (checkResult.updatesAvailable.length === 0) {\n logger.line();\n logger.log(` ${pc.green('✓')} All cognitives are up to date`);\n logger.line();\n return;\n }\n\n // If dry run, don't actually update\n if (options.dryRun === true) {\n logger.line();\n logger.hint('Run synapsync update without --dry-run to apply updates.');\n return;\n }\n\n // Perform updates\n logger.line();\n logger.bold(' Updating...');\n logger.line();\n\n const updated: string[] = [];\n const failed: Array<{ name: string; error: string }> = [];\n\n for (const update of checkResult.updatesAvailable) {\n try {\n logger.log(` ${pc.cyan('↓')} Updating ${update.name}...`);\n\n // Download new version from registry\n const downloaded = await registry.download(update.name);\n\n // Get target directory from manifest\n const manifestEntry = installed.find((c) => c.name === update.name);\n if (manifestEntry === undefined) continue;\n\n const targetDir = path.join(\n synapSyncDir,\n `${update.type}s`,\n update.category,\n update.name\n );\n\n // Save the new version\n const fileName = COGNITIVE_FILE_NAMES[update.type];\n const filePath = path.join(targetDir, fileName);\n\n // Ensure directory exists\n if (!fs.existsSync(targetDir)) {\n fs.mkdirSync(targetDir, { recursive: true });\n }\n\n // Write the updated content\n fs.writeFileSync(filePath, downloaded.content, 'utf-8');\n\n // Update manifest entry\n manifest.updateCognitive(update.name, {\n version: update.latestVersion,\n });\n\n updated.push(update.name);\n logger.log(` ${pc.green('✓')} Updated to v${update.latestVersion}`);\n } catch (error) {\n failed.push({\n name: update.name,\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n logger.log(` ${pc.red('✗')} Failed: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n }\n\n // Save manifest\n manifest.save();\n\n // Re-sync providers\n logger.line();\n logger.log(` ${pc.dim('Syncing providers...')}`);\n const config = configManager.getConfig();\n const syncEngine = new SyncEngine(synapSyncDir, projectRoot, config);\n syncEngine.sync();\n\n // Summary\n logger.line();\n if (updated.length > 0) {\n logger.log(` ${pc.green('✓')} Updated ${updated.length} cognitive(s)`);\n }\n if (failed.length > 0) {\n logger.log(` ${pc.red('✗')} Failed to update ${failed.length} cognitive(s)`);\n }\n logger.line();\n}\n\n// ============================================\n// Check for Outdated (list --outdated)\n// ============================================\n\n/**\n * Check and display outdated cognitives\n */\nexport async function executeCheckOutdatedCommand(options: { json?: boolean }): Promise<void> {\n logger.line();\n\n // Check if project is initialized\n const configManager = ConfigManager.findConfig();\n if (configManager === null) {\n logger.error('No SynapSync project found.');\n logger.hint('Run synapsync init to initialize a project first.');\n return;\n }\n\n const synapSyncDir = configManager.getSynapSyncDir();\n const manifest = new ManifestManager(synapSyncDir);\n const checker = new UpdateChecker();\n\n // Header\n if (options.json !== true) {\n logger.bold(' Checking for Updates');\n logger.line();\n }\n\n // Get installed cognitives\n const installed = manifest.getCognitives();\n\n if (installed.length === 0) {\n if (options.json === true) {\n console.log(JSON.stringify({ message: 'No cognitives installed' }));\n } else {\n logger.log(` ${pc.dim('No cognitives installed.')}`);\n }\n return;\n }\n\n // Check for updates\n const checkResult = await checker.checkAll(installed);\n\n // JSON output\n if (options.json === true) {\n console.log(JSON.stringify(checkResult, null, 2));\n return;\n }\n\n // Display results\n displayCheckResults(checkResult);\n\n logger.line();\n if (checkResult.updatesAvailable.length > 0) {\n logger.hint('Run synapsync update --all to update all cognitives.');\n } else {\n logger.log(` ${pc.green('✓')} All cognitives are up to date`);\n }\n logger.line();\n}\n\n// ============================================\n// Display Functions\n// ============================================\n\nfunction displayCheckResults(result: UpdateCheckResult): void {\n if (result.updatesAvailable.length > 0) {\n logger.bold(' Updates available:');\n logger.line();\n\n for (const update of result.updatesAvailable) {\n logger.log(\n ` ${pc.yellow('↑')} ${pc.white(update.name)} ` +\n `${pc.dim(update.currentVersion)} → ${pc.green(update.latestVersion)}`\n );\n }\n }\n\n if (result.upToDate.length > 0 && result.updatesAvailable.length > 0) {\n logger.line();\n logger.log(` ${pc.dim(`${result.upToDate.length} cognitive(s) up to date`)}`);\n }\n\n if (result.errors.length > 0) {\n logger.line();\n logger.log(` ${pc.red('Errors:')}`);\n for (const error of result.errors) {\n logger.log(` ${pc.red('✗')} ${error.cognitive}: ${error.message}`);\n }\n }\n}\n\n// ============================================\n// Command Registration\n// ============================================\n\n/**\n * Register update command with Commander\n */\nexport function registerUpdateCommand(program: Command): void {\n program\n .command('update [cognitive]')\n .description('Update installed cognitives to latest versions')\n .option('-a, --all', 'Update all cognitives')\n .option('-f, --force', 'Force update even if already latest')\n .option('-n, --dry-run', 'Preview updates without applying them')\n .option('--json', 'Output as JSON')\n .action(async (cognitive: string | undefined, options: UpdateCommandOptions) => {\n await executeUpdateCommand(cognitive, options);\n });\n}\n","/**\n * Update Checker Service\n *\n * Checks for available updates to installed cognitives\n */\n\nimport type { UpdateInfo, UpdateCheckResult } from './types.js';\nimport type { ManifestCognitive } from '../manifest/types.js';\nimport { RegistryClient } from '../registry/client.js';\n\nexport class UpdateChecker {\n private registry: RegistryClient;\n\n constructor(registry?: RegistryClient) {\n this.registry = registry ?? new RegistryClient();\n }\n\n /**\n * Check all installed cognitives for updates\n */\n async checkAll(installed: ManifestCognitive[]): Promise<UpdateCheckResult> {\n const result: UpdateCheckResult = {\n checked: 0,\n updatesAvailable: [],\n upToDate: [],\n errors: [],\n checkTime: new Date().toISOString(),\n };\n\n // Only check registry-sourced cognitives\n const registryCognitives = installed.filter((c) => c.source === 'registry');\n\n for (const cognitive of registryCognitives) {\n try {\n const updateInfo = await this.checkOne(cognitive);\n result.checked++;\n\n if (updateInfo.hasUpdate) {\n result.updatesAvailable.push(updateInfo);\n } else {\n result.upToDate.push(updateInfo);\n }\n } catch (error) {\n result.errors.push({\n cognitive: cognitive.name,\n message: error instanceof Error ? error.message : 'Unknown error',\n });\n }\n }\n\n return result;\n }\n\n /**\n * Check a single cognitive for updates\n */\n async checkOne(cognitive: ManifestCognitive): Promise<UpdateInfo> {\n const entry = await this.registry.findByName(cognitive.name);\n\n if (entry === null) {\n // Cognitive not in registry anymore\n return {\n name: cognitive.name,\n type: cognitive.type,\n category: cognitive.category,\n currentVersion: cognitive.version,\n latestVersion: cognitive.version,\n hasUpdate: false,\n source: cognitive.source,\n };\n }\n\n const hasUpdate = this.compareVersions(cognitive.version, entry.version) < 0;\n\n return {\n name: cognitive.name,\n type: cognitive.type,\n category: cognitive.category,\n currentVersion: cognitive.version,\n latestVersion: entry.version,\n hasUpdate,\n source: cognitive.source,\n };\n }\n\n /**\n * Compare two semver versions\n * Returns: -1 if a < b, 0 if a == b, 1 if a > b\n */\n private compareVersions(a: string, b: string): number {\n const parseVersion = (v: string): number[] => {\n return v\n .replace(/^v/, '')\n .split('.')\n .map((n) => {\n const num = parseInt(n, 10);\n return Number.isNaN(num) ? 0 : num;\n });\n };\n\n const aParts = parseVersion(a);\n const bParts = parseVersion(b);\n\n const maxLen = Math.max(aParts.length, bParts.length);\n for (let i = 0; i < maxLen; i++) {\n const aNum = aParts[i] ?? 0;\n const bNum = bParts[i] ?? 0;\n\n if (aNum < bNum) return -1;\n if (aNum > bNum) return 1;\n }\n\n return 0;\n }\n\n /**\n * Get the registry client\n */\n getRegistry(): RegistryClient {\n return this.registry;\n }\n}\n","/**\n * Doctor Command\n *\n * Diagnose and fix issues with SynapSync projects\n */\n\nimport type { Command } from 'commander';\nimport pc from 'picocolors';\nimport { ConfigManager } from '../services/config/manager.js';\nimport { DoctorService } from '../services/maintenance/doctor.js';\nimport type { DiagnosticCheck, DiagnosticResult, FixResult } from '../services/maintenance/types.js';\nimport { logger } from '../utils/logger.js';\n\n// ============================================\n// Types\n// ============================================\n\ninterface DoctorCommandOptions {\n fix?: boolean;\n check?: string[];\n verbose?: boolean;\n json?: boolean;\n}\n\n// ============================================\n// Main Function\n// ============================================\n\n/**\n * Execute the doctor command\n */\nexport async function executeDoctorCommand(options: DoctorCommandOptions = {}): Promise<void> {\n logger.line();\n\n // Check if project is initialized\n const configManager = ConfigManager.findConfig();\n if (configManager === null) {\n logger.error('No SynapSync project found.');\n logger.hint('Run synapsync init to initialize a project first.');\n return;\n }\n\n const synapSyncDir = configManager.getSynapSyncDir();\n const projectRoot = configManager.getProjectRoot();\n\n let config;\n try {\n config = configManager.getConfig();\n } catch {\n config = undefined;\n }\n\n const doctor = new DoctorService(projectRoot, synapSyncDir, config);\n\n // Header\n if (options.json !== true) {\n if (options.fix === true) {\n logger.bold(' Running Diagnostics & Fixes');\n } else {\n logger.bold(' Running Diagnostics');\n }\n logger.line();\n }\n\n // Run diagnostics\n const result = await doctor.diagnose({\n ...(options.check !== undefined && { checks: options.check }),\n ...(options.verbose !== undefined && { verbose: options.verbose }),\n });\n\n // If fix mode, apply fixes\n let fixResult: FixResult | undefined;\n if (options.fix === true && result.failed > 0) {\n fixResult = await doctor.fix({\n ...(options.check !== undefined && { checks: options.check }),\n ...(options.verbose !== undefined && { verbose: options.verbose }),\n });\n }\n\n // JSON output\n if (options.json === true) {\n console.log(\n JSON.stringify(\n {\n diagnostics: result,\n fixes: fixResult,\n },\n null,\n 2\n )\n );\n return;\n }\n\n // Display results\n displayDiagnostics(result, options.verbose);\n\n if (fixResult !== undefined) {\n logger.line();\n displayFixes(fixResult);\n }\n\n // Summary\n logger.line();\n if (result.healthy) {\n logger.log(` ${pc.green('✓')} Your project is healthy!`);\n } else if (result.failed > 0) {\n logger.log(` ${pc.red('!')} ${result.failed} issue(s) found`);\n if (options.fix !== true) {\n logger.hint('Run synapsync doctor --fix to auto-repair fixable issues.');\n }\n } else if (result.warnings > 0) {\n logger.log(` ${pc.yellow('!')} ${result.warnings} warning(s)`);\n }\n\n logger.line();\n logger.log(` ${pc.dim(`Checked ${result.checks.length} items in ${result.duration}ms`)}`);\n logger.line();\n}\n\n// ============================================\n// Display Functions\n// ============================================\n\nfunction displayDiagnostics(result: DiagnosticResult, verbose = false): void {\n for (const check of result.checks) {\n displayCheck(check, verbose);\n }\n}\n\nfunction displayCheck(check: DiagnosticCheck, verbose = false): void {\n const statusIcon = getStatusIcon(check.status);\n const statusColor = getStatusColor(check.status);\n\n logger.log(` ${statusIcon} ${statusColor(check.name)}`);\n\n if (verbose || check.status === 'fail' || check.status === 'warn') {\n logger.log(` ${pc.dim(check.message)}`);\n\n if (check.details !== undefined && check.details.length > 0) {\n for (const detail of check.details) {\n logger.log(` ${pc.dim('•')} ${pc.dim(detail)}`);\n }\n }\n }\n}\n\nfunction displayFixes(result: FixResult): void {\n logger.bold(' Fixes Applied:');\n logger.line();\n\n if (result.fixed.length > 0) {\n for (const fix of result.fixed) {\n logger.log(` ${pc.green('✓')} Fixed: ${fix}`);\n }\n }\n\n if (result.failed.length > 0) {\n for (const fail of result.failed) {\n logger.log(` ${pc.red('✗')} Failed: ${fail.check} - ${fail.error}`);\n }\n }\n\n if (result.fixed.length === 0 && result.failed.length === 0) {\n logger.log(` ${pc.dim('No fixes needed')}`);\n }\n}\n\nfunction getStatusIcon(status: DiagnosticCheck['status']): string {\n switch (status) {\n case 'pass':\n return pc.green('✓');\n case 'warn':\n return pc.yellow('!');\n case 'fail':\n return pc.red('✗');\n case 'skip':\n return pc.dim('○');\n }\n}\n\nfunction getStatusColor(status: DiagnosticCheck['status']): (text: string) => string {\n switch (status) {\n case 'pass':\n return pc.green;\n case 'warn':\n return pc.yellow;\n case 'fail':\n return pc.red;\n case 'skip':\n return pc.dim;\n }\n}\n\n// ============================================\n// Command Registration\n// ============================================\n\n/**\n * Register doctor command with Commander\n */\nexport function registerDoctorCommand(program: Command): void {\n program\n .command('doctor')\n .description('Diagnose and fix issues with your SynapSync project')\n .option('-f, --fix', 'Auto-fix detected issues')\n .option('-c, --check <checks...>', 'Run specific checks only')\n .option('-v, --verbose', 'Show detailed output')\n .option('--json', 'Output as JSON')\n .action(async (options: DoctorCommandOptions) => {\n await executeDoctorCommand(options);\n });\n}\n","/**\n * Doctor Service\n *\n * Diagnoses and fixes common issues with SynapSync projects\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport type {\n DiagnosticCheck,\n DiagnosticResult,\n FixResult,\n DoctorOptions,\n} from './types.js';\nimport type { ProjectConfig } from '../config/schema.js';\nimport { ManifestManager } from '../manifest/manager.js';\nimport { CognitiveScanner } from '../scanner/scanner.js';\nimport { SymlinkManager } from '../symlink/manager.js';\nimport { RegistryClient } from '../registry/client.js';\nimport { COGNITIVE_TYPES } from '../../core/constants.js';\nimport type { SupportedProvider } from '../../core/constants.js';\n\nexport class DoctorService {\n private projectRoot: string;\n private synapSyncDir: string;\n private config: ProjectConfig | null;\n\n constructor(projectRoot: string, synapSyncDir: string, config?: ProjectConfig) {\n this.projectRoot = projectRoot;\n this.synapSyncDir = synapSyncDir;\n this.config = config ?? null;\n }\n\n /**\n * Run all diagnostic checks\n */\n async diagnose(options: DoctorOptions = {}): Promise<DiagnosticResult> {\n const startTime = Date.now();\n const checks: DiagnosticCheck[] = [];\n\n // Run all checks\n checks.push(this.checkNodeVersion());\n checks.push(this.checkSynapSyncDir());\n checks.push(this.checkConfig());\n checks.push(this.checkManifest());\n checks.push(this.checkManifestConsistency());\n checks.push(...this.checkProviders());\n checks.push(...this.checkSymlinks());\n checks.push(await this.checkRegistryConnectivity());\n\n // Filter by requested checks\n let filteredChecks = checks;\n if (options.checks !== undefined && options.checks.length > 0) {\n const requestedChecks = options.checks;\n filteredChecks = checks.filter((c) => requestedChecks.includes(c.id));\n }\n\n const result: DiagnosticResult = {\n checks: filteredChecks,\n passed: filteredChecks.filter((c) => c.status === 'pass').length,\n warnings: filteredChecks.filter((c) => c.status === 'warn').length,\n failed: filteredChecks.filter((c) => c.status === 'fail').length,\n skipped: filteredChecks.filter((c) => c.status === 'skip').length,\n healthy: filteredChecks.every((c) => c.status === 'pass' || c.status === 'skip'),\n duration: Date.now() - startTime,\n };\n\n return result;\n }\n\n /**\n * Fix detected issues\n */\n async fix(options: DoctorOptions = {}): Promise<FixResult> {\n const startTime = Date.now();\n const result: FixResult = {\n success: true,\n fixed: [],\n failed: [],\n duration: 0,\n };\n\n // Run diagnose first to find issues\n const diagnosis = await this.diagnose(options);\n\n // Fix each fixable failed check\n for (const check of diagnosis.checks) {\n if (check.status === 'fail' && check.fixable) {\n try {\n this.fixCheck(check);\n result.fixed.push(check.id);\n } catch (error) {\n result.failed.push({\n check: check.id,\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n result.success = false;\n }\n }\n }\n\n result.duration = Date.now() - startTime;\n return result;\n }\n\n // ============================================\n // Individual Checks\n // ============================================\n\n private checkNodeVersion(): DiagnosticCheck {\n const nodeVersion = process.version;\n const majorVersion = parseInt(nodeVersion.slice(1).split('.')[0] ?? '0', 10);\n\n if (majorVersion >= 20) {\n return {\n id: 'node-version',\n name: 'Node.js Version',\n description: 'Check if Node.js version is 20 or higher',\n status: 'pass',\n message: `Node.js ${nodeVersion} is installed`,\n fixable: false,\n };\n }\n\n return {\n id: 'node-version',\n name: 'Node.js Version',\n description: 'Check if Node.js version is 20 or higher',\n status: 'fail',\n message: `Node.js ${nodeVersion} is too old. Please upgrade to v20 or higher.`,\n fixable: false,\n };\n }\n\n private checkSynapSyncDir(): DiagnosticCheck {\n if (fs.existsSync(this.synapSyncDir)) {\n return {\n id: 'synapsync-dir',\n name: '.synapsync Directory',\n description: 'Check if .synapsync directory exists',\n status: 'pass',\n message: '.synapsync directory exists',\n fixable: true,\n };\n }\n\n return {\n id: 'synapsync-dir',\n name: '.synapsync Directory',\n description: 'Check if .synapsync directory exists',\n status: 'fail',\n message: '.synapsync directory not found',\n fixable: true,\n };\n }\n\n private checkConfig(): DiagnosticCheck {\n const configPath = path.join(this.projectRoot, 'synapsync.config.yaml');\n\n if (fs.existsSync(configPath)) {\n if (this.config !== null) {\n return {\n id: 'config-valid',\n name: 'Configuration',\n description: 'Check if synapsync.config.yaml is valid',\n status: 'pass',\n message: 'Configuration is valid',\n fixable: false,\n };\n }\n\n return {\n id: 'config-valid',\n name: 'Configuration',\n description: 'Check if synapsync.config.yaml is valid',\n status: 'fail',\n message: 'Configuration file exists but is invalid',\n fixable: false,\n };\n }\n\n return {\n id: 'config-valid',\n name: 'Configuration',\n description: 'Check if synapsync.config.yaml is valid',\n status: 'fail',\n message: 'Configuration file not found',\n fixable: false,\n };\n }\n\n private checkManifest(): DiagnosticCheck {\n const manifestPath = path.join(this.synapSyncDir, 'manifest.json');\n\n if (!fs.existsSync(manifestPath)) {\n return {\n id: 'manifest-exists',\n name: 'Manifest File',\n description: 'Check if manifest.json exists',\n status: 'warn',\n message: 'manifest.json not found (will be created on first sync)',\n fixable: true,\n };\n }\n\n try {\n const content = fs.readFileSync(manifestPath, 'utf-8');\n JSON.parse(content);\n\n return {\n id: 'manifest-exists',\n name: 'Manifest File',\n description: 'Check if manifest.json exists and is valid',\n status: 'pass',\n message: 'manifest.json is valid',\n fixable: true,\n };\n } catch {\n return {\n id: 'manifest-exists',\n name: 'Manifest File',\n description: 'Check if manifest.json exists and is valid',\n status: 'fail',\n message: 'manifest.json is corrupted',\n fixable: true,\n };\n }\n }\n\n private checkManifestConsistency(): DiagnosticCheck {\n if (!fs.existsSync(this.synapSyncDir)) {\n return {\n id: 'manifest-consistency',\n name: 'Manifest Consistency',\n description: 'Check if manifest matches filesystem',\n status: 'skip',\n message: 'Skipped - .synapsync directory not found',\n fixable: true,\n };\n }\n\n try {\n const scanner = new CognitiveScanner(this.synapSyncDir);\n const manifest = new ManifestManager(this.synapSyncDir);\n\n const scanned = scanner.scan();\n const comparison = scanner.compare(scanned, manifest.getCognitives());\n\n const issues: string[] = [];\n\n if (comparison.new.length > 0) {\n issues.push(`${comparison.new.length} new cognitive(s) not in manifest`);\n }\n if (comparison.removed.length > 0) {\n issues.push(`${comparison.removed.length} cognitive(s) in manifest but not in filesystem`);\n }\n if (comparison.modified.length > 0) {\n issues.push(`${comparison.modified.length} modified cognitive(s)`);\n }\n\n if (issues.length === 0) {\n return {\n id: 'manifest-consistency',\n name: 'Manifest Consistency',\n description: 'Check if manifest matches filesystem',\n status: 'pass',\n message: 'Manifest is consistent with filesystem',\n fixable: true,\n };\n }\n\n return {\n id: 'manifest-consistency',\n name: 'Manifest Consistency',\n description: 'Check if manifest matches filesystem',\n status: 'warn',\n message: 'Manifest is out of sync',\n fixable: true,\n details: issues,\n };\n } catch (error) {\n return {\n id: 'manifest-consistency',\n name: 'Manifest Consistency',\n description: 'Check if manifest matches filesystem',\n status: 'fail',\n message: error instanceof Error ? error.message : 'Unknown error',\n fixable: true,\n };\n }\n }\n\n private checkProviders(): DiagnosticCheck[] {\n const checks: DiagnosticCheck[] = [];\n\n if (this.config === null) {\n return [\n {\n id: 'providers-configured',\n name: 'Providers',\n description: 'Check if providers are configured',\n status: 'skip',\n message: 'Skipped - no configuration',\n fixable: false,\n },\n ];\n }\n\n const providers = this.config.sync?.providers ?? {};\n const enabledProviders = Object.entries(providers)\n .filter(([, cfg]) => (cfg as { enabled?: boolean }).enabled === true)\n .map(([name]) => name as SupportedProvider);\n\n if (enabledProviders.length === 0) {\n return [\n {\n id: 'providers-configured',\n name: 'Providers',\n description: 'Check if any providers are enabled',\n status: 'warn',\n message: 'No providers are enabled',\n fixable: false,\n },\n ];\n }\n\n checks.push({\n id: 'providers-configured',\n name: 'Providers',\n description: 'Check if providers are configured',\n status: 'pass',\n message: `${enabledProviders.length} provider(s) enabled: ${enabledProviders.join(', ')}`,\n fixable: false,\n });\n\n return checks;\n }\n\n private checkSymlinks(): DiagnosticCheck[] {\n const checks: DiagnosticCheck[] = [];\n\n if (this.config === null) {\n return checks;\n }\n\n const providers = this.config.sync?.providers ?? {};\n const enabledProviders = Object.entries(providers)\n .filter(([, cfg]) => (cfg as { enabled?: boolean }).enabled === true)\n .map(([name]) => name as SupportedProvider);\n\n const symlink = new SymlinkManager(this.projectRoot, this.synapSyncDir);\n\n for (const provider of enabledProviders) {\n const { valid, broken, orphaned } = symlink.verifyProvider(provider);\n const total = valid.length + broken.length + orphaned.length;\n\n if (total === 0) {\n checks.push({\n id: `symlinks-${provider}`,\n name: `${provider} Symlinks`,\n description: `Check symlinks for ${provider}`,\n status: 'pass',\n message: 'No symlinks configured yet',\n fixable: false,\n });\n continue;\n }\n\n if (broken.length === 0 && orphaned.length === 0) {\n checks.push({\n id: `symlinks-${provider}`,\n name: `${provider} Symlinks`,\n description: `Check symlinks for ${provider}`,\n status: 'pass',\n message: `${valid.length} valid symlink(s)`,\n fixable: true,\n });\n } else {\n const details: string[] = [];\n if (broken.length > 0) details.push(`${broken.length} broken`);\n if (orphaned.length > 0) details.push(`${orphaned.length} orphaned`);\n\n checks.push({\n id: `symlinks-${provider}`,\n name: `${provider} Symlinks`,\n description: `Check symlinks for ${provider}`,\n status: 'warn',\n message: `${valid.length} valid, ${details.join(', ')}`,\n fixable: true,\n details: [\n ...broken.map((l) => `Broken: ${l.cognitiveName}`),\n ...orphaned.map((l) => `Orphaned: ${l.cognitiveName}`),\n ],\n });\n }\n }\n\n return checks;\n }\n\n private async checkRegistryConnectivity(): Promise<DiagnosticCheck> {\n try {\n const registry = new RegistryClient();\n const reachable = await registry.ping();\n\n if (reachable) {\n return {\n id: 'registry-connectivity',\n name: 'Registry Connectivity',\n description: 'Check connection to SynapSync registry',\n status: 'pass',\n message: 'Registry is reachable',\n fixable: false,\n };\n }\n\n return {\n id: 'registry-connectivity',\n name: 'Registry Connectivity',\n description: 'Check connection to SynapSync registry',\n status: 'warn',\n message: 'Registry is not reachable (check internet connection)',\n fixable: false,\n };\n } catch {\n return {\n id: 'registry-connectivity',\n name: 'Registry Connectivity',\n description: 'Check connection to SynapSync registry',\n status: 'warn',\n message: 'Failed to check registry connectivity',\n fixable: false,\n };\n }\n }\n\n // ============================================\n // Fix Methods\n // ============================================\n\n private fixCheck(check: DiagnosticCheck): void {\n switch (check.id) {\n case 'synapsync-dir':\n this.fixSynapSyncDir();\n break;\n\n case 'manifest-exists':\n case 'manifest-consistency':\n this.fixManifest();\n break;\n\n default:\n if (check.id.startsWith('symlinks-')) {\n const provider = check.id.replace('symlinks-', '') as SupportedProvider;\n this.fixSymlinks(provider);\n }\n }\n }\n\n private fixSynapSyncDir(): void {\n if (!fs.existsSync(this.synapSyncDir)) {\n fs.mkdirSync(this.synapSyncDir, { recursive: true });\n }\n\n // Create type directories\n for (const type of COGNITIVE_TYPES) {\n const typeDir = path.join(this.synapSyncDir, `${type}s`);\n if (!fs.existsSync(typeDir)) {\n fs.mkdirSync(typeDir, { recursive: true });\n }\n }\n }\n\n private fixManifest(): void {\n // Ensure directory exists\n this.fixSynapSyncDir();\n\n // Regenerate manifest from filesystem\n const scanner = new CognitiveScanner(this.synapSyncDir);\n const manifest = new ManifestManager(this.synapSyncDir);\n\n const scanned = scanner.scan();\n const manifestCognitives = scanned.map((s) => scanner.toManifestCognitive(s));\n const result = manifest.reconcile(manifestCognitives);\n\n manifest.applyReconciliation(result);\n manifest.save();\n }\n\n private fixSymlinks(provider: SupportedProvider): void {\n const symlink = new SymlinkManager(this.projectRoot, this.synapSyncDir);\n symlink.cleanProvider(provider);\n }\n\n /**\n * Get list of available check IDs\n */\n static getAvailableChecks(): string[] {\n return [\n 'node-version',\n 'synapsync-dir',\n 'config-valid',\n 'manifest-exists',\n 'manifest-consistency',\n 'providers-configured',\n 'registry-connectivity',\n // Provider-specific symlink checks are dynamic\n ];\n }\n}\n","/**\n * Clean Command\n *\n * Clean cache, orphaned symlinks, and temp files\n */\n\nimport type { Command } from 'commander';\nimport pc from 'picocolors';\nimport { ConfigManager } from '../services/config/manager.js';\nimport { CleanerService } from '../services/maintenance/cleaner.js';\nimport type { CleanResult, CleanedItem } from '../services/maintenance/types.js';\nimport { logger } from '../utils/logger.js';\n\n// ============================================\n// Types\n// ============================================\n\ninterface CleanCommandOptions {\n cache?: boolean;\n orphans?: boolean;\n temp?: boolean;\n all?: boolean;\n dryRun?: boolean;\n json?: boolean;\n}\n\n// ============================================\n// Main Function\n// ============================================\n\n/**\n * Execute the clean command\n */\nexport function executeCleanCommand(options: CleanCommandOptions = {}): void {\n logger.line();\n\n // Check if project is initialized\n const configManager = ConfigManager.findConfig();\n if (configManager === null) {\n logger.error('No SynapSync project found.');\n logger.hint('Run synapsync init to initialize a project first.');\n return;\n }\n\n const synapSyncDir = configManager.getSynapSyncDir();\n const projectRoot = configManager.getProjectRoot();\n\n let config;\n try {\n config = configManager.getConfig();\n } catch {\n config = undefined;\n }\n\n const cleaner = new CleanerService(projectRoot, synapSyncDir, config);\n\n // Header\n if (options.json !== true) {\n if (options.dryRun === true) {\n logger.bold(' Clean Preview (Dry Run)');\n } else {\n logger.bold(' Cleaning');\n }\n logger.line();\n }\n\n // Run clean\n const result = cleaner.clean({\n cache: options.cache ?? false,\n orphans: options.orphans ?? false,\n temp: options.temp ?? false,\n all: options.all ?? false,\n dryRun: options.dryRun ?? false,\n });\n\n // JSON output\n if (options.json === true) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n // Display results\n displayResults(result, options);\n\n // Summary\n logger.line();\n if (result.cleaned.length === 0) {\n logger.log(` ${pc.green('✓')} Nothing to clean`);\n } else if (options.dryRun === true) {\n logger.log(` ${pc.dim(`Would clean ${result.cleaned.length} item(s), freeing ${result.sizeFreed}`)}`);\n logger.hint('Run synapsync clean without --dry-run to apply changes.');\n } else {\n logger.log(` ${pc.green('✓')} Cleaned ${result.cleaned.length} item(s), freed ${result.sizeFreed}`);\n }\n\n if (result.errors.length > 0) {\n logger.log(` ${pc.red('!')} ${result.errors.length} error(s) occurred`);\n }\n\n logger.line();\n}\n\n// ============================================\n// Display Functions\n// ============================================\n\nfunction displayResults(result: CleanResult, _options: CleanCommandOptions): void {\n // Group by type\n const byType = groupByType(result.cleaned);\n\n if (byType.cache.length > 0) {\n logger.log(` ${pc.cyan('Cache:')}`);\n for (const item of byType.cache) {\n const size = formatBytes(item.size);\n logger.log(` ${pc.dim('-')} ${getRelativePath(item.path)} ${pc.dim(`(${size})`)}`);\n }\n logger.line();\n }\n\n if (byType.orphan.length > 0) {\n logger.log(` ${pc.cyan('Orphaned symlinks:')}`);\n for (const item of byType.orphan) {\n logger.log(` ${pc.dim('-')} ${item.path}`);\n }\n logger.line();\n }\n\n if (byType.temp.length > 0) {\n logger.log(` ${pc.cyan('Temp files:')}`);\n for (const item of byType.temp) {\n const size = formatBytes(item.size);\n logger.log(` ${pc.dim('-')} ${getRelativePath(item.path)} ${pc.dim(`(${size})`)}`);\n }\n logger.line();\n }\n\n // Errors\n if (result.errors.length > 0) {\n logger.log(` ${pc.red('Errors:')}`);\n for (const error of result.errors) {\n logger.log(` ${pc.red('✗')} ${error.path}: ${error.message}`);\n }\n logger.line();\n }\n}\n\nfunction groupByType(items: CleanedItem[]): Record<CleanedItem['type'], CleanedItem[]> {\n const result: Record<CleanedItem['type'], CleanedItem[]> = {\n cache: [],\n orphan: [],\n temp: [],\n };\n\n for (const item of items) {\n result[item.type].push(item);\n }\n\n return result;\n}\n\nfunction formatBytes(bytes: number): string {\n if (bytes === 0) return '0 B';\n\n const units = ['B', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(1024));\n const size = bytes / Math.pow(1024, i);\n\n return `${size.toFixed(i === 0 ? 0 : 1)} ${units[i]}`;\n}\n\nfunction getRelativePath(fullPath: string): string {\n const cwd = process.cwd();\n if (fullPath.startsWith(cwd)) {\n return fullPath.slice(cwd.length + 1);\n }\n return fullPath;\n}\n\n// ============================================\n// Command Registration\n// ============================================\n\n/**\n * Register clean command with Commander\n */\nexport function registerCleanCommand(program: Command): void {\n program\n .command('clean')\n .description('Clean cache, orphaned symlinks, and temp files')\n .option('-c, --cache', 'Clean registry cache')\n .option('-o, --orphans', 'Clean orphaned symlinks')\n .option('-t, --temp', 'Clean temp files')\n .option('-a, --all', 'Clean everything')\n .option('-n, --dry-run', 'Preview what would be cleaned')\n .option('--json', 'Output as JSON')\n .action((options: CleanCommandOptions) => {\n executeCleanCommand(options);\n });\n}\n","/**\n * Cleaner Service\n *\n * Cleans cache, orphaned symlinks, and temp files\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport type {\n CleanResult,\n CleanedItem,\n CleanError,\n CleanOptions,\n} from './types.js';\nimport { SymlinkManager } from '../symlink/manager.js';\nimport type { ProjectConfig } from '../config/schema.js';\nimport type { SupportedProvider } from '../../core/constants.js';\n\nexport class CleanerService {\n private projectRoot: string;\n private synapSyncDir: string;\n private config: ProjectConfig | null;\n\n constructor(projectRoot: string, synapSyncDir: string, config?: ProjectConfig) {\n this.projectRoot = projectRoot;\n this.synapSyncDir = synapSyncDir;\n this.config = config ?? null;\n }\n\n /**\n * Clean based on options\n */\n clean(options: CleanOptions = {}): CleanResult {\n const startTime = Date.now();\n const result: CleanResult = {\n success: true,\n cleaned: [],\n bytesFreed: 0,\n sizeFreed: '0 B',\n errors: [],\n duration: 0,\n };\n\n // If --all, enable everything\n if (options.all === true) {\n options.cache = true;\n options.orphans = true;\n options.temp = true;\n }\n\n // Default to cache if nothing specified\n if (options.cache !== true && options.orphans !== true && options.temp !== true) {\n options.cache = true;\n }\n\n // Clean cache\n if (options.cache === true) {\n const cacheResult = this.cleanCache(options.dryRun);\n result.cleaned.push(...cacheResult.cleaned);\n result.bytesFreed += cacheResult.bytes;\n result.errors.push(...cacheResult.errors);\n }\n\n // Clean orphaned symlinks\n if (options.orphans === true) {\n const orphanResult = this.cleanOrphans(options.dryRun);\n result.cleaned.push(...orphanResult.cleaned);\n result.errors.push(...orphanResult.errors);\n }\n\n // Clean temp files\n if (options.temp === true) {\n const tempResult = this.cleanTemp(options.dryRun);\n result.cleaned.push(...tempResult.cleaned);\n result.bytesFreed += tempResult.bytes;\n result.errors.push(...tempResult.errors);\n }\n\n result.sizeFreed = this.formatBytes(result.bytesFreed);\n result.success = result.errors.length === 0;\n result.duration = Date.now() - startTime;\n\n return result;\n }\n\n /**\n * Clean registry cache\n */\n private cleanCache(dryRun = false): {\n cleaned: CleanedItem[];\n bytes: number;\n errors: CleanError[];\n } {\n const cleaned: CleanedItem[] = [];\n const errors: CleanError[] = [];\n let bytes = 0;\n\n const cacheDir = path.join(this.synapSyncDir, 'cache');\n\n if (!fs.existsSync(cacheDir)) {\n return { cleaned, bytes, errors };\n }\n\n try {\n const items = this.listDirectory(cacheDir);\n\n for (const item of items) {\n const size = this.getSize(item);\n cleaned.push({\n type: 'cache',\n path: item,\n size,\n });\n bytes += size;\n\n if (!dryRun) {\n try {\n this.removeItem(item);\n } catch (error) {\n errors.push({\n path: item,\n message: error instanceof Error ? error.message : 'Unknown error',\n });\n }\n }\n }\n } catch (error) {\n errors.push({\n path: cacheDir,\n message: error instanceof Error ? error.message : 'Unknown error',\n });\n }\n\n return { cleaned, bytes, errors };\n }\n\n /**\n * Clean orphaned symlinks from provider directories\n */\n private cleanOrphans(dryRun = false): {\n cleaned: CleanedItem[];\n errors: CleanError[];\n } {\n const cleaned: CleanedItem[] = [];\n const errors: CleanError[] = [];\n\n if (this.config === null) {\n return { cleaned, errors };\n }\n\n const providers = this.config.sync?.providers ?? {};\n const enabledProviders = Object.entries(providers)\n .filter(([, cfg]) => (cfg as { enabled?: boolean }).enabled === true)\n .map(([name]) => name as SupportedProvider);\n\n const symlink = new SymlinkManager(this.projectRoot, this.synapSyncDir);\n\n for (const provider of enabledProviders) {\n try {\n const removed = symlink.cleanProvider(provider, dryRun);\n\n for (const name of removed) {\n cleaned.push({\n type: 'orphan',\n path: name,\n size: 0,\n });\n }\n } catch (error) {\n errors.push({\n path: provider,\n message: error instanceof Error ? error.message : 'Unknown error',\n });\n }\n }\n\n return { cleaned, errors };\n }\n\n /**\n * Clean temp files\n */\n private cleanTemp(dryRun = false): {\n cleaned: CleanedItem[];\n bytes: number;\n errors: CleanError[];\n } {\n const cleaned: CleanedItem[] = [];\n const errors: CleanError[] = [];\n let bytes = 0;\n\n const tempPatterns = [\n path.join(this.synapSyncDir, '.tmp'),\n path.join(this.synapSyncDir, 'temp'),\n path.join(this.synapSyncDir, '*.tmp'),\n path.join(this.synapSyncDir, '*.temp'),\n ];\n\n for (const pattern of tempPatterns) {\n // Check if it's a directory or file (not a glob pattern)\n if (!pattern.includes('*')) {\n if (fs.existsSync(pattern)) {\n const size = this.getSize(pattern);\n cleaned.push({\n type: 'temp',\n path: pattern,\n size,\n });\n bytes += size;\n\n if (!dryRun) {\n try {\n this.removeItem(pattern);\n } catch (error) {\n errors.push({\n path: pattern,\n message: error instanceof Error ? error.message : 'Unknown error',\n });\n }\n }\n }\n } else {\n // Handle glob patterns\n const dir = path.dirname(pattern);\n const ext = path.extname(pattern);\n\n if (fs.existsSync(dir)) {\n try {\n const entries = fs.readdirSync(dir);\n for (const entry of entries) {\n if (entry.endsWith(ext.slice(1))) {\n // Remove the *\n const fullPath = path.join(dir, entry);\n const size = this.getSize(fullPath);\n cleaned.push({\n type: 'temp',\n path: fullPath,\n size,\n });\n bytes += size;\n\n if (!dryRun) {\n try {\n this.removeItem(fullPath);\n } catch (error) {\n errors.push({\n path: fullPath,\n message: error instanceof Error ? error.message : 'Unknown error',\n });\n }\n }\n }\n }\n } catch (error) {\n errors.push({\n path: pattern,\n message: error instanceof Error ? error.message : 'Unknown error',\n });\n }\n }\n }\n }\n\n return { cleaned, bytes, errors };\n }\n\n /**\n * List all files/directories in a directory recursively\n */\n private listDirectory(dir: string): string[] {\n const items: string[] = [];\n\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n items.push(fullPath);\n\n if (entry.isDirectory()) {\n items.push(...this.listDirectory(fullPath));\n }\n }\n\n return items;\n }\n\n /**\n * Get the size of a file or directory\n */\n private getSize(itemPath: string): number {\n try {\n const stats = fs.statSync(itemPath);\n\n if (stats.isFile()) {\n return stats.size;\n }\n\n if (stats.isDirectory()) {\n let size = 0;\n const entries = fs.readdirSync(itemPath, { withFileTypes: true });\n for (const entry of entries) {\n size += this.getSize(path.join(itemPath, entry.name));\n }\n return size;\n }\n\n return 0;\n } catch {\n return 0;\n }\n }\n\n /**\n * Remove a file or directory\n */\n private removeItem(itemPath: string): void {\n const stats = fs.lstatSync(itemPath);\n\n if (stats.isSymbolicLink() || stats.isFile()) {\n fs.unlinkSync(itemPath);\n } else if (stats.isDirectory()) {\n fs.rmSync(itemPath, { recursive: true });\n }\n }\n\n /**\n * Format bytes to human readable string\n */\n private formatBytes(bytes: number): string {\n if (bytes === 0) return '0 B';\n\n const units = ['B', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(1024));\n const size = bytes / Math.pow(1024, i);\n\n return `${size.toFixed(i === 0 ? 0 : 1)} ${units[i]}`;\n }\n}\n","/**\n * Help command\n */\n\nimport type { Command } from 'commander';\nimport pc from 'picocolors';\nimport { logger } from '../utils/logger.js';\n\nexport function registerHelpCommand(program: Command): void {\n program\n .command('help [command]')\n .description('Display help for a command')\n .action((commandName?: string) => {\n if (commandName) {\n const cmd = program.commands.find((c) => c.name() === commandName);\n if (cmd) {\n cmd.outputHelp();\n } else {\n logger.error(`Unknown command: ${commandName}`);\n logger.line();\n logger.log(`Run ${pc.cyan('synapsync --help')} to see available commands.`);\n }\n } else {\n program.outputHelp();\n }\n });\n}\n","/**\n * Version command - shows detailed version information\n */\n\nimport type { Command } from 'commander';\nimport pc from 'picocolors';\nimport { version } from '../version.js';\nimport { logger } from '../utils/logger.js';\n\n// Package name for npm registry lookup\nconst PACKAGE_NAME = 'synapsync';\n\n/**\n * Compare two semver version strings\n * Returns: -1 if a < b, 0 if a === b, 1 if a > b\n */\nfunction 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 < Math.max(partsA.length, partsB.length); i++) {\n const partA = partsA[i] ?? 0;\n const partB = partsB[i] ?? 0;\n\n if (partA < partB) return -1;\n if (partA > partB) return 1;\n }\n\n return 0;\n}\n\n/**\n * Fetch latest version from npm registry\n */\nasync function fetchLatestVersion(): Promise<string | null> {\n try {\n // Create abort controller with timeout (globalThis for Node.js compatibility)\n const controller = new globalThis.AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 5000);\n\n const response = await fetch(`https://registry.npmjs.org/${PACKAGE_NAME}/latest`, {\n headers: { Accept: 'application/json' },\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n return null;\n }\n\n const data = (await response.json()) as { version?: string };\n return data.version ?? null;\n } catch {\n return null;\n }\n}\n\n/**\n * Check for available updates\n */\nasync function checkForUpdates(): Promise<void> {\n logger.hint('Checking for updates...');\n\n const latestVersion = await fetchLatestVersion();\n\n if (latestVersion === null) {\n logger.warning('Could not check for updates. Package may not be published yet.');\n return;\n }\n\n const comparison = compareVersions(version, latestVersion);\n\n if (comparison < 0) {\n // Current version is older\n logger.line();\n logger.warning(`Update available: ${pc.cyan(`v${version}`)} → ${pc.green(`v${latestVersion}`)}`);\n logger.line();\n logger.log(` Run ${pc.cyan('npm install -g synapsync')} to update`);\n } else if (comparison > 0) {\n // Current version is newer (development version)\n logger.info(`You are running a development version (${pc.cyan(`v${version}`)})`);\n logger.log(` Latest published: ${pc.dim(`v${latestVersion}`)}`);\n } else {\n // Versions are equal\n logger.success('You are using the latest version');\n }\n}\n\nexport function registerVersionCommand(program: Command): void {\n program\n .command('version')\n .description('Show detailed version information')\n .option('--check', 'Check for available updates')\n .action(async (options: { check?: boolean }) => {\n logger.line();\n logger.log(`${pc.bold('SynapSync CLI')} ${pc.cyan(`v${version}`)}`);\n logger.line();\n logger.label('Node.js', process.version);\n logger.label('Platform', `${process.platform} ${process.arch}`);\n logger.label('Home', process.env['HOME'] ?? 'N/A');\n logger.line();\n\n if (options.check === true) {\n await checkForUpdates();\n }\n });\n}\n"],"mappings":"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","names":["pc","pc","text","pc","pc","pc","fs","path","pc","path","path","pc","p","pc","group","pc","fs","path","pc","pc","p","fs","path","pc","pc","p","pc","pc","getCognitiveIcon","text","fs","path","pc","path","fs","path","yaml","setNestedValue","version","fs","path","fs","path","result","pc","fs","path","pc","validateOptions","pc","getCognitiveIcon","displayCognitive","fs","path","pc","readManifest","pc","pc","validateOptions","pc","fs","path","pc","pc","pc","pc","fs","path","pc","pc","fs","path","displayResults","pc","groupByType","pc","version","pc","pc","pc","pc"]}
1
+ {"version":3,"sources":["../node_modules/tsup/assets/esm_shims.js","../src/version.ts","../src/index.ts","../src/cli.ts","../src/core/constants.ts","../src/ui/repl.ts","../src/ui/banner.ts","../src/ui/logo.ts","../src/utils/logger.ts","../src/commands/info.ts","../src/commands/init.ts","../src/services/config/manager.ts","../src/services/config/schema.ts","../src/commands/config.ts","../src/commands/status.ts","../src/commands/providers.ts","../src/commands/search.ts","../src/services/registry/client.ts","../src/commands/add.ts","../src/services/sync/engine.ts","../src/services/scanner/scanner.ts","../src/services/scanner/parser.ts","../src/services/manifest/manager.ts","../src/services/manifest/types.ts","../src/services/symlink/manager.ts","../src/commands/list.ts","../src/commands/uninstall.ts","../src/commands/sync.ts","../src/commands/update.ts","../src/services/maintenance/update-checker.ts","../src/commands/doctor.ts","../src/services/maintenance/doctor.ts","../src/commands/clean.ts","../src/services/maintenance/cleaner.ts","../src/commands/purge.ts","../src/commands/help.ts","../src/commands/version.ts"],"sourcesContent":["// Shim globals in esm bundle\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nconst getFilename = () => fileURLToPath(import.meta.url)\nconst getDirname = () => path.dirname(getFilename())\n\nexport const __dirname = /* @__PURE__ */ getDirname()\nexport const __filename = /* @__PURE__ */ getFilename()\n","/**\n * CLI version - extracted from package.json\n */\n\n// This will be replaced during build or read from package.json\nexport const version = '0.1.4';\n","/**\n * SynapSync CLI - Entry point\n */\n\nimport { runCLI } from './cli.js';\nimport { logger } from './utils/logger.js';\n\nrunCLI().catch((error) => {\n logger.error(`Fatal error: ${error}`);\n process.exit(1);\n});\n","/**\n * CLI setup with Commander.js\n */\n\nimport { Command } from 'commander';\nimport { CLI_NAME, CLI_DESCRIPTION } from './core/constants.js';\nimport { startInteractiveMode } from './ui/repl.js';\nimport { version } from './version.js';\nimport { logger } from './utils/logger.js';\n\n// Import commands\nimport { registerHelpCommand } from './commands/help.js';\nimport { registerVersionCommand } from './commands/version.js';\nimport { registerInfoCommand } from './commands/info.js';\nimport { registerInitCommand } from './commands/init.js';\nimport { registerConfigCommand } from './commands/config.js';\nimport { registerStatusCommand } from './commands/status.js';\nimport { registerProvidersCommand } from './commands/providers.js';\nimport { registerSearchCommand } from './commands/search.js';\nimport { registerAddCommand } from './commands/add.js';\nimport { registerListCommand } from './commands/list.js';\nimport { registerUninstallCommand } from './commands/uninstall.js';\nimport { registerSyncCommand } from './commands/sync.js';\nimport { registerUpdateCommand } from './commands/update.js';\nimport { registerDoctorCommand } from './commands/doctor.js';\nimport { registerCleanCommand } from './commands/clean.js';\nimport { registerPurgeCommand } from './commands/purge.js';\n\nexport function createCLI(): Command {\n const program = new Command();\n\n program\n .name(CLI_NAME)\n .description(CLI_DESCRIPTION)\n .version(version, '-v, --version', 'Show CLI version')\n .option('--verbose', 'Enable verbose output')\n .option('--no-color', 'Disable colored output')\n .hook('preAction', (_thisCommand, _actionCommand) => {\n // Global pre-action hook for logging, etc.\n });\n\n // Enter interactive mode when no command is provided\n program.action(() => {\n startInteractiveMode();\n });\n\n // Register commands\n registerHelpCommand(program);\n registerVersionCommand(program);\n registerInfoCommand(program);\n registerInitCommand(program);\n registerConfigCommand(program);\n registerStatusCommand(program);\n registerProvidersCommand(program);\n registerSearchCommand(program);\n registerAddCommand(program);\n registerListCommand(program);\n registerUninstallCommand(program);\n registerSyncCommand(program);\n registerUpdateCommand(program);\n registerDoctorCommand(program);\n registerCleanCommand(program);\n registerPurgeCommand(program);\n\n // TODO: Register more commands as they are implemented\n // These commands will work both via CLI (synapsync init)\n // and in interactive mode (/init)\n // registerInitCommand(program);\n // registerConfigCommand(program);\n // registerConnectCommand(program);\n // registerProvidersCommand(program);\n // registerSearchCommand(program);\n // registerAddCommand(program);\n // registerListCommand(program);\n // registerInfoCommand(program);\n // registerUninstallCommand(program);\n // registerSyncCommand(program);\n // registerStatusCommand(program);\n\n return program;\n}\n\nexport async function runCLI(args: string[] = process.argv): Promise<void> {\n const program = createCLI();\n\n try {\n await program.parseAsync(args);\n } catch (error) {\n if (error instanceof Error) {\n logger.error(`Error: ${error.message}`);\n logger.debug(error.stack ?? '');\n }\n process.exit(1);\n }\n}\n","/**\n * Core constants for SynapSync CLI\n */\n\n// ============================================\n// Cognitive Types - The types of AI cognitives managed\n// Cognitives are the building blocks of AI capabilities:\n// skills, agents, prompts, workflows, and tools\n// ============================================\nexport const COGNITIVE_TYPES = ['skill', 'agent', 'prompt', 'workflow', 'tool'] as const;\nexport type CognitiveType = (typeof COGNITIVE_TYPES)[number];\n\n// File extensions per cognitive type (used for detection/scanning)\nexport const COGNITIVE_FILE_EXTENSIONS: Record<CognitiveType, string> = {\n skill: '.md',\n agent: '.md',\n prompt: '.md',\n workflow: '.yaml',\n tool: '.md',\n};\n\n// Sync mode per cognitive type:\n// - 'folder': Sync entire folder (for cognitives with assets, like skills)\n// - 'file': Sync as flat file (for simple cognitives like agents)\nexport const COGNITIVE_SYNC_MODE: Record<CognitiveType, 'folder' | 'file'> = {\n skill: 'folder', // Skills have SKILL.md + assets/ folder\n agent: 'file', // Agents are single .md files\n prompt: 'file', // Prompts are single .md files\n workflow: 'file', // Workflows are single .yaml files\n tool: 'file', // Tools are single .md files\n};\n\n// Legacy: Default file names per cognitive type (for backward compatibility)\n// New cognitives should use their original filename\nexport const COGNITIVE_FILE_NAMES: Record<CognitiveType, string> = {\n skill: 'SKILL.md',\n agent: 'AGENT.md',\n prompt: 'PROMPT.md',\n workflow: 'WORKFLOW.yaml',\n tool: 'TOOL.md',\n};\n\n// ============================================\n// Storage Paths\n// ============================================\nexport const DEFAULT_SYNAPSYNC_DIR = process.env['SYNAPSYNC_DIR'] ?? '.synapsync';\nexport const MANIFEST_FILE_NAME = 'manifest.json';\nexport const CONFIG_FILE_NAME = 'synapsync.config.yaml';\nexport const LOCK_FILE_NAME = 'synapsync.lock';\n\n// Legacy support (will be deprecated)\nexport const DEFAULT_AGENTS_DIR = process.env['SYNAPSYNC_AGENTS_DIR'] ?? '.agents';\nexport const DEFAULT_SKILLS_SUBDIR = process.env['SYNAPSYNC_SKILLS_SUBDIR'] ?? 'skills';\n\n// ============================================\n// Categories for resource organization\n// ============================================\nexport const CATEGORIES = [\n 'frontend',\n 'backend',\n 'database',\n 'devops',\n 'security',\n 'testing',\n 'analytics',\n 'automation',\n 'general',\n] as const;\n\nexport type Category = (typeof CATEGORIES)[number] | string;\n\n// ============================================\n// Provider Configuration\n// ============================================\nexport const SUPPORTED_PROVIDERS = [\n 'claude',\n 'openai',\n 'gemini',\n 'cursor',\n 'windsurf',\n 'copilot',\n] as const;\nexport type SupportedProvider = (typeof SUPPORTED_PROVIDERS)[number];\n\n// Provider paths for syncing cognitives\nexport const PROVIDER_PATHS: Record<SupportedProvider, Record<CognitiveType, string>> = {\n claude: {\n skill: '.claude/skills',\n agent: '.claude/agents',\n prompt: '.claude/prompts',\n workflow: '.claude/workflows',\n tool: '.claude/tools',\n },\n openai: {\n skill: '.openai/skills',\n agent: '.openai/agents',\n prompt: '.openai/prompts',\n workflow: '.openai/workflows',\n tool: '.openai/tools',\n },\n gemini: {\n skill: '.gemini/skills',\n agent: '.gemini/agents',\n prompt: '.gemini/prompts',\n workflow: '.gemini/workflows',\n tool: '.gemini/tools',\n },\n cursor: {\n skill: '.cursor/skills',\n agent: '.cursor/agents',\n prompt: '.cursor/prompts',\n workflow: '.cursor/workflows',\n tool: '.cursor/tools',\n },\n windsurf: {\n skill: '.windsurf/skills',\n agent: '.windsurf/agents',\n prompt: '.windsurf/prompts',\n workflow: '.windsurf/workflows',\n tool: '.windsurf/tools',\n },\n copilot: {\n skill: '.github/skills',\n agent: '.github/agents',\n prompt: '.github/prompts',\n workflow: '.github/workflows',\n tool: '.github/tools',\n },\n};\n\n// ============================================\n// CLI Metadata\n// ============================================\nexport const CLI_NAME = 'synapsync';\nexport const CLI_DESCRIPTION =\n 'Neural AI Orchestration Platform - Manage AI cognitives (skills, agents, prompts, tools) across providers';\n\n// ============================================\n// Registry Configuration\n// ============================================\nexport const REGISTRY_BASE_URL =\n process.env['SYNAPSYNC_REGISTRY_URL'] ??\n 'https://raw.githubusercontent.com/SynapSync/synapse-registry/main';\nexport const REGISTRY_INDEX_FILE = 'registry.json';\nexport const REGISTRY_MANIFEST_FILE = 'manifest.json';\n\n// ============================================\n// ANSI Escape Codes\n// ============================================\nexport const RESET = '\\x1b[0m';\nexport const DIM = '\\x1b[2m';\nexport const BOLD = '\\x1b[1m';\n","/**\n * Interactive REPL (Read-Eval-Print Loop) for SynapSync CLI\n * Allows users to run commands interactively without leaving the CLI\n */\n\nimport * as readline from 'readline';\nimport pc from 'picocolors';\nimport { showBanner, showError, showInfo } from './banner.js';\nimport { CLI_NAME } from '../core/constants.js';\nimport { logger } from '../utils/logger.js';\nimport { executeInfoCommand } from '../commands/info.js';\nimport { executeInitCommand } from '../commands/init.js';\nimport { executeConfigCommand } from '../commands/config.js';\nimport { executeStatusCommand } from '../commands/status.js';\nimport { executeProvidersCommand } from '../commands/providers.js';\nimport { executeSearchCommand } from '../commands/search.js';\nimport { executeAddCommand } from '../commands/add.js';\nimport { executeListCommand } from '../commands/list.js';\nimport { executeUninstallCommand } from '../commands/uninstall.js';\nimport { executeSyncCommand, executeSyncStatusCommand } from '../commands/sync.js';\nimport { executeUpdateCommand } from '../commands/update.js';\nimport { executeDoctorCommand } from '../commands/doctor.js';\nimport { executeCleanCommand } from '../commands/clean.js';\nimport { executePurgeCommand } from '../commands/purge.js';\n\n// Command definition with usage info\ninterface CommandDef {\n description: string;\n usage?: string;\n options?: Array<{ flag: string; description: string }>;\n examples?: string[];\n handler: (args: string) => void | Promise<void>;\n}\n\n// Available commands in interactive mode\nconst COMMANDS: Record<string, CommandDef> = {};\n\n// Register a command for interactive mode\nexport function registerInteractiveCommand(\n name: string,\n description: string,\n handler: (args: string) => void | Promise<void>,\n options?: {\n usage?: string;\n options?: Array<{ flag: string; description: string }>;\n examples?: string[];\n }\n): void {\n const def: CommandDef = { description, handler };\n if (options?.usage !== undefined) def.usage = options.usage;\n if (options?.options !== undefined) def.options = options.options;\n if (options?.examples !== undefined) def.examples = options.examples;\n COMMANDS[name] = def;\n}\n\n// Show detailed help for a specific command\nfunction showCommandHelp(commandName: string): void {\n const cmd = COMMANDS[commandName];\n if (!cmd) {\n showError(`Unknown command: /${commandName}`);\n return;\n }\n\n logger.line();\n logger.log(pc.bold(pc.cyan(` /${commandName}`)) + pc.dim(` - ${cmd.description}`));\n logger.line();\n\n if (cmd.usage) {\n logger.log(pc.bold(' Usage:'));\n logger.log(` ${pc.cyan(cmd.usage)}`);\n logger.line();\n }\n\n if (cmd.options && cmd.options.length > 0) {\n logger.log(pc.bold(' Options:'));\n for (const opt of cmd.options) {\n logger.log(` ${pc.yellow(opt.flag.padEnd(16))} ${pc.dim(opt.description)}`);\n }\n logger.line();\n }\n\n if (cmd.examples && cmd.examples.length > 0) {\n logger.log(pc.bold(' Examples:'));\n for (const example of cmd.examples) {\n logger.log(` ${pc.dim('$')} ${pc.cyan(example)}`);\n }\n logger.line();\n }\n}\n\n// ============================================\n// Built-in Commands\n// ============================================\n\nregisterInteractiveCommand(\n 'help',\n 'Show available commands or help for a specific command',\n (args) => {\n const commandName = args.trim().toLowerCase().replace(/^\\//, '');\n\n // If a command name is provided, show detailed help\n if (commandName) {\n showCommandHelp(commandName);\n return;\n }\n\n // Show general help\n logger.line();\n logger.bold(' Available Commands:');\n logger.line();\n\n // Built-in commands\n logger.log(` ${pc.cyan('/help [command]')} ${pc.dim('Show help (or help for a command)')}`);\n logger.log(` ${pc.cyan('/clear')} ${pc.dim('Clear the screen')}`);\n logger.log(` ${pc.cyan('/exit')} ${pc.dim('Exit interactive mode')}`);\n logger.line();\n\n // Registered commands by category\n const categories: Record<string, string[]> = {\n 'Information': ['info', 'version'],\n 'Project': ['init', 'config', 'status'],\n 'Providers': ['providers'],\n 'Cognitives': ['search', 'add', 'list', 'uninstall'],\n 'Sync': ['sync'],\n 'Maintenance': ['update', 'doctor', 'clean', 'purge'],\n };\n\n for (const [category, cmds] of Object.entries(categories)) {\n const availableCmds = cmds.filter((name) => COMMANDS[name]);\n if (availableCmds.length > 0) {\n logger.bold(` ${category}:`);\n for (const name of availableCmds) {\n const cmd = COMMANDS[name];\n const hasOptions = cmd?.options !== undefined && cmd.options.length > 0;\n const paddedName = `/${name}`.padEnd(18);\n const optionsHint = hasOptions ? pc.yellow(' [options]') : '';\n logger.log(` ${pc.cyan(paddedName)} ${pc.dim(cmd?.description ?? '')}${optionsHint}`);\n }\n logger.line();\n }\n }\n\n logger.hint('Tip: Use /help <command> for detailed help. Example: /help info');\n logger.line();\n },\n {\n usage: '/help [command]',\n examples: ['/help', '/help info', '/help add'],\n }\n);\n\nregisterInteractiveCommand('clear', 'Clear the screen', (_args) => {\n logger.clear();\n showBanner();\n});\n\nregisterInteractiveCommand('exit', 'Exit interactive mode', (_args) => {\n logger.line();\n showInfo('Goodbye! Run `synapsync` to start again.');\n logger.line();\n process.exit(0);\n});\n\nregisterInteractiveCommand(\n 'info',\n 'Show information about SynapSync concepts',\n (args) => {\n executeInfoCommand(args);\n },\n {\n usage: '/info [--topic]',\n options: [\n { flag: '--cognitives', description: 'Types of AI cognitives (skills, agents, etc.)' },\n { flag: '--add', description: 'How to add from registry, GitHub, local' },\n { flag: '--providers', description: 'Supported AI providers' },\n { flag: '--categories', description: 'Cognitive organization categories' },\n { flag: '--sync', description: 'How synchronization works' },\n { flag: '--structure', description: 'Project directory structure' },\n ],\n examples: ['/info', '/info --cognitives', '/info --add'],\n }\n);\n\n// ============================================\n// Project Commands\n// ============================================\n\nregisterInteractiveCommand(\n 'init',\n 'Initialize a new SynapSync project',\n async (_args) => {\n await executeInitCommand();\n },\n {\n usage: '/init [options]',\n options: [\n { flag: '-n, --name', description: 'Project name' },\n { flag: '-y, --yes', description: 'Skip prompts, use defaults' },\n ],\n examples: ['/init', '/init --name my-project', '/init --yes'],\n }\n);\n\nregisterInteractiveCommand(\n 'config',\n 'Manage project configuration',\n (args) => {\n executeConfigCommand(args);\n },\n {\n usage: '/config [list|get|set] [key] [value]',\n options: [\n { flag: 'list', description: 'Show all configuration values' },\n { flag: 'get <key>', description: 'Get a specific value' },\n { flag: 'set <key> <value>', description: 'Set a configuration value' },\n ],\n examples: ['/config', '/config list', '/config get cli.theme', '/config set cli.theme dark'],\n }\n);\n\nregisterInteractiveCommand(\n 'status',\n 'Show project status',\n (_args) => {\n executeStatusCommand();\n },\n {\n usage: '/status',\n examples: ['/status'],\n }\n);\n\n// ============================================\n// Provider Commands\n// ============================================\n\nregisterInteractiveCommand(\n 'providers',\n 'Manage provider configuration',\n (args) => {\n executeProvidersCommand(args);\n },\n {\n usage: '/providers [list|enable|disable|path] [args]',\n options: [\n { flag: 'list', description: 'List all providers and status (default)' },\n { flag: 'enable <provider>', description: 'Enable a provider' },\n { flag: 'disable <provider>', description: 'Disable a provider' },\n { flag: 'path <provider> <path>', description: 'Set custom sync path' },\n ],\n examples: [\n '/providers',\n '/providers enable openai',\n '/providers disable cursor',\n '/providers path claude .claude-code/',\n ],\n }\n);\n\n// ============================================\n// Asset Commands (skills, agents, prompts, etc.)\n// ============================================\n\nregisterInteractiveCommand(\n 'search',\n 'Search for cognitives in the registry',\n async (args) => {\n // Parse args to extract query and options\n const parts = args.split(/\\s+/);\n let query: string | undefined;\n const options: Record<string, string | boolean> = {};\n\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i];\n if (part === undefined || part === '') continue;\n\n if (part === '--type' || part === '-t') {\n options['type'] = parts[++i] ?? '';\n } else if (part === '--category' || part === '-c') {\n options['category'] = parts[++i] ?? '';\n } else if (part === '--tag') {\n options['tag'] = parts[++i] ?? '';\n } else if (part === '--limit' || part === '-l') {\n options['limit'] = parts[++i] ?? '20';\n } else if (part === '--json') {\n options['json'] = true;\n } else if (!part.startsWith('-')) {\n query = part;\n }\n }\n\n await executeSearchCommand(query, options);\n },\n {\n usage: '/search [query] [options]',\n options: [\n { flag: '-t, --type <type>', description: 'Filter by type (skill, agent, prompt, etc.)' },\n { flag: '-c, --category <cat>', description: 'Filter by category' },\n { flag: '--tag <tag>', description: 'Filter by tag' },\n { flag: '-l, --limit <n>', description: 'Limit results (default: 20)' },\n { flag: '--json', description: 'Output as JSON' },\n ],\n examples: ['/search', '/search react', '/search --type skill', '/search api --category backend'],\n }\n);\n\nregisterInteractiveCommand(\n 'add',\n 'Add a cognitive from registry, local path, or GitHub',\n async (args) => {\n const parts = args.split(/\\s+/);\n let source: string | undefined;\n const options: Record<string, string | boolean> = {};\n\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i];\n if (part === undefined || part === '') continue;\n\n if (part === '--type' || part === '-t') {\n options['type'] = parts[++i] ?? '';\n } else if (part === '--category' || part === '-c') {\n options['category'] = parts[++i] ?? '';\n } else if (part === '--force' || part === '-f') {\n options['force'] = true;\n } else if (!part.startsWith('-')) {\n source = part;\n }\n }\n\n if (source === undefined || source === '') {\n logger.error('Please specify a cognitive to add.');\n logger.hint('Usage: /add <name|path|github:user/repo>');\n return;\n }\n\n await executeAddCommand(source, options);\n },\n {\n usage: '/add <source> [options]',\n options: [\n { flag: '-t, --type <type>', description: 'Cognitive type (skill, agent, etc.)' },\n { flag: '-c, --category <cat>', description: 'Category (overrides default)' },\n { flag: '-f, --force', description: 'Overwrite if already installed' },\n ],\n examples: [\n '/add skill-creator',\n '/add ./my-skill',\n '/add github:user/repo',\n '/add skill-creator --force',\n ],\n }\n);\n\nregisterInteractiveCommand(\n 'list',\n 'List installed cognitives or browse registry',\n async (args) => {\n const parts = args.split(/\\s+/);\n const options: Record<string, string | boolean> = {};\n\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i];\n if (part === undefined || part === '') continue;\n\n if (part === '--type' || part === '-t') {\n options['type'] = parts[++i] ?? '';\n } else if (part === '--category' || part === '-c') {\n options['category'] = parts[++i] ?? '';\n } else if (part === '--remote' || part === '-r') {\n options['remote'] = true;\n } else if (part === '--json') {\n options['json'] = true;\n }\n }\n\n await executeListCommand(options);\n },\n {\n usage: '/list [options]',\n options: [\n { flag: '-t, --type <type>', description: 'Filter by type (skill, agent, prompt, etc.)' },\n { flag: '-c, --category <cat>', description: 'Filter by category' },\n { flag: '-r, --remote', description: 'Browse all cognitives in registry' },\n { flag: '--json', description: 'Output as JSON' },\n ],\n examples: ['/list', '/list --remote', '/list --type skill', '/list --category backend'],\n }\n);\n\nregisterInteractiveCommand(\n 'uninstall',\n 'Uninstall a cognitive',\n (args) => {\n const parts = args.split(/\\s+/);\n let name: string | undefined;\n const options: Record<string, boolean> = {};\n\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i];\n if (part === undefined || part === '') continue;\n\n if (part === '--force' || part === '-f') {\n options['force'] = true;\n } else if (part === '--keep-files') {\n options['keepFiles'] = true;\n } else if (!part.startsWith('-')) {\n name = part;\n }\n }\n\n if (name === undefined || name === '') {\n logger.error('Please specify a cognitive to uninstall.');\n logger.hint('Usage: /uninstall <name> [--force]');\n return;\n }\n\n executeUninstallCommand(name, options);\n },\n {\n usage: '/uninstall <name> [options]',\n options: [\n { flag: '-f, --force', description: 'Skip confirmation' },\n { flag: '--keep-files', description: 'Remove from manifest but keep files' },\n ],\n examples: ['/uninstall skill-creator', '/uninstall my-agent --force'],\n }\n);\n\n// ============================================\n// Sync Commands\n// ============================================\n\nregisterInteractiveCommand(\n 'sync',\n 'Sync cognitives to providers',\n (args) => {\n const parts = args.split(/\\s+/);\n const options: Record<string, string | boolean> = {};\n let subcommand: string | undefined;\n\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i];\n if (part === undefined || part === '') continue;\n\n if (part === 'status') {\n subcommand = 'status';\n } else if (part === '--dry-run' || part === '-n') {\n options['dryRun'] = true;\n } else if (part === '--type' || part === '-t') {\n options['type'] = parts[++i] ?? '';\n } else if (part === '--category' || part === '-c') {\n options['category'] = parts[++i] ?? '';\n } else if (part === '--provider' || part === '-p') {\n options['provider'] = parts[++i] ?? '';\n } else if (part === '--copy') {\n options['copy'] = true;\n } else if (part === '--force' || part === '-f') {\n options['force'] = true;\n } else if (part === '--verbose' || part === '-v') {\n options['verbose'] = true;\n } else if (part === '--json') {\n options['json'] = true;\n }\n }\n\n // Call the appropriate function based on subcommand\n if (subcommand === 'status') {\n executeSyncStatusCommand({ json: options['json'] === true });\n } else {\n executeSyncCommand(options);\n }\n },\n {\n usage: '/sync [status] [options]',\n options: [\n { flag: 'status', description: 'Show sync status without applying changes' },\n { flag: '-n, --dry-run', description: 'Preview changes without applying' },\n { flag: '-t, --type <type>', description: 'Sync only a specific type' },\n { flag: '-c, --category <cat>', description: 'Sync only a specific category' },\n { flag: '-p, --provider <name>', description: 'Sync only to a specific provider' },\n { flag: '--copy', description: 'Use file copy instead of symlinks' },\n { flag: '-f, --force', description: 'Force sync even if already synced' },\n { flag: '-v, --verbose', description: 'Show detailed output' },\n { flag: '--json', description: 'Output as JSON' },\n ],\n examples: ['/sync', '/sync status', '/sync --dry-run', '/sync --provider claude'],\n }\n);\n\n// ============================================\n// Maintenance Commands\n// ============================================\n\nregisterInteractiveCommand(\n 'update',\n 'Update installed cognitives',\n async (args) => {\n const parts = args.split(/\\s+/);\n let name: string | undefined;\n const options: Record<string, string | boolean> = {};\n\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i];\n if (part === undefined || part === '') continue;\n\n if (part === '--all' || part === '-a') {\n options['all'] = true;\n } else if (part === '--force' || part === '-f') {\n options['force'] = true;\n } else if (part === '--dry-run' || part === '-n') {\n options['dryRun'] = true;\n } else if (part === '--json') {\n options['json'] = true;\n } else if (!part.startsWith('-')) {\n name = part;\n }\n }\n\n await executeUpdateCommand(name, options);\n },\n {\n usage: '/update [name] [options]',\n options: [\n { flag: '-a, --all', description: 'Update all cognitives' },\n { flag: '-f, --force', description: 'Force update even if current' },\n { flag: '-n, --dry-run', description: 'Preview updates without applying' },\n { flag: '--json', description: 'Output as JSON' },\n ],\n examples: ['/update skill-creator', '/update --all', '/update --dry-run'],\n }\n);\n\nregisterInteractiveCommand(\n 'doctor',\n 'Check project health and diagnose issues',\n async (args) => {\n const parts = args.split(/\\s+/);\n const options: Record<string, boolean> = {};\n\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i];\n if (part === undefined || part === '') continue;\n\n if (part === '--fix') {\n options['fix'] = true;\n } else if (part === '--verbose' || part === '-v') {\n options['verbose'] = true;\n } else if (part === '--json') {\n options['json'] = true;\n }\n }\n\n await executeDoctorCommand(options);\n },\n {\n usage: '/doctor [options]',\n options: [\n { flag: '--fix', description: 'Attempt to fix issues automatically' },\n { flag: '-v, --verbose', description: 'Show detailed output' },\n { flag: '--json', description: 'Output as JSON' },\n ],\n examples: ['/doctor', '/doctor --fix', '/doctor --verbose'],\n }\n);\n\nregisterInteractiveCommand(\n 'clean',\n 'Remove orphaned files and fix broken symlinks',\n (args) => {\n const parts = args.split(/\\s+/);\n const options: Record<string, boolean> = {};\n\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i];\n if (part === undefined || part === '') continue;\n\n if (part === '--dry-run' || part === '-n') {\n options['dryRun'] = true;\n } else if (part === '--force' || part === '-f') {\n options['force'] = true;\n } else if (part === '--verbose' || part === '-v') {\n options['verbose'] = true;\n } else if (part === '--json') {\n options['json'] = true;\n }\n }\n\n executeCleanCommand(options);\n },\n {\n usage: '/clean [options]',\n options: [\n { flag: '-n, --dry-run', description: 'Preview what would be cleaned' },\n { flag: '-f, --force', description: 'Skip confirmation' },\n { flag: '-v, --verbose', description: 'Show detailed output' },\n { flag: '--json', description: 'Output as JSON' },\n ],\n examples: ['/clean', '/clean --dry-run', '/clean --force'],\n }\n);\n\nregisterInteractiveCommand(\n 'purge',\n 'Completely remove SynapSync from the project',\n (args) => {\n const parts = args.split(/\\s+/);\n const options: Record<string, boolean> = {};\n\n for (const part of parts) {\n if (part === '--force' || part === '-f') {\n options['force'] = true;\n }\n }\n\n executePurgeCommand(options);\n },\n {\n usage: '/purge [options]',\n options: [\n { flag: '-f, --force', description: 'Skip confirmation and remove everything' },\n ],\n examples: ['/purge', '/purge --force'],\n }\n);\n\n// ============================================\n// Utility Commands\n// ============================================\n\nregisterInteractiveCommand('version', 'Show version information', async (_args) => {\n const { version } = await import('../version.js');\n logger.line();\n logger.log(`${pc.bold('SynapSync CLI')} ${pc.cyan(`v${version}`)}`);\n logger.line();\n logger.label('Node.js', process.version);\n logger.label('Platform', `${process.platform} ${process.arch}`);\n logger.line();\n});\n\n/**\n * Parse command input and execute\n */\nasync function executeCommand(input: string): Promise<void> {\n const trimmed = input.trim();\n\n if (!trimmed) {\n return;\n }\n\n // Commands must start with /\n if (!trimmed.startsWith('/')) {\n showError(`Unknown input. Commands must start with /`);\n logger.log(`${pc.dim('Type')} ${pc.cyan('/help')} ${pc.dim('for available commands.')}`);\n return;\n }\n\n // Parse command and arguments\n const parts = trimmed.slice(1).split(/\\s+/);\n const commandName = parts[0]?.toLowerCase();\n const args = parts.slice(1).join(' ');\n\n if (!commandName) {\n return;\n }\n\n const command = COMMANDS[commandName];\n\n if (!command) {\n showError(`Unknown command: /${commandName}`);\n logger.log(`${pc.dim('Type')} ${pc.cyan('/help')} ${pc.dim('for available commands.')}`);\n return;\n }\n\n try {\n await command.handler(args);\n } catch (error) {\n if (error instanceof Error) {\n showError(error.message);\n } else {\n showError('An unexpected error occurred');\n }\n }\n}\n\n/**\n * Start the interactive REPL\n */\nexport function startInteractiveMode(): void {\n // Show banner first\n showBanner();\n\n logger.log(\n `${pc.dim('Type')} ${pc.cyan('/help')} ${pc.dim('for commands,')} ${pc.cyan('/exit')} ${pc.dim('to quit.')}`\n );\n logger.line();\n\n // Create readline interface\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n prompt: `${pc.green(CLI_NAME)} ${pc.dim('>')} `,\n terminal: true,\n });\n\n // Handle line input\n rl.on('line', (line) => {\n void executeCommand(line).then(() => {\n rl.prompt();\n });\n });\n\n // Handle close (Ctrl+C, Ctrl+D)\n rl.on('close', () => {\n logger.line();\n showInfo('Goodbye!');\n process.exit(0);\n });\n\n // Handle SIGINT (Ctrl+C)\n rl.on('SIGINT', () => {\n logger.line();\n logger.hint('(Use /exit to quit or Ctrl+D)');\n rl.prompt();\n });\n\n // Start the prompt\n rl.prompt();\n}\n","/**\n * Welcome banner for SynapSync CLI\n */\n\nimport pc from 'picocolors';\nimport { showLogo } from './logo.js';\nimport { version } from '../version.js';\nimport { logger } from '../utils/logger.js';\n\n/**\n * Show the full welcome banner\n */\nexport function showBanner(): void {\n showLogo();\n logger.line();\n logger.dim(`Neural AI Orchestration Platform`);\n logger.dim(`Version ${version}`);\n logger.line();\n\n // Quick start commands\n logger.bold(' Quick Start:');\n logger.line();\n logger.command('synapsync init', 'Initialize a new project');\n logger.command('synapsync connect', 'Connect to AI providers');\n logger.command('synapsync search', 'Search registry for assets');\n logger.command('synapsync add <name>', 'Add skill, agent, or prompt');\n logger.command('synapsync sync', 'Sync assets to providers');\n logger.line();\n\n // Help hint\n logger.log(` ${pc.dim('Run')} ${pc.cyan('synapsync --help')} ${pc.dim('for all commands')}`);\n logger.line();\n}\n\n/**\n * Show a minimal header (for command output)\n */\nexport function showHeader(title: string): void {\n logger.header(title);\n}\n\n/**\n * Show success message\n */\nexport function showSuccess(message: string): void {\n logger.success(message);\n}\n\n/**\n * Show error message\n */\nexport function showError(message: string): void {\n logger.error(message);\n}\n\n/**\n * Show warning message\n */\nexport function showWarning(message: string): void {\n logger.warning(message);\n}\n\n/**\n * Show info message\n */\nexport function showInfo(message: string): void {\n logger.info(message);\n}\n","/**\n * ASCII Logo with gradient colors\n * Inspired by vercel-labs/skills pattern\n */\n\nimport { logger } from '../utils/logger.js';\n\n// SynapSync ASCII art logo\nconst LOGO_LINES = [\n '███████╗██╗ ██╗███╗ ██╗ █████╗ ██████╗ ███████╗██╗ ██╗███╗ ██╗ ██████╗',\n '██╔════╝╚██╗ ██╔╝████╗ ██║██╔══██╗██╔══██╗██╔════╝╚██╗ ██╔╝████╗ ██║██╔════╝',\n '███████╗ ╚████╔╝ ██╔██╗ ██║███████║██████╔╝███████╗ ╚████╔╝ ██╔██╗ ██║██║ ',\n '╚════██║ ╚██╔╝ ██║╚██╗██║██╔══██║██╔═══╝ ╚════██║ ╚██╔╝ ██║╚██╗██║██║ ',\n '███████║ ██║ ██║ ╚████║██║ ██║██║ ███████║ ██║ ██║ ╚████║╚██████╗',\n '╚══════╝ ╚═╝ ╚═╝ ╚═══╝╚═╝ ╚═╝╚═╝ ╚══════╝ ╚═╝ ╚═╝ ╚═══╝ ╚═════╝',\n];\n\n// Gradient colors: Blue -> Cyan -> Green\nconst GRADIENT_COLORS = [\n '\\x1b[38;5;39m', // Bright blue\n '\\x1b[38;5;38m', // Blue-cyan\n '\\x1b[38;5;37m', // Cyan\n '\\x1b[38;5;36m', // Cyan-green\n '\\x1b[38;5;35m', // Green-cyan\n '\\x1b[38;5;34m', // Green\n];\n\n// Alternative compact logo for smaller terminals\nconst COMPACT_LOGO_LINES = [\n '╔═╗┬ ┬┌┐┌┌─┐┌─┐╔═╗┬ ┬┌┐┌┌─┐',\n '╚═╗└┬┘│││├─┤├─┘╚═╗└┬┘││││ ',\n '╚═╝ ┴ ┘└┘┴ ┴┴ ╚═╝ ┴ ┘└┘└─┘',\n];\n\nconst COMPACT_COLORS = ['\\x1b[38;5;39m', '\\x1b[38;5;37m', '\\x1b[38;5;34m'];\n\nconst RESET = '\\x1b[0m';\n\n/**\n * Get terminal width, defaulting to 80 if unavailable\n */\nfunction getTerminalWidth(): number {\n return process.stdout.columns ?? 80;\n}\n\n/**\n * Show the full ASCII logo with gradient\n */\nexport function showLogo(): void {\n const termWidth = getTerminalWidth();\n const useCompact = termWidth < 85;\n\n logger.line();\n\n if (useCompact) {\n COMPACT_LOGO_LINES.forEach((line, index) => {\n const color = COMPACT_COLORS[index % COMPACT_COLORS.length] ?? '';\n logger.gradient(line, color);\n });\n } else {\n LOGO_LINES.forEach((line, index) => {\n const color = GRADIENT_COLORS[index % GRADIENT_COLORS.length] ?? '';\n logger.gradient(line, color);\n });\n }\n}\n\n/**\n * Get logo as string array (for custom rendering)\n */\nexport function getLogoLines(): string[] {\n const termWidth = getTerminalWidth();\n const useCompact = termWidth < 85;\n const lines = useCompact ? COMPACT_LOGO_LINES : LOGO_LINES;\n const colors = useCompact ? COMPACT_COLORS : GRADIENT_COLORS;\n\n return lines.map((line, index) => {\n const color = colors[index % colors.length];\n return `${color}${line}${RESET}`;\n });\n}\n","/**\n * Logger utility for consistent CLI output\n * Centralizes all console output with styling via picocolors\n */\n\nimport pc from 'picocolors';\nimport ora, { type Ora } from 'ora';\n\nexport interface Logger {\n // Basic output\n log(message?: string): void;\n line(): void;\n clear(): void;\n\n // Status messages with icons\n info(message: string): void;\n success(message: string): void;\n warning(message: string): void;\n error(message: string): void;\n debug(message: string): void;\n\n // Formatted output\n bold(message: string): void;\n dim(message: string): void;\n section(title: string): void;\n header(title: string): void;\n list(items: string[]): void;\n\n // Utility output\n label(key: string, value: string): void;\n hint(message: string): void;\n command(cmd: string, description: string): void;\n gradient(line: string, color: string): void;\n\n // Spinner\n spinner(text: string): Ora;\n}\n\nexport const logger: Logger = {\n /**\n * Log raw message\n */\n log(message = ''): void {\n console.log(message);\n },\n\n /**\n * Print empty line\n */\n line(): void {\n console.log();\n },\n\n /**\n * Clear console\n */\n clear(): void {\n console.clear();\n },\n\n /**\n * Info message with icon\n */\n info(message: string): void {\n console.log(`${pc.blue('ℹ')} ${message}`);\n },\n\n /**\n * Success message with icon\n */\n success(message: string): void {\n console.log(`${pc.green('✓')} ${message}`);\n },\n\n /**\n * Warning message with icon\n */\n warning(message: string): void {\n console.log(`${pc.yellow('⚠')} ${message}`);\n },\n\n /**\n * Error message with icon\n */\n error(message: string): void {\n console.error(`${pc.red('✖')} ${message}`);\n },\n\n /**\n * Debug message (only if DEBUG env is set)\n */\n debug(message: string): void {\n if (process.env['DEBUG']) {\n console.log(`${pc.dim('⋯')} ${pc.dim(message)}`);\n }\n },\n\n /**\n * Bold text\n */\n bold(message: string): void {\n console.log(pc.bold(message));\n },\n\n /**\n * Dim text\n */\n dim(message: string): void {\n console.log(pc.dim(message));\n },\n\n /**\n * Section title (bold cyan)\n */\n section(title: string): void {\n console.log();\n console.log(pc.bold(pc.cyan(title)));\n },\n\n /**\n * Header with underline\n */\n header(title: string): void {\n console.log();\n console.log(pc.bold(pc.cyan(` ${title}`)));\n console.log(pc.dim(' ' + '─'.repeat(title.length + 2)));\n console.log();\n },\n\n /**\n * Bullet list\n */\n list(items: string[]): void {\n items.forEach((item) => console.log(`${pc.dim(' •')} ${item}`));\n },\n\n /**\n * Label: value format (for version info, etc.)\n */\n label(key: string, value: string): void {\n console.log(`${pc.dim(`${key}:`)}${' '.repeat(Math.max(1, 10 - key.length))}${value}`);\n },\n\n /**\n * Hint text (dim)\n */\n hint(message: string): void {\n console.log(pc.dim(message));\n },\n\n /**\n * Command display with description\n */\n command(cmd: string, description: string): void {\n console.log(` ${pc.dim('$')} ${pc.white(cmd)} ${pc.dim(description)}`);\n },\n\n /**\n * Gradient line (for logo)\n */\n gradient(line: string, color: string): void {\n const RESET = '\\x1b[0m';\n console.log(`${color}${line}${RESET}`);\n },\n\n /**\n * Create and start a spinner\n */\n spinner(text: string): Ora {\n return ora(text).start();\n },\n};\n\nexport default logger;\n","/**\n * Info command - Documentation and help about SynapSync concepts\n */\n\nimport type { Command } from 'commander';\nimport pc from 'picocolors';\nimport { logger } from '../utils/logger.js';\n\n// ============================================\n// Info Topics\n// ============================================\n\ninterface InfoTopic {\n name: string;\n description: string;\n content: () => void;\n}\n\nconst INFO_TOPICS: Record<string, InfoTopic> = {\n cognitives: {\n name: 'Cognitives',\n description: 'Types of AI cognitives managed by SynapSync',\n content: showCognitivesInfo,\n },\n add: {\n name: 'Add',\n description: 'How to add cognitives from different sources',\n content: showAddInfo,\n },\n providers: {\n name: 'Providers',\n description: 'Supported AI providers',\n content: showProvidersInfo,\n },\n categories: {\n name: 'Categories',\n description: 'Cognitive organization categories',\n content: showCategoriesInfo,\n },\n sync: {\n name: 'Sync',\n description: 'How synchronization works',\n content: showSyncInfo,\n },\n structure: {\n name: 'Structure',\n description: 'Project directory structure',\n content: showStructureInfo,\n },\n};\n\n// ============================================\n// Topic Content Functions\n// ============================================\n\nfunction showCognitivesInfo(): void {\n logger.line();\n logger.log(pc.bold(pc.cyan(' Cognitive Types')));\n logger.line();\n logger.dim(\n ' SynapSync manages multiple types of AI cognitives that can be installed,'\n );\n logger.dim(' synced across providers, and shared via the registry.');\n logger.line();\n\n // Cognitives table\n const cognitives = [\n {\n type: 'skill',\n file: 'SKILL.md',\n description: 'Reusable instruction sets for AI assistants',\n color: pc.blue,\n },\n {\n type: 'agent',\n file: 'AGENT.md',\n description: 'Autonomous AI entities with specific behaviors',\n color: pc.yellow,\n },\n {\n type: 'prompt',\n file: 'PROMPT.md',\n description: 'Reusable prompt templates with variables',\n color: pc.magenta,\n },\n {\n type: 'workflow',\n file: 'WORKFLOW.yaml',\n description: 'Multi-step processes combining agents and prompts',\n color: pc.green,\n },\n {\n type: 'tool',\n file: 'TOOL.md',\n description: 'External integrations and functions',\n color: pc.cyan,\n },\n ];\n\n // Header\n logger.log(\n ` ${pc.dim('Type')} ${pc.dim('File')} ${pc.dim('Description')}`\n );\n logger.log(pc.dim(' ' + '─'.repeat(70)));\n\n // Rows\n for (const cognitive of cognitives) {\n const typeCol = cognitive.color(cognitive.type.padEnd(10));\n const fileCol = pc.white(cognitive.file.padEnd(16));\n const descCol = pc.dim(cognitive.description);\n logger.log(` ${typeCol} ${fileCol} ${descCol}`);\n }\n\n logger.line();\n\n // Usage examples\n logger.log(pc.bold(' Usage Examples:'));\n logger.line();\n logger.log(` ${pc.dim('$')} ${pc.cyan('synapsync add')} code-reviewer ${pc.dim('# Add a skill')}`);\n logger.log(` ${pc.dim('$')} ${pc.cyan('synapsync add')} ci-agent ${pc.dim('# Add an agent')}`);\n logger.log(` ${pc.dim('$')} ${pc.cyan('synapsync list')} --type agent ${pc.dim('# List only agents')}`);\n logger.log(` ${pc.dim('$')} ${pc.cyan('synapsync sync')} --type skill ${pc.dim('# Sync only skills')}`);\n logger.line();\n\n // Storage hint\n logger.log(pc.bold(' Storage:'));\n logger.line();\n logger.dim(' Cognitives are stored in .synapsync/{type}s/{category}/{name}/');\n logger.dim(' Example: .synapsync/skills/frontend/react-patterns/SKILL.md');\n logger.line();\n\n // Detection\n logger.log(pc.bold(' Type Detection:'));\n logger.line();\n logger.dim(' When adding, SynapSync detects the cognitive type automatically:');\n logger.line();\n logger.log(` ${pc.cyan('1.')} ${pc.white('Flag')} ${pc.dim('--type skill (explicit, highest priority)')}`);\n logger.log(` ${pc.cyan('2.')} ${pc.white('Registry')} ${pc.dim('Metadata from the registry')}`);\n logger.log(` ${pc.cyan('3.')} ${pc.white('File')} ${pc.dim('Detects SKILL.md, AGENT.md, etc.')}`);\n logger.log(` ${pc.cyan('4.')} ${pc.white('Prompt')} ${pc.dim('Asks you if cannot detect')}`);\n logger.line();\n}\n\nfunction showAddInfo(): void {\n logger.line();\n logger.log(pc.bold(pc.cyan(' Installation Sources')));\n logger.line();\n logger.dim(' SynapSync can add cognitives from multiple sources:');\n logger.line();\n\n // Sources table\n logger.log(pc.bold(' Supported Sources:'));\n logger.line();\n\n const sources = [\n {\n source: 'Registry',\n format: 'synapsync add code-reviewer',\n description: 'From the SynapSync registry',\n },\n {\n source: 'Local',\n format: 'synapsync add ./path/to/cognitive',\n description: 'From local file system',\n },\n {\n source: 'GitHub',\n format: 'synapsync add github:user/repo',\n description: 'From a GitHub repository',\n },\n {\n source: 'GitHub Path',\n format: 'synapsync add github:user/repo/cognitives/skill',\n description: 'Specific path in repo',\n },\n {\n source: 'GitHub Branch',\n format: 'synapsync add github:user/repo#develop',\n description: 'Specific branch or tag',\n },\n {\n source: 'GitHub URL',\n format: 'synapsync add https://github.com/user/repo',\n description: 'Full GitHub URL',\n },\n ];\n\n for (const src of sources) {\n logger.log(` ${pc.green(src.source.padEnd(14))} ${pc.dim(src.description)}`);\n logger.log(` ${' '.repeat(14)} ${pc.cyan(src.format)}`);\n logger.line();\n }\n\n // Type detection\n logger.log(pc.bold(' Type Detection:'));\n logger.line();\n logger.dim(' SynapSync automatically detects the cognitive type using:');\n logger.line();\n\n logger.log(` ${pc.cyan('1.')} ${pc.white('Explicit flag')} ${pc.dim('synapsync add code-reviewer --type skill')}`);\n logger.log(` ${pc.cyan('2.')} ${pc.white('Registry lookup')} ${pc.dim('Registry provides type metadata')}`);\n logger.log(` ${pc.cyan('3.')} ${pc.white('File detection')} ${pc.dim('Scans for SKILL.md, AGENT.md, etc.')}`);\n logger.log(` ${pc.cyan('4.')} ${pc.white('Interactive')} ${pc.dim('Prompts you to select if unknown')}`);\n logger.line();\n\n // Version\n logger.log(pc.bold(' Version Specification:'));\n logger.line();\n logger.log(` ${pc.dim('$')} ${pc.cyan('synapsync add')} code-reviewer ${pc.dim('# Latest version')}`);\n logger.log(` ${pc.dim('$')} ${pc.cyan('synapsync add')} code-reviewer@1.2.0 ${pc.dim('# Specific version')}`);\n logger.log(` ${pc.dim('$')} ${pc.cyan('synapsync add')} code-reviewer@^1.0.0 ${pc.dim('# Version range')}`);\n logger.line();\n\n // Options\n logger.log(pc.bold(' Common Options:'));\n logger.line();\n logger.log(` ${pc.yellow('--type <type>')} ${pc.dim('Explicit cognitive type (skill, agent, prompt, workflow, tool)')}`);\n logger.log(` ${pc.yellow('--category <cat>')} ${pc.dim('Explicit category (frontend, backend, etc.)')}`);\n logger.log(` ${pc.yellow('--force')} ${pc.dim('Force reinstall even if exists')}`);\n logger.line();\n}\n\nfunction showProvidersInfo(): void {\n logger.line();\n logger.log(pc.bold(pc.cyan(' Supported Providers')));\n logger.line();\n logger.dim(' SynapSync can sync your cognitives to multiple AI providers.');\n logger.dim(' Each provider has its own directory structure for cognitives.');\n logger.line();\n\n const providers = [\n { name: 'claude', vendor: 'Anthropic', path: '.claude/', color: pc.yellow },\n { name: 'openai', vendor: 'OpenAI', path: '.openai/', color: pc.green },\n { name: 'gemini', vendor: 'Google', path: '.gemini/', color: pc.blue },\n { name: 'cursor', vendor: 'Cursor IDE', path: '.cursor/', color: pc.magenta },\n { name: 'windsurf', vendor: 'Codeium', path: '.windsurf/', color: pc.cyan },\n { name: 'copilot', vendor: 'GitHub', path: '.github/', color: pc.white },\n ];\n\n // Header\n logger.log(` ${pc.dim('Provider')} ${pc.dim('Vendor')} ${pc.dim('Path')}`);\n logger.log(pc.dim(' ' + '─'.repeat(45)));\n\n // Rows\n for (const provider of providers) {\n const nameCol = provider.color(provider.name.padEnd(11));\n const vendorCol = pc.white(provider.vendor.padEnd(12));\n const pathCol = pc.dim(provider.path);\n logger.log(` ${nameCol} ${vendorCol} ${pathCol}`);\n }\n\n logger.line();\n\n // Usage\n logger.log(pc.bold(' Usage:'));\n logger.line();\n logger.log(` ${pc.dim('$')} ${pc.cyan('synapsync connect')} claude ${pc.dim('# Connect to Claude')}`);\n logger.log(` ${pc.dim('$')} ${pc.cyan('synapsync providers')} ${pc.dim('# List connected providers')}`);\n logger.log(` ${pc.dim('$')} ${pc.cyan('synapsync sync')} --provider claude ${pc.dim('# Sync to specific provider')}`);\n logger.line();\n}\n\nfunction showCategoriesInfo(): void {\n logger.line();\n logger.log(pc.bold(pc.cyan(' Cognitive Categories')));\n logger.line();\n logger.dim(' Cognitives are organized by category for better management.');\n logger.dim(' Categories help group related cognitives together.');\n logger.line();\n\n const categories = [\n { name: 'frontend', description: 'UI, components, styling, React, Vue, etc.', color: pc.yellow },\n { name: 'backend', description: 'APIs, servers, authentication, databases', color: pc.blue },\n { name: 'database', description: 'Queries, schemas, migrations, optimization', color: pc.yellow },\n { name: 'devops', description: 'CI/CD, Docker, Kubernetes, infrastructure', color: pc.magenta },\n { name: 'security', description: 'Audits, vulnerabilities, authentication', color: pc.red },\n { name: 'testing', description: 'Unit tests, E2E, test generation', color: pc.green },\n { name: 'analytics', description: 'Metrics, tracking, data analysis', color: pc.cyan },\n { name: 'automation', description: 'Scripts, workflows, task automation', color: pc.green },\n { name: 'general', description: 'General purpose, code review, docs', color: pc.white },\n ];\n\n // Header\n logger.log(` ${pc.dim('Category')} ${pc.dim('Description')}`);\n logger.log(pc.dim(' ' + '─'.repeat(55)));\n\n // Rows\n for (const cat of categories) {\n const nameCol = cat.color(cat.name.padEnd(13));\n const descCol = pc.dim(cat.description);\n logger.log(` ${nameCol} ${descCol}`);\n }\n\n logger.line();\n\n // Usage\n logger.log(pc.bold(' Usage:'));\n logger.line();\n logger.log(` ${pc.dim('$')} ${pc.cyan('synapsync add')} react-patterns ${pc.dim('--category frontend')}`);\n logger.log(` ${pc.dim('$')} ${pc.cyan('synapsync list')} --category devops`);\n logger.log(` ${pc.dim('$')} ${pc.cyan('synapsync search')} --category security`);\n logger.line();\n}\n\nfunction showSyncInfo(): void {\n logger.line();\n logger.log(pc.bold(pc.cyan(' Synchronization')));\n logger.line();\n logger.dim(' Sync copies or links your cognitives to provider directories.');\n logger.dim(' This makes them available to each AI provider.');\n logger.line();\n\n logger.log(pc.bold(' Sync Methods:'));\n logger.line();\n logger.log(` ${pc.green('symlink')} ${pc.dim('(recommended)')}`);\n logger.dim(' Creates symbolic links to the central storage.');\n logger.dim(' Changes reflect immediately in all providers.');\n logger.dim(' Single source of truth, less disk space.');\n logger.line();\n logger.log(` ${pc.yellow('copy')}`);\n logger.dim(' Creates independent copies in each provider folder.');\n logger.dim(' Works on systems without symlink support.');\n logger.dim(' Requires re-sync after changes.');\n logger.line();\n\n logger.log(pc.bold(' How it works:'));\n logger.line();\n logger.log(pc.dim(' Central storage:'));\n logger.log(` ${pc.cyan('.synapsync/skills/frontend/react-patterns/SKILL.md')}`);\n logger.line();\n logger.log(pc.dim(' After sync (symlink):'));\n logger.log(` ${pc.green('.claude/skills/react-patterns/')} -> ${pc.dim('../../.synapsync/skills/frontend/react-patterns/')}`);\n logger.log(` ${pc.green('.openai/skills/react-patterns/')} -> ${pc.dim('../../.synapsync/skills/frontend/react-patterns/')}`);\n logger.line();\n\n logger.log(pc.bold(' Commands:'));\n logger.line();\n logger.log(` ${pc.dim('$')} ${pc.cyan('synapsync sync')} ${pc.dim('# Sync all cognitives to all providers')}`);\n logger.log(` ${pc.dim('$')} ${pc.cyan('synapsync sync')} --provider claude ${pc.dim('# Sync to specific provider')}`);\n logger.log(` ${pc.dim('$')} ${pc.cyan('synapsync sync')} --type skill ${pc.dim('# Sync only skills')}`);\n logger.log(` ${pc.dim('$')} ${pc.cyan('synapsync sync')} --copy ${pc.dim('# Force copy mode')}`);\n logger.log(` ${pc.dim('$')} ${pc.cyan('synapsync sync')} --dry-run ${pc.dim('# Preview without changes')}`);\n logger.line();\n}\n\nfunction showStructureInfo(): void {\n logger.line();\n logger.log(pc.bold(pc.cyan(' Project Structure')));\n logger.line();\n logger.dim(' After running `synapsync init`, your project will have:');\n logger.line();\n\n const structure = `\n ${pc.cyan('.synapsync/')} ${pc.dim('# Central cognitive storage')}\n ${pc.dim('├──')} ${pc.white('manifest.json')} ${pc.dim('# Installed cognitives manifest')}\n ${pc.dim('├──')} ${pc.cyan('skills/')} ${pc.dim('# Skills by category')}\n ${pc.dim('│ ├──')} ${pc.cyan('frontend/')}\n ${pc.dim('│ ├──')} ${pc.cyan('backend/')}\n ${pc.dim('│ └──')} ${pc.cyan('general/')}\n ${pc.dim('├──')} ${pc.cyan('agents/')} ${pc.dim('# Agents by category')}\n ${pc.dim('├──')} ${pc.cyan('prompts/')} ${pc.dim('# Prompts by category')}\n ${pc.dim('├──')} ${pc.cyan('workflows/')} ${pc.dim('# Workflows by category')}\n ${pc.dim('└──')} ${pc.cyan('tools/')} ${pc.dim('# Tools by category')}\n\n ${pc.green('synapsync.config.yaml')} ${pc.dim('# Project configuration')}\n\n ${pc.yellow('.claude/')} ${pc.dim('# Claude provider (after sync)')}\n ${pc.dim('├──')} ${pc.white('skills/')} ${pc.dim('# Symlinks to .synapsync/skills/*')}\n ${pc.dim('├──')} ${pc.white('agents/')} ${pc.dim('# Symlinks to .synapsync/agents/*')}\n ${pc.dim('└──')} ${pc.white('prompts/')} ${pc.dim('# Symlinks to .synapsync/prompts/*')}\n`;\n\n logger.log(structure);\n logger.line();\n}\n\n// ============================================\n// Show all topics (default)\n// ============================================\n\nfunction showAllTopics(): void {\n logger.line();\n logger.log(pc.bold(pc.cyan(' SynapSync Info')));\n logger.line();\n logger.dim(' Use /info with a topic flag to learn more:');\n logger.line();\n\n const topics = [\n { flag: '--cognitives', desc: 'Types of AI cognitives (skills, agents, prompts, etc.)' },\n { flag: '--add', desc: 'How to add from registry, GitHub, local' },\n { flag: '--providers', desc: 'Supported AI providers (Claude, OpenAI, etc.)' },\n { flag: '--categories', desc: 'Cognitive organization categories' },\n { flag: '--sync', desc: 'How synchronization works' },\n { flag: '--structure', desc: 'Project directory structure' },\n ];\n\n for (const topic of topics) {\n logger.log(` ${pc.cyan('/info ' + topic.flag.padEnd(14))} ${pc.dim(topic.desc)}`);\n }\n\n logger.line();\n logger.dim(' Example: /info --cognitives');\n logger.line();\n}\n\n// ============================================\n// Parse flags from args string\n// ============================================\n\nfunction parseInfoArgs(argsString: string): string | null {\n const args = argsString.trim().toLowerCase();\n\n if (!args) {\n return null;\n }\n\n // Check for --flag format\n const flagMatch = args.match(/^--(\\w+)/);\n if (flagMatch?.[1]) {\n return flagMatch[1];\n }\n\n // Check for direct topic name\n if (INFO_TOPICS[args]) {\n return args;\n }\n\n return null;\n}\n\n// ============================================\n// Execute info command (for REPL)\n// ============================================\n\nexport function executeInfoCommand(args: string): void {\n const topic = parseInfoArgs(args);\n\n if (!topic) {\n showAllTopics();\n return;\n }\n\n const topicInfo = INFO_TOPICS[topic];\n if (topicInfo) {\n topicInfo.content();\n } else {\n logger.error(`Unknown topic: ${topic}`);\n logger.line();\n showAllTopics();\n }\n}\n\n// ============================================\n// Register CLI command\n// ============================================\n\nexport function registerInfoCommand(program: Command): void {\n program\n .command('info')\n .description('Show information about SynapSync concepts')\n .option('--cognitives', 'Show cognitive types information')\n .option('--add', 'Show installation sources and detection')\n .option('--providers', 'Show supported providers')\n .option('--categories', 'Show cognitive categories')\n .option('--sync', 'Show sync information')\n .option('--structure', 'Show project structure')\n .action((options: Record<string, boolean>) => {\n // Find which flag was passed\n const topic = Object.keys(options).find((key) => options[key] === true);\n\n if (topic && INFO_TOPICS[topic]) {\n INFO_TOPICS[topic].content();\n } else {\n showAllTopics();\n }\n });\n}\n","/**\n * Init Command\n *\n * Initialize a new SynapSync project in the current directory\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as p from '@clack/prompts';\nimport pc from 'picocolors';\nimport type { Command } from 'commander';\nimport { ConfigManager } from '../services/config/manager.js';\nimport {\n COGNITIVE_TYPES,\n SUPPORTED_PROVIDERS,\n DEFAULT_SYNAPSYNC_DIR,\n CONFIG_FILE_NAME,\n} from '../core/constants.js';\nimport type { SupportedProvider } from '../core/constants.js';\nimport { logger } from '../utils/logger.js';\n\n// ============================================\n// Types\n// ============================================\n\ninterface InitOptions {\n name?: string;\n description?: string;\n providers?: SupportedProvider[];\n yes?: boolean; // Skip prompts, use defaults\n}\n\ninterface InitResult {\n success: boolean;\n projectPath: string;\n configPath: string;\n storagePath: string;\n}\n\n// ============================================\n// Main Function\n// ============================================\n\n/**\n * Execute the init command\n */\nexport async function executeInitCommand(options: InitOptions = {}): Promise<InitResult | null> {\n const projectRoot = process.cwd();\n const configPath = path.join(projectRoot, CONFIG_FILE_NAME);\n const storagePath = path.join(projectRoot, DEFAULT_SYNAPSYNC_DIR);\n\n // Check if already initialized\n if (ConfigManager.isProjectInitialized(projectRoot)) {\n logger.line();\n logger.warning('Project already initialized.');\n logger.log(` ${pc.dim('Config:')} ${configPath}`);\n logger.log(` ${pc.dim('Storage:')} ${storagePath}`);\n logger.line();\n logger.hint('Use /config to view or modify settings.');\n return null;\n }\n\n // Non-interactive mode\n if (options.yes === true) {\n return initializeProject({\n name: options.name ?? path.basename(projectRoot),\n ...(options.description !== undefined && { description: options.description }),\n providers: options.providers ?? ['claude'],\n });\n }\n\n // Interactive mode\n logger.line();\n p.intro(pc.bgCyan(pc.black(' Initialize SynapSync Project ')));\n\n const result = await p.group(\n {\n name: () => {\n const defaultName = path.basename(projectRoot);\n return p.text({\n message: 'Project name',\n placeholder: defaultName,\n defaultValue: defaultName,\n validate: (value) => {\n // Use defaultValue if empty (user pressed Enter)\n const finalValue = value.trim() === '' ? defaultName : value;\n if (!/^[a-z0-9-_]+$/i.test(finalValue)) {\n return 'Project name can only contain letters, numbers, hyphens, and underscores';\n }\n return undefined;\n },\n });\n },\n description: () =>\n p.text({\n message: 'Description (optional)',\n placeholder: 'A brief description of your project',\n }),\n providers: () =>\n p.multiselect({\n message: 'Select AI providers to enable',\n options: SUPPORTED_PROVIDERS.map((provider) => ({\n value: provider,\n label: getProviderLabel(provider),\n hint: getProviderHint(provider),\n })),\n initialValues: ['claude'],\n required: false,\n }),\n },\n {\n onCancel: () => {\n p.cancel('Project initialization cancelled.');\n return process.exit(0);\n },\n }\n );\n\n // Type guard for cancelled state\n if (p.isCancel(result)) {\n return null;\n }\n\n return initializeProject({\n name: result.name,\n description: result.description,\n providers: result.providers as SupportedProvider[],\n });\n}\n\n// ============================================\n// Project Initialization\n// ============================================\n\ninterface ProjectSetup {\n name: string;\n description?: string;\n providers: SupportedProvider[];\n}\n\nfunction initializeProject(setup: ProjectSetup): InitResult {\n const projectRoot = process.cwd();\n const configPath = path.join(projectRoot, CONFIG_FILE_NAME);\n const storagePath = path.join(projectRoot, DEFAULT_SYNAPSYNC_DIR);\n\n const s = p.spinner();\n s.start('Creating project structure...');\n\n try {\n // 1. Create storage directory with cognitive type subdirectories\n createStorageStructure(storagePath);\n\n // 2. Create and save configuration\n const configManager = new ConfigManager(projectRoot);\n configManager.create(setup.name, setup.description);\n\n // Enable selected providers\n for (const provider of setup.providers) {\n configManager.set(`sync.providers.${provider}.enabled`, true);\n }\n\n configManager.save();\n\n // 3. Create empty manifest\n createManifest(storagePath);\n\n // 4. Update .gitignore if exists\n updateGitignore(projectRoot);\n\n s.stop('Project structure created!');\n\n // Show success message\n showSuccessMessage(setup, configPath, storagePath);\n\n return {\n success: true,\n projectPath: projectRoot,\n configPath,\n storagePath,\n };\n } catch (error) {\n s.stop('Failed to create project.');\n logger.line();\n if (error instanceof Error) {\n logger.error(error.message);\n }\n throw error;\n }\n}\n\n/**\n * Create the .synapsync directory structure\n */\nfunction createStorageStructure(storagePath: string): void {\n // Create main directory\n fs.mkdirSync(storagePath, { recursive: true });\n\n // Create subdirectory for each cognitive type\n for (const cognitiveType of COGNITIVE_TYPES) {\n const typePath = path.join(storagePath, `${cognitiveType}s`);\n fs.mkdirSync(typePath, { recursive: true });\n\n // Create a .gitkeep to preserve empty directories\n const gitkeepPath = path.join(typePath, '.gitkeep');\n fs.writeFileSync(gitkeepPath, '');\n }\n}\n\n/**\n * Create empty manifest.json\n */\nfunction createManifest(storagePath: string): void {\n const manifestPath = path.join(storagePath, 'manifest.json');\n const manifest = {\n version: '1.0.0',\n lastUpdated: new Date().toISOString(),\n cognitives: {},\n syncs: {},\n };\n\n fs.writeFileSync(manifestPath, JSON.stringify(manifest, null, 2));\n}\n\n/**\n * Update .gitignore to include SynapSync entries\n */\nfunction updateGitignore(projectRoot: string): void {\n const gitignorePath = path.join(projectRoot, '.gitignore');\n const synapsyncEntries = `\n# SynapSync\n.synapsync/manifest.json\n*.local.yaml\n`;\n\n if (fs.existsSync(gitignorePath)) {\n const content = fs.readFileSync(gitignorePath, 'utf-8');\n\n // Check if already has SynapSync entries\n if (!content.includes('# SynapSync')) {\n fs.appendFileSync(gitignorePath, synapsyncEntries);\n }\n } else {\n // Create new .gitignore\n fs.writeFileSync(gitignorePath, synapsyncEntries.trim() + '\\n');\n }\n}\n\n// ============================================\n// UI Helpers\n// ============================================\n\nfunction getProviderLabel(provider: SupportedProvider): string {\n const labels: Record<SupportedProvider, string> = {\n claude: 'Claude (Anthropic)',\n openai: 'OpenAI (GPT)',\n gemini: 'Gemini (Google)',\n cursor: 'Cursor IDE',\n windsurf: 'Windsurf IDE',\n copilot: 'GitHub Copilot',\n };\n return labels[provider];\n}\n\nfunction getProviderHint(provider: SupportedProvider): string {\n const hints: Record<SupportedProvider, string> = {\n claude: 'Claude Code, Claude Desktop',\n openai: 'ChatGPT, API',\n gemini: 'Google AI Studio',\n cursor: 'AI-first code editor',\n windsurf: 'AI-powered IDE',\n copilot: 'VS Code integration',\n };\n return hints[provider];\n}\n\nfunction showSuccessMessage(\n setup: ProjectSetup,\n configPath: string,\n storagePath: string\n): void {\n logger.line();\n p.note(\n [\n `${pc.dim('Config:')} ${pc.cyan(configPath)}`,\n `${pc.dim('Storage:')} ${pc.cyan(storagePath)}`,\n '',\n `${pc.dim('Providers:')} ${setup.providers.map((p) => pc.green(p)).join(', ') || pc.dim('none')}`,\n ].join('\\n'),\n `Project \"${setup.name}\" initialized!`\n );\n\n logger.line();\n logger.bold(' Next Steps:');\n logger.line();\n logger.log(` ${pc.cyan('1.')} Connect to providers:`);\n logger.log(` ${pc.dim('$')} synapsync connect claude`);\n logger.line();\n logger.log(` ${pc.cyan('2.')} Add cognitives:`);\n logger.log(` ${pc.dim('$')} synapsync add code-reviewer`);\n logger.log(` ${pc.dim('$')} synapsync add github:user/my-skill`);\n logger.line();\n logger.log(` ${pc.cyan('3.')} Sync to providers:`);\n logger.log(` ${pc.dim('$')} synapsync sync`);\n logger.line();\n\n p.outro(pc.green('Happy syncing!'));\n}\n\n// ============================================\n// Command Registration\n// ============================================\n\n/**\n * Register init command with Commander\n */\nexport function registerInitCommand(program: Command): void {\n program\n .command('init')\n .description('Initialize a new SynapSync project')\n .option('-n, --name <name>', 'Project name')\n .option('-d, --description <desc>', 'Project description')\n .option('-p, --provider <providers...>', 'Enable providers (claude, openai, etc.)')\n .option('-y, --yes', 'Skip prompts and use defaults')\n .action(async (options: { name?: string; description?: string; provider?: string[]; yes?: boolean }) => {\n await executeInitCommand({\n ...(options.name !== undefined && { name: options.name }),\n ...(options.description !== undefined && { description: options.description }),\n ...(options.provider !== undefined && { providers: options.provider as SupportedProvider[] }),\n ...(options.yes !== undefined && { yes: options.yes }),\n });\n });\n}\n","/**\n * Configuration Manager\n *\n * Handles reading, writing, and manipulating synapsync.config.yaml\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as yaml from 'yaml';\nimport { CONFIG_FILE_NAME, DEFAULT_SYNAPSYNC_DIR } from '../../core/constants.js';\nimport {\n type ProjectConfig,\n createDefaultConfig,\n validateConfig,\n getNestedValue,\n setNestedValue,\n type ValidationError,\n} from './schema.js';\n\n// ============================================\n// ConfigManager Class\n// ============================================\n\nexport class ConfigManager {\n private config: ProjectConfig | null = null;\n private configPath: string;\n private projectRoot: string;\n\n constructor(projectRoot?: string) {\n this.projectRoot = projectRoot ?? process.cwd();\n this.configPath = path.join(this.projectRoot, CONFIG_FILE_NAME);\n }\n\n // ============================================\n // Static Factory Methods\n // ============================================\n\n /**\n * Find and load config from current directory or parents\n */\n static findConfig(startDir?: string): ConfigManager | null {\n let dir = startDir ?? process.cwd();\n\n while (dir !== path.dirname(dir)) {\n const configPath = path.join(dir, CONFIG_FILE_NAME);\n if (fs.existsSync(configPath)) {\n const manager = new ConfigManager(dir);\n manager.load();\n return manager;\n }\n dir = path.dirname(dir);\n }\n\n return null;\n }\n\n /**\n * Check if a project is initialized in the given directory\n */\n static isProjectInitialized(dir?: string): boolean {\n const projectRoot = dir ?? process.cwd();\n const configPath = path.join(projectRoot, CONFIG_FILE_NAME);\n const synapSyncDir = path.join(projectRoot, DEFAULT_SYNAPSYNC_DIR);\n\n return fs.existsSync(configPath) && fs.existsSync(synapSyncDir);\n }\n\n // ============================================\n // Core Methods\n // ============================================\n\n /**\n * Check if config file exists\n */\n exists(): boolean {\n return fs.existsSync(this.configPath);\n }\n\n /**\n * Load configuration from file\n */\n load(): ProjectConfig {\n if (!this.exists()) {\n throw new Error(`Configuration file not found: ${this.configPath}`);\n }\n\n const content = fs.readFileSync(this.configPath, 'utf-8');\n const parsed = yaml.parse(content) as unknown;\n\n // Validate\n const errors = validateConfig(parsed);\n if (errors.length > 0) {\n throw new ConfigValidationError(errors);\n }\n\n this.config = parsed as ProjectConfig;\n return this.config;\n }\n\n /**\n * Save configuration to file\n */\n save(): void {\n if (this.config === null) {\n throw new Error('No configuration to save. Call load() or create() first.');\n }\n\n const content = yaml.stringify(this.config, {\n indent: 2,\n lineWidth: 100,\n });\n\n fs.writeFileSync(this.configPath, content, 'utf-8');\n }\n\n /**\n * Create a new configuration\n */\n create(name: string, description?: string): ProjectConfig {\n this.config = createDefaultConfig(name, description);\n return this.config;\n }\n\n /**\n * Get the current configuration\n */\n getConfig(): ProjectConfig {\n if (this.config === null) {\n throw new Error('No configuration loaded. Call load() or create() first.');\n }\n return this.config;\n }\n\n /**\n * Get project root directory\n */\n getProjectRoot(): string {\n return this.projectRoot;\n }\n\n /**\n * Get synapsync directory path\n */\n getSynapSyncDir(): string {\n const dir = this.config?.storage?.dir ?? DEFAULT_SYNAPSYNC_DIR;\n return path.isAbsolute(dir) ? dir : path.join(this.projectRoot, dir);\n }\n\n // ============================================\n // Value Access Methods\n // ============================================\n\n /**\n * Get a configuration value by dot-notation path\n * Example: get('cli.theme') -> 'auto'\n */\n get(keyPath: string): unknown {\n if (this.config === null) {\n throw new Error('No configuration loaded. Call load() or create() first.');\n }\n return getNestedValue(this.config as unknown as Record<string, unknown>, keyPath);\n }\n\n /**\n * Set a configuration value by dot-notation path\n * Example: set('cli.theme', 'dark')\n */\n set(keyPath: string, value: unknown): void {\n if (this.config === null) {\n throw new Error('No configuration loaded. Call load() or create() first.');\n }\n setNestedValue(this.config as unknown as Record<string, unknown>, keyPath, value);\n }\n\n /**\n * Check if a configuration key exists\n */\n has(keyPath: string): boolean {\n return this.get(keyPath) !== undefined;\n }\n\n /**\n * Get all configuration as a flat object with dot-notation keys\n */\n flatten(): Record<string, unknown> {\n if (this.config === null) {\n throw new Error('No configuration loaded. Call load() or create() first.');\n }\n\n const result: Record<string, unknown> = {};\n\n function flattenObject(obj: Record<string, unknown>, prefix = ''): void {\n for (const [key, value] of Object.entries(obj)) {\n const fullKey = prefix !== '' ? `${prefix}.${key}` : key;\n\n if (value !== null && typeof value === 'object' && !Array.isArray(value)) {\n flattenObject(value as Record<string, unknown>, fullKey);\n } else {\n result[fullKey] = value;\n }\n }\n }\n\n flattenObject(this.config as unknown as Record<string, unknown>);\n return result;\n }\n}\n\n// ============================================\n// Custom Errors\n// ============================================\n\nexport class ConfigValidationError extends Error {\n constructor(public errors: ValidationError[]) {\n const messages = errors.map((e) => ` - ${e.path}: ${e.message}`).join('\\n');\n super(`Configuration validation failed:\\n${messages}`);\n this.name = 'ConfigValidationError';\n }\n}\n\nexport class ConfigNotFoundError extends Error {\n constructor(searchPath: string) {\n super(`No synapsync.config.yaml found in ${searchPath} or parent directories`);\n this.name = 'ConfigNotFoundError';\n }\n}\n","/**\n * Configuration Schema and Defaults\n */\n\nimport type { CognitiveType, SupportedProvider } from '../../core/constants.js';\nimport { SUPPORTED_PROVIDERS, PROVIDER_PATHS, DEFAULT_SYNAPSYNC_DIR } from '../../core/constants.js';\n\n// ============================================\n// Configuration Types\n// ============================================\n\nexport interface CLIConfig {\n theme: 'auto' | 'light' | 'dark';\n color: boolean;\n verbose: boolean;\n}\n\nexport interface StorageConfig {\n dir: string;\n}\n\nexport interface ProviderSyncConfig {\n enabled: boolean;\n paths?: Partial<Record<CognitiveType, string>>;\n}\n\nexport interface SyncConfig {\n method: 'symlink' | 'copy';\n providers: Partial<Record<SupportedProvider, ProviderSyncConfig>>;\n}\n\nexport interface ProjectConfig {\n name: string;\n description?: string;\n version: string;\n cli: CLIConfig;\n storage: StorageConfig;\n sync: SyncConfig;\n}\n\n// ============================================\n// Default Configuration\n// ============================================\n\nexport const DEFAULT_CLI_CONFIG: CLIConfig = {\n theme: 'auto',\n color: true,\n verbose: false,\n};\n\nexport const DEFAULT_STORAGE_CONFIG: StorageConfig = {\n dir: DEFAULT_SYNAPSYNC_DIR,\n};\n\nexport const DEFAULT_SYNC_CONFIG: SyncConfig = {\n method: 'symlink',\n providers: {\n claude: {\n enabled: true,\n paths: PROVIDER_PATHS.claude,\n },\n openai: {\n enabled: false,\n paths: PROVIDER_PATHS.openai,\n },\n cursor: {\n enabled: false,\n paths: PROVIDER_PATHS.cursor,\n },\n },\n};\n\nexport function createDefaultConfig(name: string, description?: string): ProjectConfig {\n const config: ProjectConfig = {\n name,\n version: '1.0.0',\n cli: { ...DEFAULT_CLI_CONFIG },\n storage: { ...DEFAULT_STORAGE_CONFIG },\n sync: {\n method: DEFAULT_SYNC_CONFIG.method,\n providers: JSON.parse(JSON.stringify(DEFAULT_SYNC_CONFIG.providers)) as SyncConfig['providers'],\n },\n };\n if (description !== undefined) {\n config.description = description;\n }\n return config;\n}\n\n// ============================================\n// Validation\n// ============================================\n\nexport interface ValidationError {\n path: string;\n message: string;\n}\n\nexport function validateConfig(config: unknown): ValidationError[] {\n const errors: ValidationError[] = [];\n\n if (typeof config !== 'object' || config === null) {\n errors.push({ path: '', message: 'Configuration must be an object' });\n return errors;\n }\n\n const cfg = config as Record<string, unknown>;\n\n // Required fields\n if (typeof cfg['name'] !== 'string' || cfg['name'].trim() === '') {\n errors.push({ path: 'name', message: 'Project name is required' });\n }\n\n // CLI config validation\n if (cfg['cli'] !== undefined) {\n if (typeof cfg['cli'] !== 'object' || cfg['cli'] === null) {\n errors.push({ path: 'cli', message: 'cli must be an object' });\n } else {\n const cli = cfg['cli'] as Record<string, unknown>;\n if (cli['theme'] !== undefined && !['auto', 'light', 'dark'].includes(cli['theme'] as string)) {\n errors.push({ path: 'cli.theme', message: 'theme must be auto, light, or dark' });\n }\n }\n }\n\n // Sync config validation\n if (cfg['sync'] !== undefined) {\n if (typeof cfg['sync'] !== 'object' || cfg['sync'] === null) {\n errors.push({ path: 'sync', message: 'sync must be an object' });\n } else {\n const sync = cfg['sync'] as Record<string, unknown>;\n if (sync['method'] !== undefined && !['symlink', 'copy'].includes(sync['method'] as string)) {\n errors.push({ path: 'sync.method', message: 'method must be symlink or copy' });\n }\n\n // Validate providers\n if (sync['providers'] !== undefined) {\n if (typeof sync['providers'] !== 'object' || sync['providers'] === null) {\n errors.push({ path: 'sync.providers', message: 'providers must be an object' });\n } else {\n const providers = sync['providers'] as Record<string, unknown>;\n for (const [key, value] of Object.entries(providers)) {\n if (!SUPPORTED_PROVIDERS.includes(key as SupportedProvider)) {\n errors.push({\n path: `sync.providers.${key}`,\n message: `Unknown provider: ${key}. Supported: ${SUPPORTED_PROVIDERS.join(', ')}`,\n });\n }\n if (typeof value !== 'object' || value === null) {\n errors.push({ path: `sync.providers.${key}`, message: 'Provider config must be an object' });\n }\n }\n }\n }\n }\n }\n\n return errors;\n}\n\n// ============================================\n// Path Utilities\n// ============================================\n\n/**\n * Get a nested value from config using dot notation\n * Example: getNestedValue(config, 'cli.theme') -> 'auto'\n */\nexport function getNestedValue(obj: Record<string, unknown>, path: string): unknown {\n const parts = path.split('.');\n let current: unknown = obj;\n\n for (const part of parts) {\n if (current === null || current === undefined) {\n return undefined;\n }\n if (typeof current !== 'object') {\n return undefined;\n }\n current = (current as Record<string, unknown>)[part];\n }\n\n return current;\n}\n\n/**\n * Set a nested value in config using dot notation\n * Example: setNestedValue(config, 'cli.theme', 'dark')\n */\nexport function setNestedValue(obj: Record<string, unknown>, path: string, value: unknown): void {\n const parts = path.split('.');\n let current: Record<string, unknown> = obj;\n\n for (let i = 0; i < parts.length - 1; i++) {\n const part = parts[i];\n if (part === undefined) continue;\n\n if (current[part] === undefined || typeof current[part] !== 'object') {\n current[part] = {};\n }\n current = current[part] as Record<string, unknown>;\n }\n\n const lastPart = parts[parts.length - 1];\n if (lastPart !== undefined) {\n current[lastPart] = value;\n }\n}\n","/**\n * Config Command\n *\n * Manage SynapSync project configuration\n */\n\nimport type { Command } from 'commander';\nimport pc from 'picocolors';\nimport { ConfigManager } from '../services/config/manager.js';\nimport { logger } from '../utils/logger.js';\n\n// ============================================\n// Types\n// ============================================\n\ntype ConfigAction = 'list' | 'get' | 'set';\n\ninterface ConfigOptions {\n action: ConfigAction;\n key?: string;\n value?: string;\n}\n\n// ============================================\n// Main Functions\n// ============================================\n\n/**\n * Execute the config command\n */\nexport function executeConfigCommand(args: string): void {\n const options = parseConfigArgs(args);\n\n // Find config file\n const configManager = ConfigManager.findConfig();\n\n if (configManager === null) {\n logger.line();\n logger.error('No SynapSync project found.');\n logger.hint('Run /init to initialize a project.');\n return;\n }\n\n switch (options.action) {\n case 'list':\n showConfigList(configManager);\n break;\n case 'get':\n showConfigValue(configManager, options.key ?? '');\n break;\n case 'set':\n setConfigValue(configManager, options.key ?? '', options.value ?? '');\n break;\n }\n}\n\n// ============================================\n// Config Actions\n// ============================================\n\n/**\n * Show all configuration values\n */\nfunction showConfigList(configManager: ConfigManager): void {\n const flatConfig = configManager.flatten();\n\n logger.line();\n logger.bold(' Configuration');\n logger.line();\n\n // Group by top-level key\n const groups: Record<string, Record<string, unknown>> = {};\n\n for (const [key, value] of Object.entries(flatConfig)) {\n const parts = key.split('.');\n const group = parts[0] ?? 'other';\n\n groups[group] ??= {};\n groups[group][key] = value;\n }\n\n // Display each group\n for (const [group, values] of Object.entries(groups)) {\n logger.log(` ${pc.cyan(group)}:`);\n\n for (const [key, value] of Object.entries(values)) {\n const displayKey = key.replace(`${group}.`, '');\n const displayValue = formatValue(value);\n logger.log(` ${pc.dim(displayKey.padEnd(30))} ${displayValue}`);\n }\n\n logger.line();\n }\n\n logger.hint(`Config file: ${configManager.getProjectRoot()}/synapsync.config.yaml`);\n}\n\n/**\n * Show a specific configuration value\n */\nfunction showConfigValue(configManager: ConfigManager, key: string): void {\n if (key === '') {\n logger.line();\n logger.error('Key is required.');\n logger.hint('Usage: /config get <key>');\n logger.hint('Example: /config get cli.theme');\n return;\n }\n\n const value = configManager.get(key);\n\n logger.line();\n\n if (value === undefined) {\n logger.warning(`Key not found: ${pc.cyan(key)}`);\n logger.line();\n logger.hint('Use /config list to see all available keys.');\n } else {\n logger.log(` ${pc.cyan(key)} = ${formatValue(value)}`);\n }\n}\n\n/**\n * Set a configuration value\n */\nfunction setConfigValue(configManager: ConfigManager, key: string, value: string): void {\n if (key === '') {\n logger.line();\n logger.error('Key is required.');\n logger.hint('Usage: /config set <key> <value>');\n logger.hint('Example: /config set cli.theme dark');\n return;\n }\n\n if (value === '') {\n logger.line();\n logger.error('Value is required.');\n logger.hint('Usage: /config set <key> <value>');\n return;\n }\n\n // Check if key exists (warning for new keys)\n const existingValue = configManager.get(key);\n const isNewKey = existingValue === undefined;\n\n // Parse value (handle booleans and numbers)\n const parsedValue = parseValue(value);\n\n // Set the value\n configManager.set(key, parsedValue);\n configManager.save();\n\n logger.line();\n\n if (isNewKey) {\n logger.warning(`Created new key: ${pc.cyan(key)}`);\n }\n\n logger.success(`${pc.cyan(key)} = ${formatValue(parsedValue)}`);\n}\n\n// ============================================\n// Argument Parsing\n// ============================================\n\nfunction parseConfigArgs(args: string): ConfigOptions {\n const parts = args.trim().split(/\\s+/);\n const action = (parts[0] ?? 'list').toLowerCase();\n\n // Default to list if no action\n if (action === '' || action === 'list') {\n return { action: 'list' };\n }\n\n if (action === 'get') {\n return {\n action: 'get',\n key: parts[1] ?? '',\n };\n }\n\n if (action === 'set') {\n return {\n action: 'set',\n key: parts[1] ?? '',\n value: parts.slice(2).join(' '),\n };\n }\n\n // Treat unknown action as a key (shorthand for get)\n return {\n action: 'get',\n key: action,\n };\n}\n\n// ============================================\n// Value Formatting\n// ============================================\n\nfunction formatValue(value: unknown): string {\n if (value === null || value === undefined) {\n return pc.dim('(not set)');\n }\n\n if (typeof value === 'boolean') {\n return value ? pc.green('true') : pc.red('false');\n }\n\n if (typeof value === 'number') {\n return pc.yellow(String(value));\n }\n\n if (typeof value === 'string') {\n return pc.white(`\"${value}\"`);\n }\n\n if (Array.isArray(value)) {\n return pc.dim(`[${value.join(', ')}]`);\n }\n\n return pc.dim(JSON.stringify(value));\n}\n\nfunction parseValue(value: string): unknown {\n // Boolean\n if (value.toLowerCase() === 'true') return true;\n if (value.toLowerCase() === 'false') return false;\n\n // Number\n const num = Number(value);\n if (!isNaN(num) && value.trim() !== '') return num;\n\n // String\n return value;\n}\n\n// ============================================\n// Command Registration\n// ============================================\n\n/**\n * Register config command with Commander\n */\nexport function registerConfigCommand(program: Command): void {\n const configCmd = program\n .command('config')\n .description('Manage project configuration');\n\n configCmd\n .command('list')\n .description('Show all configuration values')\n .action(() => {\n executeConfigCommand('list');\n });\n\n configCmd\n .command('get <key>')\n .description('Get a configuration value')\n .action((key: string) => {\n executeConfigCommand(`get ${key}`);\n });\n\n configCmd\n .command('set <key> <value>')\n .description('Set a configuration value')\n .action((key: string, value: string) => {\n executeConfigCommand(`set ${key} ${value}`);\n });\n\n // Default action (no subcommand)\n configCmd.action(() => {\n executeConfigCommand('list');\n });\n}\n","/**\n * Status Command\n *\n * Show the current status of the SynapSync project\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport type { Command } from 'commander';\nimport pc from 'picocolors';\nimport { ConfigManager } from '../services/config/manager.js';\nimport {\n COGNITIVE_TYPES,\n SUPPORTED_PROVIDERS,\n} from '../core/constants.js';\nimport type { CognitiveType, SupportedProvider } from '../core/constants.js';\nimport { logger } from '../utils/logger.js';\n\n// ============================================\n// Types\n// ============================================\n\ninterface ProjectStatus {\n initialized: boolean;\n projectName?: string;\n projectRoot?: string;\n configPath?: string;\n storagePath?: string;\n cognitives: Record<CognitiveType, number>;\n providers: ProviderStatus[];\n lastSync?: string;\n}\n\ninterface ProviderStatus {\n name: SupportedProvider;\n enabled: boolean;\n connected: boolean;\n cognitivesCount: number;\n}\n\n// ============================================\n// Main Function\n// ============================================\n\n/**\n * Execute the status command\n */\nexport function executeStatusCommand(_args: string = ''): void {\n const status = getProjectStatus();\n\n logger.line();\n\n if (!status.initialized) {\n showNotInitialized();\n return;\n }\n\n showProjectStatus(status);\n}\n\n// ============================================\n// Status Collection\n// ============================================\n\nfunction getProjectStatus(): ProjectStatus {\n const configManager = ConfigManager.findConfig();\n\n if (configManager === null) {\n return {\n initialized: false,\n cognitives: createEmptyCognitiveCount(),\n providers: [],\n };\n }\n\n const config = configManager.getConfig();\n const projectRoot = configManager.getProjectRoot();\n const storagePath = configManager.getSynapSyncDir();\n\n // Count cognitives by type\n const cognitives = countCognitives(storagePath);\n\n // Get provider status\n const providers = getProviderStatuses(config, projectRoot);\n\n // Get last sync from manifest\n const lastSync = getLastSyncTime(storagePath);\n\n const status: ProjectStatus = {\n initialized: true,\n projectName: config.name,\n projectRoot,\n configPath: path.join(projectRoot, 'synapsync.config.yaml'),\n storagePath,\n cognitives,\n providers,\n };\n if (lastSync !== undefined) {\n status.lastSync = lastSync;\n }\n return status;\n}\n\nfunction createEmptyCognitiveCount(): Record<CognitiveType, number> {\n const counts: Record<CognitiveType, number> = {} as Record<CognitiveType, number>;\n for (const type of COGNITIVE_TYPES) {\n counts[type] = 0;\n }\n return counts;\n}\n\nfunction countCognitives(storagePath: string): Record<CognitiveType, number> {\n const counts = createEmptyCognitiveCount();\n\n for (const type of COGNITIVE_TYPES) {\n const typePath = path.join(storagePath, `${type}s`);\n\n if (fs.existsSync(typePath)) {\n try {\n const entries = fs.readdirSync(typePath, { withFileTypes: true });\n // Count directories (each cognitive is a directory)\n counts[type] = entries.filter(\n (e) => e.isDirectory() || (e.isSymbolicLink() && !e.name.startsWith('.'))\n ).length;\n } catch {\n counts[type] = 0;\n }\n }\n }\n\n return counts;\n}\n\nfunction getProviderStatuses(\n config: ReturnType<ConfigManager['getConfig']>,\n projectRoot: string\n): ProviderStatus[] {\n const statuses: ProviderStatus[] = [];\n\n for (const provider of SUPPORTED_PROVIDERS) {\n const providerConfig = config.sync?.providers?.[provider];\n const enabled = providerConfig?.enabled ?? false;\n\n // Check if provider directory exists and has cognitives\n const providerPath = path.join(projectRoot, `.${provider}`);\n let cognitivesCount = 0;\n\n if (fs.existsSync(providerPath)) {\n try {\n // Count all items in provider subdirectories\n const subdirs = ['skills', 'agents', 'prompts', 'workflows', 'tools'];\n for (const subdir of subdirs) {\n const subdirPath = path.join(providerPath, subdir);\n if (fs.existsSync(subdirPath)) {\n const entries = fs.readdirSync(subdirPath);\n cognitivesCount += entries.filter((e) => !e.startsWith('.')).length;\n }\n }\n } catch {\n // Ignore errors\n }\n }\n\n statuses.push({\n name: provider,\n enabled,\n connected: false, // TODO: Check actual connection status\n cognitivesCount,\n });\n }\n\n return statuses;\n}\n\nfunction getLastSyncTime(storagePath: string): string | undefined {\n const manifestPath = path.join(storagePath, 'manifest.json');\n\n if (!fs.existsSync(manifestPath)) {\n return undefined;\n }\n\n try {\n const content = fs.readFileSync(manifestPath, 'utf-8');\n const manifest = JSON.parse(content) as { lastUpdated?: string };\n return manifest.lastUpdated;\n } catch {\n return undefined;\n }\n}\n\n// ============================================\n// Display Functions\n// ============================================\n\nfunction showNotInitialized(): void {\n logger.bold(' Project Status');\n logger.line();\n logger.log(` ${pc.red('●')} ${pc.dim('Not initialized')}`);\n logger.line();\n logger.hint('Run /init to initialize a SynapSync project.');\n}\n\nfunction showProjectStatus(status: ProjectStatus): void {\n // Header\n logger.bold(` ${status.projectName ?? 'SynapSync Project'}`);\n logger.line();\n\n // Project info\n logger.log(` ${pc.green('●')} ${pc.dim('Initialized')}`);\n logger.log(` ${pc.dim('Root:')} ${status.projectRoot}`);\n logger.line();\n\n // Cognitives summary\n logger.bold(' Cognitives');\n const totalCognitives = Object.values(status.cognitives).reduce((a, b) => a + b, 0);\n\n if (totalCognitives === 0) {\n logger.log(` ${pc.dim('No cognitives installed')}`);\n } else {\n for (const type of COGNITIVE_TYPES) {\n const count = status.cognitives[type];\n if (count > 0) {\n const icon = getCognitiveIcon(type);\n logger.log(` ${icon} ${pc.white(count.toString().padStart(3))} ${type}s`);\n }\n }\n logger.log(` ${pc.dim('───')}`);\n logger.log(` ${pc.bold(totalCognitives.toString().padStart(5))} total`);\n }\n logger.line();\n\n // Providers\n logger.bold(' Providers');\n const enabledProviders = status.providers.filter((p) => p.enabled);\n\n if (enabledProviders.length === 0) {\n logger.log(` ${pc.dim('No providers enabled')}`);\n } else {\n for (const provider of enabledProviders) {\n const icon = provider.cognitivesCount > 0 ? pc.green('●') : pc.yellow('○');\n const syncStatus =\n provider.cognitivesCount > 0\n ? pc.dim(`(${provider.cognitivesCount} synced)`)\n : pc.dim('(not synced)');\n logger.log(` ${icon} ${pc.white(provider.name)} ${syncStatus}`);\n }\n }\n logger.line();\n\n // Last sync\n if (status.lastSync !== undefined) {\n const syncDate = new Date(status.lastSync);\n const relativeTime = getRelativeTime(syncDate);\n logger.log(` ${pc.dim('Last updated:')} ${relativeTime}`);\n logger.line();\n }\n\n // Quick actions\n logger.hint('Run /help for available commands.');\n}\n\nfunction getCognitiveIcon(type: CognitiveType): string {\n const icons: Record<CognitiveType, string> = {\n skill: pc.blue('◆'),\n agent: pc.magenta('◆'),\n prompt: pc.yellow('◆'),\n workflow: pc.cyan('◆'),\n tool: pc.green('◆'),\n };\n return icons[type];\n}\n\nfunction getRelativeTime(date: Date): string {\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n const diffMins = Math.floor(diffMs / 60000);\n const diffHours = Math.floor(diffMins / 60);\n const diffDays = Math.floor(diffHours / 24);\n\n if (diffMins < 1) return 'just now';\n if (diffMins < 60) return `${diffMins} minute${diffMins === 1 ? '' : 's'} ago`;\n if (diffHours < 24) return `${diffHours} hour${diffHours === 1 ? '' : 's'} ago`;\n if (diffDays < 7) return `${diffDays} day${diffDays === 1 ? '' : 's'} ago`;\n\n return date.toLocaleDateString();\n}\n\n// ============================================\n// Command Registration\n// ============================================\n\n/**\n * Register status command with Commander\n */\nexport function registerStatusCommand(program: Command): void {\n program\n .command('status')\n .description('Show project status')\n .action(() => {\n executeStatusCommand();\n });\n}\n","/**\n * Providers Command\n *\n * Manage provider configuration for SynapSync\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport type { Command } from 'commander';\nimport pc from 'picocolors';\nimport { ConfigManager } from '../services/config/manager.js';\nimport { SUPPORTED_PROVIDERS, PROVIDER_PATHS } from '../core/constants.js';\nimport type { SupportedProvider } from '../core/constants.js';\nimport { logger } from '../utils/logger.js';\n\n// ============================================\n// Types\n// ============================================\n\ninterface ProviderInfo {\n name: SupportedProvider;\n enabled: boolean;\n path: string;\n exists: boolean;\n}\n\n// ============================================\n// Main Functions\n// ============================================\n\n/**\n * Execute the providers command\n */\nexport function executeProvidersCommand(args: string): void {\n const parts = args.trim().split(/\\s+/);\n const subcommand = parts[0]?.toLowerCase() ?? '';\n\n // Find config\n const configManager = ConfigManager.findConfig();\n\n if (configManager === null) {\n logger.line();\n logger.error('No SynapSync project found.');\n logger.hint('Run /init to initialize a project.');\n return;\n }\n\n switch (subcommand) {\n case '':\n case 'list':\n listProviders(configManager);\n break;\n case 'enable':\n enableProvider(configManager, parts[1]);\n break;\n case 'disable':\n disableProvider(configManager, parts[1]);\n break;\n case 'path':\n setProviderPath(configManager, parts[1], parts[2]);\n break;\n default:\n // Check if it's a provider name (shortcut for info)\n if (SUPPORTED_PROVIDERS.includes(subcommand as SupportedProvider)) {\n showProviderInfo(configManager, subcommand as SupportedProvider);\n } else {\n logger.line();\n logger.error(`Unknown subcommand: ${subcommand}`);\n logger.hint('Usage: /providers [list|enable|disable|path]');\n }\n }\n}\n\n// ============================================\n// Provider Actions\n// ============================================\n\n/**\n * List all providers and their status\n */\nfunction listProviders(configManager: ConfigManager): void {\n const providers = getProvidersInfo(configManager);\n\n logger.line();\n logger.bold(' Providers');\n logger.line();\n\n // Table header\n logger.log(\n ` ${pc.dim('Provider'.padEnd(12))} ${pc.dim('Status'.padEnd(10))} ${pc.dim('Path'.padEnd(20))} ${pc.dim('Directory')}`\n );\n logger.log(` ${pc.dim('─'.repeat(60))}`);\n\n // Provider rows\n for (const provider of providers) {\n const statusIcon = provider.enabled ? pc.green('●') : pc.dim('○');\n const statusText = provider.enabled ? pc.green('enabled') : pc.dim('disabled');\n const pathText = pc.cyan(provider.path);\n const existsText = provider.exists ? pc.green('✓ exists') : pc.dim('✗ missing');\n\n logger.log(\n ` ${statusIcon} ${pc.white(provider.name.padEnd(10))} ${statusText.padEnd(19)} ${pathText.padEnd(29)} ${existsText}`\n );\n }\n\n logger.line();\n\n // Summary\n const enabledCount = providers.filter((p) => p.enabled).length;\n logger.log(` ${pc.dim('Enabled:')} ${enabledCount} of ${providers.length} providers`);\n logger.line();\n\n logger.hint('Use /providers enable <name> or /providers disable <name>');\n}\n\n/**\n * Enable a provider\n */\nfunction enableProvider(configManager: ConfigManager, providerName: string | undefined): void {\n if (providerName === undefined || providerName === '') {\n logger.line();\n logger.error('Provider name is required.');\n logger.hint('Usage: /providers enable <provider>');\n logger.hint(`Available: ${SUPPORTED_PROVIDERS.join(', ')}`);\n return;\n }\n\n const provider = providerName.toLowerCase();\n\n if (!SUPPORTED_PROVIDERS.includes(provider as SupportedProvider)) {\n logger.line();\n logger.error(`Unknown provider: ${provider}`);\n logger.hint(`Available: ${SUPPORTED_PROVIDERS.join(', ')}`);\n return;\n }\n\n // Check if already enabled\n const currentValue = configManager.get(`sync.providers.${provider}.enabled`);\n if (currentValue === true) {\n logger.line();\n logger.info(`Provider '${provider}' is already enabled.`);\n return;\n }\n\n // Enable the provider\n configManager.set(`sync.providers.${provider}.enabled`, true);\n\n // Set default paths if not set\n const defaultPaths = PROVIDER_PATHS[provider as SupportedProvider];\n const currentPaths = configManager.get(`sync.providers.${provider}.paths`);\n if (currentPaths === undefined) {\n configManager.set(`sync.providers.${provider}.paths`, defaultPaths);\n }\n\n configManager.save();\n\n logger.line();\n logger.success(`Provider '${pc.cyan(provider)}' enabled`);\n logger.log(` ${pc.dim('Path:')} ${defaultPaths.skill.split('/')[0]}/`);\n logger.line();\n logger.hint('Run /sync to synchronize cognitives to this provider.');\n}\n\n/**\n * Disable a provider\n */\nfunction disableProvider(configManager: ConfigManager, providerName: string | undefined): void {\n if (providerName === undefined || providerName === '') {\n logger.line();\n logger.error('Provider name is required.');\n logger.hint('Usage: /providers disable <provider>');\n return;\n }\n\n const provider = providerName.toLowerCase();\n\n if (!SUPPORTED_PROVIDERS.includes(provider as SupportedProvider)) {\n logger.line();\n logger.error(`Unknown provider: ${provider}`);\n logger.hint(`Available: ${SUPPORTED_PROVIDERS.join(', ')}`);\n return;\n }\n\n // Check if already disabled\n const currentValue = configManager.get(`sync.providers.${provider}.enabled`);\n if (currentValue !== true) {\n logger.line();\n logger.info(`Provider '${provider}' is already disabled.`);\n return;\n }\n\n // Disable the provider\n configManager.set(`sync.providers.${provider}.enabled`, false);\n configManager.save();\n\n logger.line();\n logger.success(`Provider '${pc.cyan(provider)}' disabled`);\n}\n\n/**\n * Set custom path for a provider\n */\nfunction setProviderPath(\n configManager: ConfigManager,\n providerName: string | undefined,\n newPath: string | undefined\n): void {\n if (providerName === undefined || providerName === '') {\n logger.line();\n logger.error('Provider name is required.');\n logger.hint('Usage: /providers path <provider> <path>');\n return;\n }\n\n if (newPath === undefined || newPath === '') {\n logger.line();\n logger.error('Path is required.');\n logger.hint('Usage: /providers path <provider> <path>');\n logger.hint('Example: /providers path claude .claude-code/');\n return;\n }\n\n const provider = providerName.toLowerCase();\n\n if (!SUPPORTED_PROVIDERS.includes(provider as SupportedProvider)) {\n logger.line();\n logger.error(`Unknown provider: ${provider}`);\n logger.hint(`Available: ${SUPPORTED_PROVIDERS.join(', ')}`);\n return;\n }\n\n // Normalize path (ensure it ends with /)\n const normalizedPath = newPath.endsWith('/') ? newPath : `${newPath}/`;\n\n // Update all cognitive type paths\n const cognitiveTypes = ['skill', 'agent', 'prompt', 'workflow', 'tool'] as const;\n for (const type of cognitiveTypes) {\n configManager.set(`sync.providers.${provider}.paths.${type}`, `${normalizedPath}${type}s`);\n }\n\n configManager.save();\n\n logger.line();\n logger.success(`Updated paths for '${pc.cyan(provider)}'`);\n logger.log(` ${pc.dim('Base path:')} ${pc.cyan(normalizedPath)}`);\n logger.line();\n}\n\n/**\n * Show detailed info for a specific provider\n */\nfunction showProviderInfo(configManager: ConfigManager, provider: SupportedProvider): void {\n const config = configManager.getConfig();\n const projectRoot = configManager.getProjectRoot();\n const providerConfig = config.sync?.providers?.[provider];\n const enabled = providerConfig?.enabled ?? false;\n const paths = providerConfig?.paths ?? PROVIDER_PATHS[provider];\n\n logger.line();\n logger.bold(` ${getProviderDisplayName(provider)}`);\n logger.line();\n\n // Status\n const statusIcon = enabled ? pc.green('●') : pc.dim('○');\n const statusText = enabled ? pc.green('Enabled') : pc.dim('Disabled');\n logger.log(` ${pc.dim('Status:')} ${statusIcon} ${statusText}`);\n logger.line();\n\n // Paths\n logger.log(` ${pc.dim('Paths:')}`);\n const cognitiveTypes = ['skill', 'agent', 'prompt', 'workflow', 'tool'] as const;\n for (const type of cognitiveTypes) {\n const typePath = paths[type] ?? '';\n const fullPath = path.join(projectRoot, typePath);\n const exists = fs.existsSync(fullPath);\n const existsIcon = exists ? pc.green('✓') : pc.dim('✗');\n logger.log(` ${pc.dim(type.padEnd(10))} ${pc.cyan(typePath)} ${existsIcon}`);\n }\n\n logger.line();\n}\n\n// ============================================\n// Helper Functions\n// ============================================\n\nfunction getProvidersInfo(configManager: ConfigManager): ProviderInfo[] {\n const config = configManager.getConfig();\n const projectRoot = configManager.getProjectRoot();\n const providers: ProviderInfo[] = [];\n\n for (const provider of SUPPORTED_PROVIDERS) {\n const providerConfig = config.sync?.providers?.[provider];\n const enabled = providerConfig?.enabled ?? false;\n const basePath = providerConfig?.paths?.skill?.split('/')[0] ?? `.${provider}`;\n const fullPath = path.join(projectRoot, basePath);\n const exists = fs.existsSync(fullPath);\n\n providers.push({\n name: provider,\n enabled,\n path: `${basePath}/`,\n exists,\n });\n }\n\n return providers;\n}\n\nfunction getProviderDisplayName(provider: SupportedProvider): string {\n const names: Record<SupportedProvider, string> = {\n claude: 'Claude (Anthropic)',\n openai: 'OpenAI (GPT)',\n gemini: 'Gemini (Google)',\n cursor: 'Cursor IDE',\n windsurf: 'Windsurf IDE',\n copilot: 'GitHub Copilot',\n };\n return names[provider];\n}\n\n// ============================================\n// Command Registration\n// ============================================\n\n/**\n * Register providers command with Commander\n */\nexport function registerProvidersCommand(program: Command): void {\n const providersCmd = program\n .command('providers')\n .description('Manage provider configuration');\n\n // List (default)\n providersCmd\n .command('list', { isDefault: true })\n .description('List all providers and their status')\n .action(() => {\n executeProvidersCommand('list');\n });\n\n // Enable\n providersCmd\n .command('enable <provider>')\n .description('Enable a provider')\n .action((provider: string) => {\n executeProvidersCommand(`enable ${provider}`);\n });\n\n // Disable\n providersCmd\n .command('disable <provider>')\n .description('Disable a provider')\n .action((provider: string) => {\n executeProvidersCommand(`disable ${provider}`);\n });\n\n // Path\n providersCmd\n .command('path <provider> <path>')\n .description('Set custom sync path for a provider')\n .action((provider: string, newPath: string) => {\n executeProvidersCommand(`path ${provider} ${newPath}`);\n });\n\n // Default action\n providersCmd.action(() => {\n executeProvidersCommand('list');\n });\n}\n","/**\n * Search Command\n *\n * Search for cognitives in the SynapSync registry\n */\n\nimport type { Command } from 'commander';\nimport pc from 'picocolors';\nimport { RegistryClient, RegistryError } from '../services/registry/client.js';\nimport type { SearchOptions } from '../services/registry/client.js';\nimport { COGNITIVE_TYPES, CATEGORIES } from '../core/constants.js';\nimport type { CognitiveType, Category } from '../core/constants.js';\nimport type { RegistryCognitiveEntry } from '../types/index.js';\nimport { logger } from '../utils/logger.js';\n\n// ============================================\n// Types\n// ============================================\n\ninterface SearchCommandOptions {\n type?: string;\n category?: string;\n tag?: string;\n limit?: string;\n json?: boolean;\n}\n\n// ============================================\n// Main Function\n// ============================================\n\n/**\n * Execute the search command\n */\nexport async function executeSearchCommand(\n query: string | undefined,\n options: SearchCommandOptions\n): Promise<void> {\n logger.line();\n\n // Validate options\n const validatedOptions = validateOptions(options);\n if (validatedOptions === null) {\n return;\n }\n\n // Show searching indicator\n const searchingText = query !== undefined && query.trim() !== ''\n ? `Searching for \"${query}\"...`\n : 'Fetching cognitives from registry...';\n logger.log(` ${pc.dim(searchingText)}`);\n\n try {\n const client = new RegistryClient();\n\n // Check connectivity\n const isReachable = await client.ping();\n if (!isReachable) {\n logger.line();\n logger.error('Unable to reach the registry. Check your internet connection.');\n return;\n }\n\n // Search\n const searchOpts: SearchOptions = {};\n if (validatedOptions.type !== undefined) searchOpts.type = validatedOptions.type;\n if (validatedOptions.category !== undefined) searchOpts.category = validatedOptions.category;\n if (validatedOptions.tag !== undefined) searchOpts.tag = validatedOptions.tag;\n if (validatedOptions.limit !== undefined) searchOpts.limit = validatedOptions.limit;\n const result = await client.search(query, searchOpts);\n\n // Clear the searching line\n process.stdout.write('\\x1b[1A\\x1b[2K');\n\n if (options.json === true) {\n // JSON output\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n // Display results\n displaySearchResults(result.cognitives, query, result.total);\n } catch (error) {\n logger.line();\n if (error instanceof RegistryError) {\n logger.error(`Registry error: ${error.message}`);\n } else if (error instanceof Error) {\n logger.error(`Search failed: ${error.message}`);\n } else {\n logger.error('Search failed with unknown error');\n }\n }\n}\n\n// ============================================\n// Validation\n// ============================================\n\ninterface ValidatedOptions {\n type?: CognitiveType;\n category?: Category;\n tag?: string;\n limit?: number;\n}\n\nfunction validateOptions(options: SearchCommandOptions): ValidatedOptions | null {\n const validated: ValidatedOptions = {};\n\n // Validate type\n if (options.type !== undefined) {\n if (!COGNITIVE_TYPES.includes(options.type as CognitiveType)) {\n logger.error(`Invalid type: ${options.type}`);\n logger.hint(`Valid types: ${COGNITIVE_TYPES.join(', ')}`);\n return null;\n }\n validated.type = options.type as CognitiveType;\n }\n\n // Validate category\n if (options.category !== undefined) {\n if (!(CATEGORIES as readonly string[]).includes(options.category)) {\n logger.error(`Invalid category: ${options.category}`);\n logger.hint(`Valid categories: ${CATEGORIES.join(', ')}`);\n return null;\n }\n validated.category = options.category as Category;\n }\n\n // Validate tag\n if (options.tag !== undefined) {\n validated.tag = options.tag;\n }\n\n // Validate limit\n if (options.limit !== undefined) {\n const limit = parseInt(options.limit, 10);\n if (isNaN(limit) || limit < 1) {\n logger.error('Limit must be a positive number');\n return null;\n }\n validated.limit = limit;\n }\n\n return validated;\n}\n\n// ============================================\n// Display Functions\n// ============================================\n\nfunction displaySearchResults(\n cognitives: RegistryCognitiveEntry[],\n query: string | undefined,\n total: number\n): void {\n // Header\n if (query !== undefined && query.trim() !== '') {\n logger.bold(` Search Results for \"${query}\"`);\n } else {\n logger.bold(' Registry Cognitives');\n }\n logger.line();\n\n if (cognitives.length === 0) {\n logger.log(` ${pc.dim('No cognitives found')}`);\n logger.line();\n logger.hint('Try a different search query or remove filters.');\n return;\n }\n\n // Results count\n if (cognitives.length < total) {\n logger.log(` ${pc.dim(`Showing ${cognitives.length} of ${total} results`)}`);\n } else {\n logger.log(` ${pc.dim(`Found ${total} cognitive${total === 1 ? '' : 's'}`)}`);\n }\n logger.line();\n\n // Display each cognitive\n for (const cognitive of cognitives) {\n displayCognitive(cognitive);\n }\n\n logger.line();\n logger.hint('Run synapsync add <name> to add a cognitive.');\n}\n\nfunction displayCognitive(cognitive: RegistryCognitiveEntry): void {\n const typeIcon = getCognitiveIcon(cognitive.type);\n const typeLabel = pc.dim(`[${cognitive.type}]`);\n\n // Name and type\n logger.log(` ${typeIcon} ${pc.bold(pc.white(cognitive.name))} ${typeLabel}`);\n\n // Description\n logger.log(` ${pc.dim(truncate(cognitive.description, 60))}`);\n\n // Metadata line\n const meta: string[] = [];\n meta.push(pc.dim(`v${cognitive.version}`));\n meta.push(pc.dim(cognitive.category));\n if (cognitive.downloads > 0) {\n meta.push(pc.dim(`${cognitive.downloads} downloads`));\n }\n logger.log(` ${meta.join(' · ')}`);\n\n // Tags\n if (cognitive.tags.length > 0) {\n const tags = cognitive.tags.slice(0, 5).map((t) => pc.cyan(t)).join(' ');\n logger.log(` ${tags}`);\n }\n\n logger.line();\n}\n\nfunction getCognitiveIcon(type: CognitiveType): string {\n const icons: Record<CognitiveType, string> = {\n skill: pc.blue('◆'),\n agent: pc.magenta('◆'),\n prompt: pc.yellow('◆'),\n workflow: pc.cyan('◆'),\n tool: pc.green('◆'),\n };\n return icons[type];\n}\n\nfunction truncate(text: string, maxLength: number): string {\n if (text.length <= maxLength) return text;\n return text.slice(0, maxLength - 3) + '...';\n}\n\n// ============================================\n// Command Registration\n// ============================================\n\n/**\n * Register search command with Commander\n */\nexport function registerSearchCommand(program: Command): void {\n program\n .command('search [query]')\n .description('Search for cognitives in the registry')\n .option('-t, --type <type>', 'Filter by type (skill, agent, prompt, workflow, tool)')\n .option('-c, --category <category>', 'Filter by category')\n .option('--tag <tag>', 'Filter by tag')\n .option('-l, --limit <number>', 'Limit results', '20')\n .option('--json', 'Output as JSON')\n .action(async (query: string | undefined, options: SearchCommandOptions) => {\n await executeSearchCommand(query, options);\n });\n}\n","/**\n * Registry Client\n *\n * Handles fetching and querying the SynapSync public registry\n */\n\nimport {\n REGISTRY_BASE_URL,\n REGISTRY_INDEX_FILE,\n REGISTRY_MANIFEST_FILE,\n} from '../../core/constants.js';\nimport type {\n RegistryIndex,\n RegistryCognitiveEntry,\n CognitiveManifest,\n RegistrySearchResult,\n DownloadedCognitive,\n CognitiveType,\n Category,\n} from '../../types/index.js';\n\n// ============================================\n// Types\n// ============================================\n\nexport interface SearchOptions {\n type?: CognitiveType;\n category?: Category;\n tag?: string;\n limit?: number;\n}\n\nexport interface RegistryClientOptions {\n baseUrl?: string;\n cacheDir?: string;\n cacheTtl?: number; // milliseconds\n}\n\n// ============================================\n// RegistryClient Class\n// ============================================\n\nexport class RegistryClient {\n private baseUrl: string;\n private indexCache: RegistryIndex | null = null;\n private indexCacheTime: number = 0;\n private cacheTtl: number;\n\n constructor(options: RegistryClientOptions = {}) {\n this.baseUrl = options.baseUrl ?? REGISTRY_BASE_URL;\n this.cacheTtl = options.cacheTtl ?? 5 * 60 * 1000; // 5 minutes default\n }\n\n // ============================================\n // Index Operations\n // ============================================\n\n /**\n * Fetch the registry index\n */\n async getIndex(forceRefresh = false): Promise<RegistryIndex> {\n const now = Date.now();\n\n // Return cached if still valid\n if (!forceRefresh && this.indexCache !== null && now - this.indexCacheTime < this.cacheTtl) {\n return this.indexCache;\n }\n\n const url = `${this.baseUrl}/${REGISTRY_INDEX_FILE}`;\n const response = await this.fetch(url);\n\n if (!response.ok) {\n throw new RegistryError(`Failed to fetch registry index: ${response.status} ${response.statusText}`, url);\n }\n\n const index = (await response.json()) as RegistryIndex;\n this.indexCache = index;\n this.indexCacheTime = now;\n\n return index;\n }\n\n /**\n * Get total count of cognitives in registry\n */\n async getCount(): Promise<number> {\n const index = await this.getIndex();\n return index.totalCognitives;\n }\n\n // ============================================\n // Search Operations\n // ============================================\n\n /**\n * Search for cognitives in the registry\n */\n async search(query?: string, options: SearchOptions = {}): Promise<RegistrySearchResult> {\n const index = await this.getIndex();\n let results = [...index.cognitives];\n\n // Filter by query (searches name, description, tags)\n if (query !== undefined && query.trim() !== '') {\n const q = query.toLowerCase();\n results = results.filter(\n (c) =>\n c.name.toLowerCase().includes(q) ||\n c.description.toLowerCase().includes(q) ||\n c.tags.some((t) => t.toLowerCase().includes(q))\n );\n }\n\n // Filter by type\n if (options.type !== undefined) {\n results = results.filter((c) => c.type === options.type);\n }\n\n // Filter by category\n if (options.category !== undefined) {\n results = results.filter((c) => c.category === options.category);\n }\n\n // Filter by tag\n if (options.tag !== undefined) {\n const tag = options.tag.toLowerCase();\n results = results.filter((c) => c.tags.some((t) => t.toLowerCase() === tag));\n }\n\n // Apply limit\n const total = results.length;\n if (options.limit !== undefined && options.limit > 0) {\n results = results.slice(0, options.limit);\n }\n\n const filters: { type?: CognitiveType; category?: Category; tag?: string } = {};\n if (options.type !== undefined) filters.type = options.type;\n if (options.category !== undefined) filters.category = options.category;\n if (options.tag !== undefined) filters.tag = options.tag;\n\n return {\n cognitives: results,\n total,\n ...(query !== undefined ? { query } : {}),\n filters,\n };\n }\n\n /**\n * Find a cognitive by name\n */\n async findByName(name: string): Promise<RegistryCognitiveEntry | null> {\n const index = await this.getIndex();\n return index.cognitives.find((c) => c.name === name) ?? null;\n }\n\n /**\n * List all cognitives\n */\n async list(options: SearchOptions = {}): Promise<RegistryCognitiveEntry[]> {\n const result = await this.search(undefined, options);\n return result.cognitives;\n }\n\n // ============================================\n // Download Operations\n // ============================================\n\n /**\n * Get the manifest for a cognitive\n */\n async getManifest(cognitiveEntry: RegistryCognitiveEntry): Promise<CognitiveManifest> {\n const url = `${this.baseUrl}/${cognitiveEntry.path}/${REGISTRY_MANIFEST_FILE}`;\n const response = await this.fetch(url);\n\n if (!response.ok) {\n throw new RegistryError(\n `Failed to fetch manifest for ${cognitiveEntry.name}: ${response.status} ${response.statusText}`,\n url\n );\n }\n\n return (await response.json()) as CognitiveManifest;\n }\n\n /**\n * Get the content file for a cognitive\n */\n async getContent(cognitiveEntry: RegistryCognitiveEntry, manifest: CognitiveManifest): Promise<string> {\n const url = `${this.baseUrl}/${cognitiveEntry.path}/${manifest.file}`;\n const response = await this.fetch(url);\n\n if (!response.ok) {\n throw new RegistryError(\n `Failed to fetch content for ${cognitiveEntry.name}: ${response.status} ${response.statusText}`,\n url\n );\n }\n\n return response.text();\n }\n\n /**\n * Download a cognitive (manifest + content)\n */\n async download(name: string): Promise<DownloadedCognitive> {\n // Find in registry\n const entry = await this.findByName(name);\n if (entry === null) {\n throw new CognitiveNotFoundError(name);\n }\n\n // Get manifest\n const manifest = await this.getManifest(entry);\n\n // Get content\n const content = await this.getContent(entry, manifest);\n\n return {\n manifest,\n content,\n path: entry.path,\n };\n }\n\n /**\n * Download additional assets for a cognitive\n */\n async downloadAsset(cognitiveEntry: RegistryCognitiveEntry, assetPath: string): Promise<string> {\n const url = `${this.baseUrl}/${cognitiveEntry.path}/${assetPath}`;\n const response = await this.fetch(url);\n\n if (!response.ok) {\n throw new RegistryError(\n `Failed to fetch asset ${assetPath} for ${cognitiveEntry.name}: ${response.status} ${response.statusText}`,\n url\n );\n }\n\n return response.text();\n }\n\n // ============================================\n // Utility Methods\n // ============================================\n\n /**\n * Check if registry is reachable\n */\n async ping(): Promise<boolean> {\n try {\n const url = `${this.baseUrl}/${REGISTRY_INDEX_FILE}`;\n const response = await this.fetch(url, { method: 'HEAD' });\n return response.ok;\n } catch {\n return false;\n }\n }\n\n /**\n * Clear the cache\n */\n clearCache(): void {\n this.indexCache = null;\n this.indexCacheTime = 0;\n }\n\n /**\n * Get the base URL\n */\n getBaseUrl(): string {\n return this.baseUrl;\n }\n\n // ============================================\n // Private Methods\n // ============================================\n\n private async fetch(url: string, options?: RequestInit): Promise<Response> {\n try {\n return await fetch(url, {\n ...options,\n headers: {\n 'User-Agent': 'SynapSync-CLI',\n ...options?.headers,\n },\n });\n } catch (error) {\n if (error instanceof Error) {\n throw new RegistryError(`Network error: ${error.message}`, url);\n }\n throw new RegistryError('Network error', url);\n }\n }\n}\n\n// ============================================\n// Custom Errors\n// ============================================\n\nexport class RegistryError extends Error {\n constructor(\n message: string,\n public url: string\n ) {\n super(message);\n this.name = 'RegistryError';\n }\n}\n\nexport class CognitiveNotFoundError extends Error {\n constructor(public cognitiveName: string) {\n super(`Cognitive '${cognitiveName}' not found in registry`);\n this.name = 'CognitiveNotFoundError';\n }\n}\n","/**\n * Add Command\n *\n * Add cognitives from registry, local path, or GitHub\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport type { Command } from 'commander';\nimport pc from 'picocolors';\nimport { RegistryClient, CognitiveNotFoundError, RegistryError } from '../services/registry/client.js';\nimport { ConfigManager } from '../services/config/manager.js';\nimport { SyncEngine } from '../services/sync/engine.js';\nimport {\n COGNITIVE_TYPES,\n COGNITIVE_FILE_NAMES,\n} from '../core/constants.js';\nimport type { CognitiveType, Category } from '../core/constants.js';\nimport type { InstalledCognitive, CognitiveManifest } from '../types/index.js';\nimport { logger } from '../utils/logger.js';\n\n// ============================================\n// Types\n// ============================================\n\ninterface AddCommandOptions {\n type?: string;\n category?: string;\n force?: boolean;\n}\n\ninterface InstallSource {\n type: 'registry' | 'local' | 'github';\n name: string;\n path?: string;\n url?: string;\n branch?: string;\n}\n\n// ============================================\n// Main Function\n// ============================================\n\n/**\n * Execute the add command\n */\nexport async function executeAddCommand(\n source: string,\n options: AddCommandOptions\n): Promise<void> {\n logger.line();\n\n // Check if project is initialized\n const configManager = ConfigManager.findConfig();\n if (configManager === null) {\n logger.error('No SynapSync project found.');\n logger.hint('Run synapsync init to initialize a project first.');\n return;\n }\n\n // Parse the source\n const parsedSource = parseSource(source);\n logger.log(` ${pc.dim(`Installing from ${parsedSource.type}...`)}`);\n\n let success = false;\n\n try {\n switch (parsedSource.type) {\n case 'registry':\n success = await installFromRegistry(parsedSource.name, options, configManager);\n break;\n case 'local':\n if (parsedSource.path !== undefined) {\n success = installFromLocal(parsedSource.path, options, configManager);\n }\n break;\n case 'github':\n success = installFromGitHub(parsedSource, options, configManager);\n break;\n }\n\n // Auto-sync to providers after successful add\n if (success) {\n logger.log(` ${pc.dim('Syncing to providers...')}`);\n const synapSyncDir = configManager.getSynapSyncDir();\n const projectRoot = configManager.getProjectRoot();\n const config = configManager.getConfig();\n const syncEngine = new SyncEngine(synapSyncDir, projectRoot, config);\n const result = syncEngine.sync({ force: options.force ?? false });\n\n if (result.providerResults && result.providerResults.length > 0) {\n for (const pr of result.providerResults) {\n const created = pr.created.filter(c => c.success).length;\n const skipped = pr.skipped.length;\n if (created > 0) {\n logger.log(` ${pc.green('✓')} Synced to ${pr.provider} (${created} created)`);\n } else if (skipped > 0) {\n logger.log(` ${pc.green('✓')} Synced to ${pr.provider} (already up to date)`);\n }\n }\n }\n logger.line();\n }\n } catch (error) {\n logger.line();\n if (error instanceof CognitiveNotFoundError) {\n logger.error(`Cognitive '${error.cognitiveName}' not found in registry.`);\n logger.hint('Run synapsync search to find available cognitives.');\n } else if (error instanceof RegistryError) {\n logger.error(`Registry error: ${error.message}`);\n } else if (error instanceof Error) {\n logger.error(`Installation failed: ${error.message}`);\n } else {\n logger.error('Installation failed with unknown error');\n }\n }\n}\n\n// ============================================\n// Source Parsing\n// ============================================\n\nfunction parseSource(source: string): InstallSource {\n // Local path: starts with ./ or / or contains path separators\n if (source.startsWith('./') || source.startsWith('/') || source.startsWith('../')) {\n return {\n type: 'local',\n name: path.basename(source),\n path: source,\n };\n }\n\n // GitHub shorthand: github:user/repo or github:user/repo#branch\n if (source.startsWith('github:')) {\n const rest = source.slice(7);\n const [repoPath, branch] = rest.split('#');\n const parts = repoPath?.split('/') ?? [];\n\n return {\n type: 'github',\n name: parts[parts.length - 1] ?? repoPath ?? source,\n url: `https://github.com/${repoPath}`,\n branch: branch ?? 'main',\n };\n }\n\n // GitHub URL: https://github.com/user/repo\n if (source.startsWith('https://github.com/')) {\n const urlPath = source.replace('https://github.com/', '');\n const [repoPath, branch] = urlPath.split('#');\n const parts = repoPath?.split('/') ?? [];\n\n return {\n type: 'github',\n name: parts[parts.length - 1] ?? repoPath ?? source,\n url: `https://github.com/${repoPath}`,\n branch: branch ?? 'main',\n };\n }\n\n // Default: registry name\n return {\n type: 'registry',\n name: source,\n };\n}\n\n// ============================================\n// Registry Installation\n// ============================================\n\nasync function installFromRegistry(\n name: string,\n options: AddCommandOptions,\n configManager: ConfigManager\n): Promise<boolean> {\n const client = new RegistryClient();\n\n // Download cognitive\n const downloaded = await client.download(name);\n const manifest = downloaded.manifest;\n\n // Determine category\n const category = options.category ?? manifest.category;\n\n // Check if already installed\n const targetDir = getTargetDir(configManager, manifest.type, category, manifest.name);\n\n if (fs.existsSync(targetDir) && options.force !== true) {\n logger.line();\n logger.error(`Cognitive '${manifest.name}' is already installed.`);\n logger.hint('Use --force to overwrite.');\n return false;\n }\n\n // Download assets if any (check for assets folder)\n const assets = await downloadAssets(client, name, manifest);\n\n // Save files\n saveCognitive(targetDir, manifest, downloaded.content, assets);\n\n // Update manifest.json\n updateProjectManifest(configManager, manifest, 'registry');\n\n // Success\n logger.line();\n logger.log(` ${pc.green('✓')} Installed ${pc.bold(manifest.name)} ${pc.dim(`v${manifest.version}`)}`);\n logger.log(` ${pc.dim('Type:')} ${manifest.type}`);\n logger.log(` ${pc.dim('Category:')} ${category}`);\n logger.log(` ${pc.dim('Location:')} ${path.relative(process.cwd(), targetDir)}`);\n\n return true;\n}\n\nasync function downloadAssets(\n client: RegistryClient,\n name: string,\n _manifest: CognitiveManifest\n): Promise<Map<string, string>> {\n const assets = new Map<string, string>();\n\n // Find the cognitive entry first\n const entry = await client.findByName(name);\n if (entry === null) return assets;\n\n // Try to download common asset files\n const assetFiles = [\n 'assets/SKILL-TEMPLATE-BASIC.md',\n 'assets/SKILL-TEMPLATE-ADVANCED.md',\n ];\n\n for (const assetPath of assetFiles) {\n try {\n const content = await client.downloadAsset(entry, assetPath);\n assets.set(assetPath, content);\n } catch {\n // Asset doesn't exist, skip\n }\n }\n\n return assets;\n}\n\n// ============================================\n// Local Installation\n// ============================================\n\nfunction installFromLocal(\n sourcePath: string,\n options: AddCommandOptions,\n configManager: ConfigManager\n): boolean {\n const absolutePath = path.resolve(process.cwd(), sourcePath);\n\n if (!fs.existsSync(absolutePath)) {\n throw new Error(`Path not found: ${absolutePath}`);\n }\n\n // Detect cognitive type and filename\n const detected = detectCognitiveType(absolutePath);\n\n if (detected === null && options.type === undefined) {\n throw new Error(\n 'Could not detect cognitive type. Please specify with --type flag.'\n );\n }\n\n const cognitiveType = (options.type as CognitiveType) ?? detected?.type ?? 'skill';\n const fileName = detected?.fileName ?? COGNITIVE_FILE_NAMES[cognitiveType];\n\n // Read the cognitive file\n const filePath = path.join(absolutePath, fileName);\n\n if (!fs.existsSync(filePath)) {\n throw new Error(`Cognitive file not found: ${filePath}`);\n }\n\n const content = fs.readFileSync(filePath, 'utf-8');\n const metadata = parseMetadata(content);\n const name = (metadata['name'] as string) ?? path.basename(absolutePath);\n const category = (options.category as Category) ?? (metadata['category'] as Category) ?? 'general';\n\n // Create manifest from metadata - use original filename\n const manifest: CognitiveManifest = {\n name,\n type: cognitiveType,\n version: (metadata['version'] as string) ?? '1.0.0',\n description: (metadata['description'] as string) ?? '',\n author: (metadata['author'] as string) ?? 'local',\n license: (metadata['license'] as string) ?? 'MIT',\n category,\n tags: (metadata['tags'] as string[]) ?? [],\n providers: ((metadata['providers'] as string[]) ?? []) as CognitiveManifest['providers'],\n file: fileName, // Use the original filename\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n };\n\n // Check if already installed\n const targetDir = getTargetDir(configManager, cognitiveType, category, name);\n\n if (fs.existsSync(targetDir) && options.force !== true) {\n logger.line();\n logger.error(`Cognitive '${name}' is already installed.`);\n logger.hint('Use --force to overwrite.');\n return false;\n }\n\n // Copy all files from source\n const assets = new Map<string, string>();\n const assetsDir = path.join(absolutePath, 'assets');\n if (fs.existsSync(assetsDir)) {\n const assetFiles = fs.readdirSync(assetsDir);\n for (const file of assetFiles) {\n const assetContent = fs.readFileSync(path.join(assetsDir, file), 'utf-8');\n assets.set(`assets/${file}`, assetContent);\n }\n }\n\n // Save files\n saveCognitive(targetDir, manifest, content, assets);\n\n // Update manifest.json\n updateProjectManifest(configManager, manifest, 'local');\n\n // Success\n logger.line();\n logger.log(` ${pc.green('✓')} Installed ${pc.bold(name)} ${pc.dim(`v${manifest.version}`)}`);\n logger.log(` ${pc.dim('Type:')} ${cognitiveType}`);\n logger.log(` ${pc.dim('Category:')} ${category}`);\n logger.log(` ${pc.dim('Source:')} local`);\n logger.log(` ${pc.dim('Location:')} ${path.relative(process.cwd(), targetDir)}`);\n\n return true;\n}\n\n/**\n * Detect cognitive type from directory contents\n * Checks for legacy fixed filenames first, then by extension\n */\nfunction detectCognitiveType(dirPath: string): { type: CognitiveType; fileName: string } | null {\n // First check for legacy fixed filenames\n for (const type of COGNITIVE_TYPES) {\n const fileName = COGNITIVE_FILE_NAMES[type];\n if (fs.existsSync(path.join(dirPath, fileName))) {\n return { type, fileName };\n }\n }\n\n // If not found, check for files by extension\n if (!fs.existsSync(dirPath)) return null;\n\n const files = fs.readdirSync(dirPath);\n\n // Check for workflow first (yaml extension)\n for (const file of files) {\n if (file.endsWith('.yaml') && !file.startsWith('.')) {\n return { type: 'workflow', fileName: file };\n }\n }\n\n // Check for markdown files (could be skill, agent, prompt, or tool)\n // We need to parse frontmatter to determine the type\n for (const file of files) {\n if (file.endsWith('.md') && !file.startsWith('.')) {\n const content = fs.readFileSync(path.join(dirPath, file), 'utf-8');\n const metadata = parseMetadata(content);\n const detectedType = (metadata['type'] as CognitiveType) ?? 'skill'; // Default to skill\n if (COGNITIVE_TYPES.includes(detectedType)) {\n return { type: detectedType, fileName: file };\n }\n }\n }\n\n return null;\n}\n\nfunction parseMetadata(content: string): Record<string, unknown> {\n // Parse YAML frontmatter\n const match = content.match(/^---\\n([\\s\\S]*?)\\n---/);\n if (match?.[1] === undefined) {\n return {};\n }\n\n try {\n // Simple YAML parsing (key: value)\n const result: Record<string, unknown> = {};\n const lines = match[1].split('\\n');\n\n for (const line of lines) {\n const colonIndex = line.indexOf(':');\n if (colonIndex > 0) {\n const key = line.slice(0, colonIndex).trim();\n let value: unknown = line.slice(colonIndex + 1).trim();\n\n // Remove quotes\n if (typeof value === 'string') {\n if ((value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))) {\n value = value.slice(1, -1);\n }\n }\n\n result[key] = value;\n }\n }\n\n return result;\n } catch {\n return {};\n }\n}\n\n// ============================================\n// GitHub Installation\n// ============================================\n\nfunction installFromGitHub(\n _source: InstallSource,\n _options: AddCommandOptions,\n _configManager: ConfigManager\n): boolean {\n // For now, we'll use raw GitHub URLs similar to registry\n // This is a simplified implementation\n logger.line();\n logger.error('GitHub installation is not yet fully implemented.');\n logger.hint('For now, clone the repo locally and use: synapsync add ./path/to/cognitive');\n return false;\n}\n\n// ============================================\n// File Operations\n// ============================================\n\nfunction getTargetDir(\n configManager: ConfigManager,\n type: CognitiveType,\n category: Category,\n name: string\n): string {\n const synapSyncDir = configManager.getSynapSyncDir();\n return path.join(synapSyncDir, `${type}s`, category, name);\n}\n\nfunction saveCognitive(\n targetDir: string,\n manifest: CognitiveManifest,\n content: string,\n assets: Map<string, string>\n): void {\n // Create directory structure\n fs.mkdirSync(targetDir, { recursive: true });\n\n // Save main file\n const mainFilePath = path.join(targetDir, manifest.file);\n fs.writeFileSync(mainFilePath, content, 'utf-8');\n\n // Save assets\n for (const [assetPath, assetContent] of assets) {\n const fullPath = path.join(targetDir, assetPath);\n const assetDir = path.dirname(fullPath);\n fs.mkdirSync(assetDir, { recursive: true });\n fs.writeFileSync(fullPath, assetContent, 'utf-8');\n }\n}\n\nfunction updateProjectManifest(\n configManager: ConfigManager,\n manifest: CognitiveManifest,\n source: 'registry' | 'local' | 'github'\n): void {\n const synapSyncDir = configManager.getSynapSyncDir();\n const manifestPath = path.join(synapSyncDir, 'manifest.json');\n\n // Read existing manifest or create new one\n let projectManifest: {\n version: string;\n lastUpdated: string;\n cognitives: Record<string, InstalledCognitive>;\n syncs: Record<string, unknown>;\n };\n\n if (fs.existsSync(manifestPath)) {\n const content = fs.readFileSync(manifestPath, 'utf-8');\n projectManifest = JSON.parse(content) as typeof projectManifest;\n } else {\n projectManifest = {\n version: '1.0.0',\n lastUpdated: new Date().toISOString(),\n cognitives: {},\n syncs: {},\n };\n }\n\n // Add or update cognitive entry\n const mappedSource = source === 'github' ? 'git' as const : source;\n const entry: InstalledCognitive = {\n name: manifest.name,\n type: manifest.type,\n category: manifest.category,\n version: manifest.version,\n installedAt: new Date(),\n source: mappedSource,\n };\n if (source === 'registry') {\n entry.sourceUrl = 'https://github.com/SynapSync/synapse-registry';\n }\n projectManifest.cognitives[manifest.name] = entry;\n\n projectManifest.lastUpdated = new Date().toISOString();\n\n // Save manifest\n fs.writeFileSync(manifestPath, JSON.stringify(projectManifest, null, 2), 'utf-8');\n}\n\n// ============================================\n// Command Registration\n// ============================================\n\n/**\n * Register add command with Commander\n */\nexport function registerAddCommand(program: Command): void {\n program\n .command('add <source>')\n .description('Add a cognitive from registry, local path, or GitHub')\n .option('-t, --type <type>', 'Cognitive type (skill, agent, prompt, workflow, tool)')\n .option('-c, --category <category>', 'Category (overrides default)')\n .option('-f, --force', 'Overwrite if already installed')\n .action(async (source: string, options: AddCommandOptions) => {\n await executeAddCommand(source, options);\n });\n}\n","/**\n * Sync Engine\n *\n * Synchronizes the filesystem with the manifest.json and providers\n * Phase 1: filesystem ↔ manifest reconciliation\n * Phase 2: manifest ↔ provider symlinks\n */\n\nimport * as path from 'path';\nimport type {\n SyncResult,\n SyncOptions,\n SyncAction,\n SyncError,\n SyncProgressCallback,\n} from './types.js';\nimport { CognitiveScanner } from '../scanner/scanner.js';\nimport { ManifestManager } from '../manifest/manager.js';\nimport { SymlinkManager } from '../symlink/manager.js';\nimport type { ScannedCognitive } from '../scanner/types.js';\nimport type { ProviderSyncResult } from '../symlink/types.js';\nimport type { SupportedProvider } from '../../core/constants.js';\nimport type { ProjectConfig } from '../config/schema.js';\n\nexport class SyncEngine {\n private scanner: CognitiveScanner;\n private manifest: ManifestManager;\n private symlink: SymlinkManager;\n private projectRoot: string;\n private config: ProjectConfig | null;\n\n constructor(synapSyncDir: string, projectRoot?: string, config?: ProjectConfig) {\n this.projectRoot = projectRoot ?? path.dirname(synapSyncDir);\n this.config = config ?? null;\n this.scanner = new CognitiveScanner(synapSyncDir);\n this.manifest = new ManifestManager(synapSyncDir);\n this.symlink = new SymlinkManager(this.projectRoot, synapSyncDir);\n }\n\n /**\n * Perform a full sync of filesystem to manifest and providers\n */\n sync(options: SyncOptions = {}, onProgress?: SyncProgressCallback): SyncResult {\n const startTime = Date.now();\n const actions: SyncAction[] = [];\n const errors: SyncError[] = [];\n let providerResults: ProviderSyncResult[] | undefined;\n\n try {\n // Phase 1: Scan filesystem\n onProgress?.({\n phase: 'scanning',\n message: 'Scanning filesystem for cognitives...',\n });\n\n const scanOpts: import('../scanner/types.js').ScanOptions = {};\n if (options.types !== undefined) scanOpts.types = options.types;\n if (options.categories !== undefined) scanOpts.categories = options.categories;\n const scanned = this.scanner.scan(scanOpts);\n\n onProgress?.({\n phase: 'scanning',\n message: `Found ${scanned.length} cognitives in filesystem`,\n total: scanned.length,\n });\n\n // Phase 2: Compare with manifest\n onProgress?.({\n phase: 'comparing',\n message: 'Comparing with manifest...',\n });\n\n const manifestCognitives = this.manifest.getCognitives();\n const comparison = this.scanner.compare(scanned, manifestCognitives);\n\n // Build list of actions\n for (const cognitive of comparison.new) {\n actions.push({\n operation: 'add',\n cognitive,\n reason: 'New cognitive found in filesystem',\n });\n }\n\n for (const cognitive of comparison.modified) {\n actions.push({\n operation: 'update',\n cognitive,\n reason: 'Cognitive content has changed',\n });\n }\n\n for (const name of comparison.removed) {\n actions.push({\n operation: 'remove',\n cognitive: name,\n reason: 'Cognitive no longer exists in filesystem',\n });\n }\n\n onProgress?.({\n phase: 'comparing',\n message: `Found ${actions.length} changes to sync`,\n });\n\n // Phase 3: Apply manifest changes (unless dry run)\n if (options.dryRun !== true && actions.length > 0) {\n onProgress?.({\n phase: 'reconciling',\n message: 'Applying changes to manifest...',\n total: actions.length,\n processed: 0,\n });\n\n let processed = 0;\n for (const action of actions) {\n try {\n this.applyAction(action);\n processed++;\n onProgress?.({\n phase: 'reconciling',\n message: `Applied ${action.operation} for ${this.getActionName(action)}`,\n total: actions.length,\n processed,\n current: this.getActionName(action),\n });\n } catch (error) {\n errors.push({\n cognitive: this.getActionName(action),\n message: error instanceof Error ? error.message : 'Unknown error',\n code: 'UNKNOWN',\n });\n }\n }\n\n // Save manifest\n onProgress?.({\n phase: 'saving',\n message: 'Saving manifest...',\n });\n\n this.manifest.save();\n }\n\n // Phase 4: Provider sync (unless manifestOnly)\n if (options.manifestOnly !== true) {\n providerResults = this.syncProviders(scanned, options, onProgress);\n\n // Add provider errors to main errors\n for (const result of providerResults) {\n for (const error of result.errors) {\n errors.push({\n cognitive: error.path,\n message: error.message,\n code: 'UNKNOWN',\n });\n }\n }\n\n // Update provider sync state in manifest\n if (options.dryRun !== true) {\n this.updateProviderSyncState(providerResults, scanned);\n this.manifest.save();\n }\n }\n\n onProgress?.({\n phase: 'complete',\n message: options.dryRun === true ? 'Dry run complete' : 'Sync complete',\n });\n\n const duration = Date.now() - startTime;\n\n const result: SyncResult = {\n success: errors.length === 0,\n added: comparison.new.length,\n removed: comparison.removed.length,\n updated: comparison.modified.length,\n unchanged: comparison.unchanged,\n total: this.manifest.getCognitiveCount(),\n errors,\n actions,\n duration,\n };\n if (providerResults !== undefined) {\n result.providerResults = providerResults;\n }\n return result;\n } catch (error) {\n errors.push({\n message: error instanceof Error ? error.message : 'Unknown error',\n code: 'SCAN_FAILED',\n });\n\n const result: SyncResult = {\n success: false,\n added: 0,\n removed: 0,\n updated: 0,\n unchanged: 0,\n total: this.manifest.getCognitiveCount(),\n errors,\n actions,\n duration: Date.now() - startTime,\n };\n if (providerResults !== undefined) {\n result.providerResults = providerResults;\n }\n return result;\n }\n }\n\n /**\n * Sync cognitives to providers\n */\n private syncProviders(\n cognitives: ScannedCognitive[],\n options: SyncOptions,\n onProgress?: SyncProgressCallback\n ): ProviderSyncResult[] {\n const results: ProviderSyncResult[] = [];\n const enabledProviders = this.getEnabledProviders(options.provider);\n\n if (enabledProviders.length === 0) {\n return results;\n }\n\n onProgress?.({\n phase: 'reconciling',\n message: `Syncing to ${enabledProviders.length} provider(s)...`,\n });\n\n for (const provider of enabledProviders) {\n onProgress?.({\n phase: 'reconciling',\n message: `Syncing to ${provider}...`,\n current: provider,\n });\n\n const symlinkOpts: import('../symlink/types.js').SymlinkOptions = {};\n if (options.copy !== undefined) symlinkOpts.copy = options.copy;\n if (options.dryRun !== undefined) symlinkOpts.dryRun = options.dryRun;\n if (options.force !== undefined) symlinkOpts.force = options.force;\n const result = this.symlink.syncProvider(provider, cognitives, symlinkOpts);\n\n results.push(result);\n }\n\n return results;\n }\n\n /**\n * Get enabled providers from config\n */\n private getEnabledProviders(filterProvider?: SupportedProvider): SupportedProvider[] {\n if (this.config === null) {\n // No config, return empty (no providers configured)\n return [];\n }\n\n const providers = this.config.sync?.providers ?? {};\n const enabled: SupportedProvider[] = [];\n\n for (const [name, config] of Object.entries(providers)) {\n const providerConfig = config;\n if (providerConfig.enabled === true) {\n // If filtering by provider, only include that one\n if (filterProvider !== undefined && filterProvider !== name) {\n continue;\n }\n enabled.push(name as SupportedProvider);\n }\n }\n\n return enabled;\n }\n\n /**\n * Update provider sync state in manifest\n */\n private updateProviderSyncState(\n results: ProviderSyncResult[],\n cognitives: ScannedCognitive[]\n ): void {\n for (const result of results) {\n this.manifest.setProviderSync(result.provider, {\n lastSync: new Date().toISOString(),\n method: result.method,\n cognitives: cognitives.map((c) => c.name),\n });\n }\n }\n\n /**\n * Get a preview of what sync would do without making changes\n */\n preview(options: SyncOptions = {}): SyncResult {\n return this.sync({ ...options, dryRun: true });\n }\n\n /**\n * Get current sync status (what's in manifest vs filesystem)\n */\n getStatus(): {\n manifest: number;\n filesystem: number;\n inSync: boolean;\n newInFilesystem: number;\n removedFromFilesystem: number;\n modified: number;\n } {\n const scanned = this.scanner.scan();\n const manifestCognitives = this.manifest.getCognitives();\n const comparison = this.scanner.compare(scanned, manifestCognitives);\n\n return {\n manifest: manifestCognitives.length,\n filesystem: scanned.length,\n inSync:\n comparison.new.length === 0 &&\n comparison.removed.length === 0 &&\n comparison.modified.length === 0,\n newInFilesystem: comparison.new.length,\n removedFromFilesystem: comparison.removed.length,\n modified: comparison.modified.length,\n };\n }\n\n /**\n * Get provider sync status\n */\n getProviderStatus(provider: SupportedProvider): {\n valid: number;\n broken: number;\n orphaned: number;\n } {\n const { valid, broken, orphaned } = this.symlink.verifyProvider(provider);\n return {\n valid: valid.length,\n broken: broken.length,\n orphaned: orphaned.length,\n };\n }\n\n /**\n * Apply a single sync action\n */\n private applyAction(action: SyncAction): void {\n switch (action.operation) {\n case 'add': {\n const scanned = action.cognitive as ScannedCognitive;\n const manifestCognitive = this.scanner.toManifestCognitive(scanned);\n this.manifest.addCognitive(manifestCognitive);\n break;\n }\n case 'update': {\n const scanned = action.cognitive as ScannedCognitive;\n const manifestCognitive = this.scanner.toManifestCognitive(scanned);\n this.manifest.updateCognitive(scanned.name, manifestCognitive);\n break;\n }\n case 'remove': {\n const name = action.cognitive as string;\n this.manifest.removeCognitive(name);\n break;\n }\n }\n }\n\n /**\n * Get the name of the cognitive in an action\n */\n private getActionName(action: SyncAction): string {\n if (typeof action.cognitive === 'string') {\n return action.cognitive;\n }\n return action.cognitive.name;\n }\n\n /**\n * Get the manifest manager (for external access)\n */\n getManifest(): ManifestManager {\n return this.manifest;\n }\n\n /**\n * Get the scanner (for external access)\n */\n getScanner(): CognitiveScanner {\n return this.scanner;\n }\n\n /**\n * Get the symlink manager (for external access)\n */\n getSymlinkManager(): SymlinkManager {\n return this.symlink;\n }\n}\n","/**\n * Cognitive Scanner\n *\n * Scans the .synapsync directory for cognitives\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as crypto from 'crypto';\nimport type { ScannedCognitive, ScanResult, ScanOptions } from './types.js';\nimport { parseFrontmatter, extractVersion, extractName } from './parser.js';\nimport {\n COGNITIVE_TYPES,\n COGNITIVE_FILE_NAMES,\n COGNITIVE_FILE_EXTENSIONS,\n} from '../../core/constants.js';\nimport type { CognitiveType, Category } from '../../core/constants.js';\nimport type { ManifestCognitive } from '../manifest/types.js';\n\nexport class CognitiveScanner {\n private synapSyncDir: string;\n\n constructor(synapSyncDir: string) {\n this.synapSyncDir = synapSyncDir;\n }\n\n /**\n * Scan the filesystem for cognitives\n */\n scan(options: ScanOptions = {}): ScannedCognitive[] {\n const cognitives: ScannedCognitive[] = [];\n const errors: Array<{ path: string; error: string }> = [];\n\n const typesToScan = options.types ?? COGNITIVE_TYPES;\n\n for (const type of typesToScan) {\n const typeDir = path.join(this.synapSyncDir, `${type}s`);\n\n if (!fs.existsSync(typeDir)) {\n continue;\n }\n\n // Scan categories\n const categories = this.listDirectories(typeDir);\n\n for (const category of categories) {\n // Skip if filtering by category and this isn't included\n if (\n options.categories !== undefined &&\n !options.categories.includes(category)\n ) {\n continue;\n }\n\n const categoryDir = path.join(typeDir, category);\n const cognitiveDirs = this.listDirectories(categoryDir);\n\n for (const cognitiveDir of cognitiveDirs) {\n try {\n const cognitive = this.scanCognitive(\n path.join(categoryDir, cognitiveDir),\n type,\n category\n );\n if (cognitive !== null) {\n cognitives.push(cognitive);\n }\n } catch (error) {\n errors.push({\n path: path.join(categoryDir, cognitiveDir),\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n }\n }\n }\n }\n\n return cognitives;\n }\n\n /**\n * Scan a single cognitive directory\n */\n private scanCognitive(\n cognitiveDir: string,\n type: CognitiveType,\n category: Category\n ): ScannedCognitive | null {\n // Find the cognitive file (check legacy name first, then any matching extension)\n const filePath = this.findCognitiveFile(cognitiveDir, type);\n\n if (filePath === null) {\n return null;\n }\n\n const content = fs.readFileSync(filePath, 'utf-8');\n const metadata = parseFrontmatter(content);\n const dirName = path.basename(cognitiveDir);\n const fileName = path.basename(filePath);\n\n const name = extractName(metadata, dirName, content);\n const version = extractVersion(metadata, content);\n const hash = this.computeHash(content);\n\n return {\n name,\n type,\n category: (metadata.category as Category) ?? category,\n path: cognitiveDir,\n filePath,\n fileName, // Add original filename\n hash,\n metadata: {\n ...metadata,\n name,\n version,\n },\n };\n }\n\n /**\n * Find the cognitive file in a directory\n * Checks for legacy fixed filename first, then any file with matching extension\n */\n private findCognitiveFile(cognitiveDir: string, type: CognitiveType): string | null {\n // First, check for legacy fixed filename (SKILL.md, AGENT.md, etc.)\n const legacyFileName = COGNITIVE_FILE_NAMES[type];\n const legacyPath = path.join(cognitiveDir, legacyFileName);\n if (fs.existsSync(legacyPath)) {\n return legacyPath;\n }\n\n // If not found, look for any file with the correct extension\n const extension = COGNITIVE_FILE_EXTENSIONS[type];\n if (!fs.existsSync(cognitiveDir)) {\n return null;\n }\n\n const files = fs.readdirSync(cognitiveDir);\n for (const file of files) {\n if (file.endsWith(extension) && !file.startsWith('.')) {\n const fullPath = path.join(cognitiveDir, file);\n const stat = fs.statSync(fullPath);\n if (stat.isFile()) {\n return fullPath;\n }\n }\n }\n\n return null;\n }\n\n /**\n * Compare scanned cognitives with manifest and return differences\n */\n compare(\n scanned: ScannedCognitive[],\n manifestCognitives: ManifestCognitive[]\n ): ScanResult {\n const result: ScanResult = {\n found: scanned,\n new: [],\n removed: [],\n modified: [],\n unchanged: 0,\n errors: [],\n };\n\n // Create map of manifest cognitives\n const manifestMap = new Map<string, ManifestCognitive>();\n for (const cognitive of manifestCognitives) {\n manifestMap.set(cognitive.name, cognitive);\n }\n\n // Create map of scanned cognitives\n const scannedMap = new Map<string, ScannedCognitive>();\n for (const cognitive of scanned) {\n scannedMap.set(cognitive.name, cognitive);\n }\n\n // Find new and modified cognitives\n for (const scannedCognitive of scanned) {\n const manifestCognitive = manifestMap.get(scannedCognitive.name);\n\n if (manifestCognitive === undefined) {\n // New cognitive (in filesystem but not in manifest)\n result.new.push(scannedCognitive);\n } else if (\n manifestCognitive.hash !== undefined &&\n manifestCognitive.hash !== scannedCognitive.hash\n ) {\n // Modified cognitive\n result.modified.push(scannedCognitive);\n } else {\n result.unchanged++;\n }\n }\n\n // Find removed cognitives (in manifest but not in filesystem)\n for (const manifestCognitive of manifestCognitives) {\n if (!scannedMap.has(manifestCognitive.name)) {\n result.removed.push(manifestCognitive.name);\n }\n }\n\n return result;\n }\n\n /**\n * Convert a scanned cognitive to a manifest cognitive\n */\n toManifestCognitive(scanned: ScannedCognitive): ManifestCognitive {\n return {\n name: scanned.name,\n type: scanned.type,\n category: scanned.category,\n version: scanned.metadata.version ?? '1.0.0',\n installedAt: new Date().toISOString(),\n source: 'local',\n hash: scanned.hash,\n };\n }\n\n /**\n * Compute content hash for change detection\n */\n private computeHash(content: string): string {\n return crypto.createHash('sha256').update(content).digest('hex').slice(0, 16);\n }\n\n /**\n * List directories in a path\n */\n private listDirectories(dirPath: string): string[] {\n if (!fs.existsSync(dirPath)) {\n return [];\n }\n\n return fs\n .readdirSync(dirPath, { withFileTypes: true })\n .filter((dirent) => dirent.isDirectory())\n .filter((dirent) => !dirent.name.startsWith('.'))\n .map((dirent) => dirent.name);\n }\n\n /**\n * Detect cognitive type from directory contents\n */\n detectType(cognitiveDir: string): CognitiveType | null {\n for (const type of COGNITIVE_TYPES) {\n const fileName = COGNITIVE_FILE_NAMES[type];\n const filePath = path.join(cognitiveDir, fileName);\n if (fs.existsSync(filePath)) {\n return type;\n }\n }\n return null;\n }\n\n /**\n * Get cognitive count by type\n */\n countByType(cognitives: ScannedCognitive[]): Record<CognitiveType, number> {\n const counts: Record<CognitiveType, number> = {\n skill: 0,\n agent: 0,\n prompt: 0,\n workflow: 0,\n tool: 0,\n };\n\n for (const cognitive of cognitives) {\n counts[cognitive.type]++;\n }\n\n return counts;\n }\n}\n","/**\n * Frontmatter Parser\n *\n * Parse YAML frontmatter from cognitive files\n */\n\nimport type { CognitiveMetadata } from './types.js';\n\n/**\n * Parse YAML frontmatter from a markdown file content\n */\nexport function parseFrontmatter(content: string): CognitiveMetadata {\n // Match YAML frontmatter between ---\n const match = content.match(/^---\\n([\\s\\S]*?)\\n---/);\n\n if (match?.[1] === undefined) {\n return {};\n }\n\n try {\n return parseYaml(match[1]);\n } catch {\n return {};\n }\n}\n\n/**\n * Simple YAML parser for frontmatter\n * Handles basic key: value, arrays, and nested objects\n */\nfunction parseYaml(yaml: string): CognitiveMetadata {\n const result: CognitiveMetadata = {};\n const lines = yaml.split('\\n');\n\n let currentKey: string | null = null;\n let currentArray: string[] | null = null;\n\n for (const line of lines) {\n // Skip empty lines and comments\n if (line.trim() === '' || line.trim().startsWith('#')) {\n continue;\n }\n\n // Check for array item\n if (line.match(/^\\s+-\\s+/)) {\n const value = line.replace(/^\\s+-\\s+/, '').trim();\n if (currentArray !== null) {\n currentArray.push(cleanValue(value));\n }\n continue;\n }\n\n // Check for key: value\n const colonIndex = line.indexOf(':');\n if (colonIndex > 0) {\n const key = line.slice(0, colonIndex).trim();\n const rawValue = line.slice(colonIndex + 1).trim();\n\n // Save previous array if exists\n if (currentKey !== null && currentArray !== null) {\n setNestedValue(result, currentKey, currentArray);\n currentArray = null;\n }\n\n currentKey = key;\n\n if (rawValue === '' || rawValue === '|' || rawValue === '>') {\n // Start of array or multiline\n currentArray = [];\n } else if (rawValue.startsWith('[') && rawValue.endsWith(']')) {\n // Inline array\n const arrayContent = rawValue.slice(1, -1);\n const items = arrayContent.split(',').map((item) => cleanValue(item.trim()));\n setNestedValue(result, key, items);\n currentKey = null;\n } else {\n // Simple value\n setNestedValue(result, key, cleanValue(rawValue));\n currentKey = null;\n }\n }\n }\n\n // Save final array if exists\n if (currentKey !== null && currentArray !== null) {\n setNestedValue(result, currentKey, currentArray);\n }\n\n return result;\n}\n\n/**\n * Clean a YAML value (remove quotes, handle booleans, etc.)\n */\nfunction cleanValue(value: string): string {\n // Remove surrounding quotes\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n return value.slice(1, -1);\n }\n return value;\n}\n\n/**\n * Set a value in the result object, supporting nested keys\n */\nfunction setNestedValue(obj: CognitiveMetadata, key: string, value: unknown): void {\n // For now, just set flat keys\n // Could be extended to support nested objects like author.name\n (obj as Record<string, unknown>)[key] = value;\n}\n\n/**\n * Extract version from frontmatter or content\n */\nexport function extractVersion(metadata: CognitiveMetadata, content: string): string {\n // Check frontmatter first\n if (metadata.version !== undefined) {\n return metadata.version;\n }\n\n // Try to find version in content\n const versionMatch = content.match(/version:\\s*['\"]?([0-9]+\\.[0-9]+\\.[0-9]+)['\"]?/i);\n if (versionMatch?.[1] !== undefined) {\n return versionMatch[1];\n }\n\n return '1.0.0';\n}\n\n/**\n * Extract name from frontmatter, directory, or content\n */\nexport function extractName(\n metadata: CognitiveMetadata,\n dirName: string,\n content: string\n): string {\n // Check frontmatter first\n if (metadata.name !== undefined) {\n return metadata.name;\n }\n\n // Try to find name in content (# Title)\n const titleMatch = content.match(/^#\\s+(.+)$/m);\n if (titleMatch?.[1] !== undefined) {\n // Convert title to kebab-case\n return titleMatch[1]\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-|-$/g, '');\n }\n\n // Fall back to directory name\n return dirName;\n}\n","/**\n * Manifest Manager\n *\n * Service for reading, writing, and managing the manifest.json file\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport type {\n SynapSyncManifest,\n ManifestCognitive,\n ProviderSyncState,\n ReconciliationResult,\n} from './types.js';\nimport { DEFAULT_MANIFEST } from './types.js';\nimport type { SupportedProvider } from '../../core/constants.js';\n\nexport class ManifestManager {\n private manifestPath: string;\n private manifest: SynapSyncManifest;\n\n constructor(synapSyncDir: string) {\n this.manifestPath = path.join(synapSyncDir, 'manifest.json');\n this.manifest = this.load();\n }\n\n /**\n * Load manifest from disk\n */\n private load(): SynapSyncManifest {\n if (!fs.existsSync(this.manifestPath)) {\n return { ...DEFAULT_MANIFEST };\n }\n\n try {\n const content = fs.readFileSync(this.manifestPath, 'utf-8');\n const parsed = JSON.parse(content) as SynapSyncManifest;\n\n // Ensure all required fields exist\n return {\n version: parsed.version ?? DEFAULT_MANIFEST.version,\n lastUpdated: parsed.lastUpdated ?? DEFAULT_MANIFEST.lastUpdated,\n cognitives: parsed.cognitives ?? {},\n syncs: parsed.syncs ?? {},\n };\n } catch {\n return { ...DEFAULT_MANIFEST };\n }\n }\n\n /**\n * Save manifest to disk\n */\n save(): void {\n this.manifest.lastUpdated = new Date().toISOString();\n const content = JSON.stringify(this.manifest, null, 2);\n fs.writeFileSync(this.manifestPath, content, 'utf-8');\n }\n\n /**\n * Get the current manifest\n */\n getManifest(): SynapSyncManifest {\n return this.manifest;\n }\n\n /**\n * Get all cognitives from manifest\n */\n getCognitives(): ManifestCognitive[] {\n return Object.values(this.manifest.cognitives);\n }\n\n /**\n * Get a specific cognitive by name\n */\n getCognitive(name: string): ManifestCognitive | undefined {\n return this.manifest.cognitives[name];\n }\n\n /**\n * Check if a cognitive exists in manifest\n */\n hasCognitive(name: string): boolean {\n return this.manifest.cognitives[name] !== undefined;\n }\n\n /**\n * Add a cognitive to manifest\n */\n addCognitive(cognitive: ManifestCognitive): void {\n this.manifest.cognitives[cognitive.name] = cognitive;\n }\n\n /**\n * Update a cognitive in manifest\n */\n updateCognitive(name: string, updates: Partial<ManifestCognitive>): void {\n const existing = this.manifest.cognitives[name];\n if (existing !== undefined) {\n this.manifest.cognitives[name] = { ...existing, ...updates };\n }\n }\n\n /**\n * Remove a cognitive from manifest\n */\n removeCognitive(name: string): boolean {\n if (this.manifest.cognitives[name] !== undefined) {\n delete this.manifest.cognitives[name];\n return true;\n }\n return false;\n }\n\n /**\n * Reconcile manifest with scanned cognitives\n * Returns what was added, removed, and updated\n */\n reconcile(scannedCognitives: ManifestCognitive[]): ReconciliationResult {\n const result: ReconciliationResult = {\n added: [],\n removed: [],\n updated: [],\n unchanged: 0,\n };\n\n // Create a map of scanned cognitives for quick lookup\n const scannedMap = new Map<string, ManifestCognitive>();\n for (const cognitive of scannedCognitives) {\n scannedMap.set(cognitive.name, cognitive);\n }\n\n // Find removed cognitives (in manifest but not in filesystem)\n for (const name of Object.keys(this.manifest.cognitives)) {\n if (!scannedMap.has(name)) {\n result.removed.push(name);\n }\n }\n\n // Find added and updated cognitives\n for (const scanned of scannedCognitives) {\n const existing = this.manifest.cognitives[scanned.name];\n\n if (existing === undefined) {\n // New cognitive\n result.added.push(scanned);\n } else if (scanned.hash !== undefined && existing.hash !== scanned.hash) {\n // Modified cognitive\n result.updated.push(scanned);\n } else {\n result.unchanged++;\n }\n }\n\n return result;\n }\n\n /**\n * Apply reconciliation result to manifest\n */\n applyReconciliation(result: ReconciliationResult): void {\n // Remove deleted cognitives\n for (const name of result.removed) {\n delete this.manifest.cognitives[name];\n }\n\n // Add new cognitives\n for (const cognitive of result.added) {\n this.manifest.cognitives[cognitive.name] = cognitive;\n }\n\n // Update modified cognitives\n for (const cognitive of result.updated) {\n const existing = this.manifest.cognitives[cognitive.name];\n if (existing !== undefined) {\n const updated: ManifestCognitive = {\n ...existing,\n ...cognitive,\n // Keep original installation info\n installedAt: existing.installedAt,\n source: existing.source,\n };\n if (existing.sourceUrl !== undefined) {\n updated.sourceUrl = existing.sourceUrl;\n }\n this.manifest.cognitives[cognitive.name] = updated;\n }\n }\n }\n\n /**\n * Get provider sync state\n */\n getProviderSync(provider: SupportedProvider): ProviderSyncState | undefined {\n return this.manifest.syncs[provider];\n }\n\n /**\n * Update provider sync state\n */\n setProviderSync(provider: SupportedProvider, state: ProviderSyncState): void {\n this.manifest.syncs[provider] = state;\n }\n\n /**\n * Get all synced cognitives for a provider\n */\n getSyncedCognitives(provider: SupportedProvider): string[] {\n return this.manifest.syncs[provider]?.cognitives ?? [];\n }\n\n /**\n * Get cognitive count\n */\n getCognitiveCount(): number {\n return Object.keys(this.manifest.cognitives).length;\n }\n\n /**\n * Get cognitives by type\n */\n getCognitivesByType(type: string): ManifestCognitive[] {\n return Object.values(this.manifest.cognitives).filter((c) => c.type === type);\n }\n\n /**\n * Get cognitives by source\n */\n getCognitivesBySource(source: 'registry' | 'local' | 'github'): ManifestCognitive[] {\n return Object.values(this.manifest.cognitives).filter((c) => c.source === source);\n }\n}\n","/**\n * Manifest Types\n *\n * Type definitions for the SynapSync manifest.json file\n */\n\nimport type { CognitiveType, Category, SupportedProvider } from '../../core/constants.js';\n\n/**\n * Installed cognitive entry in the manifest\n */\nexport interface ManifestCognitive {\n name: string;\n type: CognitiveType;\n category: Category;\n version: string;\n installedAt: string;\n source: 'registry' | 'local' | 'github';\n sourceUrl?: string;\n hash?: string;\n}\n\n/**\n * Provider sync state\n */\nexport interface ProviderSyncState {\n lastSync: string;\n method: 'symlink' | 'copy';\n cognitives: string[];\n}\n\n/**\n * The main manifest structure\n */\nexport interface SynapSyncManifest {\n version: string;\n lastUpdated: string;\n cognitives: Record<string, ManifestCognitive>;\n syncs: Partial<Record<SupportedProvider, ProviderSyncState>>;\n}\n\n/**\n * Default empty manifest\n */\nexport const DEFAULT_MANIFEST: SynapSyncManifest = {\n version: '1.0.0',\n lastUpdated: new Date().toISOString(),\n cognitives: {},\n syncs: {},\n};\n\n/**\n * Manifest reconciliation result\n */\nexport interface ReconciliationResult {\n added: ManifestCognitive[];\n removed: string[];\n updated: ManifestCognitive[];\n unchanged: number;\n}\n","/**\n * Symlink Manager\n *\n * Manages symlinks and copies between .synapsync and provider directories\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport type {\n SymlinkCreateResult,\n ProviderSyncResult,\n SymlinkInfo,\n SymlinkOptions,\n CognitiveSymlinkMapping,\n} from './types.js';\nimport type { SupportedProvider, CognitiveType } from '../../core/constants.js';\nimport { PROVIDER_PATHS, COGNITIVE_TYPES, COGNITIVE_SYNC_MODE } from '../../core/constants.js';\nimport type { ScannedCognitive } from '../scanner/types.js';\n\nexport class SymlinkManager {\n private projectRoot: string;\n private synapSyncDir: string;\n private supportsSymlinks: boolean | null = null;\n\n constructor(projectRoot: string, synapSyncDir: string) {\n this.projectRoot = projectRoot;\n this.synapSyncDir = synapSyncDir;\n }\n\n /**\n * Check if the system supports symlinks\n */\n checkSymlinkSupport(): boolean {\n if (this.supportsSymlinks !== null) {\n return this.supportsSymlinks;\n }\n\n // On Windows, symlinks require admin privileges or developer mode\n if (process.platform === 'win32') {\n try {\n const testSource = path.join(this.synapSyncDir, '.symlink-test');\n const testTarget = path.join(this.synapSyncDir, '.symlink-test-target');\n\n // Create a test file\n fs.writeFileSync(testTarget, 'test', 'utf-8');\n\n // Try to create a symlink\n fs.symlinkSync(testTarget, testSource);\n\n // Clean up\n fs.unlinkSync(testSource);\n fs.unlinkSync(testTarget);\n\n this.supportsSymlinks = true;\n } catch {\n this.supportsSymlinks = false;\n }\n } else {\n // Unix-like systems generally support symlinks\n this.supportsSymlinks = true;\n }\n\n return this.supportsSymlinks;\n }\n\n /**\n * Sync cognitives to a provider\n */\n syncProvider(\n provider: SupportedProvider,\n cognitives: ScannedCognitive[],\n options: SymlinkOptions = {}\n ): ProviderSyncResult {\n const result: ProviderSyncResult = {\n provider,\n created: [],\n skipped: [],\n removed: [],\n errors: [],\n method: this.getMethod(options),\n };\n\n const providerPaths = PROVIDER_PATHS[provider];\n if (providerPaths === undefined) {\n result.errors.push({\n path: provider,\n operation: 'create',\n message: `Unknown provider: ${provider}`,\n });\n return result;\n }\n\n // Get mappings for all cognitives\n const mappings = this.getMappings(provider, cognitives);\n\n // Get existing symlinks/copies in provider directories\n const existingLinks = this.getExistingLinks(provider);\n\n // Create set of expected links\n const expectedNames = new Set(mappings.map((m) => `${m.cognitiveType}/${m.cognitiveName}`));\n\n // Find orphaned links (exist but cognitive no longer present)\n for (const link of existingLinks) {\n const key = `${link.cognitiveType}/${link.cognitiveName}`;\n if (!expectedNames.has(key)) {\n if (options.dryRun !== true) {\n try {\n this.removeLink(link.path);\n result.removed.push(link.cognitiveName);\n } catch (error) {\n result.errors.push({\n path: link.path,\n operation: 'remove',\n message: error instanceof Error ? error.message : 'Unknown error',\n });\n }\n } else {\n result.removed.push(link.cognitiveName);\n }\n }\n }\n\n // Create map of existing links for quick lookup\n const existingMap = new Map<string, SymlinkInfo>();\n for (const link of existingLinks) {\n existingMap.set(`${link.cognitiveType}/${link.cognitiveName}`, link);\n }\n\n // Process each mapping\n for (const mapping of mappings) {\n const key = `${mapping.cognitiveType}/${mapping.cognitiveName}`;\n const existing = existingMap.get(key);\n\n if (existing !== undefined && existing.isValid && options.force !== true) {\n // Already exists and valid\n result.skipped.push(mapping.cognitiveName);\n continue;\n }\n\n // Create the link\n if (options.dryRun !== true) {\n const createResult = this.createLink(mapping, options);\n result.created.push(createResult);\n\n if (!createResult.success && createResult.error !== undefined) {\n result.errors.push({\n path: mapping.targetPath,\n operation: 'create',\n message: createResult.error,\n });\n }\n } else {\n // Dry run - just report what would happen\n result.created.push({\n success: true,\n source: mapping.sourcePath,\n target: mapping.targetPath,\n method: result.method,\n });\n }\n }\n\n return result;\n }\n\n /**\n * Get mappings for cognitives to provider paths\n * Skills sync as folders (contain SKILL.md + assets/)\n * Other cognitives sync as flat files\n */\n private getMappings(\n provider: SupportedProvider,\n cognitives: ScannedCognitive[]\n ): CognitiveSymlinkMapping[] {\n const providerPaths = PROVIDER_PATHS[provider];\n const mappings: CognitiveSymlinkMapping[] = [];\n\n for (const cognitive of cognitives) {\n const typeDir = providerPaths[cognitive.type];\n if (typeDir === undefined) continue;\n\n const syncMode = COGNITIVE_SYNC_MODE[cognitive.type];\n\n if (syncMode === 'folder') {\n // Folder sync: symlink the entire cognitive directory\n // e.g., .claude/skills/skill-name/ -> .synapsync/skills/general/skill-name/\n mappings.push({\n cognitiveName: cognitive.name,\n cognitiveType: cognitive.type,\n sourcePath: cognitive.path, // Directory path\n targetPath: path.join(this.projectRoot, typeDir, cognitive.name),\n isFile: false,\n });\n } else {\n // File sync: symlink the cognitive file directly\n // e.g., .claude/agents/agent-name.md -> .synapsync/agents/general/agent-name/agent-name.md\n const fileName = cognitive.fileName ?? `${cognitive.name}.md`;\n mappings.push({\n cognitiveName: cognitive.name,\n cognitiveType: cognitive.type,\n sourcePath: cognitive.filePath, // File path\n targetPath: path.join(this.projectRoot, typeDir, fileName),\n isFile: true,\n });\n }\n }\n\n return mappings;\n }\n\n /**\n * Get existing links in provider directories\n * Scans for both files and directories (for backward compatibility)\n */\n getExistingLinks(provider: SupportedProvider): SymlinkInfo[] {\n const providerPaths = PROVIDER_PATHS[provider];\n const links: SymlinkInfo[] = [];\n\n for (const cognitiveType of COGNITIVE_TYPES) {\n const typeDir = providerPaths[cognitiveType];\n if (typeDir === undefined) continue;\n\n const fullPath = path.join(this.projectRoot, typeDir);\n if (!fs.existsSync(fullPath)) continue;\n\n const entries = fs.readdirSync(fullPath, { withFileTypes: true });\n\n for (const entry of entries) {\n if (entry.name.startsWith('.')) continue;\n\n const entryPath = path.join(fullPath, entry.name);\n\n // Include files (new flat structure) and directories/symlinks (legacy)\n if (entry.isFile() || entry.isDirectory() || entry.isSymbolicLink()) {\n const info = this.getLinkInfo(entryPath, cognitiveType);\n if (info !== null) {\n links.push(info);\n }\n }\n }\n }\n\n return links;\n }\n\n /**\n * Get information about a link\n */\n private getLinkInfo(linkPath: string, cognitiveType: CognitiveType): SymlinkInfo | null {\n try {\n const stats = fs.lstatSync(linkPath);\n const isSymlink = stats.isSymbolicLink();\n const baseName = path.basename(linkPath);\n\n // For symlinks, check what type it points to\n let isDirectory = stats.isDirectory();\n if (isSymlink) {\n try {\n const realStats = fs.statSync(linkPath);\n isDirectory = realStats.isDirectory();\n } catch {\n // Target doesn't exist, assume based on extension\n isDirectory = !baseName.match(/\\.(md|yaml)$/i);\n }\n }\n\n // Only strip extension for files, not directories\n // Folders: \"skill-name\" stays \"skill-name\"\n // Files: \"agent-name.md\" becomes \"agent-name\"\n const cognitiveName = isDirectory ? baseName : baseName.replace(/\\.(md|yaml)$/i, '');\n\n let target = '';\n let isValid = false;\n\n if (isSymlink) {\n target = fs.readlinkSync(linkPath);\n // Resolve relative to the link's directory\n const resolvedTarget = path.resolve(path.dirname(linkPath), target);\n isValid = fs.existsSync(resolvedTarget);\n } else if (stats.isDirectory()) {\n // It's a directory copy (legacy)\n target = linkPath;\n isValid = true;\n } else if (stats.isFile()) {\n // It's a file copy\n target = linkPath;\n isValid = true;\n }\n\n return {\n path: linkPath,\n target,\n exists: true,\n isSymlink,\n isValid,\n cognitiveName,\n cognitiveType,\n };\n } catch {\n return null;\n }\n }\n\n /**\n * Create a symlink or copy\n */\n private createLink(mapping: CognitiveSymlinkMapping, options: SymlinkOptions): SymlinkCreateResult {\n const method = this.getMethod(options);\n const isFile = mapping.isFile ?? false;\n\n try {\n // Ensure parent directory exists\n const targetDir = path.dirname(mapping.targetPath);\n if (!fs.existsSync(targetDir)) {\n fs.mkdirSync(targetDir, { recursive: true });\n }\n\n // Remove existing if force\n if (fs.existsSync(mapping.targetPath)) {\n if (options.force === true) {\n this.removeLink(mapping.targetPath);\n } else {\n return {\n success: false,\n source: mapping.sourcePath,\n target: mapping.targetPath,\n method,\n error: 'Target already exists',\n };\n }\n }\n\n if (method === 'symlink') {\n // Calculate relative path for symlink\n const relativePath = path.relative(targetDir, mapping.sourcePath);\n // Use 'file' type for file symlinks, 'dir' for directory symlinks\n fs.symlinkSync(relativePath, mapping.targetPath, isFile ? 'file' : 'dir');\n } else {\n // Copy file or directory\n if (isFile) {\n fs.copyFileSync(mapping.sourcePath, mapping.targetPath);\n } else {\n this.copyDirectory(mapping.sourcePath, mapping.targetPath);\n }\n }\n\n return {\n success: true,\n source: mapping.sourcePath,\n target: mapping.targetPath,\n method,\n };\n } catch (error) {\n // If symlink fails, try copy as fallback\n if (method === 'symlink' && options.copy !== true) {\n try {\n if (isFile) {\n fs.copyFileSync(mapping.sourcePath, mapping.targetPath);\n } else {\n this.copyDirectory(mapping.sourcePath, mapping.targetPath);\n }\n return {\n success: true,\n source: mapping.sourcePath,\n target: mapping.targetPath,\n method: 'copy',\n };\n } catch (copyError) {\n return {\n success: false,\n source: mapping.sourcePath,\n target: mapping.targetPath,\n method: 'copy',\n error: copyError instanceof Error ? copyError.message : 'Copy failed',\n };\n }\n }\n\n return {\n success: false,\n source: mapping.sourcePath,\n target: mapping.targetPath,\n method,\n error: error instanceof Error ? error.message : 'Unknown error',\n };\n }\n }\n\n /**\n * Remove a symlink, file, or directory\n */\n private removeLink(linkPath: string): void {\n const stats = fs.lstatSync(linkPath);\n\n if (stats.isSymbolicLink() || stats.isFile()) {\n fs.unlinkSync(linkPath);\n } else if (stats.isDirectory()) {\n fs.rmSync(linkPath, { recursive: true });\n }\n }\n\n /**\n * Copy a directory recursively\n */\n private copyDirectory(source: string, target: string): void {\n fs.mkdirSync(target, { recursive: true });\n\n const entries = fs.readdirSync(source, { withFileTypes: true });\n\n for (const entry of entries) {\n const sourcePath = path.join(source, entry.name);\n const targetPath = path.join(target, entry.name);\n\n if (entry.isDirectory()) {\n this.copyDirectory(sourcePath, targetPath);\n } else {\n fs.copyFileSync(sourcePath, targetPath);\n }\n }\n }\n\n /**\n * Get the sync method to use\n */\n private getMethod(options: SymlinkOptions): 'symlink' | 'copy' {\n if (options.copy === true) {\n return 'copy';\n }\n\n if (!this.checkSymlinkSupport()) {\n return 'copy';\n }\n\n return 'symlink';\n }\n\n /**\n * Verify all symlinks for a provider are valid\n */\n verifyProvider(provider: SupportedProvider): {\n valid: SymlinkInfo[];\n broken: SymlinkInfo[];\n orphaned: SymlinkInfo[];\n } {\n const existingLinks = this.getExistingLinks(provider);\n const valid: SymlinkInfo[] = [];\n const broken: SymlinkInfo[] = [];\n const orphaned: SymlinkInfo[] = [];\n\n for (const link of existingLinks) {\n if (!link.isValid) {\n broken.push(link);\n } else {\n // Check if the target is within .synapsync\n if (link.isSymlink) {\n const resolvedTarget = path.resolve(path.dirname(link.path), link.target);\n if (!resolvedTarget.includes(path.basename(this.synapSyncDir))) {\n orphaned.push(link);\n } else {\n valid.push(link);\n }\n } else {\n valid.push(link);\n }\n }\n }\n\n return { valid, broken, orphaned };\n }\n\n /**\n * Clean up orphaned and broken symlinks\n */\n cleanProvider(provider: SupportedProvider, dryRun = false): string[] {\n const { broken, orphaned } = this.verifyProvider(provider);\n const removed: string[] = [];\n\n for (const link of [...broken, ...orphaned]) {\n if (!dryRun) {\n try {\n this.removeLink(link.path);\n removed.push(link.cognitiveName);\n } catch {\n // Ignore errors during cleanup\n }\n } else {\n removed.push(link.cognitiveName);\n }\n }\n\n return removed;\n }\n}\n","/**\n * List Command\n *\n * List installed cognitives or browse registry\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport type { Command } from 'commander';\nimport pc from 'picocolors';\nimport { ConfigManager } from '../services/config/manager.js';\nimport { RegistryClient } from '../services/registry/client.js';\nimport { COGNITIVE_TYPES, CATEGORIES } from '../core/constants.js';\nimport type { CognitiveType, Category } from '../core/constants.js';\nimport type { InstalledCognitive, RegistryCognitiveEntry } from '../types/index.js';\nimport { logger } from '../utils/logger.js';\n\n// ============================================\n// Types\n// ============================================\n\ninterface ListCommandOptions {\n type?: string;\n category?: string;\n json?: boolean;\n remote?: boolean;\n}\n\ninterface ProjectManifest {\n version: string;\n lastUpdated: string;\n cognitives: Record<string, InstalledCognitive>;\n syncs: Record<string, unknown>;\n}\n\n// ============================================\n// Main Function\n// ============================================\n\n/**\n * Execute the list command\n */\nexport async function executeListCommand(options: ListCommandOptions): Promise<void> {\n logger.line();\n\n // Remote mode: list all cognitives from registry\n if (options.remote === true) {\n await listRemoteCognitives(options);\n return;\n }\n\n // Check if project is initialized\n const configManager = ConfigManager.findConfig();\n if (configManager === null) {\n logger.error('No SynapSync project found.');\n logger.hint('Run synapsync init to initialize a project first.');\n return;\n }\n\n // Validate options\n const validatedOptions = validateOptions(options);\n if (validatedOptions === null) {\n return;\n }\n\n // Read manifest\n const manifest = readManifest(configManager);\n\n if (options.json === true) {\n // JSON output\n const cognitives = Object.values(manifest.cognitives);\n const filtered = filterCognitives(cognitives, validatedOptions);\n console.log(JSON.stringify(filtered, null, 2));\n return;\n }\n\n // Display results\n displayCognitives(manifest, validatedOptions);\n}\n\n// ============================================\n// Remote Registry Listing\n// ============================================\n\nasync function listRemoteCognitives(options: ListCommandOptions): Promise<void> {\n const client = new RegistryClient();\n\n logger.log(` ${pc.dim('Fetching registry...')}`);\n\n try {\n const cognitives = await client.list();\n\n // Validate and filter\n const validatedOptions = validateOptions(options);\n if (validatedOptions === null) {\n return;\n }\n\n const filtered = filterRemoteCognitives(cognitives, validatedOptions);\n\n if (options.json === true) {\n console.log(JSON.stringify(filtered, null, 2));\n return;\n }\n\n // Display results\n displayRemoteCognitives(filtered);\n } catch (error) {\n logger.error(`Failed to fetch registry: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n}\n\nfunction filterRemoteCognitives(\n cognitives: RegistryCognitiveEntry[],\n options: ValidatedOptions\n): RegistryCognitiveEntry[] {\n return cognitives.filter((c) => {\n if (options.type !== undefined && c.type !== options.type) {\n return false;\n }\n if (options.category !== undefined && c.category !== options.category) {\n return false;\n }\n return true;\n });\n}\n\nfunction displayRemoteCognitives(cognitives: RegistryCognitiveEntry[]): void {\n logger.line();\n logger.bold(' Available Cognitives (Registry)');\n logger.line();\n\n if (cognitives.length === 0) {\n logger.log(` ${pc.dim('No cognitives found in registry.')}`);\n return;\n }\n\n // Group by type\n const grouped: Record<string, RegistryCognitiveEntry[]> = {};\n for (const cognitive of cognitives) {\n grouped[cognitive.type] ??= [];\n (grouped[cognitive.type] as RegistryCognitiveEntry[]).push(cognitive);\n }\n\n for (const [type, items] of Object.entries(grouped)) {\n const typeIcon = getCognitiveIcon(type as CognitiveType);\n const typeLabel = `${type}s`;\n logger.log(` ${typeIcon} ${pc.bold(typeLabel.charAt(0).toUpperCase() + typeLabel.slice(1))} (${items.length})`);\n logger.line();\n\n for (const cognitive of items) {\n // Name and version\n logger.log(` ${pc.white(cognitive.name)} ${pc.dim(`v${cognitive.version}`)}`);\n\n // Description (truncated)\n if (cognitive.description) {\n const desc = cognitive.description.length > 60\n ? cognitive.description.slice(0, 57) + '...'\n : cognitive.description;\n logger.log(` ${pc.dim(desc)}`);\n }\n\n // Details\n const details: string[] = [];\n details.push(pc.dim(cognitive.category));\n if (cognitive.author) {\n details.push(pc.dim(`by ${cognitive.author}`));\n }\n logger.log(` ${details.join(' · ')}`);\n\n // Tags\n if (cognitive.tags !== undefined && cognitive.tags.length > 0) {\n const tagsStr = cognitive.tags.slice(0, 5).join(' ');\n logger.log(` ${pc.cyan(tagsStr)}`);\n }\n\n logger.line();\n }\n }\n\n // Summary\n logger.log(` ${pc.dim(`Total: ${cognitives.length} cognitive${cognitives.length === 1 ? '' : 's'} available`)}`);\n logger.line();\n logger.hint('Run synapsync add <name> to add a cognitive.');\n}\n\n// ============================================\n// Validation\n// ============================================\n\ninterface ValidatedOptions {\n type?: CognitiveType;\n category?: Category;\n}\n\nfunction validateOptions(options: ListCommandOptions): ValidatedOptions | null {\n const validated: ValidatedOptions = {};\n\n // Validate type\n if (options.type !== undefined) {\n if (!COGNITIVE_TYPES.includes(options.type as CognitiveType)) {\n logger.error(`Invalid type: ${options.type}`);\n logger.hint(`Valid types: ${COGNITIVE_TYPES.join(', ')}`);\n return null;\n }\n validated.type = options.type as CognitiveType;\n }\n\n // Validate category\n if (options.category !== undefined) {\n if (!(CATEGORIES as readonly string[]).includes(options.category)) {\n logger.error(`Invalid category: ${options.category}`);\n logger.hint(`Valid categories: ${CATEGORIES.join(', ')}`);\n return null;\n }\n validated.category = options.category as Category;\n }\n\n return validated;\n}\n\n// ============================================\n// Manifest Reading\n// ============================================\n\nfunction readManifest(configManager: ConfigManager): ProjectManifest {\n const synapSyncDir = configManager.getSynapSyncDir();\n const manifestPath = path.join(synapSyncDir, 'manifest.json');\n\n if (!fs.existsSync(manifestPath)) {\n return {\n version: '1.0.0',\n lastUpdated: new Date().toISOString(),\n cognitives: {},\n syncs: {},\n };\n }\n\n try {\n const content = fs.readFileSync(manifestPath, 'utf-8');\n return JSON.parse(content) as ProjectManifest;\n } catch {\n return {\n version: '1.0.0',\n lastUpdated: new Date().toISOString(),\n cognitives: {},\n syncs: {},\n };\n }\n}\n\nfunction filterCognitives(\n cognitives: InstalledCognitive[],\n options: ValidatedOptions\n): InstalledCognitive[] {\n return cognitives.filter((c) => {\n if (options.type !== undefined && c.type !== options.type) {\n return false;\n }\n if (options.category !== undefined && c.category !== options.category) {\n return false;\n }\n return true;\n });\n}\n\n// ============================================\n// Display Functions\n// ============================================\n\nfunction displayCognitives(manifest: ProjectManifest, options: ValidatedOptions): void {\n const cognitives = Object.values(manifest.cognitives);\n const filtered = filterCognitives(cognitives, options);\n\n // Header\n logger.bold(' Installed Cognitives');\n logger.line();\n\n if (filtered.length === 0) {\n if (cognitives.length === 0) {\n logger.log(` ${pc.dim('No cognitives installed yet.')}`);\n logger.line();\n logger.hint('Run synapsync search to find cognitives to add.');\n } else {\n logger.log(` ${pc.dim('No cognitives match the specified filters.')}`);\n logger.line();\n logger.hint('Try removing filters to see all installed cognitives.');\n }\n return;\n }\n\n // Group by type\n const grouped = groupByType(filtered);\n\n for (const [type, items] of Object.entries(grouped)) {\n const typeIcon = getCognitiveIcon(type as CognitiveType);\n const typeLabel = `${type}s`;\n logger.log(` ${typeIcon} ${pc.bold(typeLabel.charAt(0).toUpperCase() + typeLabel.slice(1))} (${items.length})`);\n logger.line();\n\n for (const cognitive of items) {\n displayCognitive(cognitive);\n }\n }\n\n // Summary\n logger.line();\n logger.log(` ${pc.dim(`Total: ${filtered.length} cognitive${filtered.length === 1 ? '' : 's'}`)}`);\n logger.line();\n logger.hint('Run synapsync uninstall <name> to remove a cognitive.');\n}\n\nfunction groupByType(cognitives: InstalledCognitive[]): Record<string, InstalledCognitive[]> {\n const grouped: Record<string, InstalledCognitive[]> = {};\n\n for (const cognitive of cognitives) {\n grouped[cognitive.type] ??= [];\n (grouped[cognitive.type] as InstalledCognitive[]).push(cognitive);\n }\n\n return grouped;\n}\n\nfunction displayCognitive(cognitive: InstalledCognitive): void {\n // Name and version\n logger.log(` ${pc.white(cognitive.name)} ${pc.dim(`v${cognitive.version}`)}`);\n\n // Details\n const details: string[] = [];\n details.push(pc.dim(cognitive.category));\n details.push(pc.dim(`from ${cognitive.source}`));\n\n if (cognitive.installedAt !== undefined) {\n const date = new Date(cognitive.installedAt);\n details.push(pc.dim(`installed ${formatDate(date)}`));\n }\n\n logger.log(` ${details.join(' · ')}`);\n logger.line();\n}\n\nfunction getCognitiveIcon(type: CognitiveType): string {\n const icons: Record<CognitiveType, string> = {\n skill: pc.blue('◆'),\n agent: pc.magenta('◆'),\n prompt: pc.yellow('◆'),\n workflow: pc.cyan('◆'),\n tool: pc.green('◆'),\n };\n return icons[type];\n}\n\nfunction formatDate(date: Date): string {\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24));\n\n if (diffDays === 0) {\n return 'today';\n } else if (diffDays === 1) {\n return 'yesterday';\n } else if (diffDays < 7) {\n return `${diffDays} days ago`;\n } else if (diffDays < 30) {\n const weeks = Math.floor(diffDays / 7);\n return `${weeks} week${weeks === 1 ? '' : 's'} ago`;\n } else {\n return date.toLocaleDateString();\n }\n}\n\n// ============================================\n// Command Registration\n// ============================================\n\n/**\n * Register list command with Commander\n */\nexport function registerListCommand(program: Command): void {\n program\n .command('list')\n .alias('ls')\n .description('List installed cognitives or browse registry')\n .option('-t, --type <type>', 'Filter by type (skill, agent, prompt, workflow, tool)')\n .option('-c, --category <category>', 'Filter by category')\n .option('-r, --remote', 'List all cognitives available in the registry')\n .option('--json', 'Output as JSON')\n .action(async (options: ListCommandOptions) => {\n await executeListCommand(options);\n });\n}\n","/**\n * Uninstall Command\n *\n * Remove installed cognitives from the project\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport type { Command } from 'commander';\nimport pc from 'picocolors';\nimport { ConfigManager } from '../services/config/manager.js';\nimport type { InstalledCognitive } from '../types/index.js';\nimport { logger } from '../utils/logger.js';\n\n// ============================================\n// Types\n// ============================================\n\ninterface UninstallCommandOptions {\n force?: boolean;\n keepFiles?: boolean;\n}\n\ninterface ProjectManifest {\n version: string;\n lastUpdated: string;\n cognitives: Record<string, InstalledCognitive>;\n syncs: Record<string, unknown>;\n}\n\n// ============================================\n// Main Function\n// ============================================\n\n/**\n * Execute the uninstall command\n */\nexport function executeUninstallCommand(\n name: string,\n options: UninstallCommandOptions\n): void {\n logger.line();\n\n // Check if project is initialized\n const configManager = ConfigManager.findConfig();\n if (configManager === null) {\n logger.error('No SynapSync project found.');\n logger.hint('Run synapsync init to initialize a project first.');\n return;\n }\n\n // Read manifest\n const manifest = readManifest(configManager);\n const cognitive = manifest.cognitives[name];\n\n if (cognitive === undefined) {\n logger.error(`Cognitive '${name}' is not installed.`);\n logger.hint('Run synapsync list to see installed cognitives.');\n return;\n }\n\n // Confirm uninstall (unless --force)\n if (options.force !== true) {\n logger.log(` ${pc.yellow('!')} About to uninstall ${pc.bold(name)}`);\n logger.log(` ${pc.dim('Type:')} ${cognitive.type}`);\n logger.log(` ${pc.dim('Category:')} ${cognitive.category}`);\n logger.log(` ${pc.dim('Version:')} ${cognitive.version}`);\n logger.line();\n logger.hint('Use --force to skip confirmation and uninstall directly.');\n logger.log(` ${pc.dim('To confirm, run:')} synapsync uninstall ${name} --force`);\n return;\n }\n\n try {\n // Remove files (unless --keep-files)\n if (options.keepFiles !== true) {\n const cognitiveDir = getCognitiveDir(configManager, cognitive);\n if (fs.existsSync(cognitiveDir)) {\n fs.rmSync(cognitiveDir, { recursive: true, force: true });\n logger.log(` ${pc.dim('Removed files from')} ${path.relative(process.cwd(), cognitiveDir)}`);\n }\n }\n\n // Update manifest\n delete manifest.cognitives[name];\n manifest.lastUpdated = new Date().toISOString();\n saveManifest(configManager, manifest);\n\n // Success\n logger.line();\n logger.log(` ${pc.green('✓')} Uninstalled ${pc.bold(name)}`);\n logger.line();\n\n // Check for provider symlinks that might need cleanup\n logger.hint('Note: Provider symlinks may need manual cleanup if sync was run.');\n } catch (error) {\n logger.line();\n if (error instanceof Error) {\n logger.error(`Uninstall failed: ${error.message}`);\n } else {\n logger.error('Uninstall failed with unknown error');\n }\n }\n}\n\n// ============================================\n// Manifest Operations\n// ============================================\n\nfunction readManifest(configManager: ConfigManager): ProjectManifest {\n const synapSyncDir = configManager.getSynapSyncDir();\n const manifestPath = path.join(synapSyncDir, 'manifest.json');\n\n if (!fs.existsSync(manifestPath)) {\n return {\n version: '1.0.0',\n lastUpdated: new Date().toISOString(),\n cognitives: {},\n syncs: {},\n };\n }\n\n try {\n const content = fs.readFileSync(manifestPath, 'utf-8');\n return JSON.parse(content) as ProjectManifest;\n } catch {\n return {\n version: '1.0.0',\n lastUpdated: new Date().toISOString(),\n cognitives: {},\n syncs: {},\n };\n }\n}\n\nfunction saveManifest(configManager: ConfigManager, manifest: ProjectManifest): void {\n const synapSyncDir = configManager.getSynapSyncDir();\n const manifestPath = path.join(synapSyncDir, 'manifest.json');\n fs.writeFileSync(manifestPath, JSON.stringify(manifest, null, 2), 'utf-8');\n}\n\nfunction getCognitiveDir(configManager: ConfigManager, cognitive: InstalledCognitive): string {\n const synapSyncDir = configManager.getSynapSyncDir();\n return path.join(synapSyncDir, `${cognitive.type}s`, cognitive.category, cognitive.name);\n}\n\n// ============================================\n// Command Registration\n// ============================================\n\n/**\n * Register uninstall command with Commander\n */\nexport function registerUninstallCommand(program: Command): void {\n program\n .command('uninstall <name>')\n .alias('rm')\n .description('Uninstall a cognitive')\n .option('-f, --force', 'Skip confirmation')\n .option('--keep-files', 'Remove from manifest but keep files')\n .action((name: string, options: UninstallCommandOptions) => {\n executeUninstallCommand(name, options);\n });\n}\n","/**\n * Sync Command\n *\n * Synchronize the filesystem with the manifest.json and providers\n * Phase 1: Detects locally-created cognitives and updates manifest\n * Phase 2: Creates symlinks in provider directories\n */\n\nimport type { Command } from 'commander';\nimport pc from 'picocolors';\nimport { ConfigManager } from '../services/config/manager.js';\nimport { SyncEngine } from '../services/sync/engine.js';\nimport type { SyncResult, SyncAction, SyncOptions } from '../services/sync/types.js';\nimport type { ProviderSyncResult } from '../services/symlink/types.js';\nimport { COGNITIVE_TYPES, CATEGORIES, SUPPORTED_PROVIDERS } from '../core/constants.js';\nimport type { CognitiveType, Category, SupportedProvider } from '../core/constants.js';\nimport { logger } from '../utils/logger.js';\n\n// ============================================\n// Types\n// ============================================\n\ninterface SyncCommandOptions {\n dryRun?: boolean;\n type?: string;\n category?: string;\n provider?: string;\n copy?: boolean;\n force?: boolean;\n json?: boolean;\n verbose?: boolean;\n}\n\n// ============================================\n// Main Function\n// ============================================\n\n/**\n * Execute the sync command\n */\nexport function executeSyncCommand(options: SyncCommandOptions): void {\n logger.line();\n\n // Check if project is initialized\n const configManager = ConfigManager.findConfig();\n if (configManager === null) {\n logger.error('No SynapSync project found.');\n logger.hint('Run synapsync init to initialize a project first.');\n return;\n }\n\n // Validate options\n const validatedOptions = validateOptions(options);\n if (validatedOptions === null) {\n return;\n }\n\n // Create sync engine with config\n const synapSyncDir = configManager.getSynapSyncDir();\n const projectRoot = configManager.getProjectRoot();\n const config = configManager.getConfig();\n const syncEngine = new SyncEngine(synapSyncDir, projectRoot, config);\n\n // Show header\n if (options.json !== true) {\n if (options.dryRun === true) {\n logger.bold(' Sync Preview (Dry Run)');\n } else {\n logger.bold(' Syncing Cognitives');\n }\n logger.line();\n }\n\n // Perform sync\n const syncOpts: SyncOptions = {};\n if (options.dryRun !== undefined) syncOpts.dryRun = options.dryRun;\n if (validatedOptions.types !== undefined) syncOpts.types = validatedOptions.types;\n if (validatedOptions.categories !== undefined) syncOpts.categories = validatedOptions.categories;\n if (validatedOptions.provider !== undefined) syncOpts.provider = validatedOptions.provider;\n if (options.copy !== undefined) syncOpts.copy = options.copy;\n if (options.force !== undefined) syncOpts.force = options.force;\n if (options.verbose !== undefined) syncOpts.verbose = options.verbose;\n const result = syncEngine.sync(\n syncOpts,\n options.json !== true\n ? (status) => {\n if (options.verbose === true) {\n logger.log(` ${pc.dim(status.message)}`);\n }\n }\n : undefined\n );\n\n // Output results\n if (options.json === true) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n displayResults(result, options);\n}\n\n// ============================================\n// Validation\n// ============================================\n\ninterface ValidatedSyncOptions {\n types?: CognitiveType[];\n categories?: Category[];\n provider?: SupportedProvider;\n}\n\nfunction validateOptions(options: SyncCommandOptions): ValidatedSyncOptions | null {\n const validated: ValidatedSyncOptions = {};\n\n // Validate type\n if (options.type !== undefined) {\n if (!COGNITIVE_TYPES.includes(options.type as CognitiveType)) {\n logger.error(`Invalid type: ${options.type}`);\n logger.hint(`Valid types: ${COGNITIVE_TYPES.join(', ')}`);\n return null;\n }\n validated.types = [options.type as CognitiveType];\n }\n\n // Validate category\n if (options.category !== undefined) {\n if (!(CATEGORIES as readonly string[]).includes(options.category)) {\n logger.error(`Invalid category: ${options.category}`);\n logger.hint(`Valid categories: ${CATEGORIES.join(', ')}`);\n return null;\n }\n validated.categories = [options.category as Category];\n }\n\n // Validate provider\n if (options.provider !== undefined) {\n if (!SUPPORTED_PROVIDERS.includes(options.provider as SupportedProvider)) {\n logger.error(`Invalid provider: ${options.provider}`);\n logger.hint(`Valid providers: ${SUPPORTED_PROVIDERS.join(', ')}`);\n return null;\n }\n validated.provider = options.provider as SupportedProvider;\n }\n\n return validated;\n}\n\n// ============================================\n// Display Functions\n// ============================================\n\nfunction displayResults(result: SyncResult, options: SyncCommandOptions): void {\n const hasManifestChanges = result.added > 0 || result.removed > 0 || result.updated > 0;\n const hasProviderResults = result.providerResults !== undefined && result.providerResults.length > 0;\n\n // Check if there are any provider changes\n const hasProviderChanges = hasProviderResults && result.providerResults?.some(\n (pr) => pr.created.length > 0 || pr.removed.length > 0\n );\n\n if (!hasManifestChanges && hasProviderChanges !== true) {\n logger.log(` ${pc.green('✓')} Everything is in sync`);\n logger.line();\n logger.log(` ${pc.dim(`${result.total} cognitives in manifest`)}`);\n if (hasProviderResults && result.providerResults !== undefined) {\n const syncedProviders = result.providerResults.filter((pr) => pr.skipped.length > 0 || pr.created.length > 0);\n if (syncedProviders.length > 0) {\n logger.log(` ${pc.dim(`${syncedProviders.length} provider(s) synced`)}`);\n }\n }\n logger.line();\n return;\n }\n\n // Display manifest actions\n if (result.actions.length > 0 && (options.verbose === true || options.dryRun === true)) {\n logger.bold(' Manifest Changes:');\n logger.line();\n displayActions(result.actions, options.dryRun === true);\n logger.line();\n }\n\n // Display manifest summary\n if (hasManifestChanges) {\n if (options.dryRun === true) {\n logger.bold(' Manifest changes to apply:');\n } else {\n logger.bold(' Manifest sync:');\n }\n logger.line();\n\n if (result.added > 0) {\n logger.log(` ${pc.green('+')} ${result.added} added`);\n }\n if (result.updated > 0) {\n logger.log(` ${pc.yellow('~')} ${result.updated} updated`);\n }\n if (result.removed > 0) {\n logger.log(` ${pc.red('-')} ${result.removed} removed`);\n }\n if (result.unchanged > 0) {\n logger.log(` ${pc.dim('○')} ${result.unchanged} unchanged`);\n }\n logger.line();\n }\n\n // Display provider results\n if (hasProviderResults) {\n logger.bold(' Provider sync:');\n logger.line();\n\n for (const providerResult of result.providerResults ?? []) {\n displayProviderResult(providerResult, options);\n }\n }\n\n // Summary\n logger.log(` ${pc.dim(`Total: ${result.total} cognitives | Duration: ${result.duration}ms`)}`);\n logger.line();\n\n // Errors\n if (result.errors.length > 0) {\n logger.line();\n logger.bold(` ${pc.red('Errors:')}`);\n logger.line();\n for (const error of result.errors) {\n logger.log(` ${pc.red('✗')} ${error.cognitive ?? 'Unknown'}: ${error.message}`);\n }\n logger.line();\n }\n\n // Hints\n if (options.dryRun === true) {\n logger.hint('Run synapsync sync without --dry-run to apply changes.');\n } else {\n logger.hint('Run synapsync list to see all installed cognitives.');\n }\n}\n\nfunction displayActions(actions: SyncAction[], isDryRun: boolean): void {\n const verb = isDryRun ? 'Would' : 'Did';\n\n for (const action of actions) {\n const name = typeof action.cognitive === 'string' ? action.cognitive : action.cognitive.name;\n\n switch (action.operation) {\n case 'add':\n logger.log(` ${pc.green('+')} ${verb} add: ${pc.white(name)}`);\n break;\n case 'update':\n logger.log(` ${pc.yellow('~')} ${verb} update: ${pc.white(name)}`);\n break;\n case 'remove':\n logger.log(` ${pc.red('-')} ${verb} remove: ${pc.white(name)}`);\n break;\n }\n }\n}\n\nfunction displayProviderResult(result: ProviderSyncResult, options: SyncCommandOptions): void {\n const created = result.created.filter((c) => c.success).length;\n const skipped = result.skipped.length;\n const removed = result.removed.length;\n const errors = result.errors.length;\n\n const methodLabel = result.method === 'symlink' ? 'symlinks' : 'copies';\n const hasChanges = created > 0 || removed > 0;\n\n logger.log(` ${pc.cyan(result.provider)}:`);\n\n if (hasChanges || options.verbose === true) {\n if (created > 0) {\n logger.log(` ${pc.green('✓')} ${created} ${methodLabel} created`);\n }\n if (skipped > 0) {\n logger.log(` ${pc.dim('○')} ${skipped} already synced`);\n }\n if (removed > 0) {\n logger.log(` ${pc.red('-')} ${removed} orphaned removed`);\n }\n if (errors > 0) {\n logger.log(` ${pc.red('✗')} ${errors} errors`);\n }\n } else {\n logger.log(` ${pc.green('✓')} ${skipped + created} ${methodLabel} synced`);\n }\n\n logger.line();\n}\n\n// ============================================\n// Status Subcommand\n// ============================================\n\n/**\n * Execute the sync status subcommand\n */\nexport function executeSyncStatusCommand(options: { json?: boolean }): void {\n logger.line();\n\n // Check if project is initialized\n const configManager = ConfigManager.findConfig();\n if (configManager === null) {\n logger.error('No SynapSync project found.');\n logger.hint('Run synapsync init to initialize a project first.');\n return;\n }\n\n // Create sync engine with config\n const synapSyncDir = configManager.getSynapSyncDir();\n const projectRoot = configManager.getProjectRoot();\n const config = configManager.getConfig();\n const syncEngine = new SyncEngine(synapSyncDir, projectRoot, config);\n\n // Get status\n const status = syncEngine.getStatus();\n\n // Get provider status\n const providers = config.sync?.providers ?? {};\n const enabledProviders = Object.entries(providers)\n .filter(([, cfg]) => (cfg as { enabled?: boolean }).enabled === true)\n .map(([name]) => name as SupportedProvider);\n\n const providerStatuses: Record<string, { valid: number; broken: number; orphaned: number }> = {};\n for (const provider of enabledProviders) {\n providerStatuses[provider] = syncEngine.getProviderStatus(provider);\n }\n\n if (options.json === true) {\n console.log(JSON.stringify({ ...status, providers: providerStatuses }, null, 2));\n return;\n }\n\n // Display status\n logger.bold(' Sync Status');\n logger.line();\n\n if (status.inSync) {\n logger.log(` ${pc.green('✓')} Filesystem and manifest are in sync`);\n } else {\n logger.log(` ${pc.yellow('!')} Out of sync`);\n }\n\n logger.line();\n logger.log(` ${pc.dim('Manifest:')} ${status.manifest} cognitives`);\n logger.log(` ${pc.dim('Filesystem:')} ${status.filesystem} cognitives`);\n\n if (!status.inSync) {\n logger.line();\n\n if (status.newInFilesystem > 0) {\n logger.log(` ${pc.green('+')} ${status.newInFilesystem} new in filesystem`);\n }\n if (status.removedFromFilesystem > 0) {\n logger.log(` ${pc.red('-')} ${status.removedFromFilesystem} removed from filesystem`);\n }\n if (status.modified > 0) {\n logger.log(` ${pc.yellow('~')} ${status.modified} modified`);\n }\n }\n\n // Provider status\n if (enabledProviders.length > 0) {\n logger.line();\n logger.bold(' Provider Status:');\n logger.line();\n\n for (const provider of enabledProviders) {\n const pStatus = providerStatuses[provider];\n if (pStatus === undefined) continue;\n\n const total = pStatus.valid + pStatus.broken + pStatus.orphaned;\n const hasIssues = pStatus.broken > 0 || pStatus.orphaned > 0;\n\n logger.log(` ${pc.cyan(provider)}:`);\n if (hasIssues) {\n logger.log(` ${pc.green('✓')} ${pStatus.valid} valid`);\n if (pStatus.broken > 0) {\n logger.log(` ${pc.red('✗')} ${pStatus.broken} broken`);\n }\n if (pStatus.orphaned > 0) {\n logger.log(` ${pc.yellow('?')} ${pStatus.orphaned} orphaned`);\n }\n } else if (total > 0) {\n logger.log(` ${pc.green('✓')} ${total} symlinks valid`);\n } else {\n logger.log(` ${pc.dim('○')} No symlinks yet`);\n }\n }\n }\n\n logger.line();\n\n if (!status.inSync || Object.values(providerStatuses).some((s) => s.broken > 0 || s.orphaned > 0)) {\n logger.hint('Run synapsync sync to synchronize.');\n }\n}\n\n// ============================================\n// Command Registration\n// ============================================\n\n/**\n * Register sync command with Commander\n */\nexport function registerSyncCommand(program: Command): void {\n const syncCommand = program\n .command('sync')\n .description('Synchronize cognitives with manifest and providers')\n .option('-n, --dry-run', 'Preview changes without applying them')\n .option('-t, --type <type>', 'Sync only specific type (skill, agent, prompt, workflow, tool)')\n .option('-c, --category <category>', 'Sync only specific category')\n .option('-p, --provider <provider>', 'Sync only to specific provider (claude, cursor, etc.)')\n .option('--copy', 'Use file copy instead of symlinks')\n .option('-f, --force', 'Force sync even if already synced')\n .option('-v, --verbose', 'Show detailed output')\n .option('--json', 'Output as JSON')\n .action((options: SyncCommandOptions) => {\n executeSyncCommand(options);\n });\n\n // Status subcommand\n syncCommand\n .command('status')\n .description('Show sync status between filesystem, manifest, and providers')\n .option('--json', 'Output as JSON')\n .action((options: { json?: boolean }) => {\n executeSyncStatusCommand(options);\n });\n}\n","/**\n * Update Command\n *\n * Update installed cognitives to their latest versions\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport type { Command } from 'commander';\nimport pc from 'picocolors';\nimport { ConfigManager } from '../services/config/manager.js';\nimport { ManifestManager } from '../services/manifest/manager.js';\nimport { UpdateChecker } from '../services/maintenance/update-checker.js';\nimport { RegistryClient } from '../services/registry/client.js';\nimport { SyncEngine } from '../services/sync/engine.js';\nimport type { UpdateCheckResult } from '../services/maintenance/types.js';\nimport { COGNITIVE_FILE_NAMES } from '../core/constants.js';\nimport { logger } from '../utils/logger.js';\n\n// ============================================\n// Types\n// ============================================\n\ninterface UpdateCommandOptions {\n all?: boolean;\n force?: boolean;\n dryRun?: boolean;\n json?: boolean;\n}\n\n// ============================================\n// Main Function\n// ============================================\n\n/**\n * Execute the update command\n */\nexport async function executeUpdateCommand(\n cognitiveName?: string,\n options: UpdateCommandOptions = {}\n): Promise<void> {\n logger.line();\n\n // Check if project is initialized\n const configManager = ConfigManager.findConfig();\n if (configManager === null) {\n logger.error('No SynapSync project found.');\n logger.hint('Run synapsync init to initialize a project first.');\n return;\n }\n\n const synapSyncDir = configManager.getSynapSyncDir();\n const projectRoot = configManager.getProjectRoot();\n const manifest = new ManifestManager(synapSyncDir);\n const registry = new RegistryClient();\n const checker = new UpdateChecker(registry);\n\n // Header\n if (options.json !== true) {\n if (options.dryRun === true) {\n logger.bold(' Update Preview (Dry Run)');\n } else {\n logger.bold(' Checking for Updates');\n }\n logger.line();\n }\n\n // Get installed cognitives\n const installed = manifest.getCognitives();\n\n if (installed.length === 0) {\n if (options.json === true) {\n console.log(JSON.stringify({ message: 'No cognitives installed' }));\n } else {\n logger.log(` ${pc.dim('No cognitives installed.')}`);\n logger.hint('Run synapsync add <name> to add a cognitive.');\n }\n return;\n }\n\n // Check for updates\n let checkResult: UpdateCheckResult;\n\n if (cognitiveName !== undefined && options.all !== true) {\n // Check specific cognitive\n const cognitive = installed.find((c) => c.name === cognitiveName);\n if (cognitive === undefined) {\n logger.error(`Cognitive '${cognitiveName}' is not installed.`);\n logger.hint('Run synapsync list to see installed cognitives.');\n return;\n }\n\n if (cognitive.source !== 'registry') {\n logger.error(`Cognitive '${cognitiveName}' was installed locally and cannot be updated from registry.`);\n return;\n }\n\n const updateInfo = await checker.checkOne(cognitive);\n checkResult = {\n checked: 1,\n updatesAvailable: updateInfo.hasUpdate ? [updateInfo] : [],\n upToDate: updateInfo.hasUpdate ? [] : [updateInfo],\n errors: [],\n checkTime: new Date().toISOString(),\n };\n } else {\n // Check all\n checkResult = await checker.checkAll(installed);\n }\n\n // JSON output\n if (options.json === true) {\n console.log(JSON.stringify(checkResult, null, 2));\n return;\n }\n\n // Display check results\n displayCheckResults(checkResult);\n\n // If no updates available, we're done\n if (checkResult.updatesAvailable.length === 0) {\n logger.line();\n logger.log(` ${pc.green('✓')} All cognitives are up to date`);\n logger.line();\n return;\n }\n\n // If dry run, don't actually update\n if (options.dryRun === true) {\n logger.line();\n logger.hint('Run synapsync update without --dry-run to apply updates.');\n return;\n }\n\n // Perform updates\n logger.line();\n logger.bold(' Updating...');\n logger.line();\n\n const updated: string[] = [];\n const failed: Array<{ name: string; error: string }> = [];\n\n for (const update of checkResult.updatesAvailable) {\n try {\n logger.log(` ${pc.cyan('↓')} Updating ${update.name}...`);\n\n // Download new version from registry\n const downloaded = await registry.download(update.name);\n\n // Get target directory from manifest\n const manifestEntry = installed.find((c) => c.name === update.name);\n if (manifestEntry === undefined) continue;\n\n const targetDir = path.join(\n synapSyncDir,\n `${update.type}s`,\n update.category,\n update.name\n );\n\n // Save the new version\n const fileName = COGNITIVE_FILE_NAMES[update.type];\n const filePath = path.join(targetDir, fileName);\n\n // Ensure directory exists\n if (!fs.existsSync(targetDir)) {\n fs.mkdirSync(targetDir, { recursive: true });\n }\n\n // Write the updated content\n fs.writeFileSync(filePath, downloaded.content, 'utf-8');\n\n // Update manifest entry\n manifest.updateCognitive(update.name, {\n version: update.latestVersion,\n });\n\n updated.push(update.name);\n logger.log(` ${pc.green('✓')} Updated to v${update.latestVersion}`);\n } catch (error) {\n failed.push({\n name: update.name,\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n logger.log(` ${pc.red('✗')} Failed: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n }\n\n // Save manifest\n manifest.save();\n\n // Re-sync providers\n logger.line();\n logger.log(` ${pc.dim('Syncing providers...')}`);\n const config = configManager.getConfig();\n const syncEngine = new SyncEngine(synapSyncDir, projectRoot, config);\n syncEngine.sync();\n\n // Summary\n logger.line();\n if (updated.length > 0) {\n logger.log(` ${pc.green('✓')} Updated ${updated.length} cognitive(s)`);\n }\n if (failed.length > 0) {\n logger.log(` ${pc.red('✗')} Failed to update ${failed.length} cognitive(s)`);\n }\n logger.line();\n}\n\n// ============================================\n// Check for Outdated (list --outdated)\n// ============================================\n\n/**\n * Check and display outdated cognitives\n */\nexport async function executeCheckOutdatedCommand(options: { json?: boolean }): Promise<void> {\n logger.line();\n\n // Check if project is initialized\n const configManager = ConfigManager.findConfig();\n if (configManager === null) {\n logger.error('No SynapSync project found.');\n logger.hint('Run synapsync init to initialize a project first.');\n return;\n }\n\n const synapSyncDir = configManager.getSynapSyncDir();\n const manifest = new ManifestManager(synapSyncDir);\n const checker = new UpdateChecker();\n\n // Header\n if (options.json !== true) {\n logger.bold(' Checking for Updates');\n logger.line();\n }\n\n // Get installed cognitives\n const installed = manifest.getCognitives();\n\n if (installed.length === 0) {\n if (options.json === true) {\n console.log(JSON.stringify({ message: 'No cognitives installed' }));\n } else {\n logger.log(` ${pc.dim('No cognitives installed.')}`);\n }\n return;\n }\n\n // Check for updates\n const checkResult = await checker.checkAll(installed);\n\n // JSON output\n if (options.json === true) {\n console.log(JSON.stringify(checkResult, null, 2));\n return;\n }\n\n // Display results\n displayCheckResults(checkResult);\n\n logger.line();\n if (checkResult.updatesAvailable.length > 0) {\n logger.hint('Run synapsync update --all to update all cognitives.');\n } else {\n logger.log(` ${pc.green('✓')} All cognitives are up to date`);\n }\n logger.line();\n}\n\n// ============================================\n// Display Functions\n// ============================================\n\nfunction displayCheckResults(result: UpdateCheckResult): void {\n if (result.updatesAvailable.length > 0) {\n logger.bold(' Updates available:');\n logger.line();\n\n for (const update of result.updatesAvailable) {\n logger.log(\n ` ${pc.yellow('↑')} ${pc.white(update.name)} ` +\n `${pc.dim(update.currentVersion)} → ${pc.green(update.latestVersion)}`\n );\n }\n }\n\n if (result.upToDate.length > 0 && result.updatesAvailable.length > 0) {\n logger.line();\n logger.log(` ${pc.dim(`${result.upToDate.length} cognitive(s) up to date`)}`);\n }\n\n if (result.errors.length > 0) {\n logger.line();\n logger.log(` ${pc.red('Errors:')}`);\n for (const error of result.errors) {\n logger.log(` ${pc.red('✗')} ${error.cognitive}: ${error.message}`);\n }\n }\n}\n\n// ============================================\n// Command Registration\n// ============================================\n\n/**\n * Register update command with Commander\n */\nexport function registerUpdateCommand(program: Command): void {\n program\n .command('update [cognitive]')\n .description('Update installed cognitives to latest versions')\n .option('-a, --all', 'Update all cognitives')\n .option('-f, --force', 'Force update even if already latest')\n .option('-n, --dry-run', 'Preview updates without applying them')\n .option('--json', 'Output as JSON')\n .action(async (cognitive: string | undefined, options: UpdateCommandOptions) => {\n await executeUpdateCommand(cognitive, options);\n });\n}\n","/**\n * Update Checker Service\n *\n * Checks for available updates to installed cognitives\n */\n\nimport type { UpdateInfo, UpdateCheckResult } from './types.js';\nimport type { ManifestCognitive } from '../manifest/types.js';\nimport { RegistryClient } from '../registry/client.js';\n\nexport class UpdateChecker {\n private registry: RegistryClient;\n\n constructor(registry?: RegistryClient) {\n this.registry = registry ?? new RegistryClient();\n }\n\n /**\n * Check all installed cognitives for updates\n */\n async checkAll(installed: ManifestCognitive[]): Promise<UpdateCheckResult> {\n const result: UpdateCheckResult = {\n checked: 0,\n updatesAvailable: [],\n upToDate: [],\n errors: [],\n checkTime: new Date().toISOString(),\n };\n\n // Only check registry-sourced cognitives\n const registryCognitives = installed.filter((c) => c.source === 'registry');\n\n for (const cognitive of registryCognitives) {\n try {\n const updateInfo = await this.checkOne(cognitive);\n result.checked++;\n\n if (updateInfo.hasUpdate) {\n result.updatesAvailable.push(updateInfo);\n } else {\n result.upToDate.push(updateInfo);\n }\n } catch (error) {\n result.errors.push({\n cognitive: cognitive.name,\n message: error instanceof Error ? error.message : 'Unknown error',\n });\n }\n }\n\n return result;\n }\n\n /**\n * Check a single cognitive for updates\n */\n async checkOne(cognitive: ManifestCognitive): Promise<UpdateInfo> {\n const entry = await this.registry.findByName(cognitive.name);\n\n if (entry === null) {\n // Cognitive not in registry anymore\n return {\n name: cognitive.name,\n type: cognitive.type,\n category: cognitive.category,\n currentVersion: cognitive.version,\n latestVersion: cognitive.version,\n hasUpdate: false,\n source: cognitive.source,\n };\n }\n\n const hasUpdate = this.compareVersions(cognitive.version, entry.version) < 0;\n\n return {\n name: cognitive.name,\n type: cognitive.type,\n category: cognitive.category,\n currentVersion: cognitive.version,\n latestVersion: entry.version,\n hasUpdate,\n source: cognitive.source,\n };\n }\n\n /**\n * Compare two semver versions\n * Returns: -1 if a < b, 0 if a == b, 1 if a > b\n */\n private compareVersions(a: string, b: string): number {\n const parseVersion = (v: string): number[] => {\n return v\n .replace(/^v/, '')\n .split('.')\n .map((n) => {\n const num = parseInt(n, 10);\n return Number.isNaN(num) ? 0 : num;\n });\n };\n\n const aParts = parseVersion(a);\n const bParts = parseVersion(b);\n\n const maxLen = Math.max(aParts.length, bParts.length);\n for (let i = 0; i < maxLen; i++) {\n const aNum = aParts[i] ?? 0;\n const bNum = bParts[i] ?? 0;\n\n if (aNum < bNum) return -1;\n if (aNum > bNum) return 1;\n }\n\n return 0;\n }\n\n /**\n * Get the registry client\n */\n getRegistry(): RegistryClient {\n return this.registry;\n }\n}\n","/**\n * Doctor Command\n *\n * Diagnose and fix issues with SynapSync projects\n */\n\nimport type { Command } from 'commander';\nimport pc from 'picocolors';\nimport { ConfigManager } from '../services/config/manager.js';\nimport { DoctorService } from '../services/maintenance/doctor.js';\nimport type { DiagnosticCheck, DiagnosticResult, FixResult } from '../services/maintenance/types.js';\nimport { logger } from '../utils/logger.js';\n\n// ============================================\n// Types\n// ============================================\n\ninterface DoctorCommandOptions {\n fix?: boolean;\n check?: string[];\n verbose?: boolean;\n json?: boolean;\n}\n\n// ============================================\n// Main Function\n// ============================================\n\n/**\n * Execute the doctor command\n */\nexport async function executeDoctorCommand(options: DoctorCommandOptions = {}): Promise<void> {\n logger.line();\n\n // Check if project is initialized\n const configManager = ConfigManager.findConfig();\n if (configManager === null) {\n logger.error('No SynapSync project found.');\n logger.hint('Run synapsync init to initialize a project first.');\n return;\n }\n\n const synapSyncDir = configManager.getSynapSyncDir();\n const projectRoot = configManager.getProjectRoot();\n\n let config;\n try {\n config = configManager.getConfig();\n } catch {\n config = undefined;\n }\n\n const doctor = new DoctorService(projectRoot, synapSyncDir, config);\n\n // Header\n if (options.json !== true) {\n if (options.fix === true) {\n logger.bold(' Running Diagnostics & Fixes');\n } else {\n logger.bold(' Running Diagnostics');\n }\n logger.line();\n }\n\n // Run diagnostics\n const result = await doctor.diagnose({\n ...(options.check !== undefined && { checks: options.check }),\n ...(options.verbose !== undefined && { verbose: options.verbose }),\n });\n\n // If fix mode, apply fixes\n let fixResult: FixResult | undefined;\n if (options.fix === true && result.failed > 0) {\n fixResult = await doctor.fix({\n ...(options.check !== undefined && { checks: options.check }),\n ...(options.verbose !== undefined && { verbose: options.verbose }),\n });\n }\n\n // JSON output\n if (options.json === true) {\n console.log(\n JSON.stringify(\n {\n diagnostics: result,\n fixes: fixResult,\n },\n null,\n 2\n )\n );\n return;\n }\n\n // Display results\n displayDiagnostics(result, options.verbose);\n\n if (fixResult !== undefined) {\n logger.line();\n displayFixes(fixResult);\n }\n\n // Summary\n logger.line();\n if (result.healthy) {\n logger.log(` ${pc.green('✓')} Your project is healthy!`);\n } else if (result.failed > 0) {\n logger.log(` ${pc.red('!')} ${result.failed} issue(s) found`);\n if (options.fix !== true) {\n logger.hint('Run synapsync doctor --fix to auto-repair fixable issues.');\n }\n } else if (result.warnings > 0) {\n logger.log(` ${pc.yellow('!')} ${result.warnings} warning(s)`);\n }\n\n logger.line();\n logger.log(` ${pc.dim(`Checked ${result.checks.length} items in ${result.duration}ms`)}`);\n logger.line();\n}\n\n// ============================================\n// Display Functions\n// ============================================\n\nfunction displayDiagnostics(result: DiagnosticResult, verbose = false): void {\n for (const check of result.checks) {\n displayCheck(check, verbose);\n }\n}\n\nfunction displayCheck(check: DiagnosticCheck, verbose = false): void {\n const statusIcon = getStatusIcon(check.status);\n const statusColor = getStatusColor(check.status);\n\n logger.log(` ${statusIcon} ${statusColor(check.name)}`);\n\n if (verbose || check.status === 'fail' || check.status === 'warn') {\n logger.log(` ${pc.dim(check.message)}`);\n\n if (check.details !== undefined && check.details.length > 0) {\n for (const detail of check.details) {\n logger.log(` ${pc.dim('•')} ${pc.dim(detail)}`);\n }\n }\n }\n}\n\nfunction displayFixes(result: FixResult): void {\n logger.bold(' Fixes Applied:');\n logger.line();\n\n if (result.fixed.length > 0) {\n for (const fix of result.fixed) {\n logger.log(` ${pc.green('✓')} Fixed: ${fix}`);\n }\n }\n\n if (result.failed.length > 0) {\n for (const fail of result.failed) {\n logger.log(` ${pc.red('✗')} Failed: ${fail.check} - ${fail.error}`);\n }\n }\n\n if (result.fixed.length === 0 && result.failed.length === 0) {\n logger.log(` ${pc.dim('No fixes needed')}`);\n }\n}\n\nfunction getStatusIcon(status: DiagnosticCheck['status']): string {\n switch (status) {\n case 'pass':\n return pc.green('✓');\n case 'warn':\n return pc.yellow('!');\n case 'fail':\n return pc.red('✗');\n case 'skip':\n return pc.dim('○');\n }\n}\n\nfunction getStatusColor(status: DiagnosticCheck['status']): (text: string) => string {\n switch (status) {\n case 'pass':\n return pc.green;\n case 'warn':\n return pc.yellow;\n case 'fail':\n return pc.red;\n case 'skip':\n return pc.dim;\n }\n}\n\n// ============================================\n// Command Registration\n// ============================================\n\n/**\n * Register doctor command with Commander\n */\nexport function registerDoctorCommand(program: Command): void {\n program\n .command('doctor')\n .description('Diagnose and fix issues with your SynapSync project')\n .option('-f, --fix', 'Auto-fix detected issues')\n .option('-c, --check <checks...>', 'Run specific checks only')\n .option('-v, --verbose', 'Show detailed output')\n .option('--json', 'Output as JSON')\n .action(async (options: DoctorCommandOptions) => {\n await executeDoctorCommand(options);\n });\n}\n","/**\n * Doctor Service\n *\n * Diagnoses and fixes common issues with SynapSync projects\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport type {\n DiagnosticCheck,\n DiagnosticResult,\n FixResult,\n DoctorOptions,\n} from './types.js';\nimport type { ProjectConfig } from '../config/schema.js';\nimport { ManifestManager } from '../manifest/manager.js';\nimport { CognitiveScanner } from '../scanner/scanner.js';\nimport { SymlinkManager } from '../symlink/manager.js';\nimport { RegistryClient } from '../registry/client.js';\nimport { COGNITIVE_TYPES } from '../../core/constants.js';\nimport type { SupportedProvider } from '../../core/constants.js';\n\nexport class DoctorService {\n private projectRoot: string;\n private synapSyncDir: string;\n private config: ProjectConfig | null;\n\n constructor(projectRoot: string, synapSyncDir: string, config?: ProjectConfig) {\n this.projectRoot = projectRoot;\n this.synapSyncDir = synapSyncDir;\n this.config = config ?? null;\n }\n\n /**\n * Run all diagnostic checks\n */\n async diagnose(options: DoctorOptions = {}): Promise<DiagnosticResult> {\n const startTime = Date.now();\n const checks: DiagnosticCheck[] = [];\n\n // Run all checks\n checks.push(this.checkNodeVersion());\n checks.push(this.checkSynapSyncDir());\n checks.push(this.checkConfig());\n checks.push(this.checkManifest());\n checks.push(this.checkManifestConsistency());\n checks.push(...this.checkProviders());\n checks.push(...this.checkSymlinks());\n checks.push(await this.checkRegistryConnectivity());\n\n // Filter by requested checks\n let filteredChecks = checks;\n if (options.checks !== undefined && options.checks.length > 0) {\n const requestedChecks = options.checks;\n filteredChecks = checks.filter((c) => requestedChecks.includes(c.id));\n }\n\n const result: DiagnosticResult = {\n checks: filteredChecks,\n passed: filteredChecks.filter((c) => c.status === 'pass').length,\n warnings: filteredChecks.filter((c) => c.status === 'warn').length,\n failed: filteredChecks.filter((c) => c.status === 'fail').length,\n skipped: filteredChecks.filter((c) => c.status === 'skip').length,\n healthy: filteredChecks.every((c) => c.status === 'pass' || c.status === 'skip'),\n duration: Date.now() - startTime,\n };\n\n return result;\n }\n\n /**\n * Fix detected issues\n */\n async fix(options: DoctorOptions = {}): Promise<FixResult> {\n const startTime = Date.now();\n const result: FixResult = {\n success: true,\n fixed: [],\n failed: [],\n duration: 0,\n };\n\n // Run diagnose first to find issues\n const diagnosis = await this.diagnose(options);\n\n // Fix each fixable failed check\n for (const check of diagnosis.checks) {\n if (check.status === 'fail' && check.fixable) {\n try {\n this.fixCheck(check);\n result.fixed.push(check.id);\n } catch (error) {\n result.failed.push({\n check: check.id,\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n result.success = false;\n }\n }\n }\n\n result.duration = Date.now() - startTime;\n return result;\n }\n\n // ============================================\n // Individual Checks\n // ============================================\n\n private checkNodeVersion(): DiagnosticCheck {\n const nodeVersion = process.version;\n const majorVersion = parseInt(nodeVersion.slice(1).split('.')[0] ?? '0', 10);\n\n if (majorVersion >= 20) {\n return {\n id: 'node-version',\n name: 'Node.js Version',\n description: 'Check if Node.js version is 20 or higher',\n status: 'pass',\n message: `Node.js ${nodeVersion} is installed`,\n fixable: false,\n };\n }\n\n return {\n id: 'node-version',\n name: 'Node.js Version',\n description: 'Check if Node.js version is 20 or higher',\n status: 'fail',\n message: `Node.js ${nodeVersion} is too old. Please upgrade to v20 or higher.`,\n fixable: false,\n };\n }\n\n private checkSynapSyncDir(): DiagnosticCheck {\n if (fs.existsSync(this.synapSyncDir)) {\n return {\n id: 'synapsync-dir',\n name: '.synapsync Directory',\n description: 'Check if .synapsync directory exists',\n status: 'pass',\n message: '.synapsync directory exists',\n fixable: true,\n };\n }\n\n return {\n id: 'synapsync-dir',\n name: '.synapsync Directory',\n description: 'Check if .synapsync directory exists',\n status: 'fail',\n message: '.synapsync directory not found',\n fixable: true,\n };\n }\n\n private checkConfig(): DiagnosticCheck {\n const configPath = path.join(this.projectRoot, 'synapsync.config.yaml');\n\n if (fs.existsSync(configPath)) {\n if (this.config !== null) {\n return {\n id: 'config-valid',\n name: 'Configuration',\n description: 'Check if synapsync.config.yaml is valid',\n status: 'pass',\n message: 'Configuration is valid',\n fixable: false,\n };\n }\n\n return {\n id: 'config-valid',\n name: 'Configuration',\n description: 'Check if synapsync.config.yaml is valid',\n status: 'fail',\n message: 'Configuration file exists but is invalid',\n fixable: false,\n };\n }\n\n return {\n id: 'config-valid',\n name: 'Configuration',\n description: 'Check if synapsync.config.yaml is valid',\n status: 'fail',\n message: 'Configuration file not found',\n fixable: false,\n };\n }\n\n private checkManifest(): DiagnosticCheck {\n const manifestPath = path.join(this.synapSyncDir, 'manifest.json');\n\n if (!fs.existsSync(manifestPath)) {\n return {\n id: 'manifest-exists',\n name: 'Manifest File',\n description: 'Check if manifest.json exists',\n status: 'warn',\n message: 'manifest.json not found (will be created on first sync)',\n fixable: true,\n };\n }\n\n try {\n const content = fs.readFileSync(manifestPath, 'utf-8');\n JSON.parse(content);\n\n return {\n id: 'manifest-exists',\n name: 'Manifest File',\n description: 'Check if manifest.json exists and is valid',\n status: 'pass',\n message: 'manifest.json is valid',\n fixable: true,\n };\n } catch {\n return {\n id: 'manifest-exists',\n name: 'Manifest File',\n description: 'Check if manifest.json exists and is valid',\n status: 'fail',\n message: 'manifest.json is corrupted',\n fixable: true,\n };\n }\n }\n\n private checkManifestConsistency(): DiagnosticCheck {\n if (!fs.existsSync(this.synapSyncDir)) {\n return {\n id: 'manifest-consistency',\n name: 'Manifest Consistency',\n description: 'Check if manifest matches filesystem',\n status: 'skip',\n message: 'Skipped - .synapsync directory not found',\n fixable: true,\n };\n }\n\n try {\n const scanner = new CognitiveScanner(this.synapSyncDir);\n const manifest = new ManifestManager(this.synapSyncDir);\n\n const scanned = scanner.scan();\n const comparison = scanner.compare(scanned, manifest.getCognitives());\n\n const issues: string[] = [];\n\n if (comparison.new.length > 0) {\n issues.push(`${comparison.new.length} new cognitive(s) not in manifest`);\n }\n if (comparison.removed.length > 0) {\n issues.push(`${comparison.removed.length} cognitive(s) in manifest but not in filesystem`);\n }\n if (comparison.modified.length > 0) {\n issues.push(`${comparison.modified.length} modified cognitive(s)`);\n }\n\n if (issues.length === 0) {\n return {\n id: 'manifest-consistency',\n name: 'Manifest Consistency',\n description: 'Check if manifest matches filesystem',\n status: 'pass',\n message: 'Manifest is consistent with filesystem',\n fixable: true,\n };\n }\n\n return {\n id: 'manifest-consistency',\n name: 'Manifest Consistency',\n description: 'Check if manifest matches filesystem',\n status: 'warn',\n message: 'Manifest is out of sync',\n fixable: true,\n details: issues,\n };\n } catch (error) {\n return {\n id: 'manifest-consistency',\n name: 'Manifest Consistency',\n description: 'Check if manifest matches filesystem',\n status: 'fail',\n message: error instanceof Error ? error.message : 'Unknown error',\n fixable: true,\n };\n }\n }\n\n private checkProviders(): DiagnosticCheck[] {\n const checks: DiagnosticCheck[] = [];\n\n if (this.config === null) {\n return [\n {\n id: 'providers-configured',\n name: 'Providers',\n description: 'Check if providers are configured',\n status: 'skip',\n message: 'Skipped - no configuration',\n fixable: false,\n },\n ];\n }\n\n const providers = this.config.sync?.providers ?? {};\n const enabledProviders = Object.entries(providers)\n .filter(([, cfg]) => (cfg as { enabled?: boolean }).enabled === true)\n .map(([name]) => name as SupportedProvider);\n\n if (enabledProviders.length === 0) {\n return [\n {\n id: 'providers-configured',\n name: 'Providers',\n description: 'Check if any providers are enabled',\n status: 'warn',\n message: 'No providers are enabled',\n fixable: false,\n },\n ];\n }\n\n checks.push({\n id: 'providers-configured',\n name: 'Providers',\n description: 'Check if providers are configured',\n status: 'pass',\n message: `${enabledProviders.length} provider(s) enabled: ${enabledProviders.join(', ')}`,\n fixable: false,\n });\n\n return checks;\n }\n\n private checkSymlinks(): DiagnosticCheck[] {\n const checks: DiagnosticCheck[] = [];\n\n if (this.config === null) {\n return checks;\n }\n\n const providers = this.config.sync?.providers ?? {};\n const enabledProviders = Object.entries(providers)\n .filter(([, cfg]) => (cfg as { enabled?: boolean }).enabled === true)\n .map(([name]) => name as SupportedProvider);\n\n const symlink = new SymlinkManager(this.projectRoot, this.synapSyncDir);\n\n for (const provider of enabledProviders) {\n const { valid, broken, orphaned } = symlink.verifyProvider(provider);\n const total = valid.length + broken.length + orphaned.length;\n\n if (total === 0) {\n checks.push({\n id: `symlinks-${provider}`,\n name: `${provider} Symlinks`,\n description: `Check symlinks for ${provider}`,\n status: 'pass',\n message: 'No symlinks configured yet',\n fixable: false,\n });\n continue;\n }\n\n if (broken.length === 0 && orphaned.length === 0) {\n checks.push({\n id: `symlinks-${provider}`,\n name: `${provider} Symlinks`,\n description: `Check symlinks for ${provider}`,\n status: 'pass',\n message: `${valid.length} valid symlink(s)`,\n fixable: true,\n });\n } else {\n const details: string[] = [];\n if (broken.length > 0) details.push(`${broken.length} broken`);\n if (orphaned.length > 0) details.push(`${orphaned.length} orphaned`);\n\n checks.push({\n id: `symlinks-${provider}`,\n name: `${provider} Symlinks`,\n description: `Check symlinks for ${provider}`,\n status: 'warn',\n message: `${valid.length} valid, ${details.join(', ')}`,\n fixable: true,\n details: [\n ...broken.map((l) => `Broken: ${l.cognitiveName}`),\n ...orphaned.map((l) => `Orphaned: ${l.cognitiveName}`),\n ],\n });\n }\n }\n\n return checks;\n }\n\n private async checkRegistryConnectivity(): Promise<DiagnosticCheck> {\n try {\n const registry = new RegistryClient();\n const reachable = await registry.ping();\n\n if (reachable) {\n return {\n id: 'registry-connectivity',\n name: 'Registry Connectivity',\n description: 'Check connection to SynapSync registry',\n status: 'pass',\n message: 'Registry is reachable',\n fixable: false,\n };\n }\n\n return {\n id: 'registry-connectivity',\n name: 'Registry Connectivity',\n description: 'Check connection to SynapSync registry',\n status: 'warn',\n message: 'Registry is not reachable (check internet connection)',\n fixable: false,\n };\n } catch {\n return {\n id: 'registry-connectivity',\n name: 'Registry Connectivity',\n description: 'Check connection to SynapSync registry',\n status: 'warn',\n message: 'Failed to check registry connectivity',\n fixable: false,\n };\n }\n }\n\n // ============================================\n // Fix Methods\n // ============================================\n\n private fixCheck(check: DiagnosticCheck): void {\n switch (check.id) {\n case 'synapsync-dir':\n this.fixSynapSyncDir();\n break;\n\n case 'manifest-exists':\n case 'manifest-consistency':\n this.fixManifest();\n break;\n\n default:\n if (check.id.startsWith('symlinks-')) {\n const provider = check.id.replace('symlinks-', '') as SupportedProvider;\n this.fixSymlinks(provider);\n }\n }\n }\n\n private fixSynapSyncDir(): void {\n if (!fs.existsSync(this.synapSyncDir)) {\n fs.mkdirSync(this.synapSyncDir, { recursive: true });\n }\n\n // Create type directories\n for (const type of COGNITIVE_TYPES) {\n const typeDir = path.join(this.synapSyncDir, `${type}s`);\n if (!fs.existsSync(typeDir)) {\n fs.mkdirSync(typeDir, { recursive: true });\n }\n }\n }\n\n private fixManifest(): void {\n // Ensure directory exists\n this.fixSynapSyncDir();\n\n // Regenerate manifest from filesystem\n const scanner = new CognitiveScanner(this.synapSyncDir);\n const manifest = new ManifestManager(this.synapSyncDir);\n\n const scanned = scanner.scan();\n const manifestCognitives = scanned.map((s) => scanner.toManifestCognitive(s));\n const result = manifest.reconcile(manifestCognitives);\n\n manifest.applyReconciliation(result);\n manifest.save();\n }\n\n private fixSymlinks(provider: SupportedProvider): void {\n const symlink = new SymlinkManager(this.projectRoot, this.synapSyncDir);\n symlink.cleanProvider(provider);\n }\n\n /**\n * Get list of available check IDs\n */\n static getAvailableChecks(): string[] {\n return [\n 'node-version',\n 'synapsync-dir',\n 'config-valid',\n 'manifest-exists',\n 'manifest-consistency',\n 'providers-configured',\n 'registry-connectivity',\n // Provider-specific symlink checks are dynamic\n ];\n }\n}\n","/**\n * Clean Command\n *\n * Clean cache, orphaned symlinks, and temp files\n */\n\nimport type { Command } from 'commander';\nimport pc from 'picocolors';\nimport { ConfigManager } from '../services/config/manager.js';\nimport { CleanerService } from '../services/maintenance/cleaner.js';\nimport type { CleanResult, CleanedItem } from '../services/maintenance/types.js';\nimport { logger } from '../utils/logger.js';\n\n// ============================================\n// Types\n// ============================================\n\ninterface CleanCommandOptions {\n cache?: boolean;\n orphans?: boolean;\n temp?: boolean;\n all?: boolean;\n dryRun?: boolean;\n json?: boolean;\n}\n\n// ============================================\n// Main Function\n// ============================================\n\n/**\n * Execute the clean command\n */\nexport function executeCleanCommand(options: CleanCommandOptions = {}): void {\n logger.line();\n\n // Check if project is initialized\n const configManager = ConfigManager.findConfig();\n if (configManager === null) {\n logger.error('No SynapSync project found.');\n logger.hint('Run synapsync init to initialize a project first.');\n return;\n }\n\n const synapSyncDir = configManager.getSynapSyncDir();\n const projectRoot = configManager.getProjectRoot();\n\n let config;\n try {\n config = configManager.getConfig();\n } catch {\n config = undefined;\n }\n\n const cleaner = new CleanerService(projectRoot, synapSyncDir, config);\n\n // Header\n if (options.json !== true) {\n if (options.dryRun === true) {\n logger.bold(' Clean Preview (Dry Run)');\n } else {\n logger.bold(' Cleaning');\n }\n logger.line();\n }\n\n // Run clean\n const result = cleaner.clean({\n cache: options.cache ?? false,\n orphans: options.orphans ?? false,\n temp: options.temp ?? false,\n all: options.all ?? false,\n dryRun: options.dryRun ?? false,\n });\n\n // JSON output\n if (options.json === true) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n // Display results\n displayResults(result, options);\n\n // Summary\n logger.line();\n if (result.cleaned.length === 0) {\n logger.log(` ${pc.green('✓')} Nothing to clean`);\n } else if (options.dryRun === true) {\n logger.log(` ${pc.dim(`Would clean ${result.cleaned.length} item(s), freeing ${result.sizeFreed}`)}`);\n logger.hint('Run synapsync clean without --dry-run to apply changes.');\n } else {\n logger.log(` ${pc.green('✓')} Cleaned ${result.cleaned.length} item(s), freed ${result.sizeFreed}`);\n }\n\n if (result.errors.length > 0) {\n logger.log(` ${pc.red('!')} ${result.errors.length} error(s) occurred`);\n }\n\n logger.line();\n}\n\n// ============================================\n// Display Functions\n// ============================================\n\nfunction displayResults(result: CleanResult, _options: CleanCommandOptions): void {\n // Group by type\n const byType = groupByType(result.cleaned);\n\n if (byType.cache.length > 0) {\n logger.log(` ${pc.cyan('Cache:')}`);\n for (const item of byType.cache) {\n const size = formatBytes(item.size);\n logger.log(` ${pc.dim('-')} ${getRelativePath(item.path)} ${pc.dim(`(${size})`)}`);\n }\n logger.line();\n }\n\n if (byType.orphan.length > 0) {\n logger.log(` ${pc.cyan('Orphaned symlinks:')}`);\n for (const item of byType.orphan) {\n logger.log(` ${pc.dim('-')} ${item.path}`);\n }\n logger.line();\n }\n\n if (byType.temp.length > 0) {\n logger.log(` ${pc.cyan('Temp files:')}`);\n for (const item of byType.temp) {\n const size = formatBytes(item.size);\n logger.log(` ${pc.dim('-')} ${getRelativePath(item.path)} ${pc.dim(`(${size})`)}`);\n }\n logger.line();\n }\n\n // Errors\n if (result.errors.length > 0) {\n logger.log(` ${pc.red('Errors:')}`);\n for (const error of result.errors) {\n logger.log(` ${pc.red('✗')} ${error.path}: ${error.message}`);\n }\n logger.line();\n }\n}\n\nfunction groupByType(items: CleanedItem[]): Record<CleanedItem['type'], CleanedItem[]> {\n const result: Record<CleanedItem['type'], CleanedItem[]> = {\n cache: [],\n orphan: [],\n temp: [],\n };\n\n for (const item of items) {\n result[item.type].push(item);\n }\n\n return result;\n}\n\nfunction formatBytes(bytes: number): string {\n if (bytes === 0) return '0 B';\n\n const units = ['B', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(1024));\n const size = bytes / Math.pow(1024, i);\n\n return `${size.toFixed(i === 0 ? 0 : 1)} ${units[i]}`;\n}\n\nfunction getRelativePath(fullPath: string): string {\n const cwd = process.cwd();\n if (fullPath.startsWith(cwd)) {\n return fullPath.slice(cwd.length + 1);\n }\n return fullPath;\n}\n\n// ============================================\n// Command Registration\n// ============================================\n\n/**\n * Register clean command with Commander\n */\nexport function registerCleanCommand(program: Command): void {\n program\n .command('clean')\n .description('Clean cache, orphaned symlinks, and temp files')\n .option('-c, --cache', 'Clean registry cache')\n .option('-o, --orphans', 'Clean orphaned symlinks')\n .option('-t, --temp', 'Clean temp files')\n .option('-a, --all', 'Clean everything')\n .option('-n, --dry-run', 'Preview what would be cleaned')\n .option('--json', 'Output as JSON')\n .action((options: CleanCommandOptions) => {\n executeCleanCommand(options);\n });\n}\n","/**\n * Cleaner Service\n *\n * Cleans cache, orphaned symlinks, and temp files\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport type {\n CleanResult,\n CleanedItem,\n CleanError,\n CleanOptions,\n} from './types.js';\nimport { SymlinkManager } from '../symlink/manager.js';\nimport type { ProjectConfig } from '../config/schema.js';\nimport type { SupportedProvider } from '../../core/constants.js';\n\nexport class CleanerService {\n private projectRoot: string;\n private synapSyncDir: string;\n private config: ProjectConfig | null;\n\n constructor(projectRoot: string, synapSyncDir: string, config?: ProjectConfig) {\n this.projectRoot = projectRoot;\n this.synapSyncDir = synapSyncDir;\n this.config = config ?? null;\n }\n\n /**\n * Clean based on options\n */\n clean(options: CleanOptions = {}): CleanResult {\n const startTime = Date.now();\n const result: CleanResult = {\n success: true,\n cleaned: [],\n bytesFreed: 0,\n sizeFreed: '0 B',\n errors: [],\n duration: 0,\n };\n\n // If --all, enable everything\n if (options.all === true) {\n options.cache = true;\n options.orphans = true;\n options.temp = true;\n }\n\n // Default to cache if nothing specified\n if (options.cache !== true && options.orphans !== true && options.temp !== true) {\n options.cache = true;\n }\n\n // Clean cache\n if (options.cache === true) {\n const cacheResult = this.cleanCache(options.dryRun);\n result.cleaned.push(...cacheResult.cleaned);\n result.bytesFreed += cacheResult.bytes;\n result.errors.push(...cacheResult.errors);\n }\n\n // Clean orphaned symlinks\n if (options.orphans === true) {\n const orphanResult = this.cleanOrphans(options.dryRun);\n result.cleaned.push(...orphanResult.cleaned);\n result.errors.push(...orphanResult.errors);\n }\n\n // Clean temp files\n if (options.temp === true) {\n const tempResult = this.cleanTemp(options.dryRun);\n result.cleaned.push(...tempResult.cleaned);\n result.bytesFreed += tempResult.bytes;\n result.errors.push(...tempResult.errors);\n }\n\n result.sizeFreed = this.formatBytes(result.bytesFreed);\n result.success = result.errors.length === 0;\n result.duration = Date.now() - startTime;\n\n return result;\n }\n\n /**\n * Clean registry cache\n */\n private cleanCache(dryRun = false): {\n cleaned: CleanedItem[];\n bytes: number;\n errors: CleanError[];\n } {\n const cleaned: CleanedItem[] = [];\n const errors: CleanError[] = [];\n let bytes = 0;\n\n const cacheDir = path.join(this.synapSyncDir, 'cache');\n\n if (!fs.existsSync(cacheDir)) {\n return { cleaned, bytes, errors };\n }\n\n try {\n const items = this.listDirectory(cacheDir);\n\n for (const item of items) {\n const size = this.getSize(item);\n cleaned.push({\n type: 'cache',\n path: item,\n size,\n });\n bytes += size;\n\n if (!dryRun) {\n try {\n this.removeItem(item);\n } catch (error) {\n errors.push({\n path: item,\n message: error instanceof Error ? error.message : 'Unknown error',\n });\n }\n }\n }\n } catch (error) {\n errors.push({\n path: cacheDir,\n message: error instanceof Error ? error.message : 'Unknown error',\n });\n }\n\n return { cleaned, bytes, errors };\n }\n\n /**\n * Clean orphaned symlinks from provider directories\n */\n private cleanOrphans(dryRun = false): {\n cleaned: CleanedItem[];\n errors: CleanError[];\n } {\n const cleaned: CleanedItem[] = [];\n const errors: CleanError[] = [];\n\n if (this.config === null) {\n return { cleaned, errors };\n }\n\n const providers = this.config.sync?.providers ?? {};\n const enabledProviders = Object.entries(providers)\n .filter(([, cfg]) => (cfg as { enabled?: boolean }).enabled === true)\n .map(([name]) => name as SupportedProvider);\n\n const symlink = new SymlinkManager(this.projectRoot, this.synapSyncDir);\n\n for (const provider of enabledProviders) {\n try {\n const removed = symlink.cleanProvider(provider, dryRun);\n\n for (const name of removed) {\n cleaned.push({\n type: 'orphan',\n path: name,\n size: 0,\n });\n }\n } catch (error) {\n errors.push({\n path: provider,\n message: error instanceof Error ? error.message : 'Unknown error',\n });\n }\n }\n\n return { cleaned, errors };\n }\n\n /**\n * Clean temp files\n */\n private cleanTemp(dryRun = false): {\n cleaned: CleanedItem[];\n bytes: number;\n errors: CleanError[];\n } {\n const cleaned: CleanedItem[] = [];\n const errors: CleanError[] = [];\n let bytes = 0;\n\n const tempPatterns = [\n path.join(this.synapSyncDir, '.tmp'),\n path.join(this.synapSyncDir, 'temp'),\n path.join(this.synapSyncDir, '*.tmp'),\n path.join(this.synapSyncDir, '*.temp'),\n ];\n\n for (const pattern of tempPatterns) {\n // Check if it's a directory or file (not a glob pattern)\n if (!pattern.includes('*')) {\n if (fs.existsSync(pattern)) {\n const size = this.getSize(pattern);\n cleaned.push({\n type: 'temp',\n path: pattern,\n size,\n });\n bytes += size;\n\n if (!dryRun) {\n try {\n this.removeItem(pattern);\n } catch (error) {\n errors.push({\n path: pattern,\n message: error instanceof Error ? error.message : 'Unknown error',\n });\n }\n }\n }\n } else {\n // Handle glob patterns\n const dir = path.dirname(pattern);\n const ext = path.extname(pattern);\n\n if (fs.existsSync(dir)) {\n try {\n const entries = fs.readdirSync(dir);\n for (const entry of entries) {\n if (entry.endsWith(ext.slice(1))) {\n // Remove the *\n const fullPath = path.join(dir, entry);\n const size = this.getSize(fullPath);\n cleaned.push({\n type: 'temp',\n path: fullPath,\n size,\n });\n bytes += size;\n\n if (!dryRun) {\n try {\n this.removeItem(fullPath);\n } catch (error) {\n errors.push({\n path: fullPath,\n message: error instanceof Error ? error.message : 'Unknown error',\n });\n }\n }\n }\n }\n } catch (error) {\n errors.push({\n path: pattern,\n message: error instanceof Error ? error.message : 'Unknown error',\n });\n }\n }\n }\n }\n\n return { cleaned, bytes, errors };\n }\n\n /**\n * List all files/directories in a directory recursively\n */\n private listDirectory(dir: string): string[] {\n const items: string[] = [];\n\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n items.push(fullPath);\n\n if (entry.isDirectory()) {\n items.push(...this.listDirectory(fullPath));\n }\n }\n\n return items;\n }\n\n /**\n * Get the size of a file or directory\n */\n private getSize(itemPath: string): number {\n try {\n const stats = fs.statSync(itemPath);\n\n if (stats.isFile()) {\n return stats.size;\n }\n\n if (stats.isDirectory()) {\n let size = 0;\n const entries = fs.readdirSync(itemPath, { withFileTypes: true });\n for (const entry of entries) {\n size += this.getSize(path.join(itemPath, entry.name));\n }\n return size;\n }\n\n return 0;\n } catch {\n return 0;\n }\n }\n\n /**\n * Remove a file or directory\n */\n private removeItem(itemPath: string): void {\n const stats = fs.lstatSync(itemPath);\n\n if (stats.isSymbolicLink() || stats.isFile()) {\n fs.unlinkSync(itemPath);\n } else if (stats.isDirectory()) {\n fs.rmSync(itemPath, { recursive: true });\n }\n }\n\n /**\n * Format bytes to human readable string\n */\n private formatBytes(bytes: number): string {\n if (bytes === 0) return '0 B';\n\n const units = ['B', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(1024));\n const size = bytes / Math.pow(1024, i);\n\n return `${size.toFixed(i === 0 ? 0 : 1)} ${units[i]}`;\n }\n}\n","/**\n * Purge Command\n *\n * Completely remove SynapSync from the project\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport type { Command } from 'commander';\nimport pc from 'picocolors';\nimport { ConfigManager } from '../services/config/manager.js';\nimport { SUPPORTED_PROVIDERS, PROVIDER_PATHS, COGNITIVE_TYPES } from '../core/constants.js';\nimport { logger } from '../utils/logger.js';\n\n// ============================================\n// Types\n// ============================================\n\ninterface PurgeCommandOptions {\n force?: boolean;\n}\n\n// ============================================\n// Main Function\n// ============================================\n\n/**\n * Execute the purge command - completely remove SynapSync from the project\n */\nexport function executePurgeCommand(options: PurgeCommandOptions): void {\n logger.line();\n\n const configManager = ConfigManager.findConfig();\n if (configManager === null) {\n logger.error('No SynapSync project found.');\n return;\n }\n\n const projectRoot = configManager.getProjectRoot();\n const synapSyncDir = configManager.getSynapSyncDir();\n\n // Show what will be removed unless --force\n if (options.force !== true) {\n logger.log(` ${pc.yellow('!')} This will completely remove SynapSync from your project:`);\n logger.line();\n\n const itemsToRemove = collectItemsToRemove(projectRoot, synapSyncDir);\n\n for (const item of itemsToRemove) {\n logger.log(` ${pc.red('✗')} ${item}`);\n }\n\n logger.line();\n logger.hint('Use --force to confirm and remove everything.');\n logger.log(` ${pc.dim('To confirm, run:')} synapsync purge --force`);\n return;\n }\n\n let removedCount = 0;\n\n try {\n // 1. Remove only symlinks pointing to .synapsync\n removedCount += removeProviderSymlinks(projectRoot, synapSyncDir);\n\n // 2. Remove .synapsync directory\n if (fs.existsSync(synapSyncDir)) {\n fs.rmSync(synapSyncDir, { recursive: true, force: true });\n logger.log(` ${pc.red('✗')} Removed ${path.relative(projectRoot, synapSyncDir)}/`);\n removedCount++;\n }\n\n // 3. Remove synapsync.config.yaml\n const configPath = path.join(projectRoot, 'synapsync.config.yaml');\n if (fs.existsSync(configPath)) {\n fs.unlinkSync(configPath);\n logger.log(` ${pc.red('✗')} Removed synapsync.config.yaml`);\n removedCount++;\n }\n\n // 4. Clean .gitignore entries\n if (cleanGitignore(projectRoot)) {\n logger.log(` ${pc.red('✗')} Cleaned SynapSync entries from .gitignore`);\n removedCount++;\n }\n\n // Summary\n logger.line();\n if (removedCount > 0) {\n logger.log(` ${pc.green('✓')} SynapSync has been completely removed from this project.`);\n } else {\n logger.log(` ${pc.green('✓')} Nothing to remove.`);\n }\n logger.line();\n } catch (error) {\n logger.line();\n if (error instanceof Error) {\n logger.error(`Purge failed: ${error.message}`);\n } else {\n logger.error('Purge failed with unknown error');\n }\n }\n}\n\n// ============================================\n// Collection (for preview)\n// ============================================\n\nfunction collectItemsToRemove(projectRoot: string, synapSyncDir: string): string[] {\n const items: string[] = [];\n\n // Symlinks pointing to .synapsync\n const symlinks = findSynapSyncSymlinks(projectRoot, synapSyncDir);\n for (const link of symlinks) {\n items.push(`${path.relative(projectRoot, link)} (symlink)`);\n }\n\n // .synapsync directory\n if (fs.existsSync(synapSyncDir)) {\n items.push(path.relative(projectRoot, synapSyncDir) + '/');\n }\n\n // Config file\n const configPath = path.join(projectRoot, 'synapsync.config.yaml');\n if (fs.existsSync(configPath)) {\n items.push('synapsync.config.yaml');\n }\n\n // .gitignore entries\n const gitignorePath = path.join(projectRoot, '.gitignore');\n if (fs.existsSync(gitignorePath)) {\n const content = fs.readFileSync(gitignorePath, 'utf-8');\n if (content.includes('# SynapSync')) {\n items.push('.gitignore (SynapSync entries)');\n }\n }\n\n return items;\n}\n\n// ============================================\n// Removal Functions\n// ============================================\n\n/**\n * Find all symlinks under provider directories that point to .synapsync/\n */\nfunction findSynapSyncSymlinks(projectRoot: string, synapSyncDir: string): string[] {\n const symlinks: string[] = [];\n const resolvedSynapSync = path.resolve(synapSyncDir);\n\n for (const provider of SUPPORTED_PROVIDERS) {\n const providerPaths = PROVIDER_PATHS[provider];\n for (const type of COGNITIVE_TYPES) {\n const typePath = path.join(projectRoot, providerPaths[type]);\n if (!fs.existsSync(typePath)) continue;\n\n try {\n const entries = fs.readdirSync(typePath, { withFileTypes: true });\n for (const entry of entries) {\n const fullPath = path.join(typePath, entry.name);\n if (entry.isSymbolicLink()) {\n const target = path.resolve(typePath, fs.readlinkSync(fullPath));\n if (target.startsWith(resolvedSynapSync)) {\n symlinks.push(fullPath);\n }\n }\n }\n } catch {\n // Cannot read directory, skip\n }\n }\n }\n\n return symlinks;\n}\n\n/**\n * Remove only symlinks that point to .synapsync/\n */\nfunction removeProviderSymlinks(projectRoot: string, synapSyncDir: string): number {\n const symlinks = findSynapSyncSymlinks(projectRoot, synapSyncDir);\n\n for (const link of symlinks) {\n fs.unlinkSync(link);\n logger.log(` ${pc.red('✗')} Removed symlink ${path.relative(projectRoot, link)}`);\n }\n\n return symlinks.length;\n}\n\nfunction cleanGitignore(projectRoot: string): boolean {\n const gitignorePath = path.join(projectRoot, '.gitignore');\n if (!fs.existsSync(gitignorePath)) return false;\n\n const content = fs.readFileSync(gitignorePath, 'utf-8');\n if (!content.includes('# SynapSync')) return false;\n\n // Remove the SynapSync block\n const cleaned = content\n .replace(/\\n?# SynapSync\\n\\.synapsync\\/manifest\\.json\\n\\*\\.local\\.yaml\\n?/g, '')\n .replace(/^\\s*\\n$/gm, '\\n'); // Clean up extra blank lines\n\n // If the file is empty or only whitespace after cleanup, remove it\n if (cleaned.trim() === '') {\n fs.unlinkSync(gitignorePath);\n } else {\n fs.writeFileSync(gitignorePath, cleaned, 'utf-8');\n }\n\n return true;\n}\n\n// ============================================\n// Command Registration\n// ============================================\n\n/**\n * Register purge command with Commander\n */\nexport function registerPurgeCommand(program: Command): void {\n program\n .command('purge')\n .description('Completely remove SynapSync from the project')\n .option('-f, --force', 'Skip confirmation and remove everything')\n .action((options: PurgeCommandOptions) => {\n executePurgeCommand(options);\n });\n}\n","/**\n * Help command\n */\n\nimport type { Command } from 'commander';\nimport pc from 'picocolors';\nimport { logger } from '../utils/logger.js';\n\nexport function registerHelpCommand(program: Command): void {\n program\n .command('help [command]')\n .description('Display help for a command')\n .action((commandName?: string) => {\n if (commandName) {\n const cmd = program.commands.find((c) => c.name() === commandName);\n if (cmd) {\n cmd.outputHelp();\n } else {\n logger.error(`Unknown command: ${commandName}`);\n logger.line();\n logger.log(`Run ${pc.cyan('synapsync --help')} to see available commands.`);\n }\n } else {\n program.outputHelp();\n }\n });\n}\n","/**\n * Version command - shows detailed version information\n */\n\nimport type { Command } from 'commander';\nimport pc from 'picocolors';\nimport { version } from '../version.js';\nimport { logger } from '../utils/logger.js';\n\n// Package name for npm registry lookup\nconst PACKAGE_NAME = 'synapsync';\n\n/**\n * Compare two semver version strings\n * Returns: -1 if a < b, 0 if a === b, 1 if a > b\n */\nfunction 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 < Math.max(partsA.length, partsB.length); i++) {\n const partA = partsA[i] ?? 0;\n const partB = partsB[i] ?? 0;\n\n if (partA < partB) return -1;\n if (partA > partB) return 1;\n }\n\n return 0;\n}\n\n/**\n * Fetch latest version from npm registry\n */\nasync function fetchLatestVersion(): Promise<string | null> {\n try {\n // Create abort controller with timeout (globalThis for Node.js compatibility)\n const controller = new globalThis.AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 5000);\n\n const response = await fetch(`https://registry.npmjs.org/${PACKAGE_NAME}/latest`, {\n headers: { Accept: 'application/json' },\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n return null;\n }\n\n const data = (await response.json()) as { version?: string };\n return data.version ?? null;\n } catch {\n return null;\n }\n}\n\n/**\n * Check for available updates\n */\nasync function checkForUpdates(): Promise<void> {\n logger.hint('Checking for updates...');\n\n const latestVersion = await fetchLatestVersion();\n\n if (latestVersion === null) {\n logger.warning('Could not check for updates. Package may not be published yet.');\n return;\n }\n\n const comparison = compareVersions(version, latestVersion);\n\n if (comparison < 0) {\n // Current version is older\n logger.line();\n logger.warning(`Update available: ${pc.cyan(`v${version}`)} → ${pc.green(`v${latestVersion}`)}`);\n logger.line();\n logger.log(` Run ${pc.cyan('npm install -g synapsync')} to update`);\n } else if (comparison > 0) {\n // Current version is newer (development version)\n logger.info(`You are running a development version (${pc.cyan(`v${version}`)})`);\n logger.log(` Latest published: ${pc.dim(`v${latestVersion}`)}`);\n } else {\n // Versions are equal\n logger.success('You are using the latest version');\n }\n}\n\nexport function registerVersionCommand(program: Command): void {\n program\n .command('version')\n .description('Show detailed version information')\n .option('--check', 'Check for available updates')\n .action(async (options: { check?: boolean }) => {\n logger.line();\n logger.log(`${pc.bold('SynapSync CLI')} ${pc.cyan(`v${version}`)}`);\n logger.line();\n logger.label('Node.js', process.version);\n logger.label('Platform', `${process.platform} ${process.arch}`);\n logger.label('Home', process.env['HOME'] ?? 'N/A');\n logger.line();\n\n if (options.check === true) {\n await checkForUpdates();\n }\n });\n}\n"],"mappings":"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","names":["pc","pc","text","pc","pc","pc","fs","path","pc","path","path","pc","p","pc","group","pc","fs","path","pc","pc","p","fs","path","pc","pc","p","pc","pc","getCognitiveIcon","text","fs","path","pc","path","fs","path","yaml","setNestedValue","version","fs","path","fs","path","result","pc","fs","path","pc","validateOptions","pc","getCognitiveIcon","displayCognitive","fs","path","pc","readManifest","pc","pc","validateOptions","pc","fs","path","pc","pc","pc","pc","fs","path","pc","pc","fs","path","displayResults","pc","groupByType","fs","path","pc","pc","pc","version","pc","pc","pc","pc"]}