conflux-ai 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/cli/index.ts","../../src/providers/registry.ts","../../src/core/types.ts","../../src/providers/base.ts","../../src/utils/hash.ts","../../src/utils/fs.ts","../../src/generators/instructions.ts","../../src/generators/mcp.ts","../../src/providers/claude-code/index.ts","../../src/providers/codex/index.ts","../../src/providers/cursor/index.ts","../../src/providers/index.ts","../../src/cli/commands/init.ts","../../src/detectors/index.ts","../../src/detectors/patterns.ts","../../src/utils/logger.ts","../../src/cli/commands/sync.ts","../../src/core/config.ts","../../src/core/schema.ts","../../src/cli/commands/providers.ts","../../src/cli/commands/setup-git-hook.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { Command } from \"commander\";\nimport { readFileSync } from \"node:fs\";\nimport { fileURLToPath } from \"node:url\";\nimport { dirname, join } from \"node:path\";\n\n// Register all built-in providers before anything else\nimport { registerAllProviders } from \"../providers/index.js\";\nregisterAllProviders();\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n// Read package.json for version\nconst pkgPath = join(__dirname, \"..\", \"..\", \"package.json\");\nconst pkg = JSON.parse(readFileSync(pkgPath, \"utf-8\")) as { version: string };\n\nconst program = new Command();\n\nprogram\n .name(\"conflux\")\n .description(\n \"Unified configuration manager for AI coding tools.\\n\" +\n \"Define once in .ai/config.yaml — sync to Claude Code, Codex, Cursor, and more.\"\n )\n .version(pkg.version, \"-V, --version\", \"Show version number\")\n .option(\"-v, --verbose\", \"Verbose output\")\n .option(\"-d, --dry-run\", \"Preview changes without writing files\")\n .option(\"-p, --project <path>\", \"Project root directory\", process.cwd())\n .option(\"--json\", \"Output in JSON format (for programmatic use)\")\n .option(\"-y, --yes\", \"Skip confirmation prompts\");\n\n// Register commands\nimport { registerInitCommand } from \"./commands/init.js\";\nimport { registerSyncCommand } from \"./commands/sync.js\";\nimport { registerProvidersCommand } from \"./commands/providers.js\";\nimport { registerSetupGitHookCommand } from \"./commands/setup-git-hook.js\";\n\nregisterInitCommand(program);\nregisterSyncCommand(program);\nregisterProvidersCommand(program);\nregisterSetupGitHookCommand(program);\n\n// Parse arguments\nprogram.parse(process.argv);\n","import { AIProvider, ProviderCapability } from \"./base.js\";\n\n/**\n * Provider registry — singleton that holds all registered AI tool providers.\n */\nclass ProviderRegistry {\n private providers = new Map<string, AIProvider>();\n\n /** Register a provider (built-in or external) */\n register(provider: AIProvider): void {\n if (this.providers.has(provider.id)) {\n throw new Error(\n `Provider \"${provider.id}\" is already registered. Remove it first before re-registering.`\n );\n }\n this.providers.set(provider.id, provider);\n }\n\n /** Unregister a provider */\n unregister(id: string): boolean {\n return this.providers.delete(id);\n }\n\n /** Get a provider by ID */\n get(id: string): AIProvider | undefined {\n return this.providers.get(id);\n }\n\n /** List all registered providers */\n list(): AIProvider[] {\n return Array.from(this.providers.values());\n }\n\n /** Detect which providers apply to the given project */\n detect(projectPath: string): AIProvider[] {\n return this.list().filter((p) => p.detect(projectPath));\n }\n\n /** Get providers that support a specific capability */\n withCapability(capability: ProviderCapability): AIProvider[] {\n return this.list().filter((p) => p.capabilities.includes(capability));\n }\n\n /** Get count of registered providers */\n get size(): number {\n return this.providers.size;\n }\n}\n\n/** Singleton registry instance */\nexport const registry = new ProviderRegistry();\n","// ============================================================================\n// Core Type Definitions for Conflux\n// Re-exports all types from the Zod schema (single source of truth).\n// ============================================================================\n\nexport type {\n UnifiedConfig,\n InstructionsConfig,\n HooksConfig,\n McpConfig,\n PermissionsConfig,\n SkillsConfig,\n ProvidersConfig,\n ProviderOverride,\n HookEntry,\n McpServer,\n LocalSkill,\n ExternalSkill,\n InstructionRule,\n} from \"./schema.js\";\n\n// ============================================================================\n// Provider Capability\n// ============================================================================\n\nexport enum ProviderCapability {\n INSTRUCTIONS = \"instructions\",\n HOOKS = \"hooks\",\n MCP = \"mcp\",\n PERMISSIONS = \"permissions\",\n SKILLS = \"skills\",\n}\n\n// ============================================================================\n// Generated File\n// ============================================================================\n\nexport interface GeneratedFile {\n /** Relative path from project root */\n path: string;\n /** File content to write */\n content: string;\n /** Write mode */\n mode?: \"write\" | \"symlink\" | \"merge\";\n /** File format (drives serialization) */\n format?: \"json\" | \"yaml\" | \"toml\" | \"markdown\" | \"text\";\n /** Content hash for drift detection */\n hash?: string;\n}\n\n// ============================================================================\n// Sync Result\n// ============================================================================\n\nexport interface SyncResult {\n provider: string;\n filesWritten: GeneratedFile[];\n filesRemoved: string[];\n errors: string[];\n warnings: string[];\n}\n\n// ============================================================================\n// Drift Report\n// ============================================================================\n\nexport interface DriftReport {\n provider: string;\n inSync: boolean;\n lastSyncTime: Date | null;\n modifiedFiles: Array<{\n path: string;\n expectedHash: string;\n actualHash: string;\n }>;\n missingFiles: string[];\n extraFiles: string[];\n}\n\n// ============================================================================\n// Discovered Config (from import)\n// ============================================================================\n\nexport interface DiscoveredConfig {\n instructions: string[];\n hooks: Record<string, unknown> | null;\n mcp: Record<string, unknown> | null;\n permissions: Record<string, unknown> | null;\n skills: string[];\n}\n\n// ============================================================================\n// Sync Options\n// ============================================================================\n\nexport interface SyncOptions {\n dryRun: boolean;\n verbose: boolean;\n force: boolean;\n}\n\n// ============================================================================\n// Sync State (for drift detection)\n// ============================================================================\n\nexport interface FileState {\n hash: string;\n generatedFrom: string;\n type?: \"file\" | \"symlink\";\n target?: string;\n}\n\nexport interface ProviderSyncState {\n synced: boolean;\n lastSync: string | null;\n files: Record<string, FileState>;\n}\n\nexport interface SyncState {\n version: number;\n lastSync: string;\n configHash: string;\n providers: Record<string, ProviderSyncState>;\n}\n","import type {\n UnifiedConfig,\n GeneratedFile,\n SyncResult,\n DriftReport,\n DiscoveredConfig,\n SyncOptions,\n InstructionsConfig,\n HooksConfig,\n McpConfig,\n PermissionsConfig,\n SkillsConfig,\n ProviderCapability,\n} from \"../core/types.js\";\n\nexport { ProviderCapability } from \"../core/types.js\";\nexport type {\n GeneratedFile,\n SyncResult,\n DriftReport,\n DiscoveredConfig,\n SyncOptions,\n UnifiedConfig,\n InstructionsConfig,\n HooksConfig,\n McpConfig,\n PermissionsConfig,\n SkillsConfig,\n};\n\n/**\n * Abstract base class for AI coding tool providers.\n * Each supported tool (Claude Code, Codex, Cursor, etc.)\n * extends this class and implements the tool-specific logic.\n */\nexport abstract class AIProvider {\n /** Unique identifier (e.g., \"claude-code\", \"cursor\") */\n abstract readonly id: string;\n\n /** Human-readable name */\n abstract readonly name: string;\n\n /** Provider version (for compatibility tracking) */\n abstract readonly version: string;\n\n /** Description of what this provider supports */\n abstract readonly capabilities: ProviderCapability[];\n\n // ─── Detection ──────────────────────────────────────────────\n\n /** Whether this tool's configuration exists in the project */\n abstract detect(projectPath: string): boolean;\n\n /** Discover existing config files for this tool */\n abstract discoverExisting(projectPath: string): DiscoveredConfig;\n\n // ─── Sync Operations ────────────────────────────────────────\n\n /** Sync all applicable dimensions for this provider */\n abstract sync(\n projectPath: string,\n config: UnifiedConfig,\n options?: SyncOptions\n ): Promise<SyncResult>;\n\n /** Remove all generated config files for this provider */\n abstract clean(projectPath: string): Promise<string[]>;\n\n // ─── Drift Detection ────────────────────────────────────────\n\n /** Check if generated files have drifted from source */\n abstract checkDrift(\n projectPath: string,\n config: UnifiedConfig,\n state: SyncState\n ): Promise<DriftReport>;\n\n // ─── Per-Dimension Generators ────────────────────────────────\n\n /** Generate instruction files for this tool */\n abstract generateInstructions(config: InstructionsConfig): GeneratedFile[];\n\n /** Generate hook configurations for this tool */\n abstract generateHooks(\n config: HooksConfig,\n overrides?: HooksConfig\n ): GeneratedFile[];\n\n /** Generate MCP server configuration for this tool */\n abstract generateMcp(\n config: McpConfig,\n env?: Record<string, string>\n ): GeneratedFile[];\n\n /** Generate permission configuration for this tool */\n abstract generatePermissions(config: PermissionsConfig): GeneratedFile[];\n\n /** Generate skill files for this tool */\n abstract generateSkills(\n config: SkillsConfig,\n projectPath: string\n ): GeneratedFile[];\n\n // ─── Utility ────────────────────────────────────────────────\n\n /** Check if this provider supports a specific capability */\n hasCapability(cap: ProviderCapability): boolean {\n return this.capabilities.includes(cap);\n }\n}\n\n// Need to import SyncState at the type level\nimport type { SyncState } from \"../core/types.js\";\n","import { createHash } from \"node:crypto\";\n\n/**\n * Compute a SHA-256 hash of the given content.\n * Used for drift detection between source config and generated files.\n */\nexport function hashContent(content: string): string {\n return createHash(\"sha256\").update(content).digest(\"hex\").slice(0, 16);\n}\n\n/**\n * Compute a combined hash from multiple content strings.\n */\nexport function hashContents(...contents: string[]): string {\n const combined = contents.join(\"\\0\");\n return hashContent(combined);\n}\n","import {\n readFileSync,\n writeFileSync,\n existsSync,\n mkdirSync,\n readdirSync,\n statSync,\n symlinkSync,\n unlinkSync,\n rmSync,\n} from \"node:fs\";\nimport { dirname, join, relative } from \"node:path\";\n\n/** Read a file as UTF-8 string */\nexport function readFile(path: string): string {\n return readFileSync(path, \"utf-8\");\n}\n\n/** Read a file if it exists, otherwise return null */\nexport function readFileIfExists(path: string): string | null {\n if (existsSync(path)) {\n return readFileSync(path, \"utf-8\");\n }\n return null;\n}\n\n/** Write content to a file, creating parent directories if needed */\nexport function writeFile(path: string, content: string): void {\n const dir = dirname(path);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n writeFileSync(path, content, \"utf-8\");\n}\n\n/** Check if a path exists (file or directory) */\nexport function pathExists(path: string): boolean {\n return existsSync(path);\n}\n\n/** Check if a path is a directory */\nexport function isDirectory(path: string): boolean {\n return existsSync(path) && statSync(path).isDirectory();\n}\n\n/** List files in a directory, optionally filtering by extension */\nexport function listDir(\n dirPath: string,\n filter?: (name: string) => boolean\n): string[] {\n if (!existsSync(dirPath)) return [];\n const entries = readdirSync(dirPath);\n if (filter) return entries.filter(filter);\n return entries;\n}\n\n/** Recursively list all files in a directory */\nexport function listDirRecursive(dirPath: string): string[] {\n if (!existsSync(dirPath)) return [];\n const results: string[] = [];\n const entries = readdirSync(dirPath);\n for (const entry of entries) {\n const fullPath = join(dirPath, entry);\n if (statSync(fullPath).isDirectory()) {\n results.push(...listDirRecursive(fullPath));\n } else {\n results.push(fullPath);\n }\n }\n return results;\n}\n\n/** Create a symlink. On Windows, may need admin privileges or developer mode. */\nexport function createSymlink(target: string, linkPath: string): void {\n const dir = dirname(linkPath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n // Use relative path for portability\n const relTarget = relative(dirname(linkPath), target);\n if (existsSync(linkPath)) {\n unlinkSync(linkPath);\n }\n symlinkSync(relTarget, linkPath, isDirectory(target) ? \"dir\" : \"file\");\n}\n\n/** Delete a file if it exists */\nexport function deleteFile(path: string): void {\n if (existsSync(path)) {\n unlinkSync(path);\n }\n}\n\n/** Delete a directory recursively */\nexport function deleteDir(path: string): void {\n if (existsSync(path)) {\n rmSync(path, { recursive: true, force: true });\n }\n}\n\n/** Resolve a path relative to the project root */\nexport function projectPath(projectRoot: string, ...segments: string[]): string {\n return join(projectRoot, ...segments);\n}\n","import type { InstructionsConfig, GeneratedFile } from \"../core/types.js\";\nimport { hashContent } from \"../utils/hash.js\";\n\n/**\n * Generate the primary AGENTS.md content from the instructions config.\n * This becomes the single canonical instruction file that tools symlink to.\n */\nexport function generatePrimaryInstructions(config: InstructionsConfig): GeneratedFile {\n const lines: string[] = [\n \"# AGENTS.md\",\n \"\",\n \"> Auto-generated by [Conflux](https://github.com/conflux-ai/conflux).\",\n \"> Edit `.ai/config.yaml` instead — changes to this file will be overwritten on next `conflux sync`.\",\n \"\",\n \"---\",\n \"\",\n ];\n\n // Append content from all \"always apply\" rules\n const alwaysRules = config.rules?.filter((r) => r.alwaysApply !== false) ?? [];\n\n if (alwaysRules.length > 0) {\n for (const rule of alwaysRules) {\n lines.push(`<!-- BEGIN: ${rule.path} -->`);\n lines.push(`<!-- Source: ${rule.path} -->`);\n // Rules are referenced by path — actual content is read at sync time\n lines.push(`@${rule.path}`);\n lines.push(`<!-- END: ${rule.path} -->`);\n lines.push(\"\");\n }\n }\n\n // Append reference links\n if (config.references && config.references.length > 0) {\n lines.push(\"## References\");\n lines.push(\"\");\n for (const ref of config.references) {\n lines.push(`- [${ref.description ?? ref.path}](${ref.path})`);\n }\n lines.push(\"\");\n }\n\n const content = lines.join(\"\\n\");\n const hash = hashContent(content);\n\n return {\n path: config.primary,\n content,\n format: \"markdown\",\n mode: \"write\",\n hash,\n };\n}\n\n/**\n * Generate tool-specific instruction files (symlinks to the primary AGENTS.md).\n * For tools that expect a differently-named file (e.g., CLAUDE.md, GEMINI.md).\n */\nexport function generateToolInstructions(\n config: InstructionsConfig,\n toolPrimaryFile: string\n): GeneratedFile {\n const content = `<!-- Generated by Conflux — edit .ai/config.yaml instead -->\\n@${config.primary}\\n`;\n\n return {\n path: toolPrimaryFile,\n content,\n format: \"markdown\",\n mode: \"write\",\n hash: hashContent(content),\n };\n}\n\n/**\n * Get the tool-specific primary file name for a given provider.\n */\nexport function getToolInstructionFile(providerId: string): string {\n const mapping: Record<string, string> = {\n \"claude-code\": \"CLAUDE.md\",\n codex: \"AGENTS.md\",\n cursor: \"AGENTS.md\",\n windsurf: \".windsurfrules\",\n copilot: \".github/copilot-instructions.md\",\n \"gemini-cli\": \"GEMINI.md\",\n aider: \"CONVENTIONS.md\",\n };\n return mapping[providerId] ?? \"AGENTS.md\";\n}\n","import type { McpConfig, GeneratedFile } from \"../core/types.js\";\nimport { hashContent } from \"../utils/hash.js\";\n\n/**\n * Generate MCP server configuration in Claude Code format (JSON).\n *\n * Claude Code uses .claude/settings.json with an \"mcpServers\" key:\n * {\n * \"mcpServers\": {\n * \"server-name\": { \"command\": \"...\", \"args\": [\"...\"] }\n * }\n * }\n */\nexport function generateMcpClaudeCode(config: McpConfig): GeneratedFile {\n const servers: Record<string, unknown> = {};\n\n for (const [name, server] of Object.entries(config.servers)) {\n const entry: Record<string, unknown> = { command: server.command };\n if (server.args && server.args.length > 0) {\n entry.args = server.args;\n }\n if (server.env && Object.keys(server.env).length > 0) {\n entry.env = server.env;\n }\n servers[name] = entry;\n }\n\n const mcpConfig = { mcpServers: servers };\n const content = JSON.stringify(mcpConfig, null, 2) + \"\\n\";\n\n return {\n path: \".claude/settings.json\",\n content,\n format: \"json\",\n mode: \"merge\",\n hash: hashContent(content),\n };\n}\n\n/**\n * Generate MCP server configuration in Codex format (TOML).\n *\n * Codex uses .codex/config.toml with [[mcp_servers]] array:\n * [[mcp_servers]]\n * name = \"server-name\"\n * command = \"...\"\n * args = [\"...\"]\n */\nexport function generateMcpCodex(config: McpConfig): GeneratedFile {\n const lines: string[] = [\n \"# MCP Servers — Auto-generated by Conflux\",\n \"# Edit .ai/config.yaml instead.\",\n \"\",\n ];\n\n if (config.env) {\n for (const [key, value] of Object.entries(config.env)) {\n lines.push(`[mcp_env]`);\n lines.push(`${key} = \"${value}\"`);\n lines.push(\"\");\n break; // TOML only allows one [mcp_env] section\n }\n }\n\n for (const [name, server] of Object.entries(config.servers)) {\n lines.push(\"[[mcp_servers]]\");\n lines.push(`name = \"${name}\"`);\n lines.push(`command = \"${server.command}\"`);\n if (server.args && server.args.length > 0) {\n const argsStr = server.args.map((a) => `\"${a}\"`).join(\", \");\n lines.push(`args = [${argsStr}]`);\n }\n if (server.env && Object.keys(server.env).length > 0) {\n for (const [key, value] of Object.entries(server.env)) {\n lines.push(`[mcp_servers.env]`);\n lines.push(`${key} = \"${value}\"`);\n }\n }\n lines.push(\"\");\n }\n\n const content = lines.join(\"\\n\");\n\n return {\n path: \".codex/config.toml\",\n content,\n format: \"toml\",\n mode: \"merge\",\n hash: hashContent(content),\n };\n}\n\n/**\n * Generate MCP server configuration in Cursor format (JSON).\n *\n * Cursor uses .cursor/mcp.json:\n * {\n * \"mcpServers\": { ... }\n * }\n */\nexport function generateMcpCursor(config: McpConfig): GeneratedFile {\n const servers: Record<string, unknown> = {};\n\n for (const [name, server] of Object.entries(config.servers)) {\n const entry: Record<string, unknown> = { command: server.command };\n if (server.args && server.args.length > 0) {\n entry.args = server.args;\n }\n if (server.env && Object.keys(server.env).length > 0) {\n entry.env = server.env;\n }\n servers[name] = entry;\n }\n\n const mcpConfig = { mcpServers: servers };\n const content = JSON.stringify(mcpConfig, null, 2) + \"\\n\";\n\n return {\n path: \".cursor/mcp.json\",\n content,\n format: \"json\",\n mode: \"write\",\n hash: hashContent(content),\n };\n}\n","import { AIProvider, ProviderCapability } from \"../base.js\";\nimport type {\n UnifiedConfig,\n GeneratedFile,\n SyncResult,\n DriftReport,\n DiscoveredConfig,\n SyncOptions,\n InstructionsConfig,\n HooksConfig,\n McpConfig,\n PermissionsConfig,\n SkillsConfig,\n} from \"../../core/types.js\";\nimport { hashContent } from \"../../utils/hash.js\";\nimport { writeFile, readFileIfExists, pathExists, projectPath as pp } from \"../../utils/fs.js\";\nimport { generatePrimaryInstructions, generateToolInstructions } from \"../../generators/instructions.js\";\nimport { generateMcpClaudeCode } from \"../../generators/mcp.js\";\nimport type { SyncState } from \"../../core/types.js\";\n\n/**\n * Claude Code provider.\n *\n * Configuration:\n * Instructions → CLAUDE.md (primary), .claude/commands/*.md\n * Hooks → .claude/settings.json \"hooks\"\n * MCP → .claude/settings.json \"mcpServers\"\n * Permissions → .claude/settings.json \"permissions\"\n * Skills → .claude/skills/ (symlinks)\n */\nexport class ClaudeCodeProvider extends AIProvider {\n readonly id = \"claude-code\";\n readonly name = \"Claude Code\";\n readonly version = \"1.0.0\";\n\n readonly capabilities = [\n ProviderCapability.INSTRUCTIONS,\n ProviderCapability.HOOKS,\n ProviderCapability.MCP,\n ProviderCapability.PERMISSIONS,\n ProviderCapability.SKILLS,\n ];\n\n detect(projectPath: string): boolean {\n return (\n pathExists(pp(projectPath, \".claude\")) ||\n pathExists(pp(projectPath, \"CLAUDE.md\"))\n );\n }\n\n discoverExisting(projectPath: string): DiscoveredConfig {\n const result: DiscoveredConfig = {\n instructions: [],\n hooks: null,\n mcp: null,\n permissions: null,\n skills: [],\n };\n\n // Check CLAUDE.md\n const claudeMd = pp(projectPath, \"CLAUDE.md\");\n if (pathExists(claudeMd)) {\n result.instructions.push(claudeMd);\n }\n\n // Check .claude/settings.json for hooks/MCP/permissions\n const settingsPath = pp(projectPath, \".claude\", \"settings.json\");\n if (pathExists(settingsPath)) {\n try {\n const raw = JSON.parse(readFileIfExists(settingsPath) ?? \"{}\");\n if (raw.hooks) result.hooks = raw.hooks;\n if (raw.mcpServers) result.mcp = raw.mcpServers;\n if (raw.permissions) result.permissions = raw.permissions;\n } catch {\n // Ignore parse errors during discovery\n }\n }\n\n // Check .claude/skills/\n const skillsDir = pp(projectPath, \".claude\", \"skills\");\n if (pathExists(skillsDir)) {\n result.skills.push(skillsDir);\n }\n\n return result;\n }\n\n async sync(\n projectPath: string,\n config: UnifiedConfig,\n options?: SyncOptions\n ): Promise<SyncResult> {\n const result: SyncResult = {\n provider: this.id,\n filesWritten: [],\n filesRemoved: [],\n errors: [],\n warnings: [],\n };\n\n const dryRun = options?.dryRun ?? false;\n\n try {\n // Instructions\n if (config.instructions) {\n const override = config.providers?.overrides?.[\"claude-code\"];\n const instructionsConfig: InstructionsConfig = {\n ...config.instructions,\n ...override?.instructions,\n };\n\n const files = this.generateInstructions(instructionsConfig);\n for (const file of files) {\n result.filesWritten.push(file);\n if (!dryRun) {\n writeFile(pp(projectPath, file.path), file.content);\n }\n }\n }\n\n // Hooks\n if (config.hooks) {\n const files = this.generateHooks(config.hooks);\n for (const file of files) {\n result.filesWritten.push(file);\n }\n // Hooks are merged into settings.json — handled in syncSettingsJson\n }\n\n // MCP\n if (config.mcp) {\n const files = this.generateMcp(config.mcp);\n for (const file of files) {\n result.filesWritten.push(file);\n }\n }\n\n // Permissions\n if (config.permissions) {\n const files = this.generatePermissions(config.permissions);\n for (const file of files) {\n result.filesWritten.push(file);\n }\n }\n\n // Write merged settings.json (hooks + MCP + permissions)\n this.writeSettingsJson(projectPath, config, dryRun, result);\n\n } catch (err) {\n result.errors.push(`Sync failed: ${(err as Error).message}`);\n }\n\n return result;\n }\n\n async clean(projectPath: string): Promise<string[]> {\n const removed: string[] = [];\n const files = [\n \"CLAUDE.md\",\n \".claude/settings.json\",\n ];\n\n for (const f of files) {\n const fullPath = pp(projectPath, f);\n if (pathExists(fullPath)) {\n removed.push(f);\n // In real implementation: deleteFile(fullPath)\n }\n }\n\n return removed;\n }\n\n async checkDrift(\n projectPath: string,\n _config: UnifiedConfig,\n state: SyncState\n ): Promise<DriftReport> {\n const providerState = state.providers[this.id];\n const report: DriftReport = {\n provider: this.id,\n inSync: true,\n lastSyncTime: providerState?.lastSync ? new Date(providerState.lastSync) : null,\n modifiedFiles: [],\n missingFiles: [],\n extraFiles: [],\n };\n\n if (!providerState?.synced) {\n report.inSync = false;\n return report;\n }\n\n for (const [filePath, fileState] of Object.entries(providerState.files)) {\n const fullPath = pp(projectPath, filePath);\n const content = readFileIfExists(fullPath);\n\n if (content === null) {\n report.missingFiles.push(filePath);\n report.inSync = false;\n } else {\n const actualHash = hashContent(content);\n if (actualHash !== fileState.hash) {\n report.modifiedFiles.push({\n path: filePath,\n expectedHash: fileState.hash,\n actualHash,\n });\n report.inSync = false;\n }\n }\n }\n\n return report;\n }\n\n // ─── Dimension Generators ──────────────────────────────────────\n\n generateInstructions(config: InstructionsConfig): GeneratedFile[] {\n const files: GeneratedFile[] = [];\n\n // Primary: CLAUDE.md wrapper pointing to AGENTS.md\n files.push(generateToolInstructions(config, \"CLAUDE.md\"));\n\n return files;\n }\n\n generateHooks(config: HooksConfig): GeneratedFile[] {\n // Hooks are embedded in settings.json — returns empty, handled in sync()\n const hooksJson: Record<string, unknown> = {};\n\n for (const [event, entries] of Object.entries(config)) {\n hooksJson[event] = entries.map((entry) => ({\n matcher: entry.matcher ?? \"\",\n hooks: [\n {\n type: \"command\",\n command: entry.command,\n timeout: entry.timeout ?? 30,\n },\n ],\n }));\n }\n\n const content = JSON.stringify({ hooks: hooksJson }, null, 2) + \"\\n\";\n return [\n {\n path: \".claude/settings.json\",\n content,\n format: \"json\",\n mode: \"merge\",\n hash: hashContent(content),\n },\n ];\n }\n\n generateMcp(config: McpConfig): GeneratedFile[] {\n return [generateMcpClaudeCode(config)];\n }\n\n generatePermissions(config: PermissionsConfig): GeneratedFile[] {\n const permConfig: Record<string, unknown> = {\n permissions: {\n default: config.default,\n },\n };\n\n if (config.allow) {\n (permConfig.permissions as Record<string, unknown>).allow = config.allow;\n }\n if (config.deny) {\n (permConfig.permissions as Record<string, unknown>).deny = config.deny;\n }\n\n const content = JSON.stringify(permConfig, null, 2) + \"\\n\";\n return [\n {\n path: \".claude/settings.json\",\n content,\n format: \"json\",\n mode: \"merge\",\n hash: hashContent(content),\n },\n ];\n }\n\n generateSkills(config: SkillsConfig, _projectPath: string): GeneratedFile[] {\n // Skills are symlinked into .claude/skills/\n const files: GeneratedFile[] = [];\n\n if (config.local) {\n for (const skill of config.local) {\n files.push({\n path: `.claude/skills/${skill.name}`,\n content: `../.agents/skills/${skill.name}`,\n format: \"text\",\n mode: \"symlink\",\n hash: \"\",\n });\n }\n }\n\n return files;\n }\n\n // ─── Helpers ───────────────────────────────────────────────────\n\n private writeSettingsJson(\n projectPath: string,\n config: UnifiedConfig,\n dryRun: boolean,\n result: SyncResult\n ): void {\n // Read existing settings.json if present\n const settingsPath = pp(projectPath, \".claude\", \"settings.json\");\n let existing: Record<string, unknown> = {};\n\n if (pathExists(settingsPath)) {\n try {\n existing = JSON.parse(readFileIfExists(settingsPath) ?? \"{}\");\n } catch {\n // Start fresh if parse fails\n }\n }\n\n // Merge hooks\n if (config.hooks) {\n const hooksSection: Record<string, unknown> = {};\n for (const [event, entries] of Object.entries(config.hooks)) {\n hooksSection[event] = entries.map((entry) => ({\n matcher: entry.matcher ?? \"\",\n hooks: [\n {\n type: \"command\",\n command: entry.command,\n timeout: entry.timeout ?? 30,\n },\n ],\n }));\n }\n existing.hooks = hooksSection;\n }\n\n // Merge MCP\n if (config.mcp) {\n const servers: Record<string, unknown> = {};\n for (const [name, server] of Object.entries(config.mcp.servers)) {\n const entry: Record<string, unknown> = { command: server.command };\n if (server.args?.length) entry.args = server.args;\n if (server.env && Object.keys(server.env).length > 0) entry.env = server.env;\n servers[name] = entry;\n }\n existing.mcpServers = servers;\n }\n\n // Merge permissions\n if (config.permissions) {\n const perm: Record<string, unknown> = {\n default: config.permissions.default,\n };\n if (config.permissions.allow) perm.allow = config.permissions.allow;\n if (config.permissions.deny) perm.deny = config.permissions.deny;\n existing.permissions = perm;\n }\n\n const content = JSON.stringify(existing, null, 2) + \"\\n\";\n const file: GeneratedFile = {\n path: \".claude/settings.json\",\n content,\n format: \"json\",\n mode: \"write\",\n hash: hashContent(content),\n };\n\n result.filesWritten.push(file);\n if (!dryRun) {\n writeFile(settingsPath, content);\n }\n }\n}\n","import { AIProvider, ProviderCapability } from \"../base.js\";\nimport type {\n UnifiedConfig,\n GeneratedFile,\n SyncResult,\n DriftReport,\n DiscoveredConfig,\n SyncOptions,\n InstructionsConfig,\n HooksConfig,\n McpConfig,\n PermissionsConfig,\n SkillsConfig,\n} from \"../../core/types.js\";\nimport { hashContent } from \"../../utils/hash.js\";\nimport { writeFile, readFileIfExists, pathExists, projectPath as pp } from \"../../utils/fs.js\";\nimport { generatePrimaryInstructions } from \"../../generators/instructions.js\";\nimport { generateMcpCodex } from \"../../generators/mcp.js\";\nimport type { SyncState } from \"../../core/types.js\";\n\n/**\n * Codex CLI (OpenAI) provider.\n *\n * Configuration:\n * Instructions → AGENTS.md (primary)\n * Hooks → .codex/hooks.json\n * MCP → .codex/config.toml [mcp_servers]\n * Permissions → .codex/config.toml [permissions]\n * Skills → .codex/skills/ or .agents/skills/\n */\nexport class CodexProvider extends AIProvider {\n readonly id = \"codex\";\n readonly name = \"Codex CLI\";\n readonly version = \"1.0.0\";\n\n readonly capabilities = [\n ProviderCapability.INSTRUCTIONS,\n ProviderCapability.HOOKS,\n ProviderCapability.MCP,\n ProviderCapability.PERMISSIONS,\n ProviderCapability.SKILLS,\n ];\n\n detect(projectPath: string): boolean {\n return (\n pathExists(pp(projectPath, \".codex\")) ||\n pathExists(pp(projectPath, \"AGENTS.md\"))\n );\n }\n\n discoverExisting(projectPath: string): DiscoveredConfig {\n const result: DiscoveredConfig = {\n instructions: [],\n hooks: null,\n mcp: null,\n permissions: null,\n skills: [],\n };\n\n // Check AGENTS.md\n const agentsMd = pp(projectPath, \"AGENTS.md\");\n if (pathExists(agentsMd)) {\n result.instructions.push(agentsMd);\n }\n\n // Check .codex/hooks.json\n const hooksPath = pp(projectPath, \".codex\", \"hooks.json\");\n if (pathExists(hooksPath)) {\n try {\n result.hooks = JSON.parse(readFileIfExists(hooksPath) ?? \"{}\");\n } catch {\n // Ignore\n }\n }\n\n // Check .codex/config.toml for MCP/permissions\n const configPath = pp(projectPath, \".codex\", \"config.toml\");\n if (pathExists(configPath)) {\n // TOML parsing is best-effort during discovery\n const raw = readFileIfExists(configPath);\n if (raw?.includes(\"[[mcp_servers]]\")) {\n result.mcp = { _fromToml: true };\n }\n }\n\n return result;\n }\n\n async sync(\n projectPath: string,\n config: UnifiedConfig,\n options?: SyncOptions\n ): Promise<SyncResult> {\n const result: SyncResult = {\n provider: this.id,\n filesWritten: [],\n filesRemoved: [],\n errors: [],\n warnings: [],\n };\n\n const dryRun = options?.dryRun ?? false;\n\n try {\n // Instructions\n if (config.instructions) {\n const files = this.generateInstructions(config.instructions);\n for (const file of files) {\n result.filesWritten.push(file);\n if (!dryRun) {\n writeFile(pp(projectPath, file.path), file.content);\n }\n }\n }\n\n // Hooks → .codex/hooks.json\n if (config.hooks) {\n const files = this.generateHooks(config.hooks);\n for (const file of files) {\n result.filesWritten.push(file);\n if (!dryRun) {\n writeFile(pp(projectPath, file.path), file.content);\n }\n }\n }\n\n // MCP → .codex/config.toml\n if (config.mcp) {\n const mcpFile = generateMcpCodex(config.mcp);\n result.filesWritten.push(mcpFile);\n if (!dryRun) {\n writeFile(pp(projectPath, mcpFile.path), mcpFile.content);\n }\n }\n\n } catch (err) {\n result.errors.push(`Sync failed: ${(err as Error).message}`);\n }\n\n return result;\n }\n\n async clean(projectPath: string): Promise<string[]> {\n const removed: string[] = [];\n const files = [\n \"AGENTS.md\",\n \".codex/hooks.json\",\n \".codex/config.toml\",\n ];\n\n for (const f of files) {\n if (pathExists(pp(projectPath, f))) {\n removed.push(f);\n }\n }\n\n return removed;\n }\n\n async checkDrift(\n projectPath: string,\n _config: UnifiedConfig,\n state: SyncState\n ): Promise<DriftReport> {\n const providerState = state.providers[this.id];\n const report: DriftReport = {\n provider: this.id,\n inSync: true,\n lastSyncTime: providerState?.lastSync ? new Date(providerState.lastSync) : null,\n modifiedFiles: [],\n missingFiles: [],\n extraFiles: [],\n };\n\n if (!providerState?.synced) {\n report.inSync = false;\n return report;\n }\n\n for (const [filePath, fileState] of Object.entries(providerState.files)) {\n const fullPath = pp(projectPath, filePath);\n const content = readFileIfExists(fullPath);\n if (content === null) {\n report.missingFiles.push(filePath);\n report.inSync = false;\n } else if (hashContent(content) !== fileState.hash) {\n report.modifiedFiles.push({\n path: filePath,\n expectedHash: fileState.hash,\n actualHash: hashContent(content),\n });\n report.inSync = false;\n }\n }\n\n return report;\n }\n\n // ─── Dimension Generators ──────────────────────────────────────\n\n generateInstructions(config: InstructionsConfig): GeneratedFile[] {\n // Codex uses AGENTS.md directly\n return [generatePrimaryInstructions(config)];\n }\n\n generateHooks(config: HooksConfig): GeneratedFile[] {\n // Codex uses .codex/hooks.json\n const hooksData: Record<string, unknown> = { hooks: {} };\n\n for (const [event, entries] of Object.entries(config)) {\n (hooksData.hooks as Record<string, unknown>)[event] = entries.map((entry) => ({\n matcher: entry.matcher ?? \"\",\n hooks: [\n {\n type: \"command\",\n command: entry.command,\n timeout: entry.timeout ?? 30,\n },\n ],\n }));\n }\n\n const content = JSON.stringify(hooksData, null, 2) + \"\\n\";\n return [\n {\n path: \".codex/hooks.json\",\n content,\n format: \"json\",\n mode: \"write\",\n hash: hashContent(content),\n },\n ];\n }\n\n generateMcp(config: McpConfig): GeneratedFile[] {\n return [generateMcpCodex(config)];\n }\n\n generatePermissions(config: PermissionsConfig): GeneratedFile[] {\n // Codex: permissions go in .codex/config.toml [permissions] section\n const lines: string[] = [\n \"# Permissions — Auto-generated by Conflux\",\n \"[permissions]\",\n `default = \"${config.default}\"`,\n ];\n\n if (config.allow) {\n lines.push(\"allow = [\");\n for (const rule of config.allow) {\n lines.push(` \"${rule}\",`);\n }\n lines.push(\"]\");\n }\n\n if (config.deny) {\n lines.push(\"deny = [\");\n for (const rule of config.deny) {\n lines.push(` \"${rule}\",`);\n }\n lines.push(\"]\");\n }\n\n const content = lines.join(\"\\n\") + \"\\n\";\n return [\n {\n path: \".codex/config.toml\",\n content,\n format: \"toml\",\n mode: \"merge\",\n hash: hashContent(content),\n },\n ];\n }\n\n generateSkills(config: SkillsConfig, _projectPath: string): GeneratedFile[] {\n return (config.local ?? []).map((skill) => ({\n path: `.codex/skills/${skill.name}`,\n content: `../.agents/skills/${skill.name}`,\n format: \"text\" as const,\n mode: \"symlink\" as const,\n hash: \"\",\n }));\n }\n}\n","import { AIProvider, ProviderCapability } from \"../base.js\";\nimport type {\n UnifiedConfig,\n GeneratedFile,\n SyncResult,\n DriftReport,\n DiscoveredConfig,\n SyncOptions,\n InstructionsConfig,\n HooksConfig,\n McpConfig,\n PermissionsConfig,\n SkillsConfig,\n} from \"../../core/types.js\";\nimport { hashContent } from \"../../utils/hash.js\";\nimport { writeFile, readFileIfExists, pathExists, projectPath as pp } from \"../../utils/fs.js\";\nimport { generatePrimaryInstructions } from \"../../generators/instructions.js\";\nimport { generateMcpCursor } from \"../../generators/mcp.js\";\nimport type { SyncState } from \"../../core/types.js\";\n\n/**\n * Cursor IDE provider.\n *\n * Configuration:\n * Instructions → .cursor/rules/*.mdc (modern), .cursorrules (legacy fallback)\n * Hooks → Not supported natively (skipped with warning)\n * MCP → .cursor/mcp.json\n * Permissions → Limited (settings UI only, skipped with warning)\n * Skills → .cursor/skills/\n */\nexport class CursorProvider extends AIProvider {\n readonly id = \"cursor\";\n readonly name = \"Cursor\";\n readonly version = \"1.0.0\";\n\n readonly capabilities = [\n ProviderCapability.INSTRUCTIONS,\n ProviderCapability.MCP,\n ProviderCapability.SKILLS,\n // Cursor does NOT support hooks or permissions natively\n ];\n\n detect(projectPath: string): boolean {\n return (\n pathExists(pp(projectPath, \".cursor\")) ||\n pathExists(pp(projectPath, \".cursorrules\"))\n );\n }\n\n discoverExisting(projectPath: string): DiscoveredConfig {\n const result: DiscoveredConfig = {\n instructions: [],\n hooks: null,\n mcp: null,\n permissions: null,\n skills: [],\n };\n\n // Check for legacy .cursorrules\n const legacyRules = pp(projectPath, \".cursorrules\");\n if (pathExists(legacyRules)) {\n result.instructions.push(legacyRules);\n }\n\n // Check for .cursor/rules/*.mdc\n const rulesDir = pp(projectPath, \".cursor\", \"rules\");\n if (pathExists(rulesDir)) {\n result.instructions.push(rulesDir);\n }\n\n // Check .cursor/mcp.json\n const mcpPath = pp(projectPath, \".cursor\", \"mcp.json\");\n if (pathExists(mcpPath)) {\n try {\n result.mcp = JSON.parse(readFileIfExists(mcpPath) ?? \"{}\");\n } catch {\n // Ignore\n }\n }\n\n return result;\n }\n\n async sync(\n projectPath: string,\n config: UnifiedConfig,\n options?: SyncOptions\n ): Promise<SyncResult> {\n const result: SyncResult = {\n provider: this.id,\n filesWritten: [],\n filesRemoved: [],\n errors: [],\n warnings: [],\n };\n\n const dryRun = options?.dryRun ?? false;\n\n try {\n // Instructions\n if (config.instructions) {\n const override = config.providers?.overrides?.cursor;\n const instructionsConfig: InstructionsConfig = {\n ...config.instructions,\n ...override?.instructions,\n };\n\n const files = this.generateInstructions(instructionsConfig);\n for (const file of files) {\n result.filesWritten.push(file);\n if (!dryRun) {\n writeFile(pp(projectPath, file.path), file.content);\n }\n }\n }\n\n // MCP\n if (config.mcp) {\n const files = this.generateMcp(config.mcp);\n for (const file of files) {\n result.filesWritten.push(file);\n if (!dryRun) {\n writeFile(pp(projectPath, file.path), file.content);\n }\n }\n }\n\n // Warn about unsupported capabilities\n if (config.hooks) {\n result.warnings.push(\"Cursor does not natively support lifecycle hooks — hooks skipped\");\n }\n if (config.permissions) {\n result.warnings.push(\"Cursor has limited permission support (settings UI only) — permissions skipped\");\n }\n\n } catch (err) {\n result.errors.push(`Sync failed: ${(err as Error).message}`);\n }\n\n return result;\n }\n\n async clean(projectPath: string): Promise<string[]> {\n const removed: string[] = [];\n const files = [\n \".cursor/mcp.json\",\n ];\n\n for (const f of files) {\n if (pathExists(pp(projectPath, f))) {\n removed.push(f);\n }\n }\n\n return removed;\n }\n\n async checkDrift(\n projectPath: string,\n _config: UnifiedConfig,\n state: SyncState\n ): Promise<DriftReport> {\n const providerState = state.providers[this.id];\n const report: DriftReport = {\n provider: this.id,\n inSync: true,\n lastSyncTime: providerState?.lastSync ? new Date(providerState.lastSync) : null,\n modifiedFiles: [],\n missingFiles: [],\n extraFiles: [],\n };\n\n if (!providerState?.synced) {\n report.inSync = false;\n return report;\n }\n\n for (const [filePath, fileState] of Object.entries(providerState.files)) {\n const fullPath = pp(projectPath, filePath);\n const content = readFileIfExists(fullPath);\n if (content === null) {\n report.missingFiles.push(filePath);\n report.inSync = false;\n } else if (hashContent(content) !== fileState.hash) {\n report.modifiedFiles.push({\n path: filePath,\n expectedHash: fileState.hash,\n actualHash: hashContent(content),\n });\n report.inSync = false;\n }\n }\n\n return report;\n }\n\n // ─── Dimension Generators ──────────────────────────────────────\n\n generateInstructions(config: InstructionsConfig): GeneratedFile[] {\n const files: GeneratedFile[] = [];\n\n // Primary: AGENTS.md (Cursor reads this natively)\n files.push(generatePrimaryInstructions(config));\n\n // Generate .cursor/rules/ files for granular rules\n if (config.rules) {\n for (const rule of config.rules) {\n // Create .mdc file with YAML frontmatter\n const mdcContent = [\n \"---\",\n `description: \"${rule.description ?? rule.path}\"`,\n ...(rule.globs ? [`globs: [${rule.globs.join(\", \")}]`] : []),\n `alwaysApply: ${rule.alwaysApply ?? true}`,\n \"---\",\n \"\",\n `@${rule.path}`,\n ].join(\"\\n\");\n\n const fileName = rule.path.replace(/^rules\\//, \"\").replace(/\\.md$/, \".mdc\");\n files.push({\n path: `.cursor/rules/${fileName}`,\n content: mdcContent,\n format: \"markdown\",\n mode: \"write\",\n hash: hashContent(mdcContent),\n });\n }\n }\n\n return files;\n }\n\n generateHooks(_config: HooksConfig): GeneratedFile[] {\n // Cursor does not support hooks\n return [];\n }\n\n generateMcp(config: McpConfig): GeneratedFile[] {\n return [generateMcpCursor(config)];\n }\n\n generatePermissions(_config: PermissionsConfig): GeneratedFile[] {\n // Cursor has limited permission support via settings UI only\n return [];\n }\n\n generateSkills(config: SkillsConfig, _projectPath: string): GeneratedFile[] {\n return (config.local ?? []).map((skill) => ({\n path: `.cursor/skills/${skill.name}`,\n content: `../.agents/skills/${skill.name}`,\n format: \"text\" as const,\n mode: \"symlink\" as const,\n hash: \"\",\n }));\n }\n}\n","/**\n * Auto-registration of all built-in providers.\n * Import this module to register all providers with the global registry.\n */\n\nimport { registry } from \"./registry.js\";\nimport { ClaudeCodeProvider } from \"./claude-code/index.js\";\nimport { CodexProvider } from \"./codex/index.js\";\nimport { CursorProvider } from \"./cursor/index.js\";\n\n/**\n * Register all built-in providers.\n * Safe to call multiple times — duplicates are detected.\n */\nexport function registerAllProviders(): void {\n const providers = [\n new ClaudeCodeProvider(),\n new CodexProvider(),\n new CursorProvider(),\n ];\n\n for (const provider of providers) {\n if (!registry.get(provider.id)) {\n registry.register(provider);\n }\n }\n}\n\nexport { registry } from \"./registry.js\";\nexport { AIProvider, ProviderCapability } from \"./base.js\";\n","import { Command } from \"commander\";\nimport { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { detectTools } from \"../../detectors/index.js\";\nimport { registry } from \"../../providers/registry.js\";\nimport { writeFile, pathExists } from \"../../utils/fs.js\";\nimport { logger } from \"../../utils/logger.js\";\nimport type { UnifiedConfig, DiscoveredConfig } from \"../../core/types.js\";\n\nexport function registerInitCommand(program: Command): void {\n program\n .command(\"init\")\n .description(\n \"Initialize .ai/config.yaml — scan existing configs and import them\"\n )\n .option(\"--template <name>\", \"Template: minimal, full, monorepo\")\n .option(\"--force\", \"Overwrite existing .ai/config.yaml\")\n .action(async (options, command) => {\n const globalOpts = command.parent?.opts() ?? {};\n const projectPath: string = globalOpts.project ?? process.cwd();\n const dryRun: boolean = globalOpts.dryRun ?? false;\n const force: boolean = options.force ?? false;\n\n const configDir = join(projectPath, \".ai\");\n const configPath = join(configDir, \"config.yaml\");\n\n // Check if config already exists\n if (pathExists(configPath) && !force) {\n logger.error(\".ai/config.yaml already exists.\");\n logger.info(\"Use --force to overwrite, or edit it directly.\");\n process.exit(1);\n }\n\n logger.heading(\"Conflux Init\");\n logger.info(`Project: ${projectPath}`);\n\n // Scan for existing AI tool configurations\n const detectedPatterns = detectTools(projectPath);\n const detectedIds = detectedPatterns.map((p) => p.providerId);\n\n if (detectedIds.length > 0) {\n logger.success(`Detected ${detectedIds.length} AI tool(s): ${detectedIds.join(\", \")}`);\n } else {\n logger.info(\"No AI tools detected. A minimal config will be generated.\");\n }\n\n // Discover existing configs from each detected tool\n const discovered: Record<string, DiscoveredConfig> = {};\n for (const id of detectedIds) {\n const provider = registry.get(id);\n if (provider) {\n try {\n discovered[id] = provider.discoverExisting(projectPath);\n } catch {\n // Skip tools that fail discovery\n }\n }\n }\n\n // Build the unified config from discovered settings\n const config = buildConfigFromDiscovered(detectedIds, discovered, options.template);\n\n // Write config\n if (dryRun) {\n logger.info(\"[DRY RUN] Would create .ai/config.yaml:\");\n console.log(\"---\");\n console.log(toYamlString(config));\n console.log(\"---\");\n } else {\n writeFile(configPath, toYamlString(config));\n logger.success(\"Created .ai/config.yaml\");\n }\n\n // Summary\n console.log();\n logger.heading(\"Next steps:\");\n logger.info(\"1. Review .ai/config.yaml and adjust as needed\");\n logger.info(\"2. Run 'conflux sync' to generate tool-specific configs\");\n logger.info(\"3. Run 'conflux status' to check sync health\");\n });\n}\n\n/**\n * Build a UnifiedConfig from discovered existing configurations.\n */\nfunction buildConfigFromDiscovered(\n detectedIds: string[],\n discovered: Record<string, DiscoveredConfig>,\n _template?: string\n): UnifiedConfig {\n const config: UnifiedConfig = {\n version: 1,\n };\n\n // Collect all instruction files found\n const allInstructions = new Set<string>();\n for (const [, d] of Object.entries(discovered)) {\n for (const path of d.instructions) {\n allInstructions.add(path);\n }\n }\n\n if (allInstructions.size > 0) {\n config.instructions = {\n primary: \"AGENTS.md\",\n references: Array.from(allInstructions).map((path) => ({\n path,\n description: `Existing instruction file (auto-discovered)`,\n })),\n };\n } else {\n config.instructions = {\n primary: \"AGENTS.md\",\n };\n }\n\n // Collect MCP servers from discovered configs\n const allMcpServers: Record<string, { command: string; args?: string[]; env?: Record<string, string> }> = {};\n for (const [providerId, d] of Object.entries(discovered)) {\n if (d.mcp && typeof d.mcp === \"object\") {\n const servers = (d.mcp as Record<string, unknown>).mcpServers ?? d.mcp;\n if (typeof servers === \"object\") {\n for (const [name, server] of Object.entries(servers as Record<string, unknown>)) {\n if (typeof server === \"object\" && server !== null && !allMcpServers[name]) {\n const s = server as Record<string, unknown>;\n allMcpServers[name] = {\n command: String(s.command ?? \"\"),\n ...(s.args ? { args: s.args as string[] } : {}),\n ...(s.env ? { env: s.env as Record<string, string> } : {}),\n };\n }\n }\n }\n }\n }\n\n if (Object.keys(allMcpServers).length > 0) {\n config.mcp = { servers: allMcpServers };\n }\n\n // Enable detected providers\n config.providers = {\n enabled: detectedIds,\n };\n\n // Metadata\n config.meta = {\n created: new Date().toISOString().split(\"T\")[0],\n description: \"Auto-generated by conflux init\",\n };\n\n return config;\n}\n\n/**\n * Simple YAML stringification (avoiding js-yaml dependency in output).\n * For production, use a proper YAML library. This is a minimal serializer\n * that handles the common case.\n */\nfunction toYamlString(config: UnifiedConfig): string {\n const lines: string[] = [\n \"# .ai/config.yaml — Unified AI Coding Tool Configuration\",\n \"# Generated by Conflux (https://github.com/conflux-ai/conflux)\",\n \"# Edit this file as the single source of truth for all AI tool configs.\",\n \"\",\n `version: ${config.version}`,\n \"\",\n ];\n\n // Instructions\n if (config.instructions) {\n lines.push(\"# ─── Project Instructions ────────────────────────────────────\");\n lines.push(\"instructions:\");\n lines.push(` primary: ${config.instructions.primary}`);\n if (config.instructions.references?.length) {\n lines.push(\" references:\");\n for (const ref of config.instructions.references) {\n lines.push(` - path: ${ref.path}`);\n if (ref.description) {\n lines.push(` description: \"${ref.description}\"`);\n }\n }\n }\n lines.push(\"\");\n }\n\n // MCP\n if (config.mcp && Object.keys(config.mcp.servers).length > 0) {\n lines.push(\"# ─── MCP Servers ─────────────────────────────────────────────\");\n lines.push(\"mcp:\");\n lines.push(\" servers:\");\n for (const [name, server] of Object.entries(config.mcp.servers)) {\n lines.push(` ${name}:`);\n lines.push(` command: ${server.command}`);\n if (server.args?.length) {\n lines.push(` args: [${server.args.map((a) => `\"${a}\"`).join(\", \")}]`);\n }\n }\n lines.push(\"\");\n }\n\n // Providers\n if (config.providers?.enabled?.length) {\n lines.push(\"# ─── Providers ───────────────────────────────────────────────\");\n lines.push(\"providers:\");\n lines.push(\" enabled:\");\n for (const id of config.providers.enabled) {\n lines.push(` - ${id}`);\n }\n lines.push(\"\");\n }\n\n // Meta\n if (config.meta) {\n lines.push(\"# ─── Metadata ────────────────────────────────────────────────\");\n lines.push(\"meta:\");\n if (config.meta.description) {\n lines.push(` description: \"${config.meta.description}\"`);\n }\n lines.push(` created: \"${config.meta.created ?? \"unknown\"}\"`);\n lines.push(\"\");\n }\n\n return lines.join(\"\\n\");\n}\n","import { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { DETECTOR_PATTERNS, DetectorPattern } from \"./patterns.js\";\n\n/**\n * Detect which AI coding tools are present in the given project directory.\n */\nexport function detectTools(projectPath: string): DetectorPattern[] {\n return DETECTOR_PATTERNS.filter((pattern) =>\n pattern.markers.some((marker) => existsSync(join(projectPath, marker)))\n );\n}\n\n/**\n * Get the detected provider IDs for a project.\n */\nexport function detectToolIds(projectPath: string): string[] {\n return detectTools(projectPath).map((p) => p.providerId);\n}\n\n/**\n * Check if a specific tool is detected in the project.\n */\nexport function isToolDetected(projectPath: string, providerId: string): boolean {\n const pattern = DETECTOR_PATTERNS.find((p) => p.providerId === providerId);\n if (!pattern) return false;\n return pattern.markers.some((marker) => existsSync(join(projectPath, marker)));\n}\n","/**\n * Detector patterns — glob patterns and marker files used to detect\n * the presence of specific AI coding tools in a project.\n */\n\nexport interface DetectorPattern {\n /** The provider ID this pattern applies to */\n providerId: string;\n /** Files or directories that indicate the tool is used */\n markers: string[];\n /** Glob patterns for configuration files */\n configPatterns: string[];\n}\n\n/** Detection patterns for all supported AI coding tools */\nexport const DETECTOR_PATTERNS: DetectorPattern[] = [\n {\n providerId: \"claude-code\",\n markers: [\".claude\", \"CLAUDE.md\", \".claude/settings.json\"],\n configPatterns: [\n \".claude/**/*.json\",\n \".claude/**/*.md\",\n \"CLAUDE.md\",\n ],\n },\n {\n providerId: \"codex\",\n markers: [\".codex\", \"AGENTS.md\", \".codex/config.toml\"],\n configPatterns: [\n \".codex/**/*.toml\",\n \".codex/**/*.json\",\n \".codex/**/*.md\",\n \"AGENTS.md\",\n ],\n },\n {\n providerId: \"cursor\",\n markers: [\".cursor\", \".cursorrules\", \".cursor/rules\"],\n configPatterns: [\n \".cursor/**/*.mdc\",\n \".cursor/**/*.json\",\n \".cursorrules\",\n ],\n },\n {\n providerId: \"windsurf\",\n markers: [\".windsurf\", \".windsurfrules\", \".windsurf/rules\"],\n configPatterns: [\n \".windsurf/**/*\",\n \".windsurfrules\",\n ],\n },\n {\n providerId: \"copilot\",\n markers: [\n \".github/copilot-instructions.md\",\n \".github/instructions\",\n ],\n configPatterns: [\n \".github/copilot-instructions.md\",\n \".github/instructions/**/*.md\",\n ],\n },\n {\n providerId: \"gemini-cli\",\n markers: [\".gemini\", \"GEMINI.md\"],\n configPatterns: [\n \".gemini/**/*.json\",\n \".gemini/**/*.toml\",\n \"GEMINI.md\",\n ],\n },\n {\n providerId: \"aider\",\n markers: [\".aider.conf.yml\", \".aider\", \"CONVENTIONS.md\"],\n configPatterns: [\n \".aider.conf.yml\",\n \".aider/**/*.json\",\n \"CONVENTIONS.md\",\n ],\n },\n];\n","import chalk from \"chalk\";\n\nexport enum LogLevel {\n DEBUG = 0,\n INFO = 1,\n WARN = 2,\n ERROR = 3,\n SILENT = 4,\n}\n\nlet currentLevel = LogLevel.INFO;\n\nexport function setLogLevel(level: LogLevel): void {\n currentLevel = level;\n}\n\nexport function getLogLevel(): LogLevel {\n return currentLevel;\n}\n\nexport const logger = {\n debug(msg: string): void {\n if (currentLevel <= LogLevel.DEBUG) {\n console.error(chalk.gray(` [debug] ${msg}`));\n }\n },\n\n info(msg: string): void {\n if (currentLevel <= LogLevel.INFO) {\n console.log(chalk.blue(\"ℹ\"), msg);\n }\n },\n\n success(msg: string): void {\n if (currentLevel <= LogLevel.INFO) {\n console.log(chalk.green(\"✓\"), msg);\n }\n },\n\n warn(msg: string): void {\n if (currentLevel <= LogLevel.WARN) {\n console.warn(chalk.yellow(\"⚠\"), msg);\n }\n },\n\n error(msg: string): void {\n if (currentLevel <= LogLevel.ERROR) {\n console.error(chalk.red(\"✗\"), msg);\n }\n },\n\n heading(msg: string): void {\n if (currentLevel <= LogLevel.INFO) {\n console.log();\n console.log(chalk.bold.cyan(\"●\"), chalk.bold(msg));\n }\n },\n\n table(rows: Record<string, string>[]): void {\n if (currentLevel > LogLevel.INFO) return;\n if (rows.length === 0) return;\n\n const keys = Object.keys(rows[0]!);\n const colWidths = keys.map((key) =>\n Math.max(key.length, ...rows.map((r) => (r[key] ?? \"\").length))\n );\n\n // Header\n const header = keys\n .map((k, i) => chalk.bold(k.padEnd(colWidths[i]!)))\n .join(\" \");\n console.log(\" \" + header);\n\n // Separator\n const sep = colWidths.map((w) => \"─\".repeat(w)).join(\" \");\n console.log(\" \" + chalk.gray(sep));\n\n // Rows\n for (const row of rows) {\n const line = keys\n .map((k, i) => (row[k] ?? \"\").padEnd(colWidths[i]!))\n .join(\" \");\n console.log(\" \" + line);\n }\n },\n};\n","import { Command } from \"commander\";\nimport { join } from \"node:path\";\nimport { registry } from \"../../providers/registry.js\";\nimport { loadConfig, configExists } from \"../../core/config.js\";\nimport { detectToolIds } from \"../../detectors/index.js\";\nimport { hashContent } from \"../../utils/hash.js\";\nimport { writeFile, readFileIfExists, pathExists } from \"../../utils/fs.js\";\nimport { logger } from \"../../utils/logger.js\";\nimport type { SyncState, SyncOptions, SyncResult } from \"../../core/types.js\";\n\nconst STATE_PATH = \".ai/.conflux-state.json\";\n\nexport function registerSyncCommand(program: Command): void {\n program\n .command(\"sync\")\n .description(\"Sync .ai/config.yaml to all detected AI tools\")\n .option(\"--providers <list>\", \"Comma-separated list of providers to target\")\n .option(\"--no-detect\", \"Skip auto-detection, use --providers explicitly\")\n .option(\"--check\", \"Check if configs are in sync (for CI); exit 1 if stale\")\n .action(async (options, command) => {\n const globalOpts = command.parent?.opts() ?? {};\n const projectPath: string = globalOpts.project ?? process.cwd();\n const dryRun: boolean = globalOpts.dryRun ?? false;\n const verbose: boolean = globalOpts.verbose ?? false;\n\n if (verbose) {\n logger.info(`Project: ${projectPath}`);\n logger.info(`Dry run: ${dryRun}`);\n }\n\n // ── Check mode (CI) ──────────────────────────────────────────\n if (options.check) {\n const ok = await checkSync(projectPath);\n if (!ok) {\n logger.error(\"Configuration is out of sync. Run 'conflux sync' to fix.\");\n process.exit(1);\n }\n logger.success(\"All AI tool configs are in sync.\");\n process.exit(0);\n }\n\n // ── Normal sync mode ─────────────────────────────────────────\n // Load config\n try {\n const config = loadConfig(projectPath);\n\n if (verbose) {\n logger.info(\"Config loaded and validated successfully\");\n }\n\n // Determine which providers to sync\n const enableList = options.providers\n ? options.providers.split(\",\").map((s: string) => s.trim())\n : undefined;\n\n let providerIds: string[];\n if (enableList) {\n providerIds = enableList;\n } else if (options.detect !== false) {\n providerIds = detectToolIds(projectPath);\n } else {\n providerIds = registry.list().map((p) => p.id);\n }\n\n // Apply provider enabled filter from config\n if (config.providers?.enabled) {\n providerIds = providerIds.filter((id) =>\n config.providers!.enabled!.includes(id)\n );\n }\n\n if (providerIds.length === 0) {\n logger.warn(\"No AI tools detected in this project.\");\n logger.info(\n \"Run 'conflux providers --detect' to see what's available, \" +\n \"or use --providers to specify tools explicitly.\"\n );\n return;\n }\n\n logger.heading(`Syncing to ${providerIds.length} tool(s)`);\n\n const syncOpts: SyncOptions = {\n dryRun,\n verbose,\n force: false,\n };\n\n // Run sync for each provider\n const results: SyncResult[] = [];\n const stateData: SyncState = {\n version: 1,\n lastSync: new Date().toISOString(),\n configHash: hashContent(JSON.stringify(config)),\n providers: {},\n };\n\n for (const providerId of providerIds) {\n const provider = registry.get(providerId);\n if (!provider) {\n logger.warn(`Unknown provider: ${providerId} — skipping`);\n continue;\n }\n\n logger.info(`Syncing ${provider.name}...`);\n\n try {\n const result = await provider.sync(projectPath, config, syncOpts);\n\n stateData.providers[providerId] = {\n synced: result.errors.length === 0,\n lastSync: new Date().toISOString(),\n files: {},\n };\n\n for (const file of result.filesWritten) {\n stateData.providers[providerId]!.files[file.path] = {\n hash: file.hash ?? hashContent(file.content),\n generatedFrom: file.path,\n type: file.mode === \"symlink\" ? \"symlink\" : \"file\",\n };\n }\n\n results.push(result);\n\n for (const file of result.filesWritten) {\n const prefix = dryRun ? \" [DRY RUN]\" : \" →\";\n logger.success(`${prefix} ${file.path}`);\n }\n for (const warning of result.warnings) {\n logger.warn(warning);\n }\n for (const error of result.errors) {\n logger.error(error);\n }\n } catch (err) {\n logger.error(`${provider.name}: ${(err as Error).message}`);\n }\n }\n\n // Write sync state\n if (!dryRun) {\n const statePath = join(projectPath, STATE_PATH);\n writeFile(statePath, JSON.stringify(stateData, null, 2) + \"\\n\");\n logger.success(`State written to ${STATE_PATH}`);\n }\n\n // Summary\n const totalFiles = results.reduce((sum, r) => sum + r.filesWritten.length, 0);\n const totalErrors = results.reduce((sum, r) => sum + r.errors.length, 0);\n const totalWarnings = results.reduce((sum, r) => sum + r.warnings.length, 0);\n\n console.log();\n if (dryRun) {\n logger.heading(\n `[DRY RUN] Would write ${totalFiles} file(s) across ${results.length} tool(s)`\n );\n } else {\n logger.heading(\n `Synced ${totalFiles} file(s) across ${results.length} tool(s)`\n );\n }\n if (totalWarnings > 0) {\n logger.warn(`${totalWarnings} warning(s)`);\n }\n if (totalErrors > 0) {\n logger.error(`${totalErrors} error(s)`);\n }\n } catch (err) {\n logger.error(`Failed to load config: ${(err as Error).message}`);\n logger.info(\"Run 'conflux init' to create a .ai/config.yaml file.\");\n process.exit(1);\n }\n });\n}\n\n// ============================================================================\n// Check mode: verify configs are in sync without writing anything\n// ============================================================================\n\nasync function checkSync(projectPath: string): Promise<boolean> {\n // 1. Config file must exist\n if (!configExists(projectPath)) {\n logger.error(\"No .ai/config.yaml found. Run 'conflux init' first.\");\n return false;\n }\n\n // 2. State file must exist (a sync was run before)\n const statePath = join(projectPath, STATE_PATH);\n if (!pathExists(statePath)) {\n logger.error(\"No .ai/.conflux-state.json found. Run 'conflux sync' first.\");\n return false;\n }\n\n // 3. Load and hash current config\n let state: SyncState;\n try {\n state = JSON.parse(readFileIfExists(statePath) ?? \"{}\") as SyncState;\n } catch {\n logger.error(\"Corrupted state file. Run 'conflux sync' to regenerate.\");\n return false;\n }\n\n const config = loadConfig(projectPath);\n const currentConfigHash = hashContent(JSON.stringify(config));\n\n // 4. Config changed since last sync?\n if (currentConfigHash !== state.configHash) {\n logger.error(\"❌ .ai/config.yaml was modified since last sync.\");\n logger.info(\" Run 'conflux sync' to update tool configs.\");\n return false;\n }\n\n // 5. Check each provider's generated files for drift\n let allOk = true;\n\n for (const [providerId, providerState] of Object.entries(state.providers)) {\n if (!providerState?.synced) continue;\n\n for (const [filePath, fileState] of Object.entries(providerState.files)) {\n const fullPath = join(projectPath, filePath);\n const content = readFileIfExists(fullPath);\n\n if (content === null) {\n logger.error(`❌ Missing: ${filePath} (${providerId})`);\n allOk = false;\n continue;\n }\n\n const actualHash = hashContent(content);\n if (actualHash !== fileState.hash) {\n logger.error(`❌ Drifted: ${filePath} (${providerId}) — manually edited`);\n allOk = false;\n }\n }\n }\n\n // 6. Check for providers that should be synced but aren't in state\n const detectedIds = detectToolIds(projectPath);\n const enabledIds = config.providers?.enabled ?? detectedIds;\n const syncedIds = Object.keys(state.providers);\n\n for (const id of enabledIds) {\n if (detectedIds.includes(id) && !syncedIds.includes(id)) {\n logger.warn(`⚠ New tool detected: ${id} — run 'conflux sync' to generate configs`);\n // Warning only, not a hard failure\n }\n }\n\n return allOk;\n}\n","import { readFileSync, existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport yaml from \"js-yaml\";\nimport { UnifiedConfigSchema, type UnifiedConfig } from \"./schema.js\";\nimport { ZodError } from \"zod\";\n\n/**\n * Load and parse a .ai/config.yaml file from the given project path.\n * Throws if the file is missing, invalid YAML, or fails schema validation.\n */\nexport function loadConfig(projectPath: string): UnifiedConfig {\n const configPath = join(projectPath, \".ai\", \"config.yaml\");\n\n if (!existsSync(configPath)) {\n throw new ConfigNotFoundError(\n `No .ai/config.yaml found in ${projectPath}. Run \"conflux init\" to create one.`\n );\n }\n\n let raw: unknown;\n try {\n const content = readFileSync(configPath, \"utf-8\");\n raw = yaml.load(content);\n } catch (err) {\n if (err instanceof ConfigNotFoundError) throw err;\n throw new ConfigParseError(\n `Failed to parse ${configPath}: ${(err as Error).message}`\n );\n }\n\n return validateConfig(raw, configPath);\n}\n\n/**\n * Validate an already-parsed config object against the Zod schema.\n */\nexport function validateConfig(raw: unknown, source?: string): UnifiedConfig {\n try {\n return UnifiedConfigSchema.parse(raw);\n } catch (err) {\n if (err instanceof ZodError) {\n const issues = err.issues\n .map((i) => ` - ${i.path.join(\".\") || \"(root)\"}: ${i.message}`)\n .join(\"\\n\");\n const label = source ? ` in ${source}` : \"\";\n throw new ConfigValidationError(`Schema validation failed${label}:\\n${issues}`);\n }\n throw err;\n }\n}\n\n/**\n * Check if a .ai/config.yaml exists in the project.\n */\nexport function configExists(projectPath: string): boolean {\n return existsSync(join(projectPath, \".ai\", \"config.yaml\"));\n}\n\n// ============================================================================\n// Custom Errors\n// ============================================================================\n\nexport class ConfigNotFoundError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"ConfigNotFoundError\";\n }\n}\n\nexport class ConfigParseError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"ConfigParseError\";\n }\n}\n\nexport class ConfigValidationError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"ConfigValidationError\";\n }\n}\n","import { z } from \"zod\";\n\n// ============================================================================\n// Dimension 1: Instructions\n// ============================================================================\n\nexport const InstructionRuleSchema = z.object({\n path: z.string().describe(\"Path to the rule file (markdown)\"),\n description: z.string().optional().describe(\"What this rule covers\"),\n globs: z.array(z.string()).optional().describe(\"File globs this rule applies to\"),\n alwaysApply: z.boolean().optional().default(true).describe(\"Always apply regardless of glob\"),\n});\n\nexport const InstructionReferenceSchema = z.object({\n path: z.string().describe(\"Path to the reference document\"),\n description: z.string().optional().describe(\"What this document covers\"),\n});\n\nexport const InstructionsConfigSchema = z.object({\n primary: z.string().default(\"AGENTS.md\").describe(\"Primary instruction file name\"),\n references: z.array(InstructionReferenceSchema).optional().describe(\"Reference documents to include\"),\n rules: z.array(InstructionRuleSchema).optional().describe(\"Granular rule files\"),\n});\n\n// ============================================================================\n// Dimension 2: Hooks\n// ============================================================================\n\nexport const HookEntrySchema = z.object({\n command: z.string().describe(\"Command to execute\"),\n timeout: z.number().int().positive().optional().describe(\"Timeout in seconds\"),\n description: z.string().optional().describe(\"What this hook does\"),\n matcher: z.string().optional().describe(\"Regex matcher (e.g., tool name pattern)\"),\n});\n\nexport const HooksConfigSchema = z.record(\n z.string(),\n z.array(HookEntrySchema)\n).describe(\"Lifecycle event hooks keyed by event name\");\n\n// ============================================================================\n// Dimension 3: MCP Servers\n// ============================================================================\n\nexport const McpServerSchema = z.object({\n command: z.string().describe(\"Command to run the MCP server\"),\n args: z.array(z.string()).optional().describe(\"Command arguments\"),\n env: z.record(z.string(), z.string()).optional().describe(\"Environment variables\"),\n});\n\nexport const McpConfigSchema = z.object({\n env: z.record(z.string(), z.string()).optional().describe(\"Global env vars for all MCP servers\"),\n servers: z.record(z.string(), McpServerSchema).describe(\"MCP server configurations\"),\n});\n\n// ============================================================================\n// Dimension 4: Permissions\n// ============================================================================\n\nexport const PermissionsConfigSchema = z.object({\n default: z.enum([\"prompt\", \"allow\", \"deny\"]).default(\"prompt\").describe(\"Default permission mode\"),\n allow: z.array(z.string()).optional().describe(\"Globally allowed operations\"),\n deny: z.array(z.string()).optional().describe(\"Globally denied operations\"),\n});\n\n// ============================================================================\n// Dimension 5: Skills\n// ============================================================================\n\nexport const LocalSkillSchema = z.object({\n name: z.string().describe(\"Skill name (invoked by this name)\"),\n path: z.string().describe(\"Path to SKILL.md file\"),\n description: z.string().optional().describe(\"What this skill does\"),\n tags: z.array(z.string()).optional().describe(\"Tags for categorization\"),\n});\n\nexport const ExternalSkillSchema = z.object({\n name: z.string().describe(\"Skill name\"),\n source: z.string().describe(\"Source repo or package (e.g., 'org/repo')\"),\n sourceType: z.enum([\"github\", \"npm\", \"url\"]).describe(\"Type of source\"),\n skillPath: z.string().describe(\"Path to the skill within the source\"),\n description: z.string().optional(),\n});\n\nexport const SkillsConfigSchema = z.object({\n local: z.array(LocalSkillSchema).optional().describe(\"Locally defined skills\"),\n external: z.array(ExternalSkillSchema).optional().describe(\"Skills from external sources\"),\n});\n\n// ============================================================================\n// Provider Configuration\n// ============================================================================\n\nexport const ProviderOverrideSchema = z.object({\n instructions: InstructionsConfigSchema.partial().optional(),\n hooks: HooksConfigSchema.optional(),\n mcp: McpConfigSchema.partial().optional(),\n permissions: PermissionsConfigSchema.partial().optional(),\n skills: SkillsConfigSchema.partial().optional(),\n});\n\nexport const ProvidersConfigSchema = z.object({\n enabled: z.array(z.string()).optional().describe(\"Providers to enable (omitted = auto-detect)\"),\n overrides: z.record(z.string(), ProviderOverrideSchema).optional().describe(\"Per-provider overrides\"),\n});\n\n// ============================================================================\n// Metadata\n// ============================================================================\n\nexport const ConfluxMetaSchema = z.object({\n created: z.string().optional().describe(\"Creation date\"),\n schema: z.string().optional().describe(\"Schema URL for validation\"),\n description: z.string().optional().describe(\"Project description\"),\n});\n\n// ============================================================================\n// Full Unified Config\n// ============================================================================\n\nexport const UnifiedConfigSchema = z.object({\n version: z.literal(1).describe(\"Config schema version (must be 1)\"),\n instructions: InstructionsConfigSchema.optional().describe(\"Project instructions for AI agents\"),\n hooks: HooksConfigSchema.optional().describe(\"Lifecycle event hooks\"),\n mcp: McpConfigSchema.optional().describe(\"MCP server configurations\"),\n permissions: PermissionsConfigSchema.optional().describe(\"Permission rules\"),\n skills: SkillsConfigSchema.optional().describe(\"Reusable skill/command definitions\"),\n providers: ProvidersConfigSchema.optional().describe(\"Provider enablement and overrides\"),\n meta: ConfluxMetaSchema.optional().describe(\"Metadata\"),\n});\n\n// ============================================================================\n// Derived Types\n// ============================================================================\n\nexport type UnifiedConfig = z.infer<typeof UnifiedConfigSchema>;\nexport type InstructionsConfig = z.infer<typeof InstructionsConfigSchema>;\nexport type HooksConfig = z.infer<typeof HooksConfigSchema>;\nexport type McpConfig = z.infer<typeof McpConfigSchema>;\nexport type PermissionsConfig = z.infer<typeof PermissionsConfigSchema>;\nexport type SkillsConfig = z.infer<typeof SkillsConfigSchema>;\nexport type ProvidersConfig = z.infer<typeof ProvidersConfigSchema>;\nexport type ProviderOverride = z.infer<typeof ProviderOverrideSchema>;\nexport type HookEntry = z.infer<typeof HookEntrySchema>;\nexport type McpServer = z.infer<typeof McpServerSchema>;\nexport type LocalSkill = z.infer<typeof LocalSkillSchema>;\nexport type ExternalSkill = z.infer<typeof ExternalSkillSchema>;\nexport type InstructionRule = z.infer<typeof InstructionRuleSchema>;\n","import { Command } from \"commander\";\nimport { registry } from \"../../providers/registry.js\";\nimport { ProviderCapability } from \"../../core/types.js\";\nimport { logger } from \"../../utils/logger.js\";\nimport { detectTools } from \"../../detectors/index.js\";\n\nconst CAPABILITY_ICONS: Record<string, string> = {\n instructions: \"📋\",\n hooks: \"🪝\",\n mcp: \"🔌\",\n permissions: \"🔒\",\n skills: \"⚡\",\n};\n\nexport function registerProvidersCommand(program: Command): void {\n program\n .command(\"providers\")\n .description(\"List supported AI coding tools and their capabilities\")\n .option(\"--details\", \"Show detailed capability breakdown\")\n .option(\"--detect\", \"Show which tools are detected in the current project\")\n .action(async (options, command) => {\n const globalOpts = command.parent?.opts() ?? {};\n const projectPath: string = globalOpts.project ?? process.cwd();\n\n const providers = registry.list();\n\n if (providers.length === 0) {\n logger.warn(\"No providers registered. This is a bug — please report it.\");\n return;\n }\n\n logger.heading(`AI Coding Tools (${providers.length} supported)`);\n\n // Detect which tools are present\n const detectedPatterns = options.detect ? detectTools(projectPath) : [];\n const detectedIds = new Set(detectedPatterns.map((p) => p.providerId));\n\n if (options.details) {\n // Detailed view with capability icons\n const rows = providers.map((p) => {\n const capStr = p.capabilities\n .map((c) => CAPABILITY_ICONS[c] ?? \"❓\")\n .join(\" \");\n return {\n Provider: p.id,\n Name: p.name,\n Capabilities: capStr,\n Detected: detectedIds.has(p.id) ? \"✓\" : \"-\",\n };\n });\n\n logger.table(rows);\n } else {\n // Simple list\n for (const p of providers) {\n const detected = detectedIds.has(p.id) ? \" (detected)\" : \"\";\n console.log(` ${p.id.padEnd(20)} ${p.name}${detected}`);\n }\n }\n\n // Show capability legend if details\n if (options.details) {\n console.log();\n console.log(\" Capability legend:\");\n for (const cap of Object.values(ProviderCapability)) {\n console.log(` ${CAPABILITY_ICONS[cap] ?? \"❓\"} ${cap}`);\n }\n }\n });\n}\n","import { Command } from \"commander\";\nimport { join } from \"node:path\";\nimport { writeFile, readFileIfExists, pathExists } from \"../../utils/fs.js\";\nimport { logger } from \"../../utils/logger.js\";\n\nconst HOOK_SCRIPT = `#!/bin/sh\n# ============================================================================\n# Conflux pre-commit hook\n# Ensures AI tool configs are in sync before every commit.\n# Installed by: conflux setup-git-hook\n# ============================================================================\n\necho \"🔍 Conflux: checking AI config sync...\"\n\nif command -v conflux &> /dev/null; then\n conflux sync --check\n if [ $? -ne 0 ]; then\n echo \"\"\n echo \"❌ AI tool configs are out of sync with .ai/config.yaml.\"\n echo \" Run 'conflux sync' to fix, then commit again.\"\n echo \" Or use 'git commit --no-verify' to skip this check.\"\n exit 1\n fi\n echo \"✅ AI configs in sync.\"\nelse\n echo \"⚠️ conflux not found in PATH — skipping sync check.\"\n echo \" Install: npm install -g conflux-ai\"\nfi\n`;\n\nexport function registerSetupGitHookCommand(program: Command): void {\n program\n .command(\"setup-git-hook\")\n .description(\"Install a pre-commit hook that auto-checks config sync\")\n .option(\"--force\", \"Overwrite existing pre-commit hook\")\n .action(async (options, command) => {\n const globalOpts = command.parent?.opts() ?? {};\n const projectPath: string = globalOpts.project ?? process.cwd();\n\n // Find git directory\n const gitDir = join(projectPath, \".git\");\n if (!pathExists(gitDir)) {\n logger.error(\"Not a git repository. Run 'git init' first.\");\n process.exit(1);\n }\n\n const hookPath = join(gitDir, \"hooks\", \"pre-commit\");\n\n // Check for existing hook\n const existing = readFileIfExists(hookPath);\n if (existing && !options.force) {\n if (existing.includes(\"Conflux pre-commit hook\")) {\n logger.info(\"Conflux pre-commit hook already installed.\");\n logger.info(\"Use --force to reinstall.\");\n return;\n }\n\n logger.warn(\"A pre-commit hook already exists.\");\n logger.info(hookPath);\n logger.info(\"\");\n logger.info(\"Options:\");\n logger.info(\" 1. Use --force to replace it (your existing hook will be lost)\");\n logger.info(\" 2. Manually add this line to your existing hook:\");\n console.log(\"\");\n console.log(\" conflux sync --check\");\n console.log(\"\");\n return;\n }\n\n // Install hook\n writeFile(hookPath, HOOK_SCRIPT);\n\n // Make executable (on Unix)\n try {\n const { chmodSync } = await import(\"node:fs\");\n chmodSync(hookPath, 0o755);\n } catch {\n // chmod not critical on Windows\n }\n\n logger.success(\"Installed pre-commit hook:\");\n logger.info(` ${hookPath}`);\n console.log(\"\");\n logger.info(\"Now, before every 'git commit', Conflux will:\");\n logger.info(\" 1. Check if .ai/config.yaml changed since last sync\");\n logger.info(\" 2. Check if any generated files were manually edited\");\n logger.info(\" 3. Block the commit if configs are out of sync\");\n console.log(\"\");\n logger.info(\"To skip the check: git commit --no-verify\");\n });\n}\n"],"mappings":"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","names":["readFileSync","dirname","join","projectPath","ProviderCapability","projectPath","projectPath","projectPath","join","existsSync","join","projectPath","existsSync","join","program","projectPath","join","join","readFileSync","existsSync","join","projectPath","join","existsSync","readFileSync","program","projectPath","join","program","projectPath","join","program","projectPath","join","__filename","__dirname","dirname","join","readFileSync"]}