ai-dot 0.1.0-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +95 -0
- package/dist/cli.js +3321 -0
- package/dist/index.cjs +3308 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +476 -0
- package/dist/index.d.ts +476 -0
- package/dist/index.js +3234 -0
- package/dist/index.js.map +1 -0
- package/package.json +71 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/add.ts","../src/tui.ts","../src/commands/check.ts","../src/config/loader.ts","../src/config/markdown-loader.ts","../src/config/schema.ts","../src/config/skill-loader.ts","../src/emitters/types.ts","../src/import/runner.ts","../src/import/parsers/claude.ts","../src/import/parsers/codex.ts","../src/import/parsers/cursor.ts","../src/import/parsers/opencode.ts","../src/import/scanner.ts","../src/import/writer.ts","../src/commands/import.ts","../src/commands/init.ts","../src/templates/blank.ts","../src/templates/minimal.ts","../src/templates/monorepo.ts","../src/templates/python.ts","../src/templates/web.ts","../src/templates/index.ts","../src/commands/sync.ts","../src/emitters/agents.ts","../src/emitters/directives.ts","../src/emitters/hooks.ts","../src/emitters/mcp.ts","../src/emitters/permissions.ts","../src/emitters/skills.ts","../src/state.ts","../src/commands/status.ts","../src/domain/factories.ts","../src/domain/hook.ts","../src/domain/permission.ts","../src/domain/scope.ts","../src/domain/tool-server.ts","../src/domain/type-guards.ts"],"sourcesContent":["import { existsSync } from \"node:fs\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { parse as parseYaml, stringify as stringifyYaml } from \"yaml\";\nimport { cancelGuard, confirm, intro, isTTY, outro, select, text } from \"../tui.js\";\n\n/** Supported entity types for the add command. */\nexport type AddEntityType = \"directive\" | \"agent\" | \"skill\" | \"mcp\";\n\nconst ENTITY_TYPES: AddEntityType[] = [\"directive\", \"agent\", \"skill\", \"mcp\"];\n\n/** Options for the add command. */\nexport interface AddOptions {\n\t/** MCP server command (stdio transport, non-interactive). */\n\tcommand?: string;\n\t/** MCP server URL (http/sse transport, non-interactive). */\n\turl?: string;\n}\n\nconst ENTITY_LABELS: Record<AddEntityType, string> = {\n\tdirective: \"Directive — project rules and conventions\",\n\tagent: \"Agent — specialized AI agent instructions\",\n\tskill: \"Skill — reusable AI skill definition\",\n\tmcp: \"MCP Server — tool server configuration\",\n};\n\n/** Scaffold individual directives, agents, skills, or MCP servers. */\nexport async function runAdd(\n\tprojectDir: string,\n\tentityType?: string,\n\tname?: string,\n\toptions?: AddOptions,\n): Promise<void> {\n\tconst aiDir = join(projectDir, \".ai\");\n\n\tif (!existsSync(aiDir)) {\n\t\tconsole.error(\"\\x1b[31mNo .ai/ directory found. Run \\x1b[1mai-dot init\\x1b[22m first.\\x1b[0m\");\n\t\tprocess.exitCode = 1;\n\t\treturn;\n\t}\n\n\t// Interactive prompts when type or name is missing\n\tif (!entityType || !name) {\n\t\tif (!isTTY()) {\n\t\t\tconsole.error(\"\\x1b[31mUsage: ai-dot add <type> <name>\\x1b[0m\");\n\t\t\tconsole.error(` Types: ${ENTITY_TYPES.join(\", \")}`);\n\t\t\tprocess.exitCode = 1;\n\t\t\treturn;\n\t\t}\n\n\t\tintro(\"ai-dot add\");\n\n\t\tif (!entityType) {\n\t\t\tentityType = cancelGuard(\n\t\t\t\tawait select({\n\t\t\t\t\tmessage: \"What would you like to add?\",\n\t\t\t\t\toptions: ENTITY_TYPES.map((t) => ({\n\t\t\t\t\t\tvalue: t,\n\t\t\t\t\t\tlabel: ENTITY_LABELS[t],\n\t\t\t\t\t})),\n\t\t\t\t}),\n\t\t\t) as string;\n\t\t}\n\n\t\tif (!ENTITY_TYPES.includes(entityType as AddEntityType)) {\n\t\t\tconsole.error(\n\t\t\t\t`\\x1b[31mUnknown entity type \"${entityType}\". Must be one of: ${ENTITY_TYPES.join(\", \")}\\x1b[0m`,\n\t\t\t);\n\t\t\tprocess.exitCode = 1;\n\t\t\treturn;\n\t\t}\n\n\t\tif (!name) {\n\t\t\tname = cancelGuard(\n\t\t\t\tawait text({\n\t\t\t\t\tmessage: `Name for the ${entityType}:`,\n\t\t\t\t\tplaceholder: entityType === \"mcp\" ? \"my-server\" : `my-${entityType}`,\n\t\t\t\t\tvalidate: (val) => {\n\t\t\t\t\t\tif (!val?.trim()) return \"Name is required\";\n\t\t\t\t\t\tif (!/^[a-z0-9][a-z0-9-]*$/.test(val!))\n\t\t\t\t\t\t\treturn \"Use lowercase letters, numbers, and hyphens\";\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t) as string;\n\t\t}\n\t}\n\n\tif (!ENTITY_TYPES.includes(entityType as AddEntityType)) {\n\t\tconsole.error(\n\t\t\t`\\x1b[31mUnknown entity type \"${entityType}\". Must be one of: ${ENTITY_TYPES.join(\", \")}\\x1b[0m`,\n\t\t);\n\t\tprocess.exitCode = 1;\n\t\treturn;\n\t}\n\n\tconst type = entityType as AddEntityType;\n\n\tswitch (type) {\n\t\tcase \"directive\":\n\t\t\tawait addDirective(aiDir, name);\n\t\t\tbreak;\n\t\tcase \"agent\":\n\t\t\tawait addAgent(aiDir, name);\n\t\t\tbreak;\n\t\tcase \"skill\":\n\t\t\tawait addSkill(aiDir, name);\n\t\t\tbreak;\n\t\tcase \"mcp\":\n\t\t\tawait addMcp(aiDir, name, options);\n\t\t\tbreak;\n\t}\n}\n\nasync function addDirective(aiDir: string, name: string): Promise<void> {\n\tconst dirPath = join(aiDir, \"directives\");\n\tawait mkdir(dirPath, { recursive: true });\n\n\tconst filePath = join(dirPath, `${name}.md`);\n\tif (await checkExistingFile(filePath)) return;\n\n\tconst content = `---\nscope: project\nalwaysApply: true\ndescription: ${name}\n---\n\n<!-- Add your directive content here -->\n`;\n\n\tawait writeFile(filePath, content, \"utf-8\");\n\tconsole.log(`\\x1b[32m+\\x1b[0m Created ${filePath}`);\n}\n\nasync function addAgent(aiDir: string, name: string): Promise<void> {\n\tconst dirPath = join(aiDir, \"agents\");\n\tawait mkdir(dirPath, { recursive: true });\n\n\tconst filePath = join(dirPath, `${name}.md`);\n\tif (await checkExistingFile(filePath)) return;\n\n\tconst content = `---\ndescription: ${name} agent\n---\n\n<!-- Add agent instructions here -->\n`;\n\n\tawait writeFile(filePath, content, \"utf-8\");\n\tconsole.log(`\\x1b[32m+\\x1b[0m Created ${filePath}`);\n}\n\nasync function addSkill(aiDir: string, name: string): Promise<void> {\n\tconst skillDir = join(aiDir, \"skills\", name);\n\tawait mkdir(skillDir, { recursive: true });\n\n\tconst filePath = join(skillDir, \"SKILL.md\");\n\tif (await checkExistingFile(filePath)) return;\n\n\tconst content = `---\ndescription: ${name} skill\n---\n\n<!-- Add skill instructions here -->\n`;\n\n\tawait writeFile(filePath, content, \"utf-8\");\n\tconsole.log(`\\x1b[32m+\\x1b[0m Created ${filePath}`);\n}\n\nasync function addMcp(aiDir: string, name: string, options?: AddOptions): Promise<void> {\n\tconst configPath = join(aiDir, \"config.yaml\");\n\n\tlet transport: string;\n\tlet command: string | undefined;\n\tlet url: string | undefined;\n\tlet args: string[] | undefined;\n\n\tif (options?.command) {\n\t\t// Non-interactive: stdio transport with command\n\t\ttransport = \"stdio\";\n\t\tconst parts = options.command.split(\" \");\n\t\tcommand = parts[0];\n\t\targs = parts.length > 1 ? parts.slice(1) : undefined;\n\t} else if (options?.url) {\n\t\t// Non-interactive: http/sse transport with url\n\t\ttransport = \"http\";\n\t\turl = options.url;\n\t} else if (isTTY()) {\n\t\t// Interactive mode\n\t\tintro(`Adding MCP server: ${name}`);\n\n\t\ttransport = cancelGuard(\n\t\t\tawait select({\n\t\t\t\tmessage: \"Transport type?\",\n\t\t\t\toptions: [\n\t\t\t\t\t{ value: \"stdio\", label: \"stdio — local command\" },\n\t\t\t\t\t{ value: \"http\", label: \"http — HTTP endpoint\" },\n\t\t\t\t\t{ value: \"sse\", label: \"sse — Server-Sent Events\" },\n\t\t\t\t],\n\t\t\t}),\n\t\t) as string;\n\n\t\tif (transport === \"stdio\") {\n\t\t\t// For non-interactive fallback we need at least the command flag\n\t\t\tconsole.error(\n\t\t\t\t\"\\x1b[31mstdio transport requires --command flag in non-interactive mode.\\x1b[0m\",\n\t\t\t);\n\t\t\tconsole.error(' Example: ai-dot add mcp myserver --command \"npx @some/server\"');\n\t\t\toutro(\"Cancelled.\");\n\t\t\tprocess.exitCode = 1;\n\t\t\treturn;\n\t\t}\n\n\t\t// http or sse — we can't prompt for text with clack select, so require --url\n\t\tconsole.error(\n\t\t\t`\\x1b[31m${transport} transport requires --url flag in non-interactive mode.\\x1b[0m`,\n\t\t);\n\t\tconsole.error(` Example: ai-dot add mcp myserver --url \"http://localhost:3000\"`);\n\t\toutro(\"Cancelled.\");\n\t\tprocess.exitCode = 1;\n\t\treturn;\n\t} else {\n\t\tconsole.error(\n\t\t\t\"\\x1b[31mMCP server requires --command or --url flag in non-interactive mode.\\x1b[0m\",\n\t\t);\n\t\tprocess.exitCode = 1;\n\t\treturn;\n\t}\n\n\t// Load existing config.yaml\n\tlet configObj: Record<string, unknown> = {};\n\tif (existsSync(configPath)) {\n\t\tconst raw = await readFile(configPath, \"utf-8\");\n\t\tconfigObj = (parseYaml(raw) as Record<string, unknown>) ?? {};\n\t}\n\n\t// Add server to mcpServers\n\tconst servers = (configObj.mcpServers as Record<string, unknown>) ?? {};\n\tconst serverEntry: Record<string, unknown> = { transport };\n\tif (command) serverEntry.command = command;\n\tif (url) serverEntry.url = url;\n\tif (args?.length) serverEntry.args = args;\n\tservers[name] = serverEntry;\n\tconfigObj.mcpServers = servers;\n\n\tawait writeFile(configPath, stringifyYaml(configObj), \"utf-8\");\n\tconsole.log(`\\x1b[32m+\\x1b[0m Added MCP server \"${name}\" to config.yaml`);\n}\n\n/**\n * Check if a file already exists.\n * In TTY mode, ask for confirmation to overwrite.\n * In non-TTY mode, error out.\n * Returns true if we should skip (file exists and user declined overwrite).\n */\nasync function checkExistingFile(filePath: string): Promise<boolean> {\n\tif (!existsSync(filePath)) return false;\n\n\tif (isTTY()) {\n\t\tconst overwrite = cancelGuard(\n\t\t\tawait confirm({\n\t\t\t\tmessage: `${filePath} already exists. Overwrite?`,\n\t\t\t\tinitialValue: false,\n\t\t\t}),\n\t\t);\n\t\treturn !overwrite;\n\t}\n\n\tconsole.error(`\\x1b[31m${filePath} already exists. Use interactive mode to overwrite.\\x1b[0m`);\n\tprocess.exitCode = 1;\n\treturn true;\n}\n","import {\n\tconfirm,\n\tintro,\n\tisCancel,\n\tmultiselect,\n\toutro,\n\tselect,\n\tspinner,\n\ttext,\n} from \"@clack/prompts\";\n\n/** Check if the current process is running in an interactive terminal. */\nexport function isTTY(): boolean {\n\treturn Boolean(process.stdin.isTTY && process.stdout.isTTY);\n}\n\n/** Guard against user cancellation in clack prompts. Exits cleanly if cancelled. */\nexport function cancelGuard<T>(value: T | symbol): T {\n\tif (isCancel(value)) {\n\t\toutro(\"Cancelled.\");\n\t\tprocess.exit(0);\n\t}\n\treturn value as T;\n}\n\nexport { confirm, intro, isCancel, multiselect, outro, select, spinner, text };\n","import { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { loadMergedConfig, loadProjectConfig } from \"../config/loader.js\";\nimport type { ConfigScope, ProjectConfig } from \"../config/schema.js\";\nimport { validateConfig } from \"../config/schema.js\";\nimport { ALL_TARGETS, type TargetTool } from \"../emitters/types.js\";\n\n/** Validate config and warn about unsupported features per target. */\nexport async function runCheck(projectDir: string, scope: ConfigScope = \"project\"): Promise<void> {\n\tconst isUserScope = scope === \"user\";\n\tconst label = isUserScope ? \"~/.ai/\" : \".ai/\";\n\n\tconsole.log(`Checking ${label} configuration...\\n`);\n\n\t// Load\n\tconst { config, errors: loadErrors } = isUserScope\n\t\t? await loadProjectConfig(join(homedir(), \".ai\"), \"user\")\n\t\t: await loadMergedConfig(projectDir);\n\n\tif (loadErrors.length > 0) {\n\t\tconsole.error(\"\\x1b[31mLoad errors:\\x1b[0m\");\n\t\tfor (const err of loadErrors) {\n\t\t\tconsole.error(` ${err.file}${err.line ? `:${err.line}` : \"\"}: ${err.message}`);\n\t\t}\n\t\tprocess.exitCode = 1;\n\t\treturn;\n\t}\n\n\t// Validate\n\tconst { valid, errors: valErrors } = validateConfig(config);\n\tif (!valid) {\n\t\tconsole.error(\"\\x1b[31mValidation errors:\\x1b[0m\");\n\t\tfor (const err of valErrors) {\n\t\t\tconsole.error(` ${err.file}: ${err.message}`);\n\t\t}\n\t\tprocess.exitCode = 1;\n\t\treturn;\n\t}\n\n\tconsole.log(\"\\x1b[32m✓\\x1b[0m Config is valid\\n\");\n\n\t// Summary\n\tprintSummary(config);\n\n\t// Per-target compatibility\n\tconsole.log(\"\\n\\x1b[1mTarget compatibility:\\x1b[0m\\n\");\n\tfor (const target of ALL_TARGETS) {\n\t\tcheckTarget(config, target);\n\t}\n}\n\nfunction printSummary(config: ProjectConfig): void {\n\tconst counts = [\n\t\t[\"Directives\", config.directives.length],\n\t\t[\"Skills\", config.skills.length],\n\t\t[\"Agents\", config.agents.length],\n\t\t[\"MCP Servers\", config.toolServers.length],\n\t\t[\"Permissions\", config.permissions.length],\n\t\t[\"Settings\", config.settings.length],\n\t\t[\"Hooks\", config.hooks.length],\n\t\t[\"Ignore patterns\", config.ignorePatterns.length],\n\t] as const;\n\n\tconsole.log(\"\\x1b[1mConfig summary:\\x1b[0m\");\n\tfor (const [label, count] of counts) {\n\t\tif (count > 0) {\n\t\t\tconsole.log(` ${label}: ${count}`);\n\t\t}\n\t}\n}\n\nfunction checkTarget(config: ProjectConfig, target: TargetTool): void {\n\tconst warnings: string[] = [];\n\n\tif (target === \"codex\") {\n\t\tif (config.hooks.length > 0) {\n\t\t\twarnings.push(\"Hooks are not supported — will be skipped\");\n\t\t}\n\t\tif (config.permissions.length > 0) {\n\t\t\twarnings.push(\"Per-tool permissions are lossy — mapped to approval_policy\");\n\t\t}\n\t\tif (config.directives.some((d) => d.appliesTo?.length)) {\n\t\t\twarnings.push(\"File-scoped directives are not enforced — included as notes only\");\n\t\t}\n\t\tif (config.agents.some((a) => a.tools?.length)) {\n\t\t\twarnings.push(\"Per-agent tool restrictions are not supported\");\n\t\t}\n\t}\n\n\tif (target === \"cursor\") {\n\t\tif (config.hooks.length > 0) {\n\t\t\twarnings.push(\"Hook support is limited — hooks not directly emitted\");\n\t\t}\n\t}\n\n\tconst icon = warnings.length > 0 ? \"\\x1b[33m⚠\\x1b[0m\" : \"\\x1b[32m✓\\x1b[0m\";\n\tconsole.log(` ${icon} ${target}`);\n\tfor (const w of warnings) {\n\t\tconsole.log(` - ${w}`);\n\t}\n}\n","import { readdir, readFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { parse as parseYaml } from \"yaml\";\nimport type { Agent } from \"../domain/agent.js\";\nimport type { Directive } from \"../domain/directive.js\";\nimport type { Hook, HookEvent } from \"../domain/hook.js\";\nimport type { Permission } from \"../domain/permission.js\";\nimport type { Scope } from \"../domain/scope.js\";\nimport type { ToolServer, Transport } from \"../domain/tool-server.js\";\nimport { loadMarkdownFile } from \"./markdown-loader.js\";\nimport type { ConfigError, ConfigScope, ProjectConfig } from \"./schema.js\";\nimport { emptyConfig, mergeConfigs } from \"./schema.js\";\nimport { loadSkills } from \"./skill-loader.js\";\n\n/** Result of loading a project config from `.ai/`. */\nexport interface LoadResult {\n\tconfig: ProjectConfig;\n\terrors: ConfigError[];\n}\n\n/** Load a full ProjectConfig from an `.ai/` directory. */\nexport async function loadProjectConfig(\n\taiDir: string,\n\tscope: ConfigScope = \"project\",\n): Promise<LoadResult> {\n\tconst config = emptyConfig();\n\tconst errors: ConfigError[] = [];\n\n\t// Load config.yaml\n\tconst configPath = join(aiDir, \"config.yaml\");\n\tawait loadConfigYaml(configPath, config, errors, scope);\n\n\t// Load directives\n\tconst directivesDir = join(aiDir, \"directives\");\n\tawait loadDirectives(directivesDir, config, errors, scope);\n\n\t// Load skills\n\tconst skillsDir = join(aiDir, \"skills\");\n\ttry {\n\t\tconfig.skills = await loadSkills(skillsDir);\n\t} catch {\n\t\t// skills directory doesn't exist — that's fine\n\t}\n\n\t// Load agents\n\tconst agentsDir = join(aiDir, \"agents\");\n\tawait loadAgents(agentsDir, config, errors);\n\n\treturn { config, errors };\n}\n\n/**\n * Load merged config: user-level ~/.ai/ as base, project .ai/ overrides.\n * Returns the combined config with correct scopes on each entity.\n */\nexport async function loadMergedConfig(projectDir: string): Promise<LoadResult> {\n\tconst userAiDir = join(homedir(), \".ai\");\n\tconst projectAiDir = join(projectDir, \".ai\");\n\n\tconst userResult = await loadProjectConfig(userAiDir, \"user\");\n\tconst projectResult = await loadProjectConfig(projectAiDir, \"project\");\n\n\tconst errors = [...userResult.errors, ...projectResult.errors];\n\tconst config = mergeConfigs(userResult.config, projectResult.config);\n\n\treturn { config, errors };\n}\n\nasync function loadConfigYaml(\n\tfilePath: string,\n\tconfig: ProjectConfig,\n\terrors: ConfigError[],\n\tscope: ConfigScope = \"project\",\n): Promise<void> {\n\tlet raw: string;\n\ttry {\n\t\traw = await readFile(filePath, \"utf-8\");\n\t} catch {\n\t\t// config.yaml is optional\n\t\treturn;\n\t}\n\n\tlet parsed: Record<string, unknown>;\n\ttry {\n\t\tparsed = parseYaml(raw) ?? {};\n\t} catch (e) {\n\t\terrors.push({\n\t\t\tfile: filePath,\n\t\t\tmessage: `Invalid YAML: ${e instanceof Error ? e.message : String(e)}`,\n\t\t});\n\t\treturn;\n\t}\n\n\tif (typeof parsed !== \"object\" || parsed === null) {\n\t\terrors.push({ file: filePath, message: \"config.yaml must be a YAML mapping\" });\n\t\treturn;\n\t}\n\n\t// Parse MCP servers\n\tif (parsed.mcpServers && typeof parsed.mcpServers === \"object\") {\n\t\tfor (const [name, raw] of Object.entries(parsed.mcpServers as Record<string, unknown>)) {\n\t\t\tconst server = parseToolServer(name, raw, filePath, errors, scope);\n\t\t\tif (server) config.toolServers.push(server);\n\t\t}\n\t}\n\n\t// Parse permissions\n\tif (Array.isArray(parsed.permissions)) {\n\t\tfor (const raw of parsed.permissions) {\n\t\t\tconst perm = parsePermission(raw, filePath, errors, scope);\n\t\t\tif (perm) config.permissions.push(perm);\n\t\t}\n\t}\n\n\t// Parse settings\n\tif (parsed.settings && typeof parsed.settings === \"object\") {\n\t\tfor (const [key, value] of Object.entries(parsed.settings as Record<string, unknown>)) {\n\t\t\tconfig.settings.push({ key, value, scope: scope as Scope });\n\t\t}\n\t}\n\n\t// Parse hooks\n\tif (Array.isArray(parsed.hooks)) {\n\t\tfor (const raw of parsed.hooks) {\n\t\t\tconst hook = parseHook(raw, filePath, errors, scope);\n\t\t\tif (hook) config.hooks.push(hook);\n\t\t}\n\t}\n\n\t// Parse ignore patterns\n\tif (Array.isArray(parsed.ignore)) {\n\t\tfor (const raw of parsed.ignore) {\n\t\t\tif (typeof raw === \"string\") {\n\t\t\t\tconfig.ignorePatterns.push({ pattern: raw, scope: scope as \"project\" | \"user\" });\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction parseToolServer(\n\tname: string,\n\traw: unknown,\n\tfile: string,\n\terrors: ConfigError[],\n\tscope: ConfigScope = \"project\",\n): ToolServer | null {\n\tif (typeof raw !== \"object\" || raw === null) {\n\t\terrors.push({ file, message: `mcpServers.${name} must be an object` });\n\t\treturn null;\n\t}\n\tconst obj = raw as Record<string, unknown>;\n\tconst transport = (typeof obj.transport === \"string\" ? obj.transport : \"stdio\") as Transport;\n\treturn {\n\t\tname,\n\t\ttransport,\n\t\tcommand: typeof obj.command === \"string\" ? obj.command : undefined,\n\t\turl: typeof obj.url === \"string\" ? obj.url : undefined,\n\t\targs: Array.isArray(obj.args) ? obj.args.map(String) : undefined,\n\t\tenv:\n\t\t\ttypeof obj.env === \"object\" && obj.env !== null\n\t\t\t\t? Object.fromEntries(\n\t\t\t\t\t\tObject.entries(obj.env as Record<string, unknown>).map(([k, v]) => [k, String(v)]),\n\t\t\t\t\t)\n\t\t\t\t: undefined,\n\t\tenabledTools: Array.isArray(obj.enabledTools) ? obj.enabledTools.map(String) : undefined,\n\t\tdisabledTools: Array.isArray(obj.disabledTools) ? obj.disabledTools.map(String) : undefined,\n\t\tscope: scope as Scope,\n\t};\n}\n\nfunction parsePermission(\n\traw: unknown,\n\tfile: string,\n\terrors: ConfigError[],\n\tscope: ConfigScope = \"project\",\n): Permission | null {\n\tif (typeof raw !== \"object\" || raw === null) {\n\t\terrors.push({ file, message: \"Permission entry must be an object\" });\n\t\treturn null;\n\t}\n\tconst obj = raw as Record<string, unknown>;\n\tif (typeof obj.tool !== \"string\" || typeof obj.decision !== \"string\") {\n\t\terrors.push({ file, message: \"Permission requires 'tool' and 'decision' fields\" });\n\t\treturn null;\n\t}\n\treturn {\n\t\ttool: obj.tool,\n\t\tpattern: typeof obj.pattern === \"string\" ? obj.pattern : undefined,\n\t\tdecision: obj.decision as Permission[\"decision\"],\n\t\tscope: scope as Scope,\n\t};\n}\n\nfunction parseHook(\n\traw: unknown,\n\tfile: string,\n\terrors: ConfigError[],\n\tscope: ConfigScope = \"project\",\n): Hook | null {\n\tif (typeof raw !== \"object\" || raw === null) {\n\t\terrors.push({ file, message: \"Hook entry must be an object\" });\n\t\treturn null;\n\t}\n\tconst obj = raw as Record<string, unknown>;\n\tif (typeof obj.event !== \"string\" || typeof obj.handler !== \"string\") {\n\t\terrors.push({ file, message: \"Hook requires 'event' and 'handler' fields\" });\n\t\treturn null;\n\t}\n\treturn {\n\t\tevent: obj.event as HookEvent,\n\t\tmatcher: typeof obj.matcher === \"string\" ? obj.matcher : undefined,\n\t\thandler: obj.handler,\n\t\tscope: scope as Scope,\n\t};\n}\n\nasync function loadDirectives(\n\tdirectivesDir: string,\n\tconfig: ProjectConfig,\n\terrors: ConfigError[],\n\tscope: ConfigScope = \"project\",\n): Promise<void> {\n\tlet files: string[];\n\ttry {\n\t\tfiles = await readdir(directivesDir);\n\t} catch {\n\t\treturn; // directory doesn't exist\n\t}\n\n\tfor (const file of files.filter((f) => f.endsWith(\".md\"))) {\n\t\tconst filePath = join(directivesDir, file);\n\t\ttry {\n\t\t\tconst { frontmatter, body } = await loadMarkdownFile(filePath);\n\t\t\tconst directive: Directive = {\n\t\t\t\tcontent: body,\n\t\t\t\tscope: (typeof frontmatter.scope === \"string\" ? frontmatter.scope : scope) as Scope,\n\t\t\t\talwaysApply: frontmatter.alwaysApply !== false,\n\t\t\t\tappliesTo: Array.isArray(frontmatter.appliesTo)\n\t\t\t\t\t? frontmatter.appliesTo.map(String)\n\t\t\t\t\t: typeof frontmatter.appliesTo === \"string\"\n\t\t\t\t\t\t? [frontmatter.appliesTo]\n\t\t\t\t\t\t: undefined,\n\t\t\t\tdescription:\n\t\t\t\t\ttypeof frontmatter.description === \"string\"\n\t\t\t\t\t\t? frontmatter.description\n\t\t\t\t\t\t: file.replace(/\\.md$/, \"\"),\n\t\t\t};\n\t\t\tconfig.directives.push(directive);\n\t\t} catch (e) {\n\t\t\terrors.push({\n\t\t\t\tfile: filePath,\n\t\t\t\tmessage: `Failed to parse: ${e instanceof Error ? e.message : String(e)}`,\n\t\t\t});\n\t\t}\n\t}\n}\n\nasync function loadAgents(\n\tagentsDir: string,\n\tconfig: ProjectConfig,\n\terrors: ConfigError[],\n): Promise<void> {\n\tlet files: string[];\n\ttry {\n\t\tfiles = await readdir(agentsDir);\n\t} catch {\n\t\treturn; // directory doesn't exist\n\t}\n\n\tfor (const file of files.filter((f) => f.endsWith(\".md\"))) {\n\t\tconst filePath = join(agentsDir, file);\n\t\ttry {\n\t\t\tconst { frontmatter, body } = await loadMarkdownFile(filePath);\n\t\t\tconst agent: Agent = {\n\t\t\t\tname: file.replace(/\\.md$/, \"\"),\n\t\t\t\tdescription: typeof frontmatter.description === \"string\" ? frontmatter.description : \"\",\n\t\t\t\tinstructions: body,\n\t\t\t\tmodel: typeof frontmatter.model === \"string\" ? frontmatter.model : undefined,\n\t\t\t\treadonly: frontmatter.readonly === true ? true : undefined,\n\t\t\t\ttools: Array.isArray(frontmatter.tools) ? frontmatter.tools.map(String) : undefined,\n\t\t\t};\n\t\t\tconfig.agents.push(agent);\n\t\t} catch (e) {\n\t\t\terrors.push({\n\t\t\t\tfile: filePath,\n\t\t\t\tmessage: `Failed to parse: ${e instanceof Error ? e.message : String(e)}`,\n\t\t\t});\n\t\t}\n\t}\n}\n","import { readFile } from \"node:fs/promises\";\n\n/** Parsed result of a markdown file with YAML frontmatter. */\nexport interface ParsedMarkdown {\n\t/** Frontmatter key-value pairs. */\n\tfrontmatter: Record<string, unknown>;\n\t/** Markdown body after frontmatter. */\n\tbody: string;\n}\n\n/**\n * Parse a markdown string with optional YAML frontmatter.\n *\n * Frontmatter is delimited by `---` at the start of the file.\n * Uses a simple parser to avoid pulling in a full YAML library for frontmatter\n * (the main config.yaml uses the `yaml` package).\n */\nexport function parseMarkdownWithFrontmatter(raw: string): ParsedMarkdown {\n\tconst trimmed = raw.trimStart();\n\tif (!trimmed.startsWith(\"---\")) {\n\t\treturn { frontmatter: {}, body: raw.trim() };\n\t}\n\n\tconst endIndex = trimmed.indexOf(\"---\", 3);\n\tif (endIndex === -1) {\n\t\treturn { frontmatter: {}, body: raw.trim() };\n\t}\n\n\tconst frontmatterBlock = trimmed.slice(3, endIndex).trim();\n\tconst body = trimmed.slice(endIndex + 3).trim();\n\n\tconst frontmatter: Record<string, unknown> = {};\n\tfor (const line of frontmatterBlock.split(\"\\n\")) {\n\t\tconst colonIdx = line.indexOf(\":\");\n\t\tif (colonIdx === -1) continue;\n\n\t\tconst key = line.slice(0, colonIdx).trim();\n\t\tconst rawValue = line.slice(colonIdx + 1).trim();\n\t\tfrontmatter[key] = parseFrontmatterValue(rawValue);\n\t}\n\n\treturn { frontmatter, body };\n}\n\n/** Parse a simple frontmatter value (booleans, numbers, arrays, strings). */\nfunction parseFrontmatterValue(raw: string): unknown {\n\tif (raw === \"true\") return true;\n\tif (raw === \"false\") return false;\n\tif (raw === \"\") return \"\";\n\tif (/^-?\\d+(\\.\\d+)?$/.test(raw)) return Number(raw);\n\n\t// Simple inline array: [a, b, c]\n\tif (raw.startsWith(\"[\") && raw.endsWith(\"]\")) {\n\t\tconst inner = raw.slice(1, -1).trim();\n\t\tif (!inner) return [];\n\t\treturn inner.split(\",\").map((s) => {\n\t\t\tconst v = s.trim();\n\t\t\t// Strip quotes\n\t\t\tif ((v.startsWith('\"') && v.endsWith('\"')) || (v.startsWith(\"'\") && v.endsWith(\"'\"))) {\n\t\t\t\treturn v.slice(1, -1);\n\t\t\t}\n\t\t\treturn v;\n\t\t});\n\t}\n\n\t// Strip quotes from string values\n\tif ((raw.startsWith('\"') && raw.endsWith('\"')) || (raw.startsWith(\"'\") && raw.endsWith(\"'\"))) {\n\t\treturn raw.slice(1, -1);\n\t}\n\n\treturn raw;\n}\n\n/** Load and parse a markdown file with frontmatter from disk. */\nexport async function loadMarkdownFile(filePath: string): Promise<ParsedMarkdown> {\n\tconst content = await readFile(filePath, \"utf-8\");\n\treturn parseMarkdownWithFrontmatter(content);\n}\n","import type { Agent } from \"../domain/agent.js\";\nimport type { Directive } from \"../domain/directive.js\";\nimport type { Hook } from \"../domain/hook.js\";\nimport type { IgnorePattern } from \"../domain/ignore-pattern.js\";\nimport type { Permission } from \"../domain/permission.js\";\nimport type { Setting } from \"../domain/settings.js\";\nimport type { Skill } from \"../domain/skill.js\";\nimport type { ToolServer } from \"../domain/tool-server.js\";\n\n/** Aggregated project configuration loaded from `.ai/`. */\nexport interface ProjectConfig {\n\tdirectives: Directive[];\n\tskills: Skill[];\n\tagents: Agent[];\n\ttoolServers: ToolServer[];\n\thooks: Hook[];\n\tpermissions: Permission[];\n\tsettings: Setting[];\n\tignorePatterns: IgnorePattern[];\n}\n\n/** A validation error with location context. */\nexport interface ConfigError {\n\tfile: string;\n\tline?: number;\n\tmessage: string;\n}\n\n/** Result of config validation. */\nexport interface ValidationResult {\n\tvalid: boolean;\n\terrors: ConfigError[];\n}\n\n/** The scope at which config was loaded. */\nexport type ConfigScope = \"user\" | \"project\";\n\n/** Create an empty ProjectConfig. */\nexport function emptyConfig(): ProjectConfig {\n\treturn {\n\t\tdirectives: [],\n\t\tskills: [],\n\t\tagents: [],\n\t\ttoolServers: [],\n\t\thooks: [],\n\t\tpermissions: [],\n\t\tsettings: [],\n\t\tignorePatterns: [],\n\t};\n}\n\n/**\n * Merge two configs: base (user) + override (project).\n * Project-level entities are appended after user-level ones.\n * For settings with the same key, project overrides user.\n */\nexport function mergeConfigs(base: ProjectConfig, override: ProjectConfig): ProjectConfig {\n\t// For settings, project overrides user by key\n\tconst mergedSettings = [...base.settings];\n\tfor (const setting of override.settings) {\n\t\tconst idx = mergedSettings.findIndex((s) => s.key === setting.key);\n\t\tif (idx >= 0) {\n\t\t\tmergedSettings[idx] = setting;\n\t\t} else {\n\t\t\tmergedSettings.push(setting);\n\t\t}\n\t}\n\n\t// For tool servers, project overrides user by name\n\tconst mergedServers = [...base.toolServers];\n\tfor (const server of override.toolServers) {\n\t\tconst idx = mergedServers.findIndex((s) => s.name === server.name);\n\t\tif (idx >= 0) {\n\t\t\tmergedServers[idx] = server;\n\t\t} else {\n\t\t\tmergedServers.push(server);\n\t\t}\n\t}\n\n\treturn {\n\t\tdirectives: [...base.directives, ...override.directives],\n\t\tskills: [...base.skills, ...override.skills],\n\t\tagents: [...base.agents, ...override.agents],\n\t\ttoolServers: mergedServers,\n\t\thooks: [...base.hooks, ...override.hooks],\n\t\tpermissions: [...base.permissions, ...override.permissions],\n\t\tsettings: mergedSettings,\n\t\tignorePatterns: [...base.ignorePatterns, ...override.ignorePatterns],\n\t};\n}\n\n/** Validate a ProjectConfig and return errors. */\nexport function validateConfig(config: ProjectConfig): ValidationResult {\n\tconst errors: ConfigError[] = [];\n\n\tfor (const d of config.directives) {\n\t\tif (!d.content.trim()) {\n\t\t\terrors.push({ file: \"directives\", message: \"Directive has empty content\" });\n\t\t}\n\t}\n\n\tfor (const s of config.skills) {\n\t\tif (!s.name.trim()) {\n\t\t\terrors.push({ file: \"skills\", message: \"Skill has empty name\" });\n\t\t}\n\t\tif (!s.content.trim()) {\n\t\t\terrors.push({ file: `skills/${s.name}`, message: \"Skill has empty content\" });\n\t\t}\n\t}\n\n\tfor (const a of config.agents) {\n\t\tif (!a.name.trim()) {\n\t\t\terrors.push({ file: \"agents\", message: \"Agent has empty name\" });\n\t\t}\n\t\tif (!a.instructions.trim()) {\n\t\t\terrors.push({ file: `agents/${a.name}`, message: \"Agent has empty instructions\" });\n\t\t}\n\t}\n\n\tfor (const ts of config.toolServers) {\n\t\tif (!ts.name.trim()) {\n\t\t\terrors.push({ file: \"config.yaml\", message: \"ToolServer has empty name\" });\n\t\t}\n\t\tif (ts.transport === \"stdio\" && !ts.command) {\n\t\t\terrors.push({\n\t\t\t\tfile: \"config.yaml\",\n\t\t\t\tmessage: `ToolServer \"${ts.name}\" uses stdio transport but has no command`,\n\t\t\t});\n\t\t}\n\t\tif ((ts.transport === \"http\" || ts.transport === \"sse\") && !ts.url) {\n\t\t\terrors.push({\n\t\t\t\tfile: \"config.yaml\",\n\t\t\t\tmessage: `ToolServer \"${ts.name}\" uses ${ts.transport} transport but has no url`,\n\t\t\t});\n\t\t}\n\t}\n\n\tfor (const p of config.permissions) {\n\t\tif (!p.tool.trim()) {\n\t\t\terrors.push({ file: \"config.yaml\", message: \"Permission has empty tool\" });\n\t\t}\n\t}\n\n\treturn { valid: errors.length === 0, errors };\n}\n","import { readdir, readFile, stat } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { Skill } from \"../domain/skill.js\";\n\n/**\n * Scan `.ai/skills/` for skill directories.\n * Each skill is a directory containing a SKILL.md file.\n */\nexport async function loadSkills(skillsDir: string): Promise<Skill[]> {\n\tconst entries = await readdir(skillsDir).catch(() => []);\n\tconst skills: Skill[] = [];\n\n\tfor (const entry of entries) {\n\t\tconst skillDir = join(skillsDir, entry);\n\t\tconst skillStat = await stat(skillDir).catch(() => null);\n\t\tif (!skillStat?.isDirectory()) continue;\n\n\t\tconst skillFile = join(skillDir, \"SKILL.md\");\n\t\tconst content = await readFile(skillFile, \"utf-8\").catch(() => null);\n\t\tif (content === null) continue;\n\n\t\tskills.push({\n\t\t\tname: entry,\n\t\t\tdescription: extractDescription(content),\n\t\t\tcontent,\n\t\t\tdisableAutoInvocation: false,\n\t\t});\n\t}\n\n\treturn skills;\n}\n\n/** Extract a description from the first paragraph or heading of SKILL.md. */\nfunction extractDescription(content: string): string {\n\tconst lines = content.split(\"\\n\");\n\tfor (const line of lines) {\n\t\tconst trimmed = line.trim();\n\t\t// Skip empty lines and headings\n\t\tif (!trimmed || trimmed.startsWith(\"#\")) continue;\n\t\t// Return first non-empty, non-heading line as description\n\t\treturn trimmed.length > 100 ? `${trimmed.slice(0, 97)}...` : trimmed;\n\t}\n\treturn \"\";\n}\n","import type { ProjectConfig } from \"../config/schema.js\";\n\n/** Target AI tool for config generation. */\nexport const TargetTool = {\n\tClaude: \"claude\",\n\tCursor: \"cursor\",\n\tCodex: \"codex\",\n\tOpenCode: \"opencode\",\n\tCopilot: \"copilot\",\n\tAntigravity: \"antigravity\",\n} as const;\n\nexport type TargetTool = (typeof TargetTool)[keyof typeof TargetTool];\n\n/** All supported target tools. */\nexport const ALL_TARGETS: readonly TargetTool[] = [\n\tTargetTool.Claude,\n\tTargetTool.Cursor,\n\tTargetTool.Codex,\n\tTargetTool.OpenCode,\n\tTargetTool.Copilot,\n\tTargetTool.Antigravity,\n];\n\n/** A file written by an emitter. */\nexport interface EmittedFile {\n\t/** Relative path from the project root. */\n\tpath: string;\n\t/** File content. */\n\tcontent: string;\n}\n\n/** Result of an emit operation. */\nexport interface EmitResult {\n\t/** Files that were written (or would be written in dry-run). */\n\tfiles: EmittedFile[];\n\t/** Warnings about lossy mappings or unsupported features. */\n\twarnings: string[];\n}\n\n/** Interface that all emitters implement. */\nexport interface Emitter {\n\t/** Emit config files for a specific target tool. */\n\temit(config: ProjectConfig, target: TargetTool): EmitResult;\n}\n","import { join } from \"node:path\";\nimport { loadProjectConfig } from \"../config/loader.js\";\nimport type { ProjectConfig } from \"../config/schema.js\";\nimport { emptyConfig, mergeConfigs } from \"../config/schema.js\";\nimport { parseClaude } from \"./parsers/claude.js\";\nimport { parseCodex } from \"./parsers/codex.js\";\nimport { parseCursor } from \"./parsers/cursor.js\";\nimport { parseOpenCode } from \"./parsers/opencode.js\";\nimport type { DetectedFile, SourceTool } from \"./scanner.js\";\nimport { scanForConfigs } from \"./scanner.js\";\nimport { writeProjectConfig } from \"./writer.js\";\n\n/** Options for running an import. */\nexport interface ImportOptions {\n\tinteractive: boolean;\n\tsourceFilter?: SourceTool;\n\t/** In interactive mode, this function selects which files to import. */\n\tselectFiles?: (detected: DetectedFile[]) => Promise<DetectedFile[]>;\n}\n\n/** Result of an import operation. */\nexport interface ImportResult {\n\tdetected: DetectedFile[];\n\timported: DetectedFile[];\n\tconfig: ProjectConfig;\n\tfilesWritten: string[];\n}\n\n/** Run the import pipeline: scan → select → parse → merge → write. */\nexport async function runImport(projectDir: string, options: ImportOptions): Promise<ImportResult> {\n\tconst detected = await scanForConfigs(projectDir);\n\n\t// Filter by source if specified\n\tconst filtered = options.sourceFilter\n\t\t? detected.filter((f) => f.source === options.sourceFilter)\n\t\t: detected;\n\n\tif (filtered.length === 0) {\n\t\treturn { detected, imported: [], config: emptyConfig(), filesWritten: [] };\n\t}\n\n\t// Select files (interactive or all)\n\tconst selected = options.selectFiles ? await options.selectFiles(filtered) : filtered;\n\n\tif (selected.length === 0) {\n\t\treturn { detected, imported: [], config: emptyConfig(), filesWritten: [] };\n\t}\n\n\t// Group by source and parse\n\tconst bySource = groupBySource(selected);\n\tlet importedConfig = emptyConfig();\n\n\t// Parse in priority order: claude > cursor > codex\n\tif (bySource.claude.length > 0) {\n\t\tconst partial = await parseClaude(projectDir, bySource.claude);\n\t\timportedConfig = mergeConfigs(importedConfig, toFull(partial));\n\t}\n\tif (bySource.cursor.length > 0) {\n\t\tconst partial = await parseCursor(projectDir, bySource.cursor);\n\t\timportedConfig = mergeConfigs(importedConfig, toFull(partial));\n\t}\n\tif (bySource.codex.length > 0) {\n\t\tconst partial = await parseCodex(projectDir, bySource.codex);\n\t\timportedConfig = mergeConfigs(importedConfig, toFull(partial));\n\t}\n\tif (bySource.opencode.length > 0) {\n\t\tconst partial = await parseOpenCode(projectDir, bySource.opencode);\n\t\timportedConfig = mergeConfigs(importedConfig, toFull(partial));\n\t}\n\n\t// Deduplicate MCP servers by name (first wins due to parse order)\n\timportedConfig.toolServers = deduplicateByName(importedConfig.toolServers);\n\n\t// If .ai/ exists, load it and merge (existing .ai/ takes precedence)\n\tconst aiDir = join(projectDir, \".ai\");\n\ttry {\n\t\tconst existing = await loadProjectConfig(aiDir, \"project\");\n\t\tif (hasContent(existing.config)) {\n\t\t\timportedConfig = mergeConfigs(importedConfig, existing.config);\n\t\t}\n\t} catch {\n\t\t// No existing .ai/\n\t}\n\n\t// Write\n\tconst filesWritten = await writeProjectConfig(aiDir, importedConfig);\n\n\treturn {\n\t\tdetected,\n\t\timported: selected,\n\t\tconfig: importedConfig,\n\t\tfilesWritten,\n\t};\n}\n\nfunction groupBySource(files: DetectedFile[]): Record<SourceTool, DetectedFile[]> {\n\tconst result: Record<SourceTool, DetectedFile[]> = {\n\t\tclaude: [],\n\t\tcursor: [],\n\t\tcodex: [],\n\t\topencode: [],\n\t};\n\tfor (const f of files) {\n\t\tresult[f.source].push(f);\n\t}\n\treturn result;\n}\n\nfunction toFull(partial: Partial<ProjectConfig>): ProjectConfig {\n\treturn { ...emptyConfig(), ...partial };\n}\n\nfunction deduplicateByName<T extends { name: string }>(items: T[]): T[] {\n\tconst seen = new Set<string>();\n\treturn items.filter((item) => {\n\t\tif (seen.has(item.name)) return false;\n\t\tseen.add(item.name);\n\t\treturn true;\n\t});\n}\n\nfunction hasContent(config: ProjectConfig): boolean {\n\treturn (\n\t\tconfig.directives.length > 0 ||\n\t\tconfig.skills.length > 0 ||\n\t\tconfig.agents.length > 0 ||\n\t\tconfig.toolServers.length > 0 ||\n\t\tconfig.hooks.length > 0 ||\n\t\tconfig.permissions.length > 0 ||\n\t\tconfig.settings.length > 0 ||\n\t\tconfig.ignorePatterns.length > 0\n\t);\n}\n","import { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { ProjectConfig } from \"../../config/schema.js\";\nimport { emptyConfig } from \"../../config/schema.js\";\nimport { loadSkills } from \"../../config/skill-loader.js\";\nimport type { DetectedFile } from \"../scanner.js\";\n\n/** Parse Claude Code config files into a partial ProjectConfig. */\nexport async function parseClaude(\n\tprojectDir: string,\n\tfiles: DetectedFile[],\n): Promise<Partial<ProjectConfig>> {\n\tconst config = emptyConfig();\n\n\tfor (const file of files) {\n\t\tswitch (file.kind) {\n\t\t\tcase \"directives\":\n\t\t\t\tif (file.relativePath === \"CLAUDE.md\") {\n\t\t\t\t\tawait parseClaudeMd(file.path, config);\n\t\t\t\t} else {\n\t\t\t\t\tawait parseClaudeRule(file.path, config);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"mcp\":\n\t\t\t\tawait parseMcpJson(file.path, config);\n\t\t\t\tbreak;\n\t\t\tcase \"settings\":\n\t\t\t\tawait parseClaudeSettings(file.path, config);\n\t\t\t\tbreak;\n\t\t\tcase \"agents\":\n\t\t\t\tawait parseClaudeAgent(file.path, config);\n\t\t\t\tbreak;\n\t\t\tcase \"skills\": {\n\t\t\t\tconst skillsDir = join(projectDir, \".claude\", \"skills\");\n\t\t\t\ttry {\n\t\t\t\t\tconfig.skills = await loadSkills(skillsDir);\n\t\t\t\t} catch {\n\t\t\t\t\t// skills dir may not be loadable\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn config;\n}\n\nasync function parseClaudeMd(filePath: string, config: ProjectConfig): Promise<void> {\n\tconst raw = await readFile(filePath, \"utf-8\").catch(() => null);\n\tif (!raw) return;\n\n\tconst sections = raw.split(\"\\n\\n---\\n\\n\");\n\tfor (const section of sections) {\n\t\tconst content = section.trim();\n\t\tif (!content) continue;\n\t\tconfig.directives.push({\n\t\t\tcontent,\n\t\t\tscope: \"project\",\n\t\t\talwaysApply: true,\n\t\t\tdescription: extractHeading(content),\n\t\t});\n\t}\n}\n\nasync function parseClaudeRule(filePath: string, config: ProjectConfig): Promise<void> {\n\tconst raw = await readFile(filePath, \"utf-8\").catch(() => null);\n\tif (!raw) return;\n\n\tlet content = raw.trim();\n\tlet appliesTo: string[] | undefined;\n\n\t// Extract <!-- applies to: ... --> comment\n\tconst match = content.match(/^<!--\\s*applies to:\\s*(.+?)\\s*-->\\s*\\n*/);\n\tif (match) {\n\t\tappliesTo = match[1].split(\",\").map((s) => s.trim());\n\t\tcontent = content.slice(match[0].length).trim();\n\t}\n\n\tconfig.directives.push({\n\t\tcontent,\n\t\tscope: \"project\",\n\t\talwaysApply: !appliesTo,\n\t\tappliesTo,\n\t\tdescription: extractHeading(content),\n\t});\n}\n\nasync function parseMcpJson(filePath: string, config: ProjectConfig): Promise<void> {\n\tconst raw = await readFile(filePath, \"utf-8\").catch(() => null);\n\tif (!raw) return;\n\n\ttry {\n\t\tconst parsed = JSON.parse(raw);\n\t\tconst servers = parsed.mcpServers ?? parsed;\n\t\tif (typeof servers !== \"object\" || servers === null) return;\n\n\t\tfor (const [name, entry] of Object.entries(servers)) {\n\t\t\tconst obj = entry as Record<string, unknown>;\n\t\t\tconfig.toolServers.push({\n\t\t\t\tname,\n\t\t\t\ttransport: (typeof obj.type === \"string\" ? obj.type : \"stdio\") as \"stdio\" | \"http\" | \"sse\",\n\t\t\t\tcommand: typeof obj.command === \"string\" ? obj.command : undefined,\n\t\t\t\turl: typeof obj.url === \"string\" ? obj.url : undefined,\n\t\t\t\targs: Array.isArray(obj.args) ? obj.args.map(String) : undefined,\n\t\t\t\tenv:\n\t\t\t\t\ttypeof obj.env === \"object\" && obj.env !== null\n\t\t\t\t\t\t? Object.fromEntries(\n\t\t\t\t\t\t\t\tObject.entries(obj.env as Record<string, unknown>).map(([k, v]) => [k, String(v)]),\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t: undefined,\n\t\t\t\tscope: \"project\",\n\t\t\t});\n\t\t}\n\t} catch {\n\t\t// Invalid JSON\n\t}\n}\n\nasync function parseClaudeSettings(filePath: string, config: ProjectConfig): Promise<void> {\n\tconst raw = await readFile(filePath, \"utf-8\").catch(() => null);\n\tif (!raw) return;\n\n\ttry {\n\t\tconst parsed = JSON.parse(raw);\n\n\t\t// Parse permissions\n\t\tif (parsed.permissions) {\n\t\t\tconst perms = parsed.permissions;\n\t\t\tfor (const rule of perms.allow ?? []) {\n\t\t\t\tconst p = parsePermissionRule(rule, \"allow\");\n\t\t\t\tif (p) {\n\t\t\t\t\t// Check if this is an ignore pattern (paired Read/Edit deny)\n\t\t\t\t\tconfig.permissions.push(p);\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor (const rule of perms.deny ?? []) {\n\t\t\t\tconst p = parsePermissionRule(rule, \"deny\");\n\t\t\t\tif (p) {\n\t\t\t\t\t// Detect ignore patterns: paired Read(X) + Edit(X) deny rules\n\t\t\t\t\tif (p.tool === \"Read\" || p.tool === \"Edit\") {\n\t\t\t\t\t\tconst pattern = p.pattern;\n\t\t\t\t\t\tif (pattern) {\n\t\t\t\t\t\t\tconst existing = config.ignorePatterns.find((ip) => ip.pattern === pattern);\n\t\t\t\t\t\t\tif (!existing) {\n\t\t\t\t\t\t\t\tconfig.ignorePatterns.push({ pattern, scope: \"project\" });\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconfig.permissions.push(p);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Parse hooks\n\t\tif (parsed.hooks && typeof parsed.hooks === \"object\") {\n\t\t\tfor (const [event, entries] of Object.entries(parsed.hooks)) {\n\t\t\t\tif (!Array.isArray(entries)) continue;\n\t\t\t\tfor (const entry of entries) {\n\t\t\t\t\tconst obj = entry as Record<string, unknown>;\n\t\t\t\t\tif (typeof obj.command !== \"string\") continue;\n\t\t\t\t\tconfig.hooks.push({\n\t\t\t\t\t\tevent: event as\n\t\t\t\t\t\t\t| \"preToolUse\"\n\t\t\t\t\t\t\t| \"postToolUse\"\n\t\t\t\t\t\t\t| \"preFileEdit\"\n\t\t\t\t\t\t\t| \"postFileEdit\"\n\t\t\t\t\t\t\t| \"sessionStart\"\n\t\t\t\t\t\t\t| \"sessionEnd\",\n\t\t\t\t\t\thandler: obj.command,\n\t\t\t\t\t\tmatcher: typeof obj.matcher === \"string\" ? obj.matcher : undefined,\n\t\t\t\t\t\tscope: \"project\",\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Parse remaining settings (exclude known keys)\n\t\tconst knownKeys = new Set([\"permissions\", \"hooks\"]);\n\t\tfor (const [key, value] of Object.entries(parsed)) {\n\t\t\tif (!knownKeys.has(key)) {\n\t\t\t\tconfig.settings.push({ key, value, scope: \"project\" });\n\t\t\t}\n\t\t}\n\t} catch {\n\t\t// Invalid JSON\n\t}\n}\n\nfunction parsePermissionRule(\n\trule: string,\n\tdecision: \"allow\" | \"deny\",\n): { tool: string; pattern?: string; decision: \"allow\" | \"deny\"; scope: \"project\" } | null {\n\tconst match = rule.match(/^(\\w+)\\((.+)\\)$/);\n\tif (match) {\n\t\treturn { tool: match[1], pattern: match[2], decision, scope: \"project\" };\n\t}\n\treturn { tool: rule, decision, scope: \"project\" };\n}\n\nasync function parseClaudeAgent(filePath: string, config: ProjectConfig): Promise<void> {\n\tconst raw = await readFile(filePath, \"utf-8\").catch(() => null);\n\tif (!raw) return;\n\n\tconst name = filePath.split(\"/\").pop()?.replace(/\\.md$/, \"\") ?? \"agent\";\n\tconfig.agents.push({\n\t\tname,\n\t\tdescription: \"\",\n\t\tinstructions: raw.trim(),\n\t});\n}\n\nfunction extractHeading(content: string): string {\n\tconst match = content.match(/^#\\s+(.+)$/m);\n\tif (match) return match[1].trim();\n\tconst firstLine = content.split(\"\\n\")[0]?.trim() ?? \"\";\n\treturn firstLine.length > 50 ? `${firstLine.slice(0, 47)}...` : firstLine;\n}\n","import { readFile } from \"node:fs/promises\";\nimport { parse as parseToml } from \"smol-toml\";\nimport type { ProjectConfig } from \"../../config/schema.js\";\nimport { emptyConfig } from \"../../config/schema.js\";\nimport type { DetectedFile } from \"../scanner.js\";\n\n/** Parse Codex config files into a partial ProjectConfig. */\nexport async function parseCodex(\n\t_projectDir: string,\n\tfiles: DetectedFile[],\n): Promise<Partial<ProjectConfig>> {\n\tconst config = emptyConfig();\n\n\tfor (const file of files) {\n\t\tswitch (file.kind) {\n\t\t\tcase \"settings\":\n\t\t\t\tawait parseCodexToml(file.path, config);\n\t\t\t\tbreak;\n\t\t\tcase \"directives\":\n\t\t\t\tawait parseAgentsMd(file.path, config);\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn config;\n}\n\nasync function parseCodexToml(filePath: string, config: ProjectConfig): Promise<void> {\n\tconst raw = await readFile(filePath, \"utf-8\").catch(() => null);\n\tif (!raw) return;\n\n\ttry {\n\t\tconst parsed = parseToml(raw);\n\n\t\t// Parse MCP servers\n\t\tif (parsed.mcp_servers && typeof parsed.mcp_servers === \"object\") {\n\t\t\tfor (const [name, entry] of Object.entries(parsed.mcp_servers as Record<string, unknown>)) {\n\t\t\t\tconst obj = entry as Record<string, unknown>;\n\t\t\t\tconfig.toolServers.push({\n\t\t\t\t\tname,\n\t\t\t\t\ttransport: (typeof obj.type === \"string\" ? obj.type : \"stdio\") as\n\t\t\t\t\t\t| \"stdio\"\n\t\t\t\t\t\t| \"http\"\n\t\t\t\t\t\t| \"sse\",\n\t\t\t\t\tcommand: typeof obj.command === \"string\" ? obj.command : undefined,\n\t\t\t\t\turl: typeof obj.url === \"string\" ? obj.url : undefined,\n\t\t\t\t\targs: Array.isArray(obj.args) ? obj.args.map(String) : undefined,\n\t\t\t\t\tenv:\n\t\t\t\t\t\ttypeof obj.env === \"object\" && obj.env !== null\n\t\t\t\t\t\t\t? Object.fromEntries(\n\t\t\t\t\t\t\t\t\tObject.entries(obj.env as Record<string, unknown>).map(([k, v]) => [\n\t\t\t\t\t\t\t\t\t\tk,\n\t\t\t\t\t\t\t\t\t\tString(v),\n\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\tscope: \"project\",\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\t// Parse approval_policy → Permission\n\t\tif (typeof parsed.approval_policy === \"string\") {\n\t\t\tif (parsed.approval_policy === \"unless-allowed\") {\n\t\t\t\tconfig.permissions.push({\n\t\t\t\t\ttool: \"Bash\",\n\t\t\t\t\tdecision: \"allow\",\n\t\t\t\t\tscope: \"project\",\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\t// Parse protected_paths → IgnorePattern\n\t\tif (Array.isArray(parsed.protected_paths)) {\n\t\t\tfor (const p of parsed.protected_paths) {\n\t\t\t\tif (typeof p === \"string\") {\n\t\t\t\t\tconfig.ignorePatterns.push({ pattern: p, scope: \"project\" });\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Parse remaining settings\n\t\tconst knownKeys = new Set([\"mcp_servers\", \"approval_policy\", \"protected_paths\"]);\n\t\tfor (const [key, value] of Object.entries(parsed)) {\n\t\t\tif (!knownKeys.has(key)) {\n\t\t\t\tconfig.settings.push({ key, value, scope: \"project\" });\n\t\t\t}\n\t\t}\n\t} catch {\n\t\t// Invalid TOML\n\t}\n}\n\nasync function parseAgentsMd(filePath: string, config: ProjectConfig): Promise<void> {\n\tconst raw = await readFile(filePath, \"utf-8\").catch(() => null);\n\tif (!raw) return;\n\n\tconst lines = raw.split(\"\\n\");\n\tlet currentName: string | null = null;\n\tlet currentType: \"agent\" | \"directive\" = \"directive\";\n\tlet currentLines: string[] = [];\n\n\tconst flush = () => {\n\t\tconst content = currentLines.join(\"\\n\").trim();\n\t\tif (!content) return;\n\n\t\tif (currentType === \"agent\" && currentName) {\n\t\t\tconfig.agents.push({\n\t\t\t\tname: currentName,\n\t\t\t\tdescription: \"\",\n\t\t\t\tinstructions: content,\n\t\t\t});\n\t\t} else if (currentType === \"directive\") {\n\t\t\tconfig.directives.push({\n\t\t\t\tcontent,\n\t\t\t\tscope: \"project\",\n\t\t\t\talwaysApply: true,\n\t\t\t\tdescription: currentName ?? \"directive\",\n\t\t\t});\n\t\t}\n\t};\n\n\tfor (const line of lines) {\n\t\tconst agentMatch = line.match(/^##\\s+Agent:\\s+(.+)$/);\n\t\tconst sectionMatch = !agentMatch ? line.match(/^##\\s+(.+)$/) : null;\n\n\t\tif (agentMatch) {\n\t\t\tflush();\n\t\t\tcurrentName = agentMatch[1].trim();\n\t\t\tcurrentType = \"agent\";\n\t\t\tcurrentLines = [];\n\t\t} else if (sectionMatch) {\n\t\t\tflush();\n\t\t\tcurrentName = sectionMatch[1].trim();\n\t\t\tcurrentType = \"directive\";\n\t\t\tcurrentLines = [];\n\t\t} else if (currentName !== null || currentType === \"directive\") {\n\t\t\t// Skip top-level heading\n\t\t\tif (line.match(/^#\\s/) && currentLines.length === 0 && currentName === null) continue;\n\t\t\tcurrentLines.push(line);\n\t\t}\n\t}\n\tflush();\n}\n","import { readFile } from \"node:fs/promises\";\nimport { parseMarkdownWithFrontmatter } from \"../../config/markdown-loader.js\";\nimport type { ProjectConfig } from \"../../config/schema.js\";\nimport { emptyConfig } from \"../../config/schema.js\";\nimport type { DetectedFile } from \"../scanner.js\";\n\n/** Parse Cursor config files into a partial ProjectConfig. */\nexport async function parseCursor(\n\t_projectDir: string,\n\tfiles: DetectedFile[],\n): Promise<Partial<ProjectConfig>> {\n\tconst config = emptyConfig();\n\n\tfor (const file of files) {\n\t\tswitch (file.kind) {\n\t\t\tcase \"directives\":\n\t\t\t\tawait parseCursorRule(file.path, config);\n\t\t\t\tbreak;\n\t\t\tcase \"mcp\":\n\t\t\t\tawait parseCursorMcp(file.path, config);\n\t\t\t\tbreak;\n\t\t\tcase \"agents\":\n\t\t\t\tawait parseCursorAgent(file.path, config);\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn config;\n}\n\nasync function parseCursorRule(filePath: string, config: ProjectConfig): Promise<void> {\n\tconst raw = await readFile(filePath, \"utf-8\").catch(() => null);\n\tif (!raw) return;\n\n\tconst { frontmatter, body } = parseMarkdownWithFrontmatter(raw);\n\n\tlet appliesTo: string[] | undefined;\n\tif (typeof frontmatter.globs === \"string\") {\n\t\tappliesTo = frontmatter.globs.split(\",\").map((s: string) => s.trim());\n\t} else if (Array.isArray(frontmatter.globs)) {\n\t\tappliesTo = frontmatter.globs.map(String);\n\t}\n\n\tconfig.directives.push({\n\t\tcontent: body,\n\t\tscope: \"project\",\n\t\talwaysApply: frontmatter.alwaysApply !== false,\n\t\tappliesTo,\n\t\tdescription:\n\t\t\ttypeof frontmatter.description === \"string\"\n\t\t\t\t? frontmatter.description\n\t\t\t\t: (filePath\n\t\t\t\t\t\t.split(\"/\")\n\t\t\t\t\t\t.pop()\n\t\t\t\t\t\t?.replace(/\\.mdc?$/, \"\") ?? \"rule\"),\n\t});\n}\n\nasync function parseCursorMcp(filePath: string, config: ProjectConfig): Promise<void> {\n\tconst raw = await readFile(filePath, \"utf-8\").catch(() => null);\n\tif (!raw) return;\n\n\ttry {\n\t\tconst parsed = JSON.parse(raw);\n\t\tconst servers = parsed.mcpServers ?? parsed;\n\t\tif (typeof servers !== \"object\" || servers === null) return;\n\n\t\tfor (const [name, entry] of Object.entries(servers)) {\n\t\t\t// Skip if already detected from Claude (dedup by name happens in runner)\n\t\t\tconst obj = entry as Record<string, unknown>;\n\t\t\tconfig.toolServers.push({\n\t\t\t\tname,\n\t\t\t\ttransport: (typeof obj.type === \"string\" ? obj.type : \"stdio\") as \"stdio\" | \"http\" | \"sse\",\n\t\t\t\tcommand: typeof obj.command === \"string\" ? obj.command : undefined,\n\t\t\t\turl: typeof obj.url === \"string\" ? obj.url : undefined,\n\t\t\t\targs: Array.isArray(obj.args) ? obj.args.map(String) : undefined,\n\t\t\t\tenv:\n\t\t\t\t\ttypeof obj.env === \"object\" && obj.env !== null\n\t\t\t\t\t\t? Object.fromEntries(\n\t\t\t\t\t\t\t\tObject.entries(obj.env as Record<string, unknown>).map(([k, v]) => [k, String(v)]),\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t: undefined,\n\t\t\t\tscope: \"project\",\n\t\t\t});\n\t\t}\n\t} catch {\n\t\t// Invalid JSON\n\t}\n}\n\nasync function parseCursorAgent(filePath: string, config: ProjectConfig): Promise<void> {\n\tconst raw = await readFile(filePath, \"utf-8\").catch(() => null);\n\tif (!raw) return;\n\n\tconst { frontmatter, body } = parseMarkdownWithFrontmatter(raw);\n\tconst name = filePath.split(\"/\").pop()?.replace(/\\.md$/, \"\") ?? \"agent\";\n\n\tconfig.agents.push({\n\t\tname,\n\t\tdescription: typeof frontmatter.description === \"string\" ? frontmatter.description : \"\",\n\t\tinstructions: body,\n\t\tmodel: typeof frontmatter.model === \"string\" ? frontmatter.model : undefined,\n\t\treadonly: frontmatter.readonly === true ? true : undefined,\n\t\ttools: Array.isArray(frontmatter.tools) ? frontmatter.tools.map(String) : undefined,\n\t});\n}\n","import { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { parseMarkdownWithFrontmatter } from \"../../config/markdown-loader.js\";\nimport type { ProjectConfig } from \"../../config/schema.js\";\nimport { emptyConfig } from \"../../config/schema.js\";\nimport { loadSkills } from \"../../config/skill-loader.js\";\nimport type { DetectedFile } from \"../scanner.js\";\n\n/** Parse OpenCode config files into a partial ProjectConfig. */\nexport async function parseOpenCode(\n\tprojectDir: string,\n\tfiles: DetectedFile[],\n): Promise<Partial<ProjectConfig>> {\n\tconst config = emptyConfig();\n\n\tfor (const file of files) {\n\t\tswitch (file.kind) {\n\t\t\tcase \"settings\":\n\t\t\t\tawait parseOpenCodeJson(file.path, config);\n\t\t\t\tbreak;\n\t\t\tcase \"agents\":\n\t\t\t\tawait parseOpenCodeAgent(file.path, config);\n\t\t\t\tbreak;\n\t\t\tcase \"skills\": {\n\t\t\t\tconst skillsDir = join(projectDir, \".opencode\", \"skills\");\n\t\t\t\ttry {\n\t\t\t\t\tconfig.skills = await loadSkills(skillsDir);\n\t\t\t\t} catch {\n\t\t\t\t\t// skills dir may not be loadable\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn config;\n}\n\n/** Known OpenCode config keys that map to settings. */\nconst SETTINGS_KEYS = new Set([\"model\", \"theme\", \"provider\", \"maxTokens\"]);\n\nasync function parseOpenCodeJson(filePath: string, config: ProjectConfig): Promise<void> {\n\tconst raw = await readFile(filePath, \"utf-8\").catch(() => null);\n\tif (!raw) return;\n\n\ttry {\n\t\tconst parsed = JSON.parse(raw);\n\n\t\t// MCP servers\n\t\tif (parsed.mcp && typeof parsed.mcp === \"object\") {\n\t\t\tfor (const [name, entry] of Object.entries(parsed.mcp)) {\n\t\t\t\tconst obj = entry as Record<string, unknown>;\n\t\t\t\tconst rawType = typeof obj.type === \"string\" ? obj.type : \"stdio\";\n\t\t\t\t// OpenCode \"remote\" maps to \"http\"\n\t\t\t\tconst transport = rawType === \"remote\" ? \"http\" : rawType;\n\n\t\t\t\tconfig.toolServers.push({\n\t\t\t\t\tname,\n\t\t\t\t\ttransport: transport as \"stdio\" | \"http\" | \"sse\",\n\t\t\t\t\tcommand: typeof obj.command === \"string\" ? obj.command : undefined,\n\t\t\t\t\turl: typeof obj.url === \"string\" ? obj.url : undefined,\n\t\t\t\t\targs: Array.isArray(obj.args) ? obj.args.map(String) : undefined,\n\t\t\t\t\tenv:\n\t\t\t\t\t\ttypeof obj.env === \"object\" && obj.env !== null\n\t\t\t\t\t\t\t? Object.fromEntries(\n\t\t\t\t\t\t\t\t\tObject.entries(obj.env as Record<string, unknown>).map(([k, v]) => [\n\t\t\t\t\t\t\t\t\t\tk,\n\t\t\t\t\t\t\t\t\t\tString(v),\n\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\tscope: \"project\",\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\t// Permissions\n\t\tif (parsed.permission && typeof parsed.permission === \"object\") {\n\t\t\tfor (const [tool, value] of Object.entries(parsed.permission)) {\n\t\t\t\tif (typeof value === \"string\") {\n\t\t\t\t\t// Flat: { \"<tool>\": \"<decision>\" }\n\t\t\t\t\tconfig.permissions.push({\n\t\t\t\t\t\ttool,\n\t\t\t\t\t\tdecision: value as \"allow\" | \"deny\" | \"ask\",\n\t\t\t\t\t\tscope: \"project\",\n\t\t\t\t\t});\n\t\t\t\t} else if (typeof value === \"object\" && value !== null) {\n\t\t\t\t\t// Nested: { \"bash\": { \"<pattern>\": \"<decision>\" } }\n\t\t\t\t\tfor (const [pattern, decision] of Object.entries(value as Record<string, string>)) {\n\t\t\t\t\t\tconfig.permissions.push({\n\t\t\t\t\t\t\ttool,\n\t\t\t\t\t\t\tpattern,\n\t\t\t\t\t\t\tdecision: decision as \"allow\" | \"deny\" | \"ask\",\n\t\t\t\t\t\t\tscope: \"project\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Instructions → directives\n\t\tif (Array.isArray(parsed.instructions)) {\n\t\t\tfor (const instrPath of parsed.instructions) {\n\t\t\t\tif (typeof instrPath !== \"string\") continue;\n\t\t\t\tconst absPath = join(filePath, \"..\", instrPath);\n\t\t\t\tconst content = await readFile(absPath, \"utf-8\").catch(() => null);\n\t\t\t\tif (!content) continue;\n\n\t\t\t\tlet body = content.trim();\n\t\t\t\tlet appliesTo: string[] | undefined;\n\n\t\t\t\t// Extract <!-- applies to: ... --> comment\n\t\t\t\tconst match = body.match(/^<!--\\s*applies to:\\s*(.+?)\\s*-->\\s*\\n*/);\n\t\t\t\tif (match) {\n\t\t\t\t\tappliesTo = match[1].split(\",\").map((s) => s.trim());\n\t\t\t\t\tbody = body.slice(match[0].length).trim();\n\t\t\t\t}\n\n\t\t\t\tconfig.directives.push({\n\t\t\t\t\tcontent: body,\n\t\t\t\t\tscope: \"project\",\n\t\t\t\t\talwaysApply: !appliesTo,\n\t\t\t\t\tappliesTo,\n\t\t\t\t\tdescription: extractHeading(body),\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\t// Watcher ignore\n\t\tif (parsed.watcher?.ignore && Array.isArray(parsed.watcher.ignore)) {\n\t\t\tfor (const pattern of parsed.watcher.ignore) {\n\t\t\t\tif (typeof pattern === \"string\") {\n\t\t\t\t\tconfig.ignorePatterns.push({ pattern, scope: \"project\" });\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Settings (known keys)\n\t\tfor (const [key, value] of Object.entries(parsed)) {\n\t\t\tif (SETTINGS_KEYS.has(key)) {\n\t\t\t\tconfig.settings.push({ key, value, scope: \"project\" });\n\t\t\t}\n\t\t}\n\t} catch {\n\t\t// Invalid JSON\n\t}\n}\n\nasync function parseOpenCodeAgent(filePath: string, config: ProjectConfig): Promise<void> {\n\tconst raw = await readFile(filePath, \"utf-8\").catch(() => null);\n\tif (!raw) return;\n\n\tconst { frontmatter, body } = parseMarkdownWithFrontmatter(raw);\n\tconst name = filePath.split(\"/\").pop()?.replace(/\\.md$/, \"\") ?? \"agent\";\n\n\tconfig.agents.push({\n\t\tname,\n\t\tdescription: typeof frontmatter.description === \"string\" ? frontmatter.description : \"\",\n\t\tinstructions: body,\n\t\tmodel: typeof frontmatter.model === \"string\" ? frontmatter.model : undefined,\n\t\tmode:\n\t\t\ttypeof frontmatter.mode === \"string\"\n\t\t\t\t? (frontmatter.mode as \"primary\" | \"subagent\" | \"all\")\n\t\t\t\t: undefined,\n\t\ttemperature: typeof frontmatter.temperature === \"number\" ? frontmatter.temperature : undefined,\n\t\ttopP: typeof frontmatter.top_p === \"number\" ? frontmatter.top_p : undefined,\n\t\tsteps: typeof frontmatter.steps === \"number\" ? frontmatter.steps : undefined,\n\t\tcolor: typeof frontmatter.color === \"string\" ? frontmatter.color : undefined,\n\t\thidden: frontmatter.hidden === true ? true : undefined,\n\t\tdisabled: frontmatter.disable === true ? true : undefined,\n\t});\n}\n\nfunction extractHeading(content: string): string {\n\tconst match = content.match(/^#\\s+(.+)$/m);\n\tif (match) return match[1].trim();\n\tconst firstLine = content.split(\"\\n\")[0]?.trim() ?? \"\";\n\treturn firstLine.length > 50 ? `${firstLine.slice(0, 47)}...` : firstLine;\n}\n","import { readdir, stat } from \"node:fs/promises\";\nimport { join, relative } from \"node:path\";\n\n/** Source tool that originally created a config file. */\nexport type SourceTool = \"claude\" | \"cursor\" | \"codex\" | \"opencode\";\n\n/** Kind of config entity the file maps to. */\nexport type DetectedKind =\n\t| \"directives\"\n\t| \"mcp\"\n\t| \"permissions\"\n\t| \"hooks\"\n\t| \"settings\"\n\t| \"agents\"\n\t| \"skills\"\n\t| \"ignore\";\n\n/** A detected raw config file in the project. */\nexport interface DetectedFile {\n\tpath: string;\n\trelativePath: string;\n\tsource: SourceTool;\n\tkind: DetectedKind;\n\tlabel: string;\n}\n\nasync function exists(p: string): Promise<boolean> {\n\ttry {\n\t\tawait stat(p);\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nasync function listMdFiles(dir: string): Promise<string[]> {\n\ttry {\n\t\tconst entries = await readdir(dir);\n\t\treturn entries.filter((f) => f.endsWith(\".md\"));\n\t} catch {\n\t\treturn [];\n\t}\n}\n\nasync function listMdcFiles(dir: string): Promise<string[]> {\n\ttry {\n\t\tconst entries = await readdir(dir);\n\t\treturn entries.filter((f) => f.endsWith(\".mdc\"));\n\t} catch {\n\t\treturn [];\n\t}\n}\n\nasync function listSkillDirs(dir: string): Promise<string[]> {\n\ttry {\n\t\tconst entries = await readdir(dir);\n\t\tconst dirs: string[] = [];\n\t\tfor (const entry of entries) {\n\t\t\tconst p = join(dir, entry);\n\t\t\tconst s = await stat(p).catch(() => null);\n\t\t\tif (s?.isDirectory()) {\n\t\t\t\tconst skillFile = join(p, \"SKILL.md\");\n\t\t\t\tif (await exists(skillFile)) dirs.push(entry);\n\t\t\t}\n\t\t}\n\t\treturn dirs;\n\t} catch {\n\t\treturn [];\n\t}\n}\n\n/** Scan a project directory for existing raw config files from AI tools. */\nexport async function scanForConfigs(projectDir: string): Promise<DetectedFile[]> {\n\tconst detected: DetectedFile[] = [];\n\n\tconst add = (absPath: string, source: SourceTool, kind: DetectedKind, label: string) => {\n\t\tdetected.push({\n\t\t\tpath: absPath,\n\t\t\trelativePath: relative(projectDir, absPath),\n\t\t\tsource,\n\t\t\tkind,\n\t\t\tlabel,\n\t\t});\n\t};\n\n\t// Claude Code files\n\tconst claudeMd = join(projectDir, \"CLAUDE.md\");\n\tif (await exists(claudeMd)) add(claudeMd, \"claude\", \"directives\", \"CLAUDE.md (directives)\");\n\n\tconst mcpJson = join(projectDir, \".mcp.json\");\n\tif (await exists(mcpJson)) add(mcpJson, \"claude\", \"mcp\", \".mcp.json (MCP servers)\");\n\n\tconst claudeSettings = join(projectDir, \".claude\", \"settings.json\");\n\tif (await exists(claudeSettings))\n\t\tadd(claudeSettings, \"claude\", \"settings\", \".claude/settings.json (permissions + settings)\");\n\n\tconst claudeRulesDir = join(projectDir, \".claude\", \"rules\");\n\tfor (const f of await listMdFiles(claudeRulesDir)) {\n\t\tconst p = join(claudeRulesDir, f);\n\t\tadd(p, \"claude\", \"directives\", `.claude/rules/${f} (directive)`);\n\t}\n\n\tconst claudeAgentsDir = join(projectDir, \".claude\", \"agents\");\n\tfor (const f of await listMdFiles(claudeAgentsDir)) {\n\t\tconst p = join(claudeAgentsDir, f);\n\t\tadd(p, \"claude\", \"agents\", `.claude/agents/${f} (agent)`);\n\t}\n\n\tconst claudeSkillsDir = join(projectDir, \".claude\", \"skills\");\n\tfor (const s of await listSkillDirs(claudeSkillsDir)) {\n\t\tconst p = join(claudeSkillsDir, s, \"SKILL.md\");\n\t\tadd(p, \"claude\", \"skills\", `.claude/skills/${s}/SKILL.md (skill)`);\n\t}\n\n\t// Cursor files\n\tconst cursorRulesDir = join(projectDir, \".cursor\", \"rules\");\n\tfor (const f of await listMdcFiles(cursorRulesDir)) {\n\t\tconst p = join(cursorRulesDir, f);\n\t\tadd(p, \"cursor\", \"directives\", `.cursor/rules/${f} (directive)`);\n\t}\n\n\tconst cursorMcp = join(projectDir, \".cursor\", \"mcp.json\");\n\tif (await exists(cursorMcp)) add(cursorMcp, \"cursor\", \"mcp\", \".cursor/mcp.json (MCP servers)\");\n\n\tconst cursorAgentsDir = join(projectDir, \".cursor\", \"agents\");\n\tfor (const f of await listMdFiles(cursorAgentsDir)) {\n\t\tconst p = join(cursorAgentsDir, f);\n\t\tadd(p, \"cursor\", \"agents\", `.cursor/agents/${f} (agent)`);\n\t}\n\n\t// Codex files\n\tconst codexToml = join(projectDir, \".codex\", \"config.toml\");\n\tif (await exists(codexToml)) add(codexToml, \"codex\", \"settings\", \".codex/config.toml (settings)\");\n\n\tconst agentsMd = join(projectDir, \"AGENTS.md\");\n\tif (await exists(agentsMd)) add(agentsMd, \"codex\", \"directives\", \"AGENTS.md (directives)\");\n\n\t// OpenCode files\n\tconst opencodeJson = join(projectDir, \"opencode.json\");\n\tif (await exists(opencodeJson))\n\t\tadd(opencodeJson, \"opencode\", \"settings\", \"opencode.json (config)\");\n\n\tconst opencodeAgentsDir = join(projectDir, \".opencode\", \"agents\");\n\tfor (const f of await listMdFiles(opencodeAgentsDir)) {\n\t\tconst p = join(opencodeAgentsDir, f);\n\t\tadd(p, \"opencode\", \"agents\", `.opencode/agents/${f} (agent)`);\n\t}\n\n\tconst opencodeSkillsDir = join(projectDir, \".opencode\", \"skills\");\n\tfor (const s of await listSkillDirs(opencodeSkillsDir)) {\n\t\tconst p = join(opencodeSkillsDir, s, \"SKILL.md\");\n\t\tadd(p, \"opencode\", \"skills\", `.opencode/skills/${s}/SKILL.md (skill)`);\n\t}\n\n\treturn detected;\n}\n","import { mkdir, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { stringify as stringifyYaml } from \"yaml\";\nimport type { ProjectConfig } from \"../config/schema.js\";\n\n/** Slugify a string into a filename-safe slug. */\nfunction slugify(str: string): string {\n\treturn str\n\t\t.toLowerCase()\n\t\t.replace(/[^a-z0-9]+/g, \"-\")\n\t\t.replace(/^-|-$/g, \"\");\n}\n\n/** Serialize a ProjectConfig back to an `.ai/` directory. Returns paths of written files. */\nexport async function writeProjectConfig(aiDir: string, config: ProjectConfig): Promise<string[]> {\n\tconst written: string[] = [];\n\n\t// Ensure base directories exist\n\tawait mkdir(aiDir, { recursive: true });\n\tawait mkdir(join(aiDir, \"directives\"), { recursive: true });\n\tawait mkdir(join(aiDir, \"skills\"), { recursive: true });\n\tawait mkdir(join(aiDir, \"agents\"), { recursive: true });\n\n\t// Write config.yaml\n\tconst yamlObj: Record<string, unknown> = {};\n\n\tif (config.toolServers.length > 0) {\n\t\tconst servers: Record<string, unknown> = {};\n\t\tfor (const s of config.toolServers) {\n\t\t\tconst entry: Record<string, unknown> = { transport: s.transport };\n\t\t\tif (s.command) entry.command = s.command;\n\t\t\tif (s.url) entry.url = s.url;\n\t\t\tif (s.args?.length) entry.args = s.args;\n\t\t\tif (s.env && Object.keys(s.env).length > 0) entry.env = s.env;\n\t\t\tif (s.enabledTools?.length) entry.enabledTools = s.enabledTools;\n\t\t\tif (s.disabledTools?.length) entry.disabledTools = s.disabledTools;\n\t\t\tservers[s.name] = entry;\n\t\t}\n\t\tyamlObj.mcpServers = servers;\n\t} else {\n\t\tyamlObj.mcpServers = {};\n\t}\n\n\tif (config.permissions.length > 0) {\n\t\tyamlObj.permissions = config.permissions.map((p) => {\n\t\t\tconst entry: Record<string, unknown> = { tool: p.tool, decision: p.decision };\n\t\t\tif (p.pattern) entry.pattern = p.pattern;\n\t\t\treturn entry;\n\t\t});\n\t} else {\n\t\tyamlObj.permissions = [];\n\t}\n\n\tif (config.settings.length > 0) {\n\t\tconst settingsObj: Record<string, unknown> = {};\n\t\tfor (const s of config.settings) {\n\t\t\tsettingsObj[s.key] = s.value;\n\t\t}\n\t\tyamlObj.settings = settingsObj;\n\t} else {\n\t\tyamlObj.settings = {};\n\t}\n\n\tif (config.hooks.length > 0) {\n\t\tyamlObj.hooks = config.hooks.map((h) => {\n\t\t\tconst entry: Record<string, unknown> = { event: h.event, handler: h.handler };\n\t\t\tif (h.matcher) entry.matcher = h.matcher;\n\t\t\treturn entry;\n\t\t});\n\t} else {\n\t\tyamlObj.hooks = [];\n\t}\n\n\tif (config.ignorePatterns.length > 0) {\n\t\tyamlObj.ignore = config.ignorePatterns.map((p) => p.pattern);\n\t} else {\n\t\tyamlObj.ignore = [];\n\t}\n\n\tconst configPath = join(aiDir, \"config.yaml\");\n\tawait writeFile(configPath, stringifyYaml(yamlObj), \"utf-8\");\n\twritten.push(configPath);\n\n\t// Write directives\n\tfor (const d of config.directives) {\n\t\tconst name = slugify(d.description || \"rule\");\n\t\tconst fm: string[] = [];\n\t\tfm.push(`scope: ${d.scope}`);\n\t\tfm.push(`alwaysApply: ${d.alwaysApply}`);\n\t\tif (d.appliesTo?.length) {\n\t\t\tfm.push(`appliesTo: [${d.appliesTo.join(\", \")}]`);\n\t\t}\n\t\tif (d.description) {\n\t\t\tfm.push(`description: ${d.description}`);\n\t\t}\n\t\tconst header = `---\\n${fm.join(\"\\n\")}\\n---`;\n\t\tconst filePath = join(aiDir, \"directives\", `${name}.md`);\n\t\tawait writeFile(filePath, `${header}\\n\\n${d.content}\\n`, \"utf-8\");\n\t\twritten.push(filePath);\n\t}\n\n\t// Write agents\n\tfor (const a of config.agents) {\n\t\tconst fm: string[] = [];\n\t\tif (a.description) fm.push(`description: ${a.description}`);\n\t\tif (a.model) fm.push(`model: ${a.model}`);\n\t\tif (a.readonly) fm.push(\"readonly: true\");\n\t\tif (a.tools?.length) fm.push(`tools: [${a.tools.join(\", \")}]`);\n\t\tconst header = fm.length > 0 ? `---\\n${fm.join(\"\\n\")}\\n---\\n\\n` : \"\";\n\t\tconst filePath = join(aiDir, \"agents\", `${a.name}.md`);\n\t\tawait writeFile(filePath, `${header}${a.instructions}\\n`, \"utf-8\");\n\t\twritten.push(filePath);\n\t}\n\n\t// Write skills\n\tfor (const s of config.skills) {\n\t\tconst skillDir = join(aiDir, \"skills\", s.name);\n\t\tawait mkdir(skillDir, { recursive: true });\n\t\tconst filePath = join(skillDir, \"SKILL.md\");\n\t\tawait writeFile(filePath, s.content, \"utf-8\");\n\t\twritten.push(filePath);\n\t}\n\n\treturn written;\n}\n","import { runImport } from \"../import/runner.js\";\nimport type { SourceTool } from \"../import/scanner.js\";\nimport { scanForConfigs } from \"../import/scanner.js\";\nimport { cancelGuard, intro, isTTY, multiselect, outro } from \"../tui.js\";\n\n/** Options for the import command. */\nexport interface ImportCommandOptions {\n\tsource?: SourceTool;\n}\n\n/** Import existing AI tool configs into .ai/ format. */\nexport async function runImportCommand(\n\tprojectDir: string,\n\toptions?: ImportCommandOptions,\n): Promise<void> {\n\tif (isTTY()) {\n\t\tawait interactiveImport(projectDir, options);\n\t} else {\n\t\tawait nonInteractiveImport(projectDir, options);\n\t}\n}\n\nasync function interactiveImport(\n\tprojectDir: string,\n\toptions?: ImportCommandOptions,\n): Promise<void> {\n\tintro(\"ai-dot import — detect and import existing configs\");\n\n\tconst detected = await scanForConfigs(projectDir);\n\tconst filtered = options?.source ? detected.filter((f) => f.source === options.source) : detected;\n\n\tif (filtered.length === 0) {\n\t\toutro(\"No existing config files found.\");\n\t\treturn;\n\t}\n\n\tconst result = await runImport(projectDir, {\n\t\tinteractive: true,\n\t\tsourceFilter: options?.source,\n\t\tselectFiles: async (files) => {\n\t\t\tconst selected = cancelGuard(\n\t\t\t\tawait multiselect({\n\t\t\t\t\tmessage: \"Select files to import:\",\n\t\t\t\t\toptions: files.map((f) => ({\n\t\t\t\t\t\tvalue: f.relativePath,\n\t\t\t\t\t\tlabel: f.label,\n\t\t\t\t\t\thint: f.source,\n\t\t\t\t\t})),\n\t\t\t\t\trequired: true,\n\t\t\t\t}),\n\t\t\t) as string[];\n\t\t\treturn files.filter((f) => selected.includes(f.relativePath));\n\t\t},\n\t});\n\n\tif (result.imported.length === 0) {\n\t\toutro(\"Nothing imported.\");\n\t\treturn;\n\t}\n\n\tconsole.log(`\\n \\x1b[32m✓\\x1b[0m Imported ${result.imported.length} file(s):`);\n\tfor (const f of result.imported) {\n\t\tconsole.log(` ${f.label}`);\n\t}\n\tconsole.log(`\\n Wrote ${result.filesWritten.length} file(s) to .ai/`);\n\n\toutro(\"Run ai-dot sync to generate tool configs from imported settings.\");\n}\n\nasync function nonInteractiveImport(\n\tprojectDir: string,\n\toptions?: ImportCommandOptions,\n): Promise<void> {\n\tconst result = await runImport(projectDir, {\n\t\tinteractive: false,\n\t\tsourceFilter: options?.source,\n\t});\n\n\tif (result.detected.length === 0) {\n\t\tconsole.log(\"No existing config files found.\");\n\t\treturn;\n\t}\n\n\tif (result.imported.length === 0) {\n\t\tconsole.log(\"No files to import.\");\n\t\treturn;\n\t}\n\n\tconsole.log(`\\x1b[32m✓\\x1b[0m Imported ${result.imported.length} file(s):`);\n\tfor (const f of result.imported) {\n\t\tconsole.log(` ${f.label}`);\n\t}\n\tconsole.log(`\\nWrote ${result.filesWritten.length} file(s) to .ai/`);\n\tconsole.log(\"\\nNext: run \\x1b[1mai-dot sync\\x1b[0m to generate tool configs.\");\n}\n","import { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { TargetTool } from \"../emitters/types.js\";\nimport { runImport } from \"../import/runner.js\";\nimport { scanForConfigs } from \"../import/scanner.js\";\nimport { writeProjectConfig } from \"../import/writer.js\";\nimport type { TemplateName } from \"../templates/index.js\";\nimport { getTemplate, TEMPLATES } from \"../templates/index.js\";\nimport { cancelGuard, confirm, intro, isTTY, multiselect, outro, select } from \"../tui.js\";\nimport { runSync } from \"./sync.js\";\n\n/** Options for the init command. */\nexport interface InitOptions {\n\ttemplate?: TemplateName;\n\ttargets?: TargetTool[];\n\tskipImport?: boolean;\n\tautoSync?: boolean;\n}\n\n/** Scaffold a new `.ai/` directory with guided setup or flags. */\nexport async function runInit(projectDir: string, options?: InitOptions): Promise<void> {\n\tif (isTTY() && !options?.template) {\n\t\tawait interactiveInit(projectDir, options);\n\t} else {\n\t\tawait nonInteractiveInit(projectDir, options);\n\t}\n}\n\nasync function interactiveInit(projectDir: string, options?: InitOptions): Promise<void> {\n\tintro(\"ai-dot — universal AI tool config\");\n\n\tconst aiDir = join(projectDir, \".ai\");\n\tif (existsSync(aiDir)) {\n\t\tconst proceed = cancelGuard(\n\t\t\tawait confirm({ message: \".ai/ directory already exists. Reinitialize?\" }),\n\t\t);\n\t\tif (!proceed) {\n\t\t\toutro(\"Keeping existing .ai/ directory.\");\n\t\t\treturn;\n\t\t}\n\t}\n\n\t// Select target tools\n\tconst targets = cancelGuard(\n\t\tawait multiselect({\n\t\t\tmessage: \"Which AI tools do you use?\",\n\t\t\toptions: [\n\t\t\t\t{ value: \"claude\", label: \"Claude Code\" },\n\t\t\t\t{ value: \"cursor\", label: \"Cursor\" },\n\t\t\t\t{ value: \"codex\", label: \"Codex\" },\n\t\t\t],\n\t\t\trequired: true,\n\t\t}),\n\t) as TargetTool[];\n\n\t// Select template\n\tconst templateName = cancelGuard(\n\t\tawait select({\n\t\t\tmessage: \"Start from a template?\",\n\t\t\toptions: TEMPLATES.map((t) => ({\n\t\t\t\tvalue: t.name,\n\t\t\t\tlabel: t.label,\n\t\t\t\thint: t.description,\n\t\t\t})),\n\t\t}),\n\t) as TemplateName;\n\n\t// Build and write template config\n\tconst config = getTemplate(templateName);\n\tconst written = await writeProjectConfig(aiDir, config);\n\tconsole.log(`\\n \\x1b[32m✓\\x1b[0m Created .ai/ from \"${templateName}\" template`);\n\tfor (const f of written) {\n\t\tconst rel = f.replace(`${projectDir}/`, \"\");\n\t\tconsole.log(` ${rel}`);\n\t}\n\n\t// Auto-scan for existing configs\n\tif (!options?.skipImport) {\n\t\tconst detected = await scanForConfigs(projectDir);\n\t\tif (detected.length > 0) {\n\t\t\tconst doImport = cancelGuard(\n\t\t\t\tawait confirm({\n\t\t\t\t\tmessage: `Found ${detected.length} existing config file(s). Import them?`,\n\t\t\t\t}),\n\t\t\t);\n\n\t\t\tif (doImport) {\n\t\t\t\tconst result = await runImport(projectDir, {\n\t\t\t\t\tinteractive: false,\n\t\t\t\t});\n\t\t\t\tif (result.imported.length > 0) {\n\t\t\t\t\tconsole.log(`\\n \\x1b[32m✓\\x1b[0m Imported ${result.imported.length} file(s)`);\n\t\t\t\t\tfor (const f of result.imported) {\n\t\t\t\t\t\tconsole.log(` ${f.label}`);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Offer to sync\n\tconst doSync = cancelGuard(await confirm({ message: \"Run ai-dot sync now?\" }));\n\n\tif (doSync) {\n\t\tconsole.log(\"\");\n\t\tawait runSync(projectDir, { targets, dryRun: false, scope: \"project\", force: false });\n\t}\n\n\toutro(\"Done! Edit .ai/ to customize, then run ai-dot sync.\");\n}\n\nasync function nonInteractiveInit(projectDir: string, options?: InitOptions): Promise<void> {\n\tconst aiDir = join(projectDir, \".ai\");\n\tconst templateName = options?.template ?? \"blank\";\n\tconst config = getTemplate(templateName);\n\tconst written = await writeProjectConfig(aiDir, config);\n\n\tconsole.log(`\\x1b[32m✓\\x1b[0m Initialized .ai/ from \"${templateName}\" template`);\n\tfor (const f of written) {\n\t\tconst rel = f.replace(`${projectDir}/`, \"\");\n\t\tconsole.log(` ${rel}`);\n\t}\n\n\t// Auto-import unless skipped\n\tif (!options?.skipImport) {\n\t\tconst detected = await scanForConfigs(projectDir);\n\t\tif (detected.length > 0) {\n\t\t\tconst result = await runImport(projectDir, {\n\t\t\t\tinteractive: false,\n\t\t\t});\n\t\t\tif (result.imported.length > 0) {\n\t\t\t\tconsole.log(`\\x1b[32m✓\\x1b[0m Imported ${result.imported.length} existing config file(s)`);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Auto-sync if requested\n\tif (options?.autoSync) {\n\t\tconst targets = options.targets ?? [];\n\t\tawait runSync(projectDir, { targets, dryRun: false, scope: \"project\", force: false });\n\t}\n\n\tif (!options?.autoSync) {\n\t\tconsole.log(\"\\nNext: run \\x1b[1mai-dot sync\\x1b[0m to generate tool configs.\");\n\t}\n}\n","import type { ProjectConfig } from \"../config/schema.js\";\nimport { emptyConfig } from \"../config/schema.js\";\n\n/** Empty skeleton — current init behavior. */\nexport function blankTemplate(): ProjectConfig {\n\treturn emptyConfig();\n}\n","import type { ProjectConfig } from \"../config/schema.js\";\n\n/** Minimal starter — conventions directive + common ignore patterns. */\nexport function minimalTemplate(): ProjectConfig {\n\treturn {\n\t\tdirectives: [\n\t\t\t{\n\t\t\t\tcontent:\n\t\t\t\t\t\"# Project Conventions\\n\\n- Follow existing code style and patterns\\n- Write clear, descriptive commit messages\\n- Keep functions focused and small\\n- Add comments only where the logic isn't self-evident\",\n\t\t\t\tscope: \"project\",\n\t\t\t\talwaysApply: true,\n\t\t\t\tdescription: \"conventions\",\n\t\t\t},\n\t\t],\n\t\tskills: [],\n\t\tagents: [],\n\t\ttoolServers: [],\n\t\thooks: [],\n\t\tpermissions: [],\n\t\tsettings: [],\n\t\tignorePatterns: [\n\t\t\t{ pattern: \"node_modules/**\", scope: \"project\" },\n\t\t\t{ pattern: \"dist/**\", scope: \"project\" },\n\t\t\t{ pattern: \".env\", scope: \"project\" },\n\t\t\t{ pattern: \".env.*\", scope: \"project\" },\n\t\t],\n\t};\n}\n","import type { ProjectConfig } from \"../config/schema.js\";\n\n/** Monorepo starter — workspace-aware directive, reviewer agent, scoped ignores. */\nexport function monorepoTemplate(): ProjectConfig {\n\treturn {\n\t\tdirectives: [\n\t\t\t{\n\t\t\t\tcontent:\n\t\t\t\t\t\"# Monorepo Conventions\\n\\n- Each package lives in its own directory under `packages/` or `apps/`\\n- Changes to shared packages require careful review of downstream consumers\\n- Prefer workspace-level dependencies; hoist shared deps to the root\\n- Each package must have its own README, tests, and build script\\n- Cross-package imports must go through published package names, not relative paths\",\n\t\t\t\tscope: \"project\",\n\t\t\t\talwaysApply: true,\n\t\t\t\tdescription: \"monorepo-conventions\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tcontent:\n\t\t\t\t\t\"# Code Review Guidelines\\n\\n- All changes need at least one approval before merging\\n- Review for correctness, readability, and maintainability\\n- Check that changes don't break other packages in the workspace\\n- Verify that new dependencies are justified and properly scoped\",\n\t\t\t\tscope: \"project\",\n\t\t\t\talwaysApply: true,\n\t\t\t\tdescription: \"code-review\",\n\t\t\t},\n\t\t],\n\t\tskills: [],\n\t\tagents: [\n\t\t\t{\n\t\t\t\tname: \"reviewer\",\n\t\t\t\tdescription: \"Reviews code changes for quality and cross-package impact\",\n\t\t\t\tinstructions:\n\t\t\t\t\t\"You are a code reviewer for a monorepo. When reviewing changes:\\n\\n1. Check if the change affects shared packages and identify downstream consumers\\n2. Verify that cross-package dependencies are properly declared\\n3. Ensure tests cover the change adequately\\n4. Flag any breaking changes to package APIs\\n5. Check for consistent coding patterns across the monorepo\",\n\t\t\t\treadonly: true,\n\t\t\t},\n\t\t],\n\t\ttoolServers: [],\n\t\thooks: [],\n\t\tpermissions: [\n\t\t\t{ tool: \"Bash\", pattern: \"npm *\", decision: \"allow\", scope: \"project\" },\n\t\t\t{ tool: \"Bash\", pattern: \"pnpm *\", decision: \"allow\", scope: \"project\" },\n\t\t\t{ tool: \"Bash\", pattern: \"yarn *\", decision: \"allow\", scope: \"project\" },\n\t\t\t{ tool: \"Bash\", pattern: \"turbo *\", decision: \"allow\", scope: \"project\" },\n\t\t],\n\t\tsettings: [],\n\t\tignorePatterns: [\n\t\t\t{ pattern: \"node_modules/**\", scope: \"project\" },\n\t\t\t{ pattern: \"dist/**\", scope: \"project\" },\n\t\t\t{ pattern: \"build/**\", scope: \"project\" },\n\t\t\t{ pattern: \".env\", scope: \"project\" },\n\t\t\t{ pattern: \".env.*\", scope: \"project\" },\n\t\t\t{ pattern: \".turbo/**\", scope: \"project\" },\n\t\t],\n\t};\n}\n","import type { ProjectConfig } from \"../config/schema.js\";\n\n/** Python project starter — formatting, typing, docstring conventions. */\nexport function pythonTemplate(): ProjectConfig {\n\treturn {\n\t\tdirectives: [\n\t\t\t{\n\t\t\t\tcontent:\n\t\t\t\t\t\"# Python Conventions\\n\\n- Use type hints for all function signatures\\n- Follow PEP 8 style guidelines\\n- Use `ruff` or `black` for formatting\\n- Prefer f-strings over `.format()` or `%` formatting\\n- Use `pathlib.Path` instead of `os.path` for file operations\\n- Use dataclasses or Pydantic models for structured data\",\n\t\t\t\tscope: \"project\",\n\t\t\t\talwaysApply: true,\n\t\t\t\tdescription: \"python-conventions\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tcontent:\n\t\t\t\t\t\"# Docstring Conventions\\n\\n- Write docstrings for all public modules, classes, and functions\\n- Use Google-style docstrings\\n- Include Args, Returns, and Raises sections as applicable\\n- Keep the first line as a concise summary\",\n\t\t\t\tscope: \"project\",\n\t\t\t\talwaysApply: true,\n\t\t\t\tdescription: \"docstrings\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tcontent:\n\t\t\t\t\t\"# Testing Rules\\n\\n- Write tests using pytest\\n- Use descriptive test names: `test_<what>_<condition>_<expected>`\\n- Use fixtures for shared setup\\n- Mock external services, not internal logic\\n- Aim for high coverage on business logic\",\n\t\t\t\tscope: \"project\",\n\t\t\t\talwaysApply: true,\n\t\t\t\tdescription: \"testing\",\n\t\t\t},\n\t\t],\n\t\tskills: [],\n\t\tagents: [],\n\t\ttoolServers: [],\n\t\thooks: [],\n\t\tpermissions: [\n\t\t\t{ tool: \"Bash\", pattern: \"python *\", decision: \"allow\", scope: \"project\" },\n\t\t\t{ tool: \"Bash\", pattern: \"pip *\", decision: \"allow\", scope: \"project\" },\n\t\t\t{ tool: \"Bash\", pattern: \"pytest *\", decision: \"allow\", scope: \"project\" },\n\t\t],\n\t\tsettings: [],\n\t\tignorePatterns: [\n\t\t\t{ pattern: \"__pycache__/**\", scope: \"project\" },\n\t\t\t{ pattern: \".venv/**\", scope: \"project\" },\n\t\t\t{ pattern: \"*.pyc\", scope: \"project\" },\n\t\t\t{ pattern: \".env\", scope: \"project\" },\n\t\t\t{ pattern: \"dist/**\", scope: \"project\" },\n\t\t\t{ pattern: \"*.egg-info/**\", scope: \"project\" },\n\t\t],\n\t};\n}\n","import type { ProjectConfig } from \"../config/schema.js\";\n\n/** Web/TypeScript project starter — conventions, testing, security directives. */\nexport function webTemplate(): ProjectConfig {\n\treturn {\n\t\tdirectives: [\n\t\t\t{\n\t\t\t\tcontent:\n\t\t\t\t\t\"# TypeScript Conventions\\n\\n- Use strict TypeScript — avoid `any`, prefer explicit types\\n- Prefer `const` over `let`; never use `var`\\n- Use ES modules (`import`/`export`), not CommonJS\\n- Prefer async/await over raw promises\\n- Use template literals over string concatenation\\n- Destructure objects and arrays where it improves readability\",\n\t\t\t\tscope: \"project\",\n\t\t\t\talwaysApply: true,\n\t\t\t\tdescription: \"typescript-conventions\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tcontent:\n\t\t\t\t\t\"# Testing Rules\\n\\n- Write tests for all new functionality\\n- Use descriptive test names that explain the expected behavior\\n- Prefer unit tests; use integration tests for cross-boundary flows\\n- Mock external dependencies, not internal modules\\n- Each test should test one thing\",\n\t\t\t\tscope: \"project\",\n\t\t\t\talwaysApply: true,\n\t\t\t\tdescription: \"testing\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tcontent:\n\t\t\t\t\t\"# Security Guidelines\\n\\n- Never hardcode secrets, tokens, or credentials\\n- Validate and sanitize all user input\\n- Use parameterized queries for database operations\\n- Escape output to prevent XSS\\n- Follow the principle of least privilege for permissions and access\",\n\t\t\t\tscope: \"project\",\n\t\t\t\talwaysApply: true,\n\t\t\t\tdescription: \"security\",\n\t\t\t},\n\t\t],\n\t\tskills: [],\n\t\tagents: [],\n\t\ttoolServers: [\n\t\t\t{\n\t\t\t\tname: \"filesystem\",\n\t\t\t\ttransport: \"stdio\",\n\t\t\t\tcommand: \"npx\",\n\t\t\t\targs: [\"-y\", \"@modelcontextprotocol/server-filesystem\", \".\"],\n\t\t\t\tscope: \"project\",\n\t\t\t},\n\t\t],\n\t\thooks: [],\n\t\tpermissions: [\n\t\t\t{ tool: \"Bash\", pattern: \"npm *\", decision: \"allow\", scope: \"project\" },\n\t\t\t{ tool: \"Bash\", pattern: \"npx *\", decision: \"allow\", scope: \"project\" },\n\t\t],\n\t\tsettings: [],\n\t\tignorePatterns: [\n\t\t\t{ pattern: \"node_modules/**\", scope: \"project\" },\n\t\t\t{ pattern: \"dist/**\", scope: \"project\" },\n\t\t\t{ pattern: \"build/**\", scope: \"project\" },\n\t\t\t{ pattern: \".env\", scope: \"project\" },\n\t\t\t{ pattern: \".env.*\", scope: \"project\" },\n\t\t\t{ pattern: \"*.min.js\", scope: \"project\" },\n\t\t],\n\t};\n}\n","import type { ProjectConfig } from \"../config/schema.js\";\nimport { blankTemplate } from \"./blank.js\";\nimport { minimalTemplate } from \"./minimal.js\";\nimport { monorepoTemplate } from \"./monorepo.js\";\nimport { pythonTemplate } from \"./python.js\";\nimport { webTemplate } from \"./web.js\";\n\n/** Available template names. */\nexport type TemplateName = \"blank\" | \"minimal\" | \"web\" | \"python\" | \"monorepo\";\n\n/** Template metadata for display. */\nexport interface TemplateInfo {\n\tname: TemplateName;\n\tlabel: string;\n\tdescription: string;\n\tfactory: () => ProjectConfig;\n}\n\n/** All available templates. */\nexport const TEMPLATES: readonly TemplateInfo[] = [\n\t{\n\t\tname: \"minimal\",\n\t\tlabel: \"Minimal\",\n\t\tdescription: \"Conventions + common ignore patterns\",\n\t\tfactory: minimalTemplate,\n\t},\n\t{\n\t\tname: \"web\",\n\t\tlabel: \"Web / TypeScript\",\n\t\tdescription: \"TypeScript conventions, testing, security, MCP server\",\n\t\tfactory: webTemplate,\n\t},\n\t{\n\t\tname: \"python\",\n\t\tlabel: \"Python\",\n\t\tdescription: \"Formatting, typing, docstrings, pytest conventions\",\n\t\tfactory: pythonTemplate,\n\t},\n\t{\n\t\tname: \"monorepo\",\n\t\tlabel: \"Monorepo\",\n\t\tdescription: \"Workspace-aware conventions, reviewer agent\",\n\t\tfactory: monorepoTemplate,\n\t},\n\t{\n\t\tname: \"blank\",\n\t\tlabel: \"Blank\",\n\t\tdescription: \"Empty config skeleton\",\n\t\tfactory: blankTemplate,\n\t},\n] as const;\n\n/** Get a template by name. Throws if not found. */\nexport function getTemplate(name: TemplateName): ProjectConfig {\n\tconst template = TEMPLATES.find((t) => t.name === name);\n\tif (!template) {\n\t\tthrow new Error(`Unknown template: ${name}`);\n\t}\n\treturn template.factory();\n}\n\n/** All valid template names. */\nexport const TEMPLATE_NAMES: readonly TemplateName[] = TEMPLATES.map((t) => t.name);\n","import { mkdir, writeFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport { loadMergedConfig, loadProjectConfig } from \"../config/loader.js\";\nimport type { ConfigScope, ProjectConfig } from \"../config/schema.js\";\nimport { validateConfig } from \"../config/schema.js\";\nimport {\n\tagentsEmitter,\n\tdirectivesEmitter,\n\thooksEmitter,\n\tmcpEmitter,\n\tpermissionsEmitter,\n\tskillsEmitter,\n} from \"../emitters/index.js\";\nimport type { EmitResult, EmittedFile, Emitter, TargetTool } from \"../emitters/types.js\";\nimport { ALL_TARGETS } from \"../emitters/types.js\";\nimport type { FileStatusEntry } from \"../state.js\";\nimport { diffFiles, loadState, saveState } from \"../state.js\";\nimport { cancelGuard, confirm, isTTY } from \"../tui.js\";\n\nexport interface SyncOptions {\n\ttargets: TargetTool[];\n\tdryRun: boolean;\n\tscope: ConfigScope;\n\tforce: boolean;\n\tyes?: boolean;\n}\n\n/** Map of target tool to user-level output directories. */\nconst USER_OUTPUT_DIRS: Record<TargetTool, string> = {\n\tclaude: join(homedir(), \".claude\"),\n\tcursor: join(homedir(), \".cursor\"),\n\tcodex: join(homedir(), \".codex\"),\n\topencode: join(homedir(), \".config\", \"opencode\"),\n\tcopilot: join(homedir(), \".copilot\"),\n\tantigravity: join(homedir(), \".agent\"),\n};\n\nconst EMITTERS: Emitter[] = [\n\tskillsEmitter,\n\tdirectivesEmitter,\n\tmcpEmitter,\n\tagentsEmitter,\n\tpermissionsEmitter,\n\thooksEmitter,\n];\n\n/** Load config, run emitters, write files. */\nexport async function runSync(projectDir: string, options: SyncOptions): Promise<void> {\n\tconst isUserScope = options.scope === \"user\";\n\tconst label = isUserScope ? \"~/.ai/\" : \".ai/\";\n\n\t// Load\n\tconsole.log(`Loading config from ${label} ...`);\n\n\tconst { config, errors: loadErrors } = isUserScope\n\t\t? await loadProjectConfig(join(homedir(), \".ai\"), \"user\")\n\t\t: await loadMergedConfig(projectDir);\n\n\tif (loadErrors.length > 0) {\n\t\tconsole.error(\"\\x1b[31mConfig errors:\\x1b[0m\");\n\t\tfor (const err of loadErrors) {\n\t\t\tconsole.error(` ${err.file}${err.line ? `:${err.line}` : \"\"}: ${err.message}`);\n\t\t}\n\t\tprocess.exitCode = 1;\n\t\treturn;\n\t}\n\n\t// Validate\n\tconst { errors: valErrors } = validateConfig(config);\n\tif (valErrors.length > 0) {\n\t\tconsole.error(\"\\x1b[31mValidation errors:\\x1b[0m\");\n\t\tfor (const err of valErrors) {\n\t\t\tconsole.error(` ${err.file}: ${err.message}`);\n\t\t}\n\t\tprocess.exitCode = 1;\n\t\treturn;\n\t}\n\n\t// Emit — track per-target results for summary\n\tconst targets = options.targets.length > 0 ? options.targets : [...ALL_TARGETS];\n\tconst perTarget = new Map<TargetTool, { files: EmittedFile[]; warnings: string[] }>();\n\n\tfor (const target of targets) {\n\t\tconst targetFiles: EmittedFile[] = [];\n\t\tconst targetWarnings: string[] = [];\n\t\tfor (const emitter of EMITTERS) {\n\t\t\tconst result: EmitResult = emitter.emit(config, target);\n\t\t\ttargetFiles.push(...result.files);\n\t\t\ttargetWarnings.push(...result.warnings);\n\t\t}\n\t\tperTarget.set(target, { files: targetFiles, warnings: targetWarnings });\n\t}\n\n\tconst allFiles = [...perTarget.values()].flatMap((r) => r.files);\n\tconst allWarnings = [...perTarget.values()].flatMap((r) => r.warnings);\n\n\t// Merge files that target the same path (e.g. multiple emitters writing to .claude/settings.json)\n\tconst mergedFiles = mergeFiles(allFiles);\n\n\t// Warnings\n\tif (allWarnings.length > 0) {\n\t\tconsole.log(\"\\x1b[33mWarnings:\\x1b[0m\");\n\t\tfor (const w of allWarnings) {\n\t\t\tconsole.log(` ⚠ ${w}`);\n\t\t}\n\t\tconsole.log(\"\");\n\t}\n\n\t// Conflict detection (project scope only)\n\tif (!isUserScope && !options.force && !options.dryRun) {\n\t\tconst state = await loadState(projectDir);\n\t\tconst statuses = await diffFiles(projectDir, mergedFiles, state);\n\t\tconst conflicts = statuses.filter((s) => s.status === \"conflict\");\n\t\tif (conflicts.length > 0) {\n\t\t\tconsole.error(\"\\x1b[31mConflicts detected (files manually edited since last sync):\\x1b[0m\");\n\t\t\tfor (const c of conflicts) {\n\t\t\t\tconsole.error(` ! ${c.path}`);\n\t\t\t}\n\t\t\tconsole.error(\"\\nUse \\x1b[1m--force\\x1b[0m to overwrite, or manually resolve.\");\n\t\t\tprocess.exitCode = 1;\n\t\t\treturn;\n\t\t}\n\t}\n\n\t// Write or report\n\tif (options.dryRun) {\n\t\tconsole.log(\"\\x1b[36mDry run — files that would be written:\\x1b[0m\");\n\t\tfor (const file of mergedFiles) {\n\t\t\tconst outputPath = resolveOutputPath(file.path, isUserScope, projectDir, targets);\n\t\t\tconsole.log(` ${outputPath}`);\n\t\t}\n\t} else {\n\t\t// Interactive confirmation in TTY mode (unless --yes)\n\t\tlet filesToWrite = mergedFiles;\n\t\tif (!options.yes && isTTY() && !isUserScope) {\n\t\t\tconst state = await loadState(projectDir);\n\t\t\tconst statuses = await diffFiles(projectDir, mergedFiles, state);\n\t\t\tconst changeCount = statuses.filter(\n\t\t\t\t(s) => s.status !== \"up-to-date\" && s.status !== \"orphaned\",\n\t\t\t).length;\n\n\t\t\tif (changeCount === 0) {\n\t\t\t\tconsole.log(\"\\x1b[32m✓\\x1b[0m Everything is up-to-date.\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tprintStatusTable(statuses, projectDir, isUserScope, targets);\n\n\t\t\tconst proceed = cancelGuard(\n\t\t\t\tawait confirm({\n\t\t\t\t\tmessage: `Apply ${changeCount} change${changeCount === 1 ? \"\" : \"s\"}?`,\n\t\t\t\t\tinitialValue: true,\n\t\t\t\t}),\n\t\t\t);\n\n\t\t\tif (!proceed) {\n\t\t\t\tconsole.log(\"Sync cancelled.\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Filter out up-to-date files\n\t\t\tconst changePaths = new Set(\n\t\t\t\tstatuses.filter((s) => s.status !== \"up-to-date\").map((s) => s.path),\n\t\t\t);\n\t\t\tfilesToWrite = mergedFiles.filter((f) => changePaths.has(f.path));\n\t\t}\n\n\t\tfor (const file of filesToWrite) {\n\t\t\tconst fullPath = resolveOutputPath(file.path, isUserScope, projectDir, targets);\n\t\t\tawait mkdir(dirname(fullPath), { recursive: true });\n\t\t\tawait writeFile(fullPath, file.content, \"utf-8\");\n\t\t}\n\n\t\t// Save state for conflict detection (track all files, not just written ones)\n\t\tif (!isUserScope) {\n\t\t\tawait saveState(projectDir, mergedFiles);\n\t\t}\n\n\t\tprintSyncSummary(config, targets, perTarget, filesToWrite.length);\n\t}\n}\n\nconst TARGET_LABELS: Record<TargetTool, string> = {\n\tclaude: \"Claude Code\",\n\tcursor: \"Cursor\",\n\tcodex: \"Codex\",\n\topencode: \"OpenCode\",\n\tcopilot: \"GitHub Copilot\",\n\tantigravity: \"Antigravity\",\n};\n\ninterface EntityCount {\n\tlabel: string;\n\tcount: number;\n}\n\nfunction countEntities(config: ProjectConfig): EntityCount[] {\n\tconst counts: EntityCount[] = [];\n\tif (config.directives.length > 0)\n\t\tcounts.push({ label: \"directive\", count: config.directives.length });\n\tif (config.skills.length > 0) counts.push({ label: \"skill\", count: config.skills.length });\n\tif (config.agents.length > 0) counts.push({ label: \"agent\", count: config.agents.length });\n\tif (config.toolServers.length > 0)\n\t\tcounts.push({ label: \"MCP server\", count: config.toolServers.length });\n\tif (config.permissions.length > 0)\n\t\tcounts.push({ label: \"permission\", count: config.permissions.length });\n\tif (config.hooks.length > 0) counts.push({ label: \"hook\", count: config.hooks.length });\n\treturn counts;\n}\n\nfunction pluralize(count: number, singular: string): string {\n\treturn `${count} ${singular}${count === 1 ? \"\" : \"s\"}`;\n}\n\nfunction printSyncSummary(\n\tconfig: ProjectConfig,\n\ttargets: TargetTool[],\n\tperTarget: Map<TargetTool, { files: EmittedFile[]; warnings: string[] }>,\n\tfilesWritten: number,\n): void {\n\tconst entities = countEntities(config);\n\n\tconsole.log(\n\t\t`\\x1b[32m✓\\x1b[0m Synced to ${targets.length} target${targets.length === 1 ? \"\" : \"s\"}`,\n\t);\n\tconsole.log(\"\");\n\n\tconst maxLabelLen = Math.max(...targets.map((t) => TARGET_LABELS[t].length));\n\n\tfor (const target of targets) {\n\t\tconst label = TARGET_LABELS[target].padEnd(maxLabelLen);\n\t\tconst result = perTarget.get(target);\n\t\tconst warnings = result?.warnings ?? [];\n\n\t\t// Count which entity types actually produced files for this target\n\t\tconst targetEntities = entities\n\t\t\t.filter((e) => {\n\t\t\t\t// If there are warnings about this entity type being unsupported, exclude it\n\t\t\t\tconst unsupported = warnings.some(\n\t\t\t\t\t(w) =>\n\t\t\t\t\t\tw.toLowerCase().includes(e.label.toLowerCase()) &&\n\t\t\t\t\t\tw.toLowerCase().includes(\"not support\"),\n\t\t\t\t);\n\t\t\t\treturn !unsupported;\n\t\t\t})\n\t\t\t.map((e) => pluralize(e.count, e.label));\n\n\t\tconst summary = targetEntities.length > 0 ? targetEntities.join(\", \") : \"no entities\";\n\n\t\t// Collect short warning notes\n\t\tconst warningNotes = warnings\n\t\t\t.filter((w) => w.toLowerCase().includes(\"not support\"))\n\t\t\t.map((w) => `\\x1b[33m⚠ ${w}\\x1b[0m`);\n\n\t\tif (warningNotes.length > 0) {\n\t\t\tconsole.log(` ${label} — ${summary}`);\n\t\t\tfor (const note of warningNotes) {\n\t\t\t\tconsole.log(` ${\"\".padEnd(maxLabelLen)} ${note}`);\n\t\t\t}\n\t\t} else {\n\t\t\tconsole.log(` ${label} — ${summary}`);\n\t\t}\n\t}\n\n\tconsole.log(\"\");\n\tconsole.log(` ${filesWritten} file${filesWritten === 1 ? \"\" : \"s\"} written.`);\n}\n\n/**\n * Resolve the output path for a file.\n * In user scope, files targeting tool-specific dirs go to ~/.<tool>/...\n * In project scope, files are relative to the project root.\n */\nfunction resolveOutputPath(\n\trelativePath: string,\n\tisUserScope: boolean,\n\tprojectDir: string,\n\t_targets: TargetTool[],\n): string {\n\tif (!isUserScope) {\n\t\treturn join(projectDir, relativePath);\n\t}\n\n\t// Map tool-specific paths to user home directories\n\tfor (const [tool, userDir] of Object.entries(USER_OUTPUT_DIRS)) {\n\t\tconst prefix = `.${tool}/`;\n\t\tif (relativePath.startsWith(prefix)) {\n\t\t\treturn join(userDir, relativePath.slice(prefix.length));\n\t\t}\n\t}\n\n\t// Copilot uses .github/ and .vscode/ prefixes → map to user copilot dir\n\tconst copilotPrefixes = [\".github/\", \".vscode/\"];\n\tfor (const prefix of copilotPrefixes) {\n\t\tif (relativePath.startsWith(prefix)) {\n\t\t\treturn join(USER_OUTPUT_DIRS.copilot, relativePath);\n\t\t}\n\t}\n\n\t// Antigravity uses .agent/ prefix → map to user antigravity dir\n\tif (relativePath.startsWith(\".agent/\")) {\n\t\treturn join(USER_OUTPUT_DIRS.antigravity, relativePath.slice(\".agent/\".length));\n\t}\n\n\t// Root-level files (CLAUDE.md, AGENTS.md, .mcp.json) go to home dir in user scope\n\treturn join(homedir(), relativePath);\n}\n\n/**\n * Merge files targeting the same path.\n * For JSON files, deep-merge the objects.\n * For TOML files, concatenate sections.\n * For other files, later content wins.\n */\nfunction mergeFiles(files: EmittedFile[]): EmittedFile[] {\n\tconst byPath = new Map<string, EmittedFile[]>();\n\tfor (const file of files) {\n\t\tconst existing = byPath.get(file.path) ?? [];\n\t\texisting.push(file);\n\t\tbyPath.set(file.path, existing);\n\t}\n\n\tconst merged: EmittedFile[] = [];\n\tfor (const [path, group] of byPath) {\n\t\tif (group.length === 1) {\n\t\t\tmerged.push(group[0]);\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (path.endsWith(\".json\")) {\n\t\t\t// Deep merge JSON objects\n\t\t\tlet result = {};\n\t\t\tfor (const file of group) {\n\t\t\t\tconst parsed = JSON.parse(file.content);\n\t\t\t\tresult = deepMerge(result, parsed);\n\t\t\t}\n\t\t\tmerged.push({ path, content: `${JSON.stringify(result, null, 2)}\\n` });\n\t\t} else if (path.endsWith(\".toml\")) {\n\t\t\t// Concatenate TOML sections\n\t\t\tconst combined = group.map((f) => f.content.trim()).join(\"\\n\\n\");\n\t\t\tmerged.push({ path, content: `${combined}\\n` });\n\t\t} else if (path.endsWith(\".md\")) {\n\t\t\t// Concatenate markdown with separator\n\t\t\tconst combined = group.map((f) => f.content.trim()).join(\"\\n\\n---\\n\\n\");\n\t\t\tmerged.push({ path, content: `${combined}\\n` });\n\t\t} else {\n\t\t\t// Last writer wins\n\t\t\tmerged.push(group[group.length - 1]);\n\t\t}\n\t}\n\n\treturn merged;\n}\n\nconst STATUS_COLORS: Record<string, string> = {\n\tnew: \"\\x1b[32m\",\n\tmodified: \"\\x1b[33m\",\n\t\"up-to-date\": \"\\x1b[2m\",\n\tconflict: \"\\x1b[31m\",\n\torphaned: \"\\x1b[2m\",\n};\n\nfunction printStatusTable(\n\tstatuses: FileStatusEntry[],\n\tprojectDir: string,\n\tisUserScope: boolean,\n\ttargets: TargetTool[],\n): void {\n\tconsole.log(\"\");\n\tfor (const entry of statuses) {\n\t\tconst color = STATUS_COLORS[entry.status] ?? \"\";\n\t\tconst reset = \"\\x1b[0m\";\n\t\tconst outputPath = resolveOutputPath(entry.path, isUserScope, projectDir, targets);\n\t\tconst suffix = entry.status === \"up-to-date\" ? \" (skip)\" : \"\";\n\t\tconsole.log(` ${color}${outputPath.padEnd(40)}${entry.status}${suffix}${reset}`);\n\t}\n\tconsole.log(\"\");\n}\n\nfunction deepMerge(\n\ttarget: Record<string, unknown>,\n\tsource: Record<string, unknown>,\n): Record<string, unknown> {\n\tconst result = { ...target };\n\tfor (const [key, value] of Object.entries(source)) {\n\t\tif (\n\t\t\ttypeof value === \"object\" &&\n\t\t\tvalue !== null &&\n\t\t\t!Array.isArray(value) &&\n\t\t\ttypeof result[key] === \"object\" &&\n\t\t\tresult[key] !== null &&\n\t\t\t!Array.isArray(result[key])\n\t\t) {\n\t\t\tresult[key] = deepMerge(\n\t\t\t\tresult[key] as Record<string, unknown>,\n\t\t\t\tvalue as Record<string, unknown>,\n\t\t\t);\n\t\t} else if (Array.isArray(value) && Array.isArray(result[key])) {\n\t\t\tresult[key] = [...(result[key] as unknown[]), ...value];\n\t\t} else {\n\t\t\tresult[key] = value;\n\t\t}\n\t}\n\treturn result;\n}\n","import type { ProjectConfig } from \"../config/schema.js\";\nimport type { Agent } from \"../domain/agent.js\";\nimport type { EmitResult, EmittedFile, Emitter, TargetTool } from \"./types.js\";\n\n/** Emits agent definition files. */\nexport const agentsEmitter: Emitter = {\n\temit(config: ProjectConfig, target: TargetTool): EmitResult {\n\t\tswitch (target) {\n\t\t\tcase \"claude\":\n\t\t\t\treturn emitClaudeAgents(config.agents);\n\t\t\tcase \"cursor\":\n\t\t\t\treturn emitCursorAgents(config.agents);\n\t\t\tcase \"codex\":\n\t\t\t\treturn emitCodexAgents(config.agents);\n\t\t\tcase \"opencode\":\n\t\t\t\treturn emitOpenCodeAgents(config.agents);\n\t\t\tcase \"copilot\":\n\t\t\t\treturn emitCopilotAgents(config.agents);\n\t\t\tcase \"antigravity\":\n\t\t\t\treturn emitAntigravityAgents(config.agents);\n\t\t}\n\t},\n};\n\n/** Claude Code: .claude/agents/<name>.md */\nfunction emitClaudeAgents(agents: Agent[]): EmitResult {\n\tconst files: EmittedFile[] = [];\n\tfor (const agent of agents) {\n\t\tfiles.push({\n\t\t\tpath: `.claude/agents/${agent.name}.md`,\n\t\t\tcontent: `${agent.instructions}\\n`,\n\t\t});\n\t}\n\treturn { files, warnings: [] };\n}\n\n/** Cursor: .cursor/agents/<name>.md */\nfunction emitCursorAgents(agents: Agent[]): EmitResult {\n\tconst files: EmittedFile[] = [];\n\tfor (const agent of agents) {\n\t\tconst frontmatter: string[] = [];\n\t\tif (agent.description) frontmatter.push(`description: ${agent.description}`);\n\t\tif (agent.model) frontmatter.push(`model: ${agent.model}`);\n\t\tif (agent.readonly) frontmatter.push(`readonly: true`);\n\t\tif (agent.tools?.length) frontmatter.push(`tools: [${agent.tools.join(\", \")}]`);\n\n\t\tconst header = frontmatter.length > 0 ? `---\\n${frontmatter.join(\"\\n\")}\\n---\\n\\n` : \"\";\n\t\tfiles.push({\n\t\t\tpath: `.cursor/agents/${agent.name}.md`,\n\t\t\tcontent: `${header}${agent.instructions}\\n`,\n\t\t});\n\t}\n\treturn { files, warnings: [] };\n}\n\n/** Codex: agent sections appended to AGENTS.md */\nfunction emitCodexAgents(agents: Agent[]): EmitResult {\n\tconst files: EmittedFile[] = [];\n\tconst warnings: string[] = [];\n\n\tif (agents.length === 0) return { files, warnings };\n\n\tconst sections = agents.map((a) => {\n\t\tconst meta: string[] = [];\n\t\tif (a.model) meta.push(`Model: ${a.model}`);\n\t\tif (a.readonly) meta.push(\"Read-only access\");\n\t\tif (a.tools?.length) meta.push(`Tools: ${a.tools.join(\", \")}`);\n\t\tconst metaBlock = meta.length > 0 ? `\\n\\n> ${meta.join(\" | \")}` : \"\";\n\t\treturn `## Agent: ${a.name}\\n\\n${a.description ? `${a.description}\\n\\n` : \"\"}${a.instructions}${metaBlock}`;\n\t});\n\n\tfiles.push({\n\t\tpath: \"AGENTS.md\",\n\t\tcontent: `# Agents\\n\\n${sections.join(\"\\n\\n---\\n\\n\")}\\n`,\n\t});\n\n\tif (agents.some((a) => a.tools?.length)) {\n\t\twarnings.push(\n\t\t\t\"Codex does not support per-agent tool restrictions — tools listed as notes only.\",\n\t\t);\n\t}\n\n\treturn { files, warnings };\n}\n\n/** Tool name mapping from generic to Copilot aliases. */\nconst COPILOT_TOOL_MAP: Record<string, string> = {\n\tRead: \"read\",\n\tWrite: \"edit\",\n\tEdit: \"edit\",\n\tBash: \"execute\",\n\tShell: \"execute\",\n\tSearch: \"search\",\n\tWebSearch: \"web\",\n\tWebFetch: \"web\",\n};\n\n/** Copilot: .github/agents/<name>.agent.md with YAML frontmatter */\nfunction emitCopilotAgents(agents: Agent[]): EmitResult {\n\tconst files: EmittedFile[] = [];\n\tconst warnings: string[] = [];\n\n\tfor (const agent of agents) {\n\t\tconst frontmatter: string[] = [];\n\t\tfrontmatter.push(`description: ${agent.description || agent.name}`);\n\n\t\tif (agent.readonly) {\n\t\t\tfrontmatter.push(`tools: [read, search]`);\n\t\t} else if (agent.tools?.length) {\n\t\t\tconst mapped = [\n\t\t\t\t...new Set(\n\t\t\t\t\tagent.tools.map((t) => {\n\t\t\t\t\t\tconst alias = COPILOT_TOOL_MAP[t];\n\t\t\t\t\t\tif (!alias) {\n\t\t\t\t\t\t\twarnings.push(\n\t\t\t\t\t\t\t\t`Unknown tool \"${t}\" for Copilot agent \"${agent.name}\" — passed through as-is.`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\treturn t.toLowerCase();\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn alias;\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t];\n\t\t\tfrontmatter.push(`tools: [${mapped.join(\", \")}]`);\n\t\t}\n\n\t\tif (agent.model) {\n\t\t\twarnings.push(\n\t\t\t\t`Copilot agents do not support model override in file config — model \"${agent.model}\" on agent \"${agent.name}\" is ignored.`,\n\t\t\t);\n\t\t}\n\n\t\tconst header = `---\\n${frontmatter.join(\"\\n\")}\\n---\\n\\n`;\n\t\tfiles.push({\n\t\t\tpath: `.github/agents/${agent.name}.agent.md`,\n\t\t\tcontent: `${header}${agent.instructions}\\n`,\n\t\t});\n\t}\n\n\treturn { files, warnings };\n}\n\n/** OpenCode: .opencode/agents/<name>.md with YAML frontmatter */\nfunction emitOpenCodeAgents(agents: Agent[]): EmitResult {\n\tconst files: EmittedFile[] = [];\n\tfor (const agent of agents) {\n\t\tconst frontmatter: string[] = [];\n\t\tif (agent.description) frontmatter.push(`description: ${agent.description}`);\n\t\tif (agent.mode) frontmatter.push(`mode: ${agent.mode}`);\n\t\tif (agent.model) frontmatter.push(`model: ${agent.model}`);\n\t\tif (agent.temperature !== undefined) frontmatter.push(`temperature: ${agent.temperature}`);\n\t\tif (agent.topP !== undefined) frontmatter.push(`top_p: ${agent.topP}`);\n\t\tif (agent.steps !== undefined) frontmatter.push(`steps: ${agent.steps}`);\n\t\tif (agent.color) frontmatter.push(`color: ${agent.color}`);\n\t\tif (agent.hidden) frontmatter.push(`hidden: true`);\n\t\tif (agent.disabled) frontmatter.push(`disable: true`);\n\t\tif (agent.readonly) {\n\t\t\tfrontmatter.push(`tools:`);\n\t\t\tfrontmatter.push(` write: false`);\n\t\t\tfrontmatter.push(` bash: false`);\n\t\t}\n\n\t\tconst header = frontmatter.length > 0 ? `---\\n${frontmatter.join(\"\\n\")}\\n---\\n\\n` : \"\";\n\t\tfiles.push({\n\t\t\tpath: `.opencode/agents/${agent.name}.md`,\n\t\t\tcontent: `${header}${agent.instructions}\\n`,\n\t\t});\n\t}\n\treturn { files, warnings: [] };\n}\n\n/** Antigravity: no file-based agent configuration */\nfunction emitAntigravityAgents(agents: Agent[]): EmitResult {\n\tconst warnings: string[] = [];\n\n\tif (agents.length > 0) {\n\t\twarnings.push(\n\t\t\t\"Antigravity does not support file-based agent configuration — agents are skipped.\",\n\t\t);\n\t}\n\n\treturn { files: [], warnings };\n}\n","import type { ProjectConfig } from \"../config/schema.js\";\nimport type { Directive } from \"../domain/directive.js\";\nimport type { EmitResult, EmittedFile, Emitter, TargetTool } from \"./types.js\";\n\n/** Emits directive files — biggest format divergence across tools. */\nexport const directivesEmitter: Emitter = {\n\temit(config: ProjectConfig, target: TargetTool): EmitResult {\n\t\tswitch (target) {\n\t\t\tcase \"claude\":\n\t\t\t\treturn emitClaude(config.directives);\n\t\t\tcase \"cursor\":\n\t\t\t\treturn emitCursor(config.directives);\n\t\t\tcase \"codex\":\n\t\t\t\treturn emitCodex(config.directives);\n\t\t\tcase \"opencode\":\n\t\t\t\treturn emitOpenCode(config.directives);\n\t\t\tcase \"copilot\":\n\t\t\t\treturn emitCopilot(config.directives);\n\t\t\tcase \"antigravity\":\n\t\t\t\treturn emitAntigravity(config.directives);\n\t\t}\n\t},\n};\n\n/**\n * Claude Code:\n * - alwaysApply directives → CLAUDE.md (concatenated)\n * - scoped/conditional directives → .claude/rules/<name>.md\n */\nfunction emitClaude(directives: Directive[]): EmitResult {\n\tconst files: EmittedFile[] = [];\n\tconst warnings: string[] = [];\n\n\tconst alwaysApply = directives.filter((d) => d.alwaysApply && !d.appliesTo?.length);\n\tconst scoped = directives.filter((d) => !d.alwaysApply || d.appliesTo?.length);\n\n\tif (alwaysApply.length > 0) {\n\t\tconst sections = alwaysApply.map((d) => d.content);\n\t\tfiles.push({\n\t\t\tpath: \"CLAUDE.md\",\n\t\t\tcontent: `${sections.join(\"\\n\\n---\\n\\n\")}\\n`,\n\t\t});\n\t}\n\n\tfor (const directive of scoped) {\n\t\tconst name = slugify(directive.description || \"rule\");\n\t\tlet content = directive.content;\n\n\t\t// Claude Code rules don't support frontmatter, so embed scope info as comments\n\t\tif (directive.appliesTo?.length) {\n\t\t\tconst globs = directive.appliesTo.join(\", \");\n\t\t\tcontent = `<!-- applies to: ${globs} -->\\n\\n${content}`;\n\t\t}\n\n\t\tfiles.push({\n\t\t\tpath: `.claude/rules/${name}.md`,\n\t\t\tcontent: `${content}\\n`,\n\t\t});\n\t}\n\n\treturn { files, warnings };\n}\n\n/**\n * Cursor:\n * Each directive → .cursor/rules/<name>.mdc with frontmatter.\n */\nfunction emitCursor(directives: Directive[]): EmitResult {\n\tconst files: EmittedFile[] = [];\n\tconst warnings: string[] = [];\n\n\tfor (const directive of directives) {\n\t\tconst name = slugify(directive.description || \"rule\");\n\t\tconst frontmatter: string[] = [];\n\n\t\tif (directive.description) {\n\t\t\tfrontmatter.push(`description: ${directive.description}`);\n\t\t}\n\t\tif (directive.appliesTo?.length) {\n\t\t\tfrontmatter.push(`globs: ${directive.appliesTo.join(\", \")}`);\n\t\t}\n\t\tfrontmatter.push(`alwaysApply: ${directive.alwaysApply}`);\n\n\t\tconst header = `---\\n${frontmatter.join(\"\\n\")}\\n---`;\n\t\tfiles.push({\n\t\t\tpath: `.cursor/rules/${name}.mdc`,\n\t\t\tcontent: `${header}\\n\\n${directive.content}\\n`,\n\t\t});\n\t}\n\n\treturn { files, warnings };\n}\n\n/**\n * Codex:\n * All directives concatenated into a single AGENTS.md with section headers.\n */\nfunction emitCodex(directives: Directive[]): EmitResult {\n\tconst files: EmittedFile[] = [];\n\tconst warnings: string[] = [];\n\n\tif (directives.length === 0) return { files, warnings };\n\n\tconst sections = directives.map((d) => {\n\t\tconst header = d.description ? `## ${d.description}` : \"## Directive\";\n\t\tconst scopeNote = d.appliesTo?.length ? `\\n\\n> Applies to: ${d.appliesTo.join(\", \")}` : \"\";\n\t\treturn `${header}${scopeNote}\\n\\n${d.content}`;\n\t});\n\n\tfiles.push({\n\t\tpath: \"AGENTS.md\",\n\t\tcontent: `# Project Instructions\\n\\n${sections.join(\"\\n\\n---\\n\\n\")}\\n`,\n\t});\n\n\tif (directives.some((d) => d.appliesTo?.length)) {\n\t\twarnings.push(\n\t\t\t\"Codex AGENTS.md does not support file-scoped directives — appliesTo patterns are included as notes but not enforced.\",\n\t\t);\n\t}\n\n\treturn { files, warnings };\n}\n\n/**\n * OpenCode:\n * Each directive → .opencode/instructions/<name>.md, paths listed in opencode.json.\n */\nfunction emitOpenCode(directives: Directive[]): EmitResult {\n\tconst files: EmittedFile[] = [];\n\tconst warnings: string[] = [];\n\n\tif (directives.length === 0) return { files, warnings };\n\n\tconst paths: string[] = [];\n\tfor (const directive of directives) {\n\t\tconst name = slugify(directive.description || \"rule\");\n\t\tlet content = directive.content;\n\n\t\tif (directive.appliesTo?.length) {\n\t\t\tcontent = `<!-- applies to: ${directive.appliesTo.join(\", \")} -->\\n\\n${content}`;\n\t\t}\n\n\t\tconst relPath = `.opencode/instructions/${name}.md`;\n\t\tfiles.push({ path: relPath, content: `${content}\\n` });\n\t\tpaths.push(relPath);\n\t}\n\n\tfiles.push({\n\t\tpath: \"opencode.json\",\n\t\tcontent: `${JSON.stringify({ instructions: paths }, null, 2)}\\n`,\n\t});\n\n\tif (directives.some((d) => d.appliesTo?.length)) {\n\t\twarnings.push(\n\t\t\t\"OpenCode does not support file-scoped directives — appliesTo patterns are included as comments but not enforced.\",\n\t\t);\n\t}\n\n\treturn { files, warnings };\n}\n\n/**\n * Copilot:\n * - alwaysApply + no appliesTo → .github/copilot-instructions.md (repo-wide)\n * - Has appliesTo → .github/instructions/<slug>.instructions.md with applyTo frontmatter\n * - Not alwaysApply, no appliesTo → .github/instructions/<slug>.instructions.md (no frontmatter)\n */\nfunction emitCopilot(directives: Directive[]): EmitResult {\n\tconst files: EmittedFile[] = [];\n\tconst warnings: string[] = [];\n\n\tconst repoWide = directives.filter((d) => d.alwaysApply && !d.appliesTo?.length);\n\tconst scoped = directives.filter((d) => !d.alwaysApply || (d.appliesTo?.length ?? 0) > 0);\n\n\tif (repoWide.length > 0) {\n\t\tconst sections = repoWide.map((d) => d.content);\n\t\tfiles.push({\n\t\t\tpath: \".github/copilot-instructions.md\",\n\t\t\tcontent: `${sections.join(\"\\n\\n---\\n\\n\")}\\n`,\n\t\t});\n\t}\n\n\tfor (const directive of scoped) {\n\t\tconst name = slugify(directive.description || \"rule\");\n\t\tlet content = directive.content;\n\n\t\tif (directive.appliesTo?.length) {\n\t\t\tconst applyTo = directive.appliesTo.join(\",\");\n\t\t\tcontent = `---\\napplyTo: \"${applyTo}\"\\n---\\n\\n${content}`;\n\t\t}\n\n\t\tfiles.push({\n\t\t\tpath: `.github/instructions/${name}.instructions.md`,\n\t\t\tcontent: `${content}\\n`,\n\t\t});\n\t}\n\n\treturn { files, warnings };\n}\n\n/**\n * Antigravity:\n * Each directive → .agent/rules/<slug>.md with YAML frontmatter.\n * Activation modes: alwaysApply, globs, description (model decision), manual.\n */\nfunction emitAntigravity(directives: Directive[]): EmitResult {\n\tconst files: EmittedFile[] = [];\n\tconst warnings: string[] = [];\n\n\tfor (const directive of directives) {\n\t\tconst name = slugify(directive.description || \"rule\");\n\t\tconst frontmatter: string[] = [];\n\n\t\tif (directive.description) {\n\t\t\tfrontmatter.push(`description: ${directive.description}`);\n\t\t}\n\n\t\tif (directive.alwaysApply && directive.appliesTo?.length) {\n\t\t\t// Glob activation mode\n\t\t\tfrontmatter.push(`globs:`);\n\t\t\tfor (const glob of directive.appliesTo) {\n\t\t\t\tfrontmatter.push(` - \"${glob}\"`);\n\t\t\t}\n\t\t} else if (directive.alwaysApply) {\n\t\t\tfrontmatter.push(`alwaysApply: true`);\n\t\t} else if (!directive.appliesTo?.length) {\n\t\t\t// Manual/@mention mode — just set alwaysApply false\n\t\t\tfrontmatter.push(`alwaysApply: false`);\n\t\t} else {\n\t\t\t// Has appliesTo but not alwaysApply — use globs\n\t\t\tfrontmatter.push(`globs:`);\n\t\t\tfor (const glob of directive.appliesTo) {\n\t\t\t\tfrontmatter.push(` - \"${glob}\"`);\n\t\t\t}\n\t\t}\n\n\t\tconst header = `---\\n${frontmatter.join(\"\\n\")}\\n---`;\n\t\tfiles.push({\n\t\t\tpath: `.agent/rules/${name}.md`,\n\t\t\tcontent: `${header}\\n\\n${directive.content}\\n`,\n\t\t});\n\t}\n\n\treturn { files, warnings };\n}\n\n/** Convert a string to a filename-safe slug. */\nfunction slugify(str: string): string {\n\treturn str\n\t\t.toLowerCase()\n\t\t.replace(/[^a-z0-9]+/g, \"-\")\n\t\t.replace(/^-|-$/g, \"\");\n}\n","import type { ProjectConfig } from \"../config/schema.js\";\nimport type { Hook } from \"../domain/hook.js\";\nimport type { IgnorePattern } from \"../domain/ignore-pattern.js\";\nimport type { EmitResult, EmittedFile, Emitter, TargetTool } from \"./types.js\";\n\n/** Emits hooks and ignore pattern configuration files. */\nexport const hooksEmitter: Emitter = {\n\temit(config: ProjectConfig, target: TargetTool): EmitResult {\n\t\tswitch (target) {\n\t\t\tcase \"claude\":\n\t\t\t\treturn emitClaude(config.hooks, config.ignorePatterns);\n\t\t\tcase \"cursor\":\n\t\t\t\treturn emitCursor(config.hooks, config.ignorePatterns);\n\t\t\tcase \"codex\":\n\t\t\t\treturn emitCodex(config.hooks, config.ignorePatterns);\n\t\t\tcase \"opencode\":\n\t\t\t\treturn emitOpenCode(config.hooks, config.ignorePatterns);\n\t\t\tcase \"copilot\":\n\t\t\t\treturn emitCopilot(config.hooks, config.ignorePatterns);\n\t\t\tcase \"antigravity\":\n\t\t\t\treturn emitAntigravity(config.hooks, config.ignorePatterns);\n\t\t}\n\t},\n};\n\n/** Claude Code: hooks in settings.json, ignore as deny rules on Read/Edit */\nfunction emitClaude(hooks: Hook[], ignorePatterns: IgnorePattern[]): EmitResult {\n\tconst files: EmittedFile[] = [];\n\tconst warnings: string[] = [];\n\n\tif (hooks.length === 0 && ignorePatterns.length === 0) return { files, warnings };\n\n\tconst settings: Record<string, unknown> = {};\n\n\t// Hooks\n\tif (hooks.length > 0) {\n\t\tconst hooksObj: Record<string, unknown[]> = {};\n\t\tfor (const hook of hooks) {\n\t\t\tif (!hooksObj[hook.event]) hooksObj[hook.event] = [];\n\t\t\tconst entry: Record<string, unknown> = { command: hook.handler };\n\t\t\tif (hook.matcher) entry.matcher = hook.matcher;\n\t\t\thooksObj[hook.event].push(entry);\n\t\t}\n\t\tsettings.hooks = hooksObj;\n\t}\n\n\t// Ignore patterns as deny rules\n\tif (ignorePatterns.length > 0) {\n\t\tconst deny = ignorePatterns.flatMap((p) => [`Read(${p.pattern})`, `Edit(${p.pattern})`]);\n\t\tsettings.permissions = { deny };\n\t}\n\n\tfiles.push({\n\t\tpath: \".claude/settings.json\",\n\t\tcontent: `${JSON.stringify(settings, null, 2)}\\n`,\n\t});\n\n\treturn { files, warnings };\n}\n\n/** Cursor: ignore patterns → .cursorignore, hooks not directly emitted */\nfunction emitCursor(hooks: Hook[], ignorePatterns: IgnorePattern[]): EmitResult {\n\tconst files: EmittedFile[] = [];\n\tconst warnings: string[] = [];\n\n\tif (ignorePatterns.length > 0) {\n\t\tconst lines = [\n\t\t\t\"# Generated by ai-dot\",\n\t\t\t\"# File exclusion rules for Cursor AI\",\n\t\t\t\"\",\n\t\t\t...ignorePatterns.map((p) => p.pattern),\n\t\t\t\"\",\n\t\t];\n\t\tfiles.push({\n\t\t\tpath: \".cursorignore\",\n\t\t\tcontent: lines.join(\"\\n\"),\n\t\t});\n\t}\n\n\tif (hooks.length > 0) {\n\t\twarnings.push(\n\t\t\t\"Cursor hook support is limited — hooks are not directly emitted to Cursor config.\",\n\t\t);\n\t}\n\n\treturn { files, warnings };\n}\n\n/** Codex: ignore → protected paths in config.toml, hooks not supported */\nfunction emitCodex(hooks: Hook[], ignorePatterns: IgnorePattern[]): EmitResult {\n\tconst files: EmittedFile[] = [];\n\tconst warnings: string[] = [];\n\n\tif (ignorePatterns.length > 0) {\n\t\tconst paths = ignorePatterns.map((p) => `\"${p.pattern}\"`).join(\", \");\n\t\tfiles.push({\n\t\t\tpath: \".codex/config.toml\",\n\t\t\tcontent: `protected_paths = [${paths}]\\n`,\n\t\t});\n\t}\n\n\tif (hooks.length > 0) {\n\t\twarnings.push(\"Codex does not support hooks — hook configuration is skipped.\");\n\t}\n\n\treturn { files, warnings };\n}\n\n/** OpenCode: ignore → watcher.ignore in opencode.json, hooks not supported */\nfunction emitOpenCode(hooks: Hook[], ignorePatterns: IgnorePattern[]): EmitResult {\n\tconst files: EmittedFile[] = [];\n\tconst warnings: string[] = [];\n\n\tif (ignorePatterns.length > 0) {\n\t\tconst ignore = ignorePatterns.map((p) => p.pattern);\n\t\tfiles.push({\n\t\t\tpath: \"opencode.json\",\n\t\t\tcontent: `${JSON.stringify({ watcher: { ignore } }, null, 2)}\\n`,\n\t\t});\n\t}\n\n\tif (hooks.length > 0) {\n\t\twarnings.push(\"OpenCode does not support lifecycle hooks — hook configuration is skipped.\");\n\t}\n\n\treturn { files, warnings };\n}\n\n/** Events supported by Copilot hooks. */\nconst COPILOT_HOOK_EVENTS = new Set([\n\t\"preToolUse\",\n\t\"postToolUse\",\n\t\"sessionStart\",\n\t\"sessionEnd\",\n\t\"userPromptSubmitted\",\n\t\"agentStop\",\n\t\"subagentStop\",\n\t\"errorOccurred\",\n]);\n\n/** Copilot: .github/hooks/ai-dot.hooks.json */\nfunction emitCopilot(hooks: Hook[], ignorePatterns: IgnorePattern[]): EmitResult {\n\tconst files: EmittedFile[] = [];\n\tconst warnings: string[] = [];\n\n\tif (hooks.length > 0) {\n\t\tconst hooksObj: Record<string, unknown[]> = {};\n\t\tfor (const hook of hooks) {\n\t\t\tif (!COPILOT_HOOK_EVENTS.has(hook.event)) {\n\t\t\t\twarnings.push(`Hook event \"${hook.event}\" is not supported by Copilot — skipped.`);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (!hooksObj[hook.event]) hooksObj[hook.event] = [];\n\t\t\tconst entry: Record<string, unknown> = { command: hook.handler };\n\t\t\tif (hook.matcher) entry.matcher = hook.matcher;\n\t\t\thooksObj[hook.event].push(entry);\n\t\t}\n\n\t\tif (Object.keys(hooksObj).length > 0) {\n\t\t\tfiles.push({\n\t\t\t\tpath: \".github/hooks/ai-dot.hooks.json\",\n\t\t\t\tcontent: `${JSON.stringify({ hooks: hooksObj }, null, 2)}\\n`,\n\t\t\t});\n\t\t}\n\t}\n\n\tif (ignorePatterns.length > 0) {\n\t\twarnings.push(\n\t\t\t\"Copilot does not support file-based ignore patterns — ignore configuration is skipped.\",\n\t\t);\n\t}\n\n\treturn { files, warnings };\n}\n\n/** Antigravity: no hooks or ignore pattern support */\nfunction emitAntigravity(hooks: Hook[], ignorePatterns: IgnorePattern[]): EmitResult {\n\tconst warnings: string[] = [];\n\n\tif (hooks.length > 0) {\n\t\twarnings.push(\"Antigravity does not support hooks — hook configuration is skipped.\");\n\t}\n\n\tif (ignorePatterns.length > 0) {\n\t\twarnings.push(\n\t\t\t\"Antigravity does not support file-based ignore patterns — ignore configuration is skipped.\",\n\t\t);\n\t}\n\n\treturn { files: [], warnings };\n}\n","import type { ProjectConfig } from \"../config/schema.js\";\nimport type { ToolServer } from \"../domain/tool-server.js\";\nimport type { EmitResult, EmittedFile, Emitter, TargetTool } from \"./types.js\";\n\n/** Emits MCP server configuration files. */\nexport const mcpEmitter: Emitter = {\n\temit(config: ProjectConfig, target: TargetTool): EmitResult {\n\t\tswitch (target) {\n\t\t\tcase \"claude\":\n\t\t\t\treturn emitClaudeMcp(config.toolServers);\n\t\t\tcase \"cursor\":\n\t\t\t\treturn emitCursorMcp(config.toolServers);\n\t\t\tcase \"codex\":\n\t\t\t\treturn emitCodexMcp(config.toolServers);\n\t\t\tcase \"opencode\":\n\t\t\t\treturn emitOpenCodeMcp(config.toolServers);\n\t\t\tcase \"copilot\":\n\t\t\t\treturn emitCopilotMcp(config.toolServers);\n\t\t\tcase \"antigravity\":\n\t\t\t\treturn emitAntigravityMcp(config.toolServers);\n\t\t}\n\t},\n};\n\n/** Claude Code: .mcp.json with `{ mcpServers: { <name>: { command, args, env } } }` */\nfunction emitClaudeMcp(servers: ToolServer[]): EmitResult {\n\tconst files: EmittedFile[] = [];\n\tconst warnings: string[] = [];\n\n\tif (servers.length === 0) return { files, warnings };\n\n\tconst mcpServers: Record<string, unknown> = {};\n\tfor (const server of servers) {\n\t\tmcpServers[server.name] = buildMcpEntry(server);\n\t}\n\n\tfiles.push({\n\t\tpath: \".mcp.json\",\n\t\tcontent: `${JSON.stringify({ mcpServers }, null, 2)}\\n`,\n\t});\n\n\treturn { files, warnings };\n}\n\n/** Cursor: .cursor/mcp.json (same JSON format as Claude Code) */\nfunction emitCursorMcp(servers: ToolServer[]): EmitResult {\n\tconst files: EmittedFile[] = [];\n\tconst warnings: string[] = [];\n\n\tif (servers.length === 0) return { files, warnings };\n\n\tconst mcpServers: Record<string, unknown> = {};\n\tfor (const server of servers) {\n\t\tmcpServers[server.name] = buildMcpEntry(server);\n\t}\n\n\tfiles.push({\n\t\tpath: \".cursor/mcp.json\",\n\t\tcontent: `${JSON.stringify({ mcpServers }, null, 2)}\\n`,\n\t});\n\n\treturn { files, warnings };\n}\n\n/** Codex: .codex/config.toml with `[mcp_servers.<name>]` sections */\nfunction emitCodexMcp(servers: ToolServer[]): EmitResult {\n\tconst files: EmittedFile[] = [];\n\tconst warnings: string[] = [];\n\n\tif (servers.length === 0) return { files, warnings };\n\n\tconst sections: string[] = [];\n\tfor (const server of servers) {\n\t\tsections.push(buildTomlSection(server));\n\t}\n\n\tfiles.push({\n\t\tpath: \".codex/config.toml\",\n\t\tcontent: `${sections.join(\"\\n\\n\")}\\n`,\n\t});\n\n\tif (servers.some((s) => s.enabledTools?.length || s.disabledTools?.length)) {\n\t\twarnings.push(\n\t\t\t\"Codex config.toml does not support enabledTools/disabledTools filtering for MCP servers.\",\n\t\t);\n\t}\n\n\treturn { files, warnings };\n}\n\n/** Copilot: .vscode/mcp.json — same JSON format but with explicit type field */\nfunction emitCopilotMcp(servers: ToolServer[]): EmitResult {\n\tconst files: EmittedFile[] = [];\n\tconst warnings: string[] = [];\n\n\tif (servers.length === 0) return { files, warnings };\n\n\tconst mcpServers: Record<string, unknown> = {};\n\tfor (const server of servers) {\n\t\tconst entry = buildMcpEntry(server);\n\t\t// Copilot requires explicit type field for all transports\n\t\tif (!entry.type) {\n\t\t\tentry.type = \"stdio\";\n\t\t}\n\t\tmcpServers[server.name] = entry;\n\t}\n\n\tfiles.push({\n\t\tpath: \".vscode/mcp.json\",\n\t\tcontent: `${JSON.stringify({ mcpServers }, null, 2)}\\n`,\n\t});\n\n\twarnings.push(\n\t\t\"Copilot coding agent MCP must be configured in GitHub repo settings separately — .vscode/mcp.json is for VS Code Copilot Chat only.\",\n\t);\n\n\treturn { files, warnings };\n}\n\nfunction buildMcpEntry(server: ToolServer): Record<string, unknown> {\n\tconst entry: Record<string, unknown> = {};\n\n\tif (server.transport === \"stdio\") {\n\t\tentry.command = server.command;\n\t\tif (server.args?.length) entry.args = server.args;\n\t} else {\n\t\tentry.type = server.transport;\n\t\tentry.url = server.url;\n\t}\n\n\tif (server.env && Object.keys(server.env).length > 0) {\n\t\tentry.env = server.env;\n\t}\n\n\treturn entry;\n}\n\nfunction buildTomlSection(server: ToolServer): string {\n\tconst lines: string[] = [`[mcp_servers.${server.name}]`];\n\n\tif (server.transport === \"stdio\") {\n\t\tlines.push(`type = \"stdio\"`);\n\t\tif (server.command) lines.push(`command = ${tomlString(server.command)}`);\n\t\tif (server.args?.length) {\n\t\t\tlines.push(`args = [${server.args.map(tomlString).join(\", \")}]`);\n\t\t}\n\t} else {\n\t\tlines.push(`type = ${tomlString(server.transport)}`);\n\t\tif (server.url) lines.push(`url = ${tomlString(server.url)}`);\n\t}\n\n\tif (server.env && Object.keys(server.env).length > 0) {\n\t\tlines.push(\"\");\n\t\tlines.push(`[mcp_servers.${server.name}.env]`);\n\t\tfor (const [key, value] of Object.entries(server.env)) {\n\t\t\tlines.push(`${key} = ${tomlString(value)}`);\n\t\t}\n\t}\n\n\treturn lines.join(\"\\n\");\n}\n\n/** OpenCode: opencode.json with `{ \"mcp\": { ... } }` */\nfunction emitOpenCodeMcp(servers: ToolServer[]): EmitResult {\n\tconst files: EmittedFile[] = [];\n\tconst warnings: string[] = [];\n\n\tif (servers.length === 0) return { files, warnings };\n\n\tconst mcp: Record<string, unknown> = {};\n\tfor (const server of servers) {\n\t\tconst entry: Record<string, unknown> = {};\n\n\t\tif (server.transport === \"stdio\") {\n\t\t\tentry.type = \"stdio\";\n\t\t\tentry.command = server.command;\n\t\t\tif (server.args?.length) entry.args = server.args;\n\t\t} else {\n\t\t\t// OpenCode uses \"remote\" for http/sse\n\t\t\tentry.type = \"remote\";\n\t\t\tentry.url = server.url;\n\t\t}\n\n\t\tif (server.env && Object.keys(server.env).length > 0) {\n\t\t\tentry.env = server.env;\n\t\t}\n\n\t\tmcp[server.name] = entry;\n\t}\n\n\tfiles.push({\n\t\tpath: \"opencode.json\",\n\t\tcontent: `${JSON.stringify({ mcp }, null, 2)}\\n`,\n\t});\n\n\tif (servers.some((s) => s.enabledTools?.length || s.disabledTools?.length)) {\n\t\twarnings.push(\n\t\t\t\"OpenCode does not support enabledTools/disabledTools filtering for MCP servers.\",\n\t\t);\n\t}\n\n\treturn { files, warnings };\n}\n\n/** Antigravity: mcp_config.json (same mcpServers JSON format) */\nfunction emitAntigravityMcp(servers: ToolServer[]): EmitResult {\n\tconst files: EmittedFile[] = [];\n\tconst warnings: string[] = [];\n\n\tif (servers.length === 0) return { files, warnings };\n\n\tconst mcpServers: Record<string, unknown> = {};\n\tfor (const server of servers) {\n\t\tmcpServers[server.name] = buildMcpEntry(server);\n\t}\n\n\tfiles.push({\n\t\tpath: \"mcp_config.json\",\n\t\tcontent: `${JSON.stringify({ mcpServers }, null, 2)}\\n`,\n\t});\n\n\tif (servers.some((s) => s.enabledTools?.length || s.disabledTools?.length)) {\n\t\twarnings.push(\n\t\t\t\"Antigravity does not support enabledTools/disabledTools filtering for MCP servers.\",\n\t\t);\n\t}\n\n\treturn { files, warnings };\n}\n\nfunction tomlString(s: string): string {\n\treturn `\"${s.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"')}\"`;\n}\n","import type { ProjectConfig } from \"../config/schema.js\";\nimport type { Permission } from \"../domain/permission.js\";\nimport type { Setting } from \"../domain/settings.js\";\nimport type { EmitResult, EmittedFile, Emitter, TargetTool } from \"./types.js\";\n\n/** Emits permissions and settings configuration files. */\nexport const permissionsEmitter: Emitter = {\n\temit(config: ProjectConfig, target: TargetTool): EmitResult {\n\t\tswitch (target) {\n\t\t\tcase \"claude\":\n\t\t\t\treturn emitClaude(config.permissions, config.settings);\n\t\t\tcase \"cursor\":\n\t\t\t\treturn emitCursor(config.permissions, config.settings);\n\t\t\tcase \"codex\":\n\t\t\t\treturn emitCodex(config.permissions, config.settings);\n\t\t\tcase \"opencode\":\n\t\t\t\treturn emitOpenCode(config.permissions, config.settings);\n\t\t\tcase \"copilot\":\n\t\t\t\treturn emitCopilot(config.permissions, config.settings);\n\t\t\tcase \"antigravity\":\n\t\t\t\treturn emitAntigravity(config.permissions, config.settings);\n\t\t}\n\t},\n};\n\n/** Claude Code: .claude/settings.json with permissions.allow/deny */\nfunction emitClaude(permissions: Permission[], settings: Setting[]): EmitResult {\n\tconst files: EmittedFile[] = [];\n\tconst warnings: string[] = [];\n\n\tif (permissions.length === 0 && settings.length === 0) return { files, warnings };\n\n\tconst settingsObj: Record<string, unknown> = {};\n\n\t// Permissions\n\tif (permissions.length > 0) {\n\t\tconst allow: string[] = [];\n\t\tconst deny: string[] = [];\n\n\t\tfor (const perm of permissions) {\n\t\t\tconst rule = perm.pattern ? `${perm.tool}(${perm.pattern})` : perm.tool;\n\t\t\tif (perm.decision === \"allow\") allow.push(rule);\n\t\t\telse if (perm.decision === \"deny\") deny.push(rule);\n\t\t}\n\n\t\tconst permsObj: Record<string, string[]> = {};\n\t\tif (allow.length > 0) permsObj.allow = allow;\n\t\tif (deny.length > 0) permsObj.deny = deny;\n\t\tsettingsObj.permissions = permsObj;\n\n\t\tif (permissions.some((p) => p.decision === \"ask\")) {\n\t\t\twarnings.push(\n\t\t\t\t'Claude Code does not support \"ask\" permission decision — these rules are omitted.',\n\t\t\t);\n\t\t}\n\t}\n\n\t// Settings\n\tfor (const setting of settings) {\n\t\tsettingsObj[setting.key] = setting.value;\n\t}\n\n\tfiles.push({\n\t\tpath: \".claude/settings.json\",\n\t\tcontent: `${JSON.stringify(settingsObj, null, 2)}\\n`,\n\t});\n\n\treturn { files, warnings };\n}\n\n/** Cursor: .cursor/cli.json with allow/deny per tool type */\nfunction emitCursor(permissions: Permission[], settings: Setting[]): EmitResult {\n\tconst files: EmittedFile[] = [];\n\tconst warnings: string[] = [];\n\n\tif (permissions.length === 0 && settings.length === 0) return { files, warnings };\n\n\tconst cliConfig: Record<string, unknown> = {};\n\n\tif (permissions.length > 0) {\n\t\tconst allow: string[] = [];\n\t\tconst deny: string[] = [];\n\n\t\tfor (const perm of permissions) {\n\t\t\tconst rule = perm.pattern ? `${perm.tool}(${perm.pattern})` : perm.tool;\n\t\t\tif (perm.decision === \"allow\") allow.push(rule);\n\t\t\telse if (perm.decision === \"deny\") deny.push(rule);\n\t\t}\n\n\t\tconst permsObj: Record<string, string[]> = {};\n\t\tif (allow.length > 0) permsObj.allow = allow;\n\t\tif (deny.length > 0) permsObj.deny = deny;\n\t\tcliConfig.permissions = permsObj;\n\t}\n\n\tfor (const setting of settings) {\n\t\tcliConfig[setting.key] = setting.value;\n\t}\n\n\tfiles.push({\n\t\tpath: \".cursor/cli.json\",\n\t\tcontent: `${JSON.stringify(cliConfig, null, 2)}\\n`,\n\t});\n\n\treturn { files, warnings };\n}\n\n/** Codex: approval_policy + sandbox_mode in .codex/config.toml (lossy) */\nfunction emitCodex(permissions: Permission[], settings: Setting[]): EmitResult {\n\tconst files: EmittedFile[] = [];\n\tconst warnings: string[] = [];\n\n\tif (permissions.length === 0 && settings.length === 0) return { files, warnings };\n\n\tconst lines: string[] = [];\n\n\t// Map permissions to Codex approval_policy\n\tif (permissions.length > 0) {\n\t\tconst hasAllow = permissions.some((p) => p.decision === \"allow\");\n\t\tconst hasDeny = permissions.some((p) => p.decision === \"deny\");\n\n\t\tif (hasAllow && !hasDeny) {\n\t\t\tlines.push(`approval_policy = \"unless-allowed\"`);\n\t\t} else if (hasDeny) {\n\t\t\tlines.push(`approval_policy = \"unless-allowed\"`);\n\t\t} else {\n\t\t\tlines.push(`approval_policy = \"on-failure\"`);\n\t\t}\n\n\t\twarnings.push(\n\t\t\t\"Codex permissions are lossy — per-tool/pattern permissions are mapped to a single approval_policy.\",\n\t\t);\n\t}\n\n\t// Settings\n\tfor (const setting of settings) {\n\t\tconst value = typeof setting.value === \"string\" ? `\"${setting.value}\"` : String(setting.value);\n\t\tlines.push(`${setting.key} = ${value}`);\n\t}\n\n\tfiles.push({\n\t\tpath: \".codex/config.toml\",\n\t\tcontent: `${lines.join(\"\\n\")}\\n`,\n\t});\n\n\treturn { files, warnings };\n}\n\n/** OpenCode: opencode.json with permission key. All 3 decisions supported. */\nfunction emitOpenCode(permissions: Permission[], settings: Setting[]): EmitResult {\n\tconst files: EmittedFile[] = [];\n\tconst warnings: string[] = [];\n\n\tif (permissions.length === 0 && settings.length === 0) return { files, warnings };\n\n\tconst config: Record<string, unknown> = {};\n\n\tif (permissions.length > 0) {\n\t\tconst permission: Record<string, unknown> = {};\n\n\t\tfor (const perm of permissions) {\n\t\t\tif (perm.pattern) {\n\t\t\t\t// Tool with pattern → nested object: { \"bash\": { \"<pattern>\": \"<decision>\" } }\n\t\t\t\tconst toolKey = perm.tool.toLowerCase();\n\t\t\t\tif (!permission[toolKey] || typeof permission[toolKey] !== \"object\") {\n\t\t\t\t\tpermission[toolKey] = {};\n\t\t\t\t}\n\t\t\t\t(permission[toolKey] as Record<string, string>)[perm.pattern] = perm.decision;\n\t\t\t} else {\n\t\t\t\t// Tool without pattern → flat: { \"<tool>\": \"<decision>\" }\n\t\t\t\tpermission[perm.tool.toLowerCase()] = perm.decision;\n\t\t\t}\n\t\t}\n\n\t\tconfig.permission = permission;\n\t}\n\n\tfor (const setting of settings) {\n\t\tconfig[setting.key] = setting.value;\n\t}\n\n\tfiles.push({\n\t\tpath: \"opencode.json\",\n\t\tcontent: `${JSON.stringify(config, null, 2)}\\n`,\n\t});\n\n\treturn { files, warnings };\n}\n\n/** Copilot: no file-based permission or settings support */\nfunction emitCopilot(permissions: Permission[], settings: Setting[]): EmitResult {\n\tconst warnings: string[] = [];\n\n\tif (permissions.length > 0) {\n\t\twarnings.push(\n\t\t\t\"Copilot does not support file-based permission configuration — permissions are skipped.\",\n\t\t);\n\t}\n\n\tif (settings.length > 0) {\n\t\twarnings.push(\n\t\t\t\"Copilot does not support file-based settings configuration — settings are skipped.\",\n\t\t);\n\t}\n\n\treturn { files: [], warnings };\n}\n\n/** Antigravity: no file-based permission or settings support */\nfunction emitAntigravity(permissions: Permission[], settings: Setting[]): EmitResult {\n\tconst warnings: string[] = [];\n\n\tif (permissions.length > 0) {\n\t\twarnings.push(\n\t\t\t\"Antigravity does not support file-based permission configuration — permissions are skipped.\",\n\t\t);\n\t}\n\n\tif (settings.length > 0) {\n\t\twarnings.push(\n\t\t\t\"Antigravity does not support file-based settings configuration — settings are skipped.\",\n\t\t);\n\t}\n\n\treturn { files: [], warnings };\n}\n","import type { ProjectConfig } from \"../config/schema.js\";\nimport type { EmitResult, EmittedFile, Emitter, TargetTool } from \"./types.js\";\n\n/** Map of target tool to skills output directory. */\nconst SKILLS_DIRS: Record<TargetTool, string> = {\n\tclaude: \".claude/skills\",\n\tcursor: \".cursor/skills\",\n\tcodex: \".codex/skills\",\n\topencode: \".opencode/skills\",\n\tcopilot: \".github/skills\",\n\tantigravity: \".agent/skills\",\n};\n\n/** Emits skill files for all target tools. Near-identical format across all 3. */\nexport const skillsEmitter: Emitter = {\n\temit(config: ProjectConfig, target: TargetTool): EmitResult {\n\t\tconst files: EmittedFile[] = [];\n\t\tconst warnings: string[] = [];\n\t\tconst baseDir = SKILLS_DIRS[target];\n\n\t\tfor (const skill of config.skills) {\n\t\t\tfiles.push({\n\t\t\t\tpath: `${baseDir}/${skill.name}/SKILL.md`,\n\t\t\t\tcontent: skill.content,\n\t\t\t});\n\t\t}\n\n\t\treturn { files, warnings };\n\t},\n};\n","import { createHash } from \"node:crypto\";\nimport { readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { EmittedFile } from \"./emitters/types.js\";\n\n/** Persisted state of last sync operation. */\nexport interface SyncState {\n\t/** Timestamp of last sync. */\n\tlastSync: string;\n\t/** Map of relative file path → content hash. */\n\tfiles: Record<string, string>;\n}\n\nconst STATE_FILE = \".ai/.state.json\";\n\n/** Compute a content hash for a string. */\nexport function contentHash(content: string): string {\n\treturn createHash(\"sha256\").update(content).digest(\"hex\").slice(0, 16);\n}\n\n/** Load the sync state from .ai/.state.json. */\nexport async function loadState(projectDir: string): Promise<SyncState | null> {\n\ttry {\n\t\tconst raw = await readFile(join(projectDir, STATE_FILE), \"utf-8\");\n\t\treturn JSON.parse(raw) as SyncState;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\n/** Save the sync state to .ai/.state.json. */\nexport async function saveState(projectDir: string, files: EmittedFile[]): Promise<void> {\n\tconst state: SyncState = {\n\t\tlastSync: new Date().toISOString(),\n\t\tfiles: {},\n\t};\n\n\tfor (const file of files) {\n\t\tstate.files[file.path] = contentHash(file.content);\n\t}\n\n\tawait writeFile(join(projectDir, STATE_FILE), `${JSON.stringify(state, null, 2)}\\n`, \"utf-8\");\n}\n\n/** Status of a generated file compared to what's on disk. */\nexport type FileStatus = \"new\" | \"up-to-date\" | \"modified\" | \"conflict\" | \"orphaned\";\n\n/** Result of comparing a file. */\nexport interface FileStatusEntry {\n\tpath: string;\n\tstatus: FileStatus;\n}\n\n/**\n * Compare generated files against on-disk state and last-known state.\n * Returns status for each file plus any orphaned files from previous sync.\n */\nexport async function diffFiles(\n\tprojectDir: string,\n\tgenerated: EmittedFile[],\n\tstate: SyncState | null,\n): Promise<FileStatusEntry[]> {\n\tconst entries: FileStatusEntry[] = [];\n\tconst seenPaths = new Set<string>();\n\n\tfor (const file of generated) {\n\t\tseenPaths.add(file.path);\n\t\tconst generatedHash = contentHash(file.content);\n\n\t\t// Read what's on disk\n\t\tlet diskContent: string | null = null;\n\t\ttry {\n\t\t\tdiskContent = await readFile(join(projectDir, file.path), \"utf-8\");\n\t\t} catch {\n\t\t\t// File doesn't exist on disk\n\t\t}\n\n\t\tif (diskContent === null) {\n\t\t\t// File doesn't exist on disk\n\t\t\tentries.push({ path: file.path, status: \"new\" });\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst diskHash = contentHash(diskContent);\n\t\tconst lastKnownHash = state?.files[file.path];\n\n\t\tif (diskHash === generatedHash) {\n\t\t\t// Disk matches what we'd generate\n\t\t\tentries.push({ path: file.path, status: \"up-to-date\" });\n\t\t} else if (!lastKnownHash) {\n\t\t\t// No previous state — file existed but differs from what we'd generate\n\t\t\tentries.push({ path: file.path, status: \"conflict\" });\n\t\t} else if (diskHash === lastKnownHash) {\n\t\t\t// Disk matches our last sync, but config has changed — safe to update\n\t\t\tentries.push({ path: file.path, status: \"modified\" });\n\t\t} else {\n\t\t\t// Disk was manually edited since last sync AND config changed — conflict\n\t\t\tentries.push({ path: file.path, status: \"conflict\" });\n\t\t}\n\t}\n\n\t// Check for orphaned files (in state but not in generated)\n\tif (state) {\n\t\tfor (const path of Object.keys(state.files)) {\n\t\t\tif (!seenPaths.has(path)) {\n\t\t\t\tentries.push({ path, status: \"orphaned\" });\n\t\t\t}\n\t\t}\n\t}\n\n\treturn entries;\n}\n","import { loadMergedConfig } from \"../config/loader.js\";\nimport { validateConfig } from \"../config/schema.js\";\nimport {\n\tagentsEmitter,\n\tdirectivesEmitter,\n\thooksEmitter,\n\tmcpEmitter,\n\tpermissionsEmitter,\n\tskillsEmitter,\n} from \"../emitters/index.js\";\nimport type { EmittedFile, Emitter } from \"../emitters/types.js\";\nimport { ALL_TARGETS } from \"../emitters/types.js\";\nimport { diffFiles, type FileStatus, loadState } from \"../state.js\";\n\nconst EMITTERS: Emitter[] = [\n\tskillsEmitter,\n\tdirectivesEmitter,\n\tmcpEmitter,\n\tagentsEmitter,\n\tpermissionsEmitter,\n\thooksEmitter,\n];\n\nconst STATUS_ICONS: Record<FileStatus, string> = {\n\tnew: \"\\x1b[32m+\\x1b[0m\",\n\t\"up-to-date\": \"\\x1b[90m=\\x1b[0m\",\n\tmodified: \"\\x1b[33m~\\x1b[0m\",\n\tconflict: \"\\x1b[31m!\\x1b[0m\",\n\torphaned: \"\\x1b[31m-\\x1b[0m\",\n};\n\nconst STATUS_LABELS: Record<FileStatus, string> = {\n\tnew: \"new\",\n\t\"up-to-date\": \"up-to-date\",\n\tmodified: \"modified\",\n\tconflict: \"conflict (manually edited)\",\n\torphaned: \"orphaned (no longer generated)\",\n};\n\n/** Show the status of generated files vs what's on disk. */\nexport async function runStatus(projectDir: string): Promise<void> {\n\t// Load config\n\tconst { config, errors: loadErrors } = await loadMergedConfig(projectDir);\n\n\tif (loadErrors.length > 0) {\n\t\tconsole.error(\"\\x1b[31mConfig errors:\\x1b[0m\");\n\t\tfor (const err of loadErrors) {\n\t\t\tconsole.error(` ${err.file}${err.line ? `:${err.line}` : \"\"}: ${err.message}`);\n\t\t}\n\t\tprocess.exitCode = 1;\n\t\treturn;\n\t}\n\n\tconst { errors: valErrors } = validateConfig(config);\n\tif (valErrors.length > 0) {\n\t\tconsole.error(\"\\x1b[31mValidation errors:\\x1b[0m\");\n\t\tfor (const err of valErrors) {\n\t\t\tconsole.error(` ${err.file}: ${err.message}`);\n\t\t}\n\t\tprocess.exitCode = 1;\n\t\treturn;\n\t}\n\n\t// Generate files (in memory only)\n\tconst allFiles: EmittedFile[] = [];\n\tfor (const target of ALL_TARGETS) {\n\t\tfor (const emitter of EMITTERS) {\n\t\t\tconst result = emitter.emit(config, target);\n\t\t\tallFiles.push(...result.files);\n\t\t}\n\t}\n\n\t// Merge duplicates\n\tconst mergedFiles = mergeFilesByPath(allFiles);\n\n\t// Load previous state\n\tconst state = await loadState(projectDir);\n\n\tif (!state) {\n\t\tconsole.log(\"No previous sync state found. Run \\x1b[1mai-dot sync\\x1b[0m first.\\n\");\n\t}\n\n\t// Diff\n\tconst entries = await diffFiles(projectDir, mergedFiles, state);\n\n\t// Display\n\tconst counts: Record<FileStatus, number> = {\n\t\tnew: 0,\n\t\t\"up-to-date\": 0,\n\t\tmodified: 0,\n\t\tconflict: 0,\n\t\torphaned: 0,\n\t};\n\n\tconsole.log(\"\\x1b[1mFile status:\\x1b[0m\\n\");\n\tfor (const entry of entries.sort((a, b) => a.path.localeCompare(b.path))) {\n\t\tcounts[entry.status]++;\n\t\tconsole.log(\n\t\t\t` ${STATUS_ICONS[entry.status]} ${entry.path} \\x1b[90m${STATUS_LABELS[entry.status]}\\x1b[0m`,\n\t\t);\n\t}\n\n\t// Summary\n\tconsole.log(\"\");\n\tconst parts: string[] = [];\n\tif (counts.new > 0) parts.push(`\\x1b[32m${counts.new} new\\x1b[0m`);\n\tif (counts.modified > 0) parts.push(`\\x1b[33m${counts.modified} modified\\x1b[0m`);\n\tif (counts[\"up-to-date\"] > 0) parts.push(`\\x1b[90m${counts[\"up-to-date\"]} up-to-date\\x1b[0m`);\n\tif (counts.conflict > 0) parts.push(`\\x1b[31m${counts.conflict} conflicts\\x1b[0m`);\n\tif (counts.orphaned > 0) parts.push(`\\x1b[31m${counts.orphaned} orphaned\\x1b[0m`);\n\tconsole.log(` ${parts.join(\", \")}`);\n\n\tif (counts.conflict > 0) {\n\t\tconsole.log(\"\\n Use \\x1b[1mai-dot sync --force\\x1b[0m to overwrite conflicting files.\");\n\t}\n}\n\n/** Simple merge of files by path (last writer wins for non-JSON/TOML). */\nfunction mergeFilesByPath(files: EmittedFile[]): EmittedFile[] {\n\tconst byPath = new Map<string, EmittedFile>();\n\tfor (const file of files) {\n\t\tconst existing = byPath.get(file.path);\n\t\tif (!existing) {\n\t\t\tbyPath.set(file.path, file);\n\t\t} else if (file.path.endsWith(\".json\")) {\n\t\t\tconst merged = deepMergeJson(existing.content, file.content);\n\t\t\tbyPath.set(file.path, { path: file.path, content: merged });\n\t\t} else if (file.path.endsWith(\".toml\")) {\n\t\t\tbyPath.set(file.path, {\n\t\t\t\tpath: file.path,\n\t\t\t\tcontent: `${existing.content.trim()}\\n\\n${file.content.trim()}\\n`,\n\t\t\t});\n\t\t} else if (file.path.endsWith(\".md\")) {\n\t\t\tbyPath.set(file.path, {\n\t\t\t\tpath: file.path,\n\t\t\t\tcontent: `${existing.content.trim()}\\n\\n---\\n\\n${file.content.trim()}\\n`,\n\t\t\t});\n\t\t} else {\n\t\t\tbyPath.set(file.path, file);\n\t\t}\n\t}\n\treturn [...byPath.values()];\n}\n\nfunction deepMergeJson(a: string, b: string): string {\n\tconst objA = JSON.parse(a);\n\tconst objB = JSON.parse(b);\n\tconst merged = merge(objA, objB);\n\treturn `${JSON.stringify(merged, null, 2)}\\n`;\n}\n\nfunction merge(\n\ttarget: Record<string, unknown>,\n\tsource: Record<string, unknown>,\n): Record<string, unknown> {\n\tconst result = { ...target };\n\tfor (const [key, value] of Object.entries(source)) {\n\t\tif (\n\t\t\ttypeof value === \"object\" &&\n\t\t\tvalue !== null &&\n\t\t\t!Array.isArray(value) &&\n\t\t\ttypeof result[key] === \"object\" &&\n\t\t\tresult[key] !== null &&\n\t\t\t!Array.isArray(result[key])\n\t\t) {\n\t\t\tresult[key] = merge(result[key] as Record<string, unknown>, value as Record<string, unknown>);\n\t\t} else if (Array.isArray(value) && Array.isArray(result[key])) {\n\t\t\tresult[key] = [...(result[key] as unknown[]), ...value];\n\t\t} else {\n\t\t\tresult[key] = value;\n\t\t}\n\t}\n\treturn result;\n}\n","import type { Agent } from \"./agent.js\";\nimport type { Directive } from \"./directive.js\";\nimport type { Hook } from \"./hook.js\";\nimport type { IgnorePattern } from \"./ignore-pattern.js\";\nimport type { Permission } from \"./permission.js\";\nimport type { Setting } from \"./settings.js\";\nimport type { Skill } from \"./skill.js\";\nimport type { ToolServer } from \"./tool-server.js\";\n\n/** Create a Directive with sensible defaults. */\nexport function createDirective(\n\toverrides: Partial<Directive> & Pick<Directive, \"content\" | \"scope\">,\n): Directive {\n\treturn {\n\t\talwaysApply: true,\n\t\t...overrides,\n\t};\n}\n\n/** Create a Skill with sensible defaults. */\nexport function createSkill(overrides: Partial<Skill> & Pick<Skill, \"name\" | \"content\">): Skill {\n\treturn {\n\t\tdescription: \"\",\n\t\tdisableAutoInvocation: false,\n\t\t...overrides,\n\t};\n}\n\n/** Create an Agent with sensible defaults. */\nexport function createAgent(\n\toverrides: Partial<Agent> & Pick<Agent, \"name\" | \"instructions\">,\n): Agent {\n\treturn {\n\t\tdescription: \"\",\n\t\t...overrides,\n\t};\n}\n\n/** Create a ToolServer with sensible defaults. */\nexport function createToolServer(\n\toverrides: Partial<ToolServer> & Pick<ToolServer, \"name\" | \"transport\" | \"scope\">,\n): ToolServer {\n\treturn { ...overrides };\n}\n\n/** Create a Hook with sensible defaults. */\nexport function createHook(\n\toverrides: Partial<Hook> & Pick<Hook, \"event\" | \"handler\" | \"scope\">,\n): Hook {\n\treturn { ...overrides };\n}\n\n/** Create a Permission with sensible defaults. */\nexport function createPermission(\n\toverrides: Partial<Permission> & Pick<Permission, \"tool\" | \"decision\" | \"scope\">,\n): Permission {\n\treturn { ...overrides };\n}\n\n/** Create a Setting. */\nexport function createSetting(\n\toverrides: Partial<Setting> & Pick<Setting, \"key\" | \"value\" | \"scope\">,\n): Setting {\n\treturn { ...overrides };\n}\n\n/** Create an IgnorePattern. */\nexport function createIgnorePattern(\n\toverrides: Partial<IgnorePattern> & Pick<IgnorePattern, \"pattern\" | \"scope\">,\n): IgnorePattern {\n\treturn { ...overrides };\n}\n","import type { Scope } from \"./scope.js\";\n\n/** Lifecycle events that can trigger a hook. */\nexport const HookEvent = {\n\tPreToolUse: \"preToolUse\",\n\tPostToolUse: \"postToolUse\",\n\tPreFileEdit: \"preFileEdit\",\n\tPostFileEdit: \"postFileEdit\",\n\tSessionStart: \"sessionStart\",\n\tSessionEnd: \"sessionEnd\",\n\tUserPromptSubmitted: \"userPromptSubmitted\",\n\tAgentStop: \"agentStop\",\n\tSubagentStop: \"subagentStop\",\n\tErrorOccurred: \"errorOccurred\",\n} as const;\n\nexport type HookEvent = (typeof HookEvent)[keyof typeof HookEvent];\n\n/**\n * An event handler that fires at specific points in the agent lifecycle.\n * Supported by Claude Code and Cursor; not supported by Codex.\n */\nexport interface Hook {\n\t/** Lifecycle event this hook responds to. */\n\tevent: HookEvent;\n\t/** Filter condition (glob pattern or tool name) for when this hook fires. */\n\tmatcher?: string;\n\t/** Shell command or prompt to execute. */\n\thandler: string;\n\t/** Scope at which this hook is defined. */\n\tscope: Scope;\n}\n","import type { Scope } from \"./scope.js\";\n\n/** The three possible access control decisions. */\nexport const Decision = {\n\tAllow: \"allow\",\n\tDeny: \"deny\",\n\tAsk: \"ask\",\n} as const;\n\nexport type Decision = (typeof Decision)[keyof typeof Decision];\n\n/**\n * An access control rule governing what tools and actions the agent can take.\n *\n * Claude Code: allow/deny/ask rules per tool (Bash(pattern), Read(pattern), etc.)\n * Cursor: allow/deny per tool type (Shell(cmd), Read(glob), Write(glob))\n * Codex: approval_policy + sandbox_mode + command rules\n */\nexport interface Permission {\n\t/** Which tool this applies to (e.g. \"Bash\", \"Read\", \"Write\"). */\n\ttool: string;\n\t/** Glob/prefix pattern for matching arguments. */\n\tpattern?: string;\n\t/** Access control decision. */\n\tdecision: Decision;\n\t/** Scope at which this permission is defined. */\n\tscope: Scope;\n}\n","/**\n * The 4-tier scope hierarchy shared by Claude Code, Cursor, and Codex.\n * Precedence: enterprise > project > user > local (highest to lowest).\n */\nexport const Scope = {\n\tEnterprise: \"enterprise\",\n\tProject: \"project\",\n\tUser: \"user\",\n\tLocal: \"local\",\n} as const;\n\nexport type Scope = (typeof Scope)[keyof typeof Scope];\n\n/** All scopes ordered from highest to lowest precedence. */\nexport const SCOPE_PRECEDENCE: readonly Scope[] = [\n\tScope.Enterprise,\n\tScope.Project,\n\tScope.User,\n\tScope.Local,\n];\n\n/** Returns true if `a` has higher precedence (lower index) than `b`. */\nexport function scopeOutranks(a: Scope, b: Scope): boolean {\n\treturn SCOPE_PRECEDENCE.indexOf(a) < SCOPE_PRECEDENCE.indexOf(b);\n}\n","import type { Scope } from \"./scope.js\";\n\n/** MCP transport type. */\nexport const Transport = {\n\tStdio: \"stdio\",\n\tHttp: \"http\",\n\tSse: \"sse\",\n} as const;\n\nexport type Transport = (typeof Transport)[keyof typeof Transport];\n\n/**\n * An external tool/data provider connected via Model Context Protocol (MCP).\n * Universal across Claude Code, Cursor, and Codex.\n */\nexport interface ToolServer {\n\t/** Identifier. */\n\tname: string;\n\t/** Connection type. */\n\ttransport: Transport;\n\t/** Shell command (stdio) or endpoint URL (http/sse). */\n\tcommand?: string;\n\turl?: string;\n\t/** Command arguments (stdio transport). */\n\targs?: string[];\n\t/** Environment variables passed to the server. */\n\tenv?: Record<string, string>;\n\t/** If set, only these tools are exposed from the server. */\n\tenabledTools?: string[];\n\t/** If set, these tools are hidden from the server. */\n\tdisabledTools?: string[];\n\t/** Scope at which this server is configured. */\n\tscope: Scope;\n}\n","import type { Agent } from \"./agent.js\";\nimport type { Directive } from \"./directive.js\";\nimport type { Hook } from \"./hook.js\";\nimport type { IgnorePattern } from \"./ignore-pattern.js\";\nimport type { Permission } from \"./permission.js\";\nimport { SCOPE_PRECEDENCE } from \"./scope.js\";\nimport type { Setting } from \"./settings.js\";\nimport type { Skill } from \"./skill.js\";\nimport type { ToolServer } from \"./tool-server.js\";\n\nfunction isObj(v: unknown): v is Record<string, unknown> {\n\treturn typeof v === \"object\" && v !== null;\n}\n\nfunction hasString(o: Record<string, unknown>, k: string): boolean {\n\treturn typeof o[k] === \"string\";\n}\n\nfunction hasScope(o: Record<string, unknown>): boolean {\n\treturn typeof o.scope === \"string\" && SCOPE_PRECEDENCE.includes(o.scope as never);\n}\n\nexport function isDirective(v: unknown): v is Directive {\n\treturn isObj(v) && hasString(v, \"content\") && hasScope(v) && typeof v.alwaysApply === \"boolean\";\n}\n\nexport function isSkill(v: unknown): v is Skill {\n\treturn (\n\t\tisObj(v) &&\n\t\thasString(v, \"name\") &&\n\t\thasString(v, \"content\") &&\n\t\ttypeof v.disableAutoInvocation === \"boolean\"\n\t);\n}\n\nexport function isAgent(v: unknown): v is Agent {\n\treturn isObj(v) && hasString(v, \"name\") && hasString(v, \"instructions\");\n}\n\nexport function isToolServer(v: unknown): v is ToolServer {\n\treturn isObj(v) && hasString(v, \"name\") && hasString(v, \"transport\") && hasScope(v);\n}\n\nexport function isHook(v: unknown): v is Hook {\n\treturn isObj(v) && hasString(v, \"event\") && hasString(v, \"handler\") && hasScope(v);\n}\n\nexport function isPermission(v: unknown): v is Permission {\n\treturn isObj(v) && hasString(v, \"tool\") && hasString(v, \"decision\") && hasScope(v);\n}\n\nexport function isSetting(v: unknown): v is Setting {\n\treturn isObj(v) && hasString(v, \"key\") && \"value\" in v && hasScope(v);\n}\n\nexport function isIgnorePattern(v: unknown): v is IgnorePattern {\n\treturn isObj(v) && hasString(v, \"pattern\") && hasScope(v);\n}\n"],"mappings":"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","names":["homedir","join","readdir","readFile","join","parseYaml","readFile","readFile","join","join","readFile","parseYaml","raw","readdir","join","homedir","join","readFile","join","join","readFile","readFile","readFile","readFile","readFile","readFile","join","join","readFile","extractHeading","readdir","stat","join","mkdir","writeFile","join","stringifyYaml","join","existsSync","join","mkdir","writeFile","homedir","join","slugify","emitClaude","emitCursor","emitCodex","emitOpenCode","emitCopilot","emitAntigravity","emitClaude","emitCursor","emitCodex","emitOpenCode","emitCopilot","emitAntigravity","readFile","writeFile","join","join","homedir","mkdir","writeFile","join","existsSync","EMITTERS"]}
|