@vitld/meld-cli 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/index.ts","../src/cli/gen.ts","../src/generate.ts","../src/config/loader.ts","../src/config/schema.ts","../src/config/interpolate.ts","../src/context/composer.ts","../src/config/types.ts","../src/generators/writer.ts","../src/generators/utils.ts","../src/generators/claude-code.ts","../src/generators/codex-cli.ts","../src/generators/gemini-cli.ts","../src/generators/workspace.ts","../src/generators/gitignore.ts","../src/cli/init.ts","../src/hub-schema.ts","../src/readme.ts","../src/cli/project.ts","../src/config/writer.ts","../src/cli/open.ts","../src/cli/update.ts","../src/cli/run.ts","../src/index.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { genCommand } from \"./gen.js\";\nimport { initCommand } from \"./init.js\";\nimport { projectCommand } from \"./project.js\";\nimport { openCommand } from \"./open.js\";\nimport { updateCommand } from \"./update.js\";\nimport { createAgentCommands } from \"./run.js\";\n\nexport function createCli(): Command {\n const program = new Command(\"meld\")\n .description(\"Agent-agnostic settings generator\")\n .version(__VERSION__);\n\n program.addCommand(initCommand);\n program.addCommand(genCommand);\n program.addCommand(projectCommand);\n program.addCommand(openCommand);\n program.addCommand(updateCommand);\n\n for (const cmd of createAgentCommands()) {\n program.addCommand(cmd);\n }\n\n return program;\n}\n","import { Command } from \"commander\";\nimport { generate } from \"../generate.js\";\nimport type { AgentName } from \"../config/types.js\";\n\nexport const genCommand = new Command(\"gen\")\n .description(\"Generate all agent configs from meld.jsonc\")\n .option(\"--dry-run\", \"Preview changes without writing files\")\n .option(\"--agent <name>\", \"Generate for a single agent (claude-code, codex-cli, gemini-cli)\")\n .action((options) => {\n const hubDir = process.cwd();\n\n const result = generate(hubDir, {\n dryRun: options.dryRun,\n agent: options.agent as AgentName | undefined,\n });\n\n if (!result.ok) {\n console.error(\"Generation failed:\");\n for (const error of result.errors) {\n console.error(` - ${error}`);\n }\n process.exit(1);\n }\n\n if (result.warnings.length > 0) {\n for (const w of result.warnings) {\n console.warn(` warning: ${w}`);\n }\n console.warn();\n }\n\n if (options.dryRun) {\n console.log(\"Dry run — would generate:\");\n } else {\n console.log(\"Generated:\");\n }\n\n for (const file of result.files) {\n console.log(` ${file.path}`);\n }\n\n console.log(`\\n${result.files.length} file(s) ${options.dryRun ? \"would be\" : \"\"} generated.`);\n });\n","import { mkdirSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { loadConfig } from \"./config/loader.js\";\nimport { interpolateEnv } from \"./config/interpolate.js\";\nimport { composeContext } from \"./context/composer.js\";\nimport { writeGeneratedFiles } from \"./generators/writer.js\";\nimport { ClaudeCodeGenerator } from \"./generators/claude-code.js\";\nimport { CodexCliGenerator } from \"./generators/codex-cli.js\";\nimport { GeminiCliGenerator } from \"./generators/gemini-cli.js\";\nimport { WorkspaceGenerator } from \"./generators/workspace.js\";\nimport { GitignoreGenerator } from \"./generators/gitignore.js\";\nimport type { Generator, GeneratedFile } from \"./generators/types.js\";\nimport { resolveAgentDir, AGENTS_DIR } from \"./config/types.js\";\nimport type { AgentName, AgentConfig } from \"./config/types.js\";\n\nexport interface GenerateOptions {\n dryRun?: boolean;\n agent?: AgentName;\n}\n\ntype GenerateResult =\n | { ok: true; files: GeneratedFile[]; warnings: string[] }\n | { ok: false; errors: string[] };\n\nconst AGENT_GENERATORS: Record<AgentName, () => Generator> = {\n \"claude-code\": () => new ClaudeCodeGenerator(),\n \"codex-cli\": () => new CodexCliGenerator(),\n \"gemini-cli\": () => new GeminiCliGenerator(),\n};\n\nexport function generate(\n hubDir: string,\n options: GenerateOptions = {},\n): GenerateResult {\n const loadResult = loadConfig(hubDir);\n if (!loadResult.ok) {\n return { ok: false, errors: loadResult.errors };\n }\n\n const { config, warnings } = interpolateEnv(loadResult.config);\n const context = composeContext(hubDir, config);\n\n const allFiles: GeneratedFile[] = [];\n\n for (const [name, agentConfig] of Object.entries(config.agents) as [AgentName, AgentConfig][]) {\n if (!agentConfig.enabled) continue;\n if (options.agent && options.agent !== name) continue;\n\n const agentDir = resolveAgentDir(name, agentConfig);\n const factory = AGENT_GENERATORS[name];\n if (!factory) continue;\n\n const files = factory().generate(config, context);\n for (const file of files) {\n file.path = `${AGENTS_DIR}/${agentDir}/${file.path}`;\n }\n allFiles.push(...files);\n }\n\n if (!options.agent) {\n allFiles.push(...new WorkspaceGenerator().generate(config, context));\n allFiles.push(...new GitignoreGenerator().generate(config, context));\n }\n\n // Ensure project artifact dirs exist\n if (!options.dryRun) {\n for (const name of Object.keys(config.projects)) {\n mkdirSync(join(hubDir, \"artifacts\", \"projects\", name), { recursive: true });\n }\n }\n\n writeGeneratedFiles(hubDir, allFiles, { dryRun: options.dryRun });\n\n return { ok: true, files: allFiles, warnings };\n}\n","import { readFileSync, existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { parse as parseJsonc, type ParseError } from \"jsonc-parser\";\nimport { validateConfig } from \"./schema.js\";\nimport type { MeldConfig } from \"./types.js\";\n\ntype LoadResult =\n | { ok: true; config: MeldConfig }\n | { ok: false; errors: string[] };\n\nexport function loadConfig(hubDir: string): LoadResult {\n const configPath = join(hubDir, \"meld.jsonc\");\n\n if (!existsSync(configPath)) {\n return { ok: false, errors: [`Config file not found: ${configPath}`] };\n }\n\n let raw: string;\n try {\n raw = readFileSync(configPath, \"utf-8\");\n } catch (err) {\n return {\n ok: false,\n errors: [`Failed to read config: ${(err as Error).message}`],\n };\n }\n\n let parsed: unknown;\n const parseErrors: ParseError[] = [];\n parsed = parseJsonc(raw, parseErrors);\n\n if (parseErrors.length > 0) {\n return {\n ok: false,\n errors: [`Invalid JSONC in meld.jsonc: ${parseErrors.length} parse error(s)`],\n };\n }\n\n return validateConfig(parsed);\n}\n","import type { MeldConfig, AgentName } from \"./types.js\";\n\nconst VALID_AGENTS: AgentName[] = [\"claude-code\", \"codex-cli\", \"gemini-cli\"];\n\ntype ValidationResult =\n | { ok: true; config: MeldConfig }\n | { ok: false; errors: string[] };\n\nexport function validateConfig(input: unknown): ValidationResult {\n const errors: string[] = [];\n\n if (typeof input !== \"object\" || input === null) {\n return { ok: false, errors: [\"Config must be an object\"] };\n }\n\n const obj = input as Record<string, unknown>;\n\n const requiredKeys = [\"projects\", \"agents\", \"mcp\", \"ide\"];\n for (const key of requiredKeys) {\n if (!(key in obj)) {\n errors.push(`Missing required key: ${key}`);\n }\n }\n\n if (errors.length > 0) {\n return { ok: false, errors };\n }\n\n // Validate agents\n const agents = obj.agents as Record<string, unknown>;\n for (const name of Object.keys(agents)) {\n if (!VALID_AGENTS.includes(name as AgentName)) {\n errors.push(`Invalid agent name: ${name}. Must be one of: ${VALID_AGENTS.join(\", \")}`);\n }\n\n const agent = agents[name] as Record<string, unknown>;\n if (\n \"overrides\" in agent\n && agent.overrides != null\n && (typeof agent.overrides !== \"object\" || Array.isArray(agent.overrides))\n ) {\n errors.push(`Agent \"${name}\" overrides must be an object`);\n }\n }\n\n // Validate MCP servers\n const mcp = obj.mcp as Record<string, unknown>;\n for (const [serverName, server] of Object.entries(mcp)) {\n const s = server as Record<string, unknown>;\n if (s.type === \"http\") {\n if (typeof s.url !== \"string\" || !s.url) {\n errors.push(`MCP server \"${serverName}\" (http) must have a \"url\" string`);\n }\n } else {\n if (typeof s.command !== \"string\" || !s.command) {\n errors.push(`MCP server \"${serverName}\" (stdio) must have a \"command\" string`);\n }\n if (!Array.isArray(s.args)) {\n errors.push(`MCP server \"${serverName}\" (stdio) must have an \"args\" array`);\n }\n }\n if (s.agents && Array.isArray(s.agents)) {\n for (const agent of s.agents) {\n if (!VALID_AGENTS.includes(agent as AgentName)) {\n errors.push(`MCP server \"${serverName}\" has invalid agent scope: ${agent}`);\n }\n }\n }\n }\n\n // Validate context if present\n if (\"context\" in obj && obj.context != null) {\n if (typeof obj.context !== \"string\") {\n errors.push(\"context must be a string path\");\n }\n }\n\n if (errors.length > 0) {\n return { ok: false, errors };\n }\n\n return { ok: true, config: input as MeldConfig };\n}\n","import type { MeldConfig } from \"./types.js\";\n\nexport interface InterpolateResult {\n config: MeldConfig;\n warnings: string[];\n}\n\nconst ENV_PATTERN = /\\$\\{([A-Za-z_][A-Za-z0-9_]*)}/g;\n\nexport function interpolateEnv(config: MeldConfig): InterpolateResult {\n const warnings: string[] = [];\n const resolved = deepInterpolate(config, warnings) as MeldConfig;\n return { config: resolved, warnings };\n}\n\nfunction deepInterpolate(value: unknown, warnings: string[]): unknown {\n if (typeof value === \"string\") {\n return value.replace(ENV_PATTERN, (match, varName: string) => {\n const envValue = process.env[varName];\n if (envValue === undefined) {\n warnings.push(`Environment variable not set: ${varName}`);\n return match;\n }\n return envValue;\n });\n }\n if (Array.isArray(value)) {\n return value.map((item) => deepInterpolate(item, warnings));\n }\n if (typeof value === \"object\" && value !== null) {\n const result: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(value)) {\n result[key] = deepInterpolate(val, warnings);\n }\n return result;\n }\n return value;\n}\n","import { readdirSync, readFileSync, existsSync } from \"node:fs\";\nimport { join, basename, extname, relative } from \"node:path\";\nimport { resolveContextPath } from \"../config/types.js\";\nimport type { MeldConfig } from \"../config/types.js\";\nimport type { ComposedContext, ContextFile, ProjectIndexEntry, CommandMeta, SkillMeta } from \"./types.js\";\n\nexport function composeContext(hubDir: string, config: MeldConfig): ComposedContext {\n const { inline, contextFiles } = readContext(hubDir, config);\n return {\n hubDir,\n hubPreamble: buildHubPreamble(config),\n projectTable: buildProjectTable(config),\n artifactsSection: buildArtifactsSection(),\n context: inline,\n contextFiles,\n commands: readCommands(hubDir),\n skills: readSkills(hubDir),\n };\n}\n\nfunction buildHubPreamble(config: MeldConfig): string {\n return [\n `# ${config.ide.workspaceName}`,\n \"\",\n \"This is a **meld hub** — a multi-project workspace with shared configuration generated by [meld](https://github.com/vitld/meld-cli).\",\n \"\",\n \"You are running from a subfolder of the hub (`agents/<name>/`). The hub root is at `../../`.\",\n \"\",\n \"## Hub Structure\",\n \"\",\n \"| Path | Purpose |\",\n \"|------|---------|\",\n \"| `meld.jsonc` | Central config — projects, agents, MCP servers |\",\n \"| `context/` | Agent instructions — root `.md` files are inlined, subfolders are copied |\",\n \"| `commands/` | Slash commands available to agents |\",\n \"| `skills/` | Reusable skills with frontmatter metadata |\",\n \"| `artifacts/` | Persistent research, plans, and notes |\",\n \"| `scratch/` | Temporary work (gitignored) |\",\n \"| `agents/` | Generated output — **do not edit**, regenerated by `meld gen` |\",\n \"\",\n \"> To change workspace settings, edit `meld.jsonc` at the hub root and run `meld gen` to regenerate.\",\n ].join(\"\\n\");\n}\n\nfunction buildProjectTable(config: MeldConfig): string {\n const projects = buildProjectIndex(config);\n if (projects.length === 0) return \"\";\n\n const lines: string[] = [\n \"## Projects\",\n \"\",\n \"| Project | Aliases | Path | Repo |\",\n \"|---------|---------|------|------|\",\n ];\n\n for (const project of projects) {\n lines.push(\n `| ${project.name} | ${project.aliases.join(\", \")} | ${project.path} | ${project.repo ?? \"\"} |`,\n );\n }\n\n return lines.join(\"\\n\");\n}\n\nfunction buildArtifactsSection(): string {\n return [\n \"## Artifacts & Scratch\",\n \"\",\n \"- Hub-scoped artifacts: `../../artifacts/hub/`\",\n \"- Per-project artifacts: `../../artifacts/projects/{project-name}/`\",\n \"- Scratch (temporary work, gitignored): `../../scratch/`\",\n \"\",\n \"> Save research, plans, and notes to the appropriate artifacts folder.\",\n ].join(\"\\n\");\n}\n\nfunction buildProjectIndex(config: MeldConfig): ProjectIndexEntry[] {\n return Object.entries(config.projects).map(([name, project]) => ({\n name,\n aliases: project.aliases,\n path: project.path,\n ...(project.repo && { repo: project.repo }),\n }));\n}\n\nfunction readContext(hubDir: string, config: MeldConfig): { inline: string; contextFiles: ContextFile[] } {\n const contextPath = resolveContextPath(config.context);\n const dir = join(hubDir, contextPath);\n\n if (!existsSync(dir)) return { inline: \"\", contextFiles: [] };\n\n const entries = readdirSync(dir, { withFileTypes: true });\n\n // Root .md files → inline\n const mdFiles = entries\n .filter((e) => e.isFile() && e.name.endsWith(\".md\"))\n .map((e) => e.name)\n .sort();\n\n const inline = mdFiles.length > 0\n ? mdFiles.map((f) => readFileSync(join(dir, f), \"utf-8\").trim()).join(\"\\n\\n\")\n : \"\";\n\n // Subdirectories → recursively collect all files\n const contextFiles: ContextFile[] = [];\n const subdirs = entries\n .filter((e) => e.isDirectory())\n .map((e) => e.name)\n .sort();\n\n for (const subdir of subdirs) {\n collectFiles(join(dir, subdir), dir, contextFiles);\n }\n\n return { inline, contextFiles };\n}\n\nfunction collectFiles(dirPath: string, relativeTo: string, out: ContextFile[]): void {\n const entries = readdirSync(dirPath, { withFileTypes: true }).sort((a, b) => a.name.localeCompare(b.name));\n for (const entry of entries) {\n const fullPath = join(dirPath, entry.name);\n if (entry.isDirectory()) {\n collectFiles(fullPath, relativeTo, out);\n } else if (entry.isFile()) {\n out.push({\n path: relative(relativeTo, fullPath),\n content: readFileSync(fullPath, \"utf-8\"),\n });\n }\n }\n}\n\nfunction readCommands(hubDir: string): CommandMeta[] {\n const commandsDir = join(hubDir, \"commands\");\n if (!existsSync(commandsDir)) return [];\n\n return readdirSync(commandsDir)\n .filter((f) => f.endsWith(\".md\"))\n .sort()\n .map((f) => ({\n name: basename(f, extname(f)),\n content: readFileSync(join(commandsDir, f), \"utf-8\"),\n }));\n}\n\nfunction readSkills(hubDir: string): SkillMeta[] {\n const skillsDir = join(hubDir, \"skills\");\n if (!existsSync(skillsDir)) return [];\n\n return readdirSync(skillsDir, { withFileTypes: true })\n .filter((d) => d.isDirectory())\n .sort((a, b) => a.name.localeCompare(b.name))\n .map((d) => {\n const skillFile = join(skillsDir, d.name, \"SKILL.md\");\n if (!existsSync(skillFile)) return null;\n\n const raw = readFileSync(skillFile, \"utf-8\");\n const { frontmatter, body } = parseFrontmatter(raw);\n\n return { name: d.name, frontmatter, body };\n })\n .filter((s): s is SkillMeta => s !== null);\n}\n\nfunction parseFrontmatter(content: string): { frontmatter: Record<string, unknown>; body: string } {\n const match = content.match(/^---\\n([\\s\\S]*?)\\n---\\n?([\\s\\S]*)$/);\n if (!match) {\n return { frontmatter: {}, body: content };\n }\n\n const yamlStr = match[1];\n const body = match[2].trim();\n const frontmatter = parseSimpleYaml(yamlStr);\n\n return { frontmatter, body };\n}\n\nfunction parseSimpleYaml(yaml: string): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n const lines = yaml.split(\"\\n\");\n let currentKey = \"\";\n let currentMap: Record<string, string> | null = null;\n\n for (const line of lines) {\n if (line.trim() === \"\") continue;\n\n // Indented line — part of a map value\n const indentedMatch = line.match(/^ (\\w[\\w-]*): (.+)$/);\n if (indentedMatch && currentKey) {\n if (!currentMap) currentMap = {};\n currentMap[indentedMatch[1]] = indentedMatch[2].trim();\n continue;\n }\n\n // Flush previous map\n if (currentMap && currentKey) {\n result[currentKey] = currentMap;\n currentMap = null;\n }\n\n // Top-level key\n const topMatch = line.match(/^(\\w[\\w-]*): (.+)$/);\n if (topMatch) {\n currentKey = topMatch[1];\n const value = topMatch[2].trim();\n\n // Array value: [a, b, c]\n if (value.startsWith(\"[\") && value.endsWith(\"]\")) {\n result[currentKey] = value.slice(1, -1).split(\",\").map((s) => s.trim().replace(/^[\"']|[\"']$/g, \"\"));\n } else if (value === \"true\") {\n result[currentKey] = true;\n } else if (value === \"false\") {\n result[currentKey] = false;\n } else {\n result[currentKey] = value.replace(/^[\"']|[\"']$/g, \"\");\n }\n continue;\n }\n\n // Top-level key with no inline value (map follows)\n const mapKeyMatch = line.match(/^(\\w[\\w-]*):$/);\n if (mapKeyMatch) {\n currentKey = mapKeyMatch[1];\n currentMap = {};\n continue;\n }\n }\n\n // Flush final map\n if (currentMap && currentKey) {\n result[currentKey] = currentMap;\n }\n\n return result;\n}\n","export interface MeldConfig {\n projects: Record<string, ProjectConfig>;\n agents: Record<AgentName, AgentConfig>;\n mcp: Record<string, McpServerConfig>;\n context?: string;\n ide: IdeConfig;\n}\n\nexport type AgentName = \"claude-code\" | \"codex-cli\" | \"gemini-cli\";\n\nexport interface ProjectConfig {\n path: string;\n aliases: string[];\n repo?: string;\n}\n\nexport interface AgentConfig {\n enabled: boolean;\n dir?: string;\n overrides?: Record<string, unknown>;\n}\n\nexport const AGENTS_DIR = \"agents\";\n\nexport const DEFAULT_AGENT_DIRS: Record<AgentName, string> = {\n \"claude-code\": \"claude-code\",\n \"codex-cli\": \"codex\",\n \"gemini-cli\": \"gemini\",\n};\n\nexport function resolveAgentDir(name: AgentName, agentConfig: AgentConfig): string {\n return agentConfig.dir ?? DEFAULT_AGENT_DIRS[name];\n}\n\nexport type McpServerConfig = McpStdioServerConfig | McpHttpServerConfig;\n\nexport interface McpStdioServerConfig {\n type?: \"stdio\";\n command: string;\n args: string[];\n env?: Record<string, string>;\n agents?: AgentName[];\n}\n\nexport interface McpHttpServerConfig {\n type: \"http\";\n url: string;\n headers?: Record<string, string>;\n env?: Record<string, string>;\n agents?: AgentName[];\n}\n\nexport function isHttpMcp(server: McpServerConfig): server is McpHttpServerConfig {\n return server.type === \"http\";\n}\n\nexport interface IdeConfig {\n default: string;\n workspaceName: string;\n}\n\nexport const DEFAULT_CONTEXT_PATH = \"./context/\";\n\nexport function resolveContextPath(contextPath?: string): string {\n return contextPath ?? DEFAULT_CONTEXT_PATH;\n}\n","import { writeFileSync, mkdirSync } from \"node:fs\";\nimport { join, dirname } from \"node:path\";\nimport type { GeneratedFile } from \"./types.js\";\n\nexport interface WriteOptions {\n dryRun?: boolean;\n}\n\nexport function writeGeneratedFiles(\n hubDir: string,\n files: GeneratedFile[],\n options: WriteOptions = {},\n): GeneratedFile[] {\n if (!options.dryRun) {\n for (const file of files) {\n const fullPath = join(hubDir, file.path);\n mkdirSync(dirname(fullPath), { recursive: true });\n writeFileSync(fullPath, file.content);\n }\n }\n return files;\n}\n","export function isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nexport function deepMerge(\n base: Record<string, unknown>,\n overrides: Record<string, unknown>,\n): Record<string, unknown> {\n const merged: Record<string, unknown> = { ...base };\n\n for (const [key, value] of Object.entries(overrides)) {\n const current = merged[key];\n if (isPlainObject(current) && isPlainObject(value)) {\n merged[key] = deepMerge(current, value);\n continue;\n }\n merged[key] = value;\n }\n\n return merged;\n}\n\nexport function serializeToml(config: Record<string, unknown>): string {\n const lines: string[] = [];\n appendTable([], config, lines);\n return `${lines.join(\"\\n\")}\\n`;\n}\n\nfunction appendTable(path: string[], table: Record<string, unknown>, lines: string[]): void {\n const entries = Object.entries(table).filter(([, value]) => value !== undefined && value !== null);\n const scalarEntries = entries.filter(([, value]) => !isPlainObject(value));\n const tableEntries = entries.filter(([, value]) => isPlainObject(value)) as [string, Record<string, unknown>][];\n\n if (path.length > 0 && scalarEntries.length === 0 && tableEntries.length === 0) {\n return;\n }\n\n if (path.length > 0) {\n if (lines.length > 0) lines.push(\"\");\n lines.push(`[${path.map(escapeTomlKey).join(\".\")}]`);\n }\n\n for (const [key, value] of scalarEntries) {\n lines.push(`${escapeTomlKey(key)} = ${formatTomlValue(value)}`);\n }\n\n for (const [key, value] of tableEntries) {\n appendTable([...path, key], value, lines);\n }\n}\n\nfunction formatTomlValue(value: unknown): string {\n if (typeof value === \"string\") return `\"${escapeTomlString(value)}\"`;\n if (typeof value === \"number\") {\n if (!Number.isFinite(value)) {\n throw new Error(`Cannot serialize non-finite number to TOML: ${value}`);\n }\n return String(value);\n }\n if (typeof value === \"boolean\") return value ? \"true\" : \"false\";\n if (Array.isArray(value)) {\n return `[${value.map((item) => formatTomlArrayValue(item)).join(\", \")}]`;\n }\n\n throw new Error(`Unsupported TOML value type: ${typeof value}`);\n}\n\nfunction formatTomlArrayValue(value: unknown): string {\n if (typeof value === \"string\") return `\"${escapeTomlString(value)}\"`;\n if (typeof value === \"number\") {\n if (!Number.isFinite(value)) {\n throw new Error(`Cannot serialize non-finite number to TOML: ${value}`);\n }\n return String(value);\n }\n if (typeof value === \"boolean\") return value ? \"true\" : \"false\";\n\n throw new Error(`Unsupported TOML array value type: ${typeof value}`);\n}\n\nfunction escapeTomlKey(key: string): string {\n return /^[A-Za-z0-9_-]+$/.test(key)\n ? key\n : `\"${escapeTomlString(key)}\"`;\n}\n\nfunction escapeTomlString(value: string): string {\n return value\n .replace(/\\\\/g, \"\\\\\\\\\")\n .replace(/\"/g, '\\\\\"')\n .replace(/\\n/g, \"\\\\n\")\n .replace(/\\r/g, \"\\\\r\")\n .replace(/\\t/g, \"\\\\t\");\n}\n","import type { MeldConfig } from \"../config/types.js\";\nimport { isHttpMcp } from \"../config/types.js\";\nimport type { ComposedContext, SkillMeta } from \"../context/types.js\";\nimport type { Generator, GeneratedFile } from \"./types.js\";\nimport { deepMerge, isPlainObject } from \"./utils.js\";\n\nexport class ClaudeCodeGenerator implements Generator {\n name = \"claude-code\";\n\n generate(config: MeldConfig, context: ComposedContext): GeneratedFile[] {\n const files: GeneratedFile[] = [];\n\n files.push({\n path: \"CLAUDE.md\",\n content: this.buildInstructions(context),\n });\n\n files.push({\n path: \".mcp.json\",\n content: this.buildMcpConfig(config),\n });\n\n files.push({\n path: \".claude/settings.json\",\n content: this.buildSettings(config, context.hubDir),\n });\n\n for (const command of context.commands) {\n files.push({\n path: `.claude/commands/meld/${command.name}.md`,\n content: command.content,\n });\n }\n\n for (const skill of context.skills) {\n files.push({\n path: `.claude/skills/meld-${skill.name}/SKILL.md`,\n content: this.buildSkill(skill),\n });\n }\n\n for (const file of context.contextFiles) {\n files.push({ path: file.path, content: file.content });\n }\n\n return files;\n }\n\n private buildInstructions(context: ComposedContext): string {\n const sections: string[] = [context.hubPreamble];\n\n if (context.projectTable) {\n sections.push(context.projectTable);\n }\n\n sections.push(context.artifactsSection);\n\n if (context.context) {\n sections.push(context.context);\n }\n\n return sections.join(\"\\n\\n\");\n }\n\n private buildMcpConfig(config: MeldConfig): string {\n const servers: Record<string, Record<string, unknown>> = {};\n\n for (const [name, server] of Object.entries(config.mcp)) {\n if (server.agents && !server.agents.includes(\"claude-code\")) continue;\n\n if (isHttpMcp(server)) {\n const entry: Record<string, unknown> = { type: \"http\", url: server.url };\n if (server.headers) entry.headers = server.headers;\n if (server.env) entry.env = server.env;\n servers[name] = entry;\n } else {\n const entry: Record<string, unknown> = { command: server.command, args: server.args };\n if (server.env) entry.env = server.env;\n servers[name] = entry;\n }\n }\n\n return JSON.stringify({ mcpServers: servers }, null, 2);\n }\n\n private buildSettings(config: MeldConfig, hubDir: string): string {\n const settings: Record<string, unknown> = {};\n\n // Enable lazy MCP tool loading\n settings.env = { ENABLE_TOOL_SEARCH: \"true\" };\n\n // Permissions\n const allow: string[] = [];\n\n // Non-destructive tools (not path-scoped)\n const safeTools = [\"Task\", \"WebSearch\", \"WebFetch\", \"ToolSearch\"];\n allow.push(...safeTools);\n\n // Non-destructive Bash commands (not path-scoped since flags break prefix matching)\n const safeBashCommands = [\n \"cd\", \"ls\", \"mkdir\", \"cp\", \"mv\", \"cat\",\n \"git\", \"gh\",\n \"node\", \"npx\", \"npm\", \"yarn\", \"pnpm\", \"bun\",\n \"which\", \"pwd\", \"ast-grep\",\n ];\n for (const cmd of safeBashCommands) {\n allow.push(`Bash(command:${cmd} *)`);\n }\n\n // Hub root permissions\n allow.push(`Read(//${hubDir}/**)`);\n allow.push(`Glob(//${hubDir}/**)`);\n allow.push(`Grep(//${hubDir}/**)`);\n allow.push(`Write(//${hubDir}/**)`);\n allow.push(`Edit(//${hubDir}/**)`);\n\n // Per-project permissions\n const additionalDirectories: string[] = [];\n for (const [, project] of Object.entries(config.projects)) {\n allow.push(`Read(//${project.path}/**)`);\n allow.push(`Glob(//${project.path}/**)`);\n allow.push(`Grep(//${project.path}/**)`);\n allow.push(`Write(//${project.path}/**)`);\n allow.push(`Edit(//${project.path}/**)`);\n additionalDirectories.push(project.path);\n }\n settings.permissions = { allow, additionalDirectories };\n\n const overrides = config.agents[\"claude-code\"].overrides;\n const mergedSettings = isPlainObject(overrides)\n ? deepMerge(settings, overrides)\n : settings;\n\n return JSON.stringify(mergedSettings, null, 2);\n }\n\n private buildSkill(skill: SkillMeta): string {\n const fm = { ...skill.frontmatter };\n\n // Resolve model for claude\n if (fm.model && typeof fm.model === \"object\" && !Array.isArray(fm.model)) {\n const modelMap = fm.model as Record<string, string>;\n if (modelMap[\"claude-code\"]) {\n fm.model = modelMap[\"claude-code\"];\n } else {\n delete fm.model;\n }\n }\n\n const frontmatterLines = this.serializeFrontmatter(fm);\n return `---\\n${frontmatterLines}\\n---\\n\\n${skill.body}`;\n }\n\n private serializeFrontmatter(fm: Record<string, unknown>): string {\n const lines: string[] = [];\n for (const [key, value] of Object.entries(fm)) {\n if (typeof value === \"string\") {\n lines.push(`${key}: ${value}`);\n } else if (typeof value === \"boolean\") {\n lines.push(`${key}: ${value}`);\n } else if (Array.isArray(value)) {\n lines.push(`${key}: [${value.join(\", \")}]`);\n }\n }\n return lines.join(\"\\n\");\n }\n}\n","import type { MeldConfig } from \"../config/types.js\";\nimport { isHttpMcp } from \"../config/types.js\";\nimport type { ComposedContext, SkillMeta } from \"../context/types.js\";\nimport type { Generator, GeneratedFile } from \"./types.js\";\nimport { deepMerge, isPlainObject, serializeToml } from \"./utils.js\";\n\nexport class CodexCliGenerator implements Generator {\n name = \"codex-cli\";\n\n generate(config: MeldConfig, context: ComposedContext): GeneratedFile[] {\n const files: GeneratedFile[] = [];\n\n files.push({\n path: \"AGENTS.md\",\n content: this.buildInstructions(context),\n });\n\n files.push({\n path: \".codex/config.toml\",\n content: this.buildConfigToml(config, context),\n });\n\n for (const command of context.commands) {\n files.push({\n path: `.agents/skills/meld-cmd-${command.name}/SKILL.md`,\n content: command.content,\n });\n }\n\n for (const skill of context.skills) {\n files.push({\n path: `.agents/skills/meld-${skill.name}/SKILL.md`,\n content: this.buildSkill(skill),\n });\n }\n\n for (const file of context.contextFiles) {\n files.push({ path: file.path, content: file.content });\n }\n\n return files;\n }\n\n private buildInstructions(context: ComposedContext): string {\n const sections: string[] = [context.hubPreamble];\n\n if (context.projectTable) {\n sections.push(context.projectTable);\n }\n\n sections.push(context.artifactsSection);\n\n if (context.context) {\n sections.push(context.context);\n }\n\n return sections.join(\"\\n\\n\");\n }\n\n private buildConfigToml(config: MeldConfig, context: ComposedContext): string {\n const writableRoots = Array.from(new Set([\n context.hubDir,\n ...Object.values(config.projects).map((project) => project.path),\n ]));\n\n const generatedConfig: Record<string, unknown> = {\n approval_policy: \"on-request\",\n sandbox_mode: \"workspace-write\",\n sandbox_workspace_write: {\n writable_roots: writableRoots,\n },\n };\n\n const mcpServers = this.buildMcpServers(config);\n if (Object.keys(mcpServers).length > 0) {\n generatedConfig.mcp_servers = mcpServers;\n }\n\n const overrides = config.agents[\"codex-cli\"].overrides;\n const mergedConfig = isPlainObject(overrides)\n ? deepMerge(generatedConfig, overrides)\n : generatedConfig;\n\n return serializeToml(mergedConfig);\n }\n\n private buildMcpServers(config: MeldConfig): Record<string, Record<string, unknown>> {\n const servers: Record<string, Record<string, unknown>> = {};\n\n for (const [name, server] of Object.entries(config.mcp)) {\n if (server.agents && !server.agents.includes(\"codex-cli\")) continue;\n\n if (isHttpMcp(server)) {\n const entry: Record<string, unknown> = { url: server.url };\n if (server.headers && Object.keys(server.headers).length > 0) {\n entry.http_headers = server.headers;\n }\n if (server.env && Object.keys(server.env).length > 0) {\n entry.env = server.env;\n }\n servers[name] = entry;\n } else {\n const entry: Record<string, unknown> = { command: server.command, args: server.args };\n if (server.env && Object.keys(server.env).length > 0) {\n entry.env = server.env;\n }\n servers[name] = entry;\n }\n }\n\n return servers;\n }\n\n private buildSkill(skill: SkillMeta): string {\n const fm = { ...skill.frontmatter };\n\n if (fm.model && typeof fm.model === \"object\" && !Array.isArray(fm.model)) {\n const modelMap = fm.model as Record<string, string>;\n if (modelMap[\"codex-cli\"]) {\n fm.model = modelMap[\"codex-cli\"];\n } else {\n delete fm.model;\n }\n }\n\n const frontmatterLines = this.serializeFrontmatter(fm);\n return `---\\n${frontmatterLines}\\n---\\n\\n${skill.body}`;\n }\n\n private serializeFrontmatter(fm: Record<string, unknown>): string {\n const lines: string[] = [];\n for (const [key, value] of Object.entries(fm)) {\n if (typeof value === \"string\") {\n lines.push(`${key}: ${value}`);\n } else if (typeof value === \"boolean\") {\n lines.push(`${key}: ${value}`);\n } else if (Array.isArray(value)) {\n lines.push(`${key}: [${value.join(\", \")}]`);\n }\n }\n return lines.join(\"\\n\");\n }\n}\n","import type { MeldConfig } from \"../config/types.js\";\nimport { isHttpMcp } from \"../config/types.js\";\nimport type { ComposedContext, SkillMeta } from \"../context/types.js\";\nimport type { Generator, GeneratedFile } from \"./types.js\";\nimport { deepMerge, isPlainObject } from \"./utils.js\";\n\nexport class GeminiCliGenerator implements Generator {\n name = \"gemini-cli\";\n\n generate(config: MeldConfig, context: ComposedContext): GeneratedFile[] {\n const files: GeneratedFile[] = [];\n\n files.push({\n path: \"GEMINI.md\",\n content: this.buildInstructions(context),\n });\n\n files.push({\n path: \".gemini/settings.json\",\n content: this.buildSettings(config),\n });\n\n for (const command of context.commands) {\n files.push({\n path: `.gemini/commands/meld/${command.name}.toml`,\n content: this.buildCommandToml(command.name, command.content),\n });\n }\n\n for (const skill of context.skills) {\n files.push({\n path: `.gemini/commands/meld/${skill.name}.toml`,\n content: this.buildSkillToml(skill),\n });\n }\n\n for (const file of context.contextFiles) {\n files.push({ path: file.path, content: file.content });\n }\n\n return files;\n }\n\n private buildInstructions(context: ComposedContext): string {\n const sections: string[] = [context.hubPreamble];\n\n if (context.projectTable) {\n sections.push(context.projectTable);\n }\n\n sections.push(context.artifactsSection);\n\n if (context.context) {\n sections.push(context.context);\n }\n\n return sections.join(\"\\n\\n\");\n }\n\n private buildSettings(config: MeldConfig): string {\n const servers: Record<string, Record<string, unknown>> = {};\n\n for (const [name, server] of Object.entries(config.mcp)) {\n if (server.agents && !server.agents.includes(\"gemini-cli\")) continue;\n\n if (isHttpMcp(server)) {\n const entry: Record<string, unknown> = { type: \"http\", url: server.url };\n if (server.headers) entry.headers = server.headers;\n if (server.env) entry.env = server.env;\n servers[name] = entry;\n } else {\n const entry: Record<string, unknown> = { command: server.command, args: server.args };\n if (server.env) entry.env = server.env;\n servers[name] = entry;\n }\n }\n\n const settings: Record<string, unknown> = { mcpServers: servers };\n const overrides = config.agents[\"gemini-cli\"].overrides;\n const mergedSettings = isPlainObject(overrides)\n ? deepMerge(settings, overrides)\n : settings;\n\n return JSON.stringify(mergedSettings, null, 2);\n }\n\n private buildCommandToml(name: string, content: string): string {\n return [\n `description = \"${name}\"`,\n \"\",\n `[template]`,\n `prompt = \"\"\"`,\n content,\n `\"\"\"`,\n ].join(\"\\n\");\n }\n\n private buildSkillToml(skill: SkillMeta): string {\n const description = (skill.frontmatter.description as string) ?? skill.name;\n return [\n `# skill: ${skill.name}`,\n `description = \"${description}\"`,\n \"\",\n `[template]`,\n `prompt = \"\"\"`,\n skill.body,\n `\"\"\"`,\n ].join(\"\\n\");\n }\n}\n","import { homedir } from \"node:os\";\nimport type { MeldConfig } from \"../config/types.js\";\nimport type { ComposedContext } from \"../context/types.js\";\nimport type { Generator, GeneratedFile } from \"./types.js\";\n\nexport class WorkspaceGenerator implements Generator {\n name = \"workspace\";\n\n generate(config: MeldConfig, _context: ComposedContext): GeneratedFile[] {\n const folders = [\n { name: config.ide.workspaceName, path: \".\" },\n ...Object.entries(config.projects).map(([name, project]) => ({\n name,\n path: resolveTilde(project.path),\n })),\n ];\n\n const workspace = {\n folders,\n settings: {},\n };\n\n return [\n {\n path: `${config.ide.workspaceName}.code-workspace`,\n content: JSON.stringify(workspace, null, 2),\n },\n ];\n }\n}\n\nfunction resolveTilde(path: string): string {\n if (path.startsWith(\"~/\")) {\n return homedir() + path.slice(1);\n }\n return path;\n}\n","import { readFileSync, existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { MeldConfig } from \"../config/types.js\";\nimport type { ComposedContext } from \"../context/types.js\";\nimport type { Generator, GeneratedFile } from \"./types.js\";\n\nconst START_MARKER = \"# ── meld managed (do not edit) ──\";\nconst END_MARKER = \"# ── end meld managed ──\";\n\nexport class GitignoreGenerator implements Generator {\n name = \"gitignore\";\n\n generate(_config: MeldConfig, context: ComposedContext): GeneratedFile[] {\n const lines: string[] = [\n \"agents/\",\n \"scratch/\",\n ];\n\n const managedBlock = [\n START_MARKER,\n ...lines,\n END_MARKER,\n ].join(\"\\n\");\n\n const content = spliceIntoExisting(context.hubDir, managedBlock);\n\n return [{ path: \".gitignore\", content }];\n }\n}\n\nfunction spliceIntoExisting(hubDir: string, managedBlock: string): string {\n const gitignorePath = join(hubDir, \".gitignore\");\n\n if (!existsSync(gitignorePath)) {\n return managedBlock + \"\\n\";\n }\n\n const existing = readFileSync(gitignorePath, \"utf-8\");\n const startIdx = existing.indexOf(START_MARKER);\n const endIdx = existing.indexOf(END_MARKER);\n\n if (startIdx === -1 || endIdx === -1) {\n const trimmed = existing.trimEnd();\n return trimmed + (trimmed.length > 0 ? \"\\n\\n\" : \"\") + managedBlock + \"\\n\";\n }\n\n const before = existing.slice(0, startIdx);\n const after = existing.slice(endIdx + END_MARKER.length);\n\n return before + managedBlock + after;\n}\n","import { Command } from \"commander\";\nimport * as p from \"@clack/prompts\";\nimport { writeFileSync, mkdirSync, existsSync, readdirSync } from \"node:fs\";\nimport { execSync } from \"node:child_process\";\nimport { join } from \"node:path\";\nimport type { MeldConfig } from \"../config/types.js\";\nimport { readPackageSchema } from \"../hub-schema.js\";\nimport { generateReadme } from \"../readme.js\";\n\nfunction ensureDir(path: string): void {\n mkdirSync(path, { recursive: true });\n}\n\nexport const initCommand = new Command(\"init\")\n .description(\"Initialize a new meld hub\")\n .action(async () => {\n p.intro(\"meld — agent config generator\");\n\n const hubDir = process.cwd();\n\n if (existsSync(join(hubDir, \"meld.jsonc\"))) {\n p.log.warn(\"meld.jsonc already exists in this directory.\");\n const overwrite = await p.confirm({\n message: \"Overwrite existing config?\",\n initialValue: false,\n });\n if (p.isCancel(overwrite) || !overwrite) {\n p.cancel(\"Cancelled.\");\n process.exit(0);\n }\n }\n\n // Non-empty directory safeguard\n const ignored = new Set([\".git\", \"meld.jsonc\"]);\n const existing = readdirSync(hubDir).filter((f) => !ignored.has(f));\n if (existing.length > 0) {\n p.log.warn(\n `Directory contains ${existing.length} existing file(s): ${existing.slice(0, 5).join(\", \")}${existing.length > 5 ? \", ...\" : \"\"}`,\n );\n const proceed = await p.confirm({\n message:\n \"This directory contains existing files. Running init here will commit them all. Continue?\",\n initialValue: false,\n });\n if (p.isCancel(proceed) || !proceed) {\n p.cancel(\"Cancelled.\");\n process.exit(0);\n }\n }\n\n // Agent selection\n const agents = await p.multiselect({\n message: \"Which agents do you want to generate configs for?\",\n options: [\n { value: \"claude-code\", label: \"Claude Code\" },\n { value: \"codex-cli\", label: \"Codex CLI\" },\n { value: \"gemini-cli\", label: \"Gemini CLI\" },\n ],\n required: true,\n });\n\n if (p.isCancel(agents)) {\n p.cancel(\"Cancelled.\");\n process.exit(0);\n }\n\n // IDE selection\n const ide = await p.select({\n message: \"Default IDE?\",\n options: [\n { value: \"cursor\", label: \"Cursor\" },\n { value: \"code\", label: \"VS Code\" },\n { value: \"windsurf\", label: \"Windsurf\" },\n ],\n });\n\n if (p.isCancel(ide)) {\n p.cancel(\"Cancelled.\");\n process.exit(0);\n }\n\n // Workspace name\n const workspaceName = await p.text({\n message: \"Workspace name\",\n placeholder: \"meld-hub\",\n defaultValue: \"meld-hub\",\n });\n\n if (p.isCancel(workspaceName)) {\n p.cancel(\"Cancelled.\");\n process.exit(0);\n }\n\n // Build config\n const config: MeldConfig = {\n projects: {},\n agents: {\n \"claude-code\": { enabled: (agents as string[]).includes(\"claude-code\") },\n \"codex-cli\": { enabled: (agents as string[]).includes(\"codex-cli\") },\n \"gemini-cli\": { enabled: (agents as string[]).includes(\"gemini-cli\") },\n },\n mcp: {},\n ide: {\n default: ide as string,\n workspaceName: workspaceName as string,\n },\n };\n\n // Write config with $schema reference\n const configWithSchema = { $schema: \"./meld.schema.json\", ...config };\n writeFileSync(join(hubDir, \"meld.jsonc\"), JSON.stringify(configWithSchema, null, 2));\n\n // Copy schema for IDE validation\n writeFileSync(join(hubDir, \"meld.schema.json\"), readPackageSchema());\n\n // Generate README\n writeFileSync(join(hubDir, \"README.md\"), generateReadme(config));\n\n // Create directories\n ensureDir(join(hubDir, \"context\"));\n ensureDir(join(hubDir, \"commands\"));\n ensureDir(join(hubDir, \"skills\"));\n ensureDir(join(hubDir, \"artifacts\", \"hub\"));\n ensureDir(join(hubDir, \"scratch\"));\n\n // .gitignore\n writeFileSync(join(hubDir, \".gitignore\"), [\n \"# ── meld managed (do not edit) ──\",\n \"agents/\",\n \"scratch/\",\n \"# ── end meld managed ──\",\n ].join(\"\\n\") + \"\\n\");\n\n // Git init + commit\n const hasGit = existsSync(join(hubDir, \".git\"));\n if (!hasGit) {\n execSync(\"git init\", { cwd: hubDir, stdio: \"ignore\" });\n }\n const meldFiles = [\n \"meld.jsonc\",\n \"meld.schema.json\",\n \"README.md\",\n \".gitignore\",\n ];\n execSync(`git add ${meldFiles.join(\" \")}`, { cwd: hubDir, stdio: \"ignore\" });\n execSync('git commit -m \"init meld hub\"', { cwd: hubDir, stdio: \"ignore\" });\n\n p.outro(\n [\n \"Done! Created:\",\n ` meld.jsonc — central config (with schema for IDE autocomplete)`,\n ` meld.schema.json — JSON schema for validation`,\n ` README.md — getting started guide`,\n ` context/ — agent instructions`,\n ` commands/ — slash commands`,\n ` skills/ — reusable skills`,\n ` artifacts/hub/ — research & notes`,\n ` scratch/ — temporary work`,\n \"\",\n \"Next: add projects with `meld project add`, edit context/, then run `meld gen`\",\n ].join(\"\\n\"),\n );\n });\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\n/**\n * Reads meld.schema.json from the package root.\n * Works both in bundled dist/ and source src/ contexts.\n */\nexport function readPackageSchema(): string {\n let dir = dirname(fileURLToPath(import.meta.url));\n while (dir !== dirname(dir)) {\n const schemaPath = join(dir, \"meld.schema.json\");\n if (existsSync(schemaPath)) {\n return readFileSync(schemaPath, \"utf-8\");\n }\n dir = dirname(dir);\n }\n throw new Error(\"Could not locate meld.schema.json\");\n}\n","import type { MeldConfig } from \"./config/types.js\";\n\nexport function generateReadme(config: MeldConfig): string {\n const agentLabels: Record<string, string> = {\n \"claude-code\": \"Claude Code\",\n \"codex-cli\": \"Codex CLI\",\n \"gemini-cli\": \"Gemini CLI\",\n };\n\n const agentCommands: Record<string, string> = {\n \"claude-code\": \"`meld claude`\",\n \"codex-cli\": \"`meld codex`\",\n \"gemini-cli\": \"`meld gemini`\",\n };\n\n const enabledAgents = Object.entries(config.agents)\n .filter(([, a]) => a.enabled)\n .map(([name]) => name);\n\n const enabled = enabledAgents\n .map((a) => agentLabels[a] ?? a)\n .join(\", \");\n\n const launchCmds = enabledAgents\n .map((a) => agentCommands[a] ?? `\\`meld ${a}\\``)\n .join(\" / \");\n\n return [\n `# ${config.ide.workspaceName}`,\n \"\",\n `A multi-project workspace powered by [meld](https://github.com/vitld/meld-cli).`,\n \"\",\n `**Enabled agents:** ${enabled}`,\n \"\",\n \"## Getting Started\",\n \"\",\n \"1. Add projects: `meld project add`\",\n \"2. Add agent instructions in `context/` (markdown files)\",\n \"3. Generate configs: `meld gen`\",\n `4. Launch an agent: ${launchCmds}`,\n \"\",\n \"## Structure\",\n \"\",\n \"| Path | Purpose |\",\n \"|------|---------|\",\n \"| `meld.jsonc` | Central configuration |\",\n \"| `context/` | Markdown instructions for agents |\",\n \"| `commands/` | Slash commands |\",\n \"| `skills/` | Reusable agent skills |\",\n \"| `artifacts/` | Research, plans, and notes |\",\n \"| `scratch/` | Temporary work (gitignored) |\",\n \"| `agents/` | Generated output (gitignored) |\",\n \"\",\n \"## Context\",\n \"\",\n \"Files in the root of `context/` are inlined into agent instructions.\",\n \"Subfolders are copied into each agent's working directory, so you can\",\n \"link to them with relative paths like `./subfolder/doc.md`.\",\n \"\",\n \"```\",\n \"context/\",\n \" 01-role.md # Inlined into CLAUDE.md / AGENTS.md / GEMINI.md\",\n \" 02-guardrails.md # Inlined (alphabetical order)\",\n \" reference/ # Copied as agents/<name>/reference/\",\n \" api.md\",\n \" patterns.md\",\n \"```\",\n \"\",\n \"The filename determines order — use numeric prefixes to control sequencing.\",\n \"After editing, run `meld gen` to regenerate agent configs.\",\n \"\",\n \"## MCP Servers\",\n \"\",\n \"MCP servers are defined once in `meld.jsonc` under the `mcp` key and automatically\",\n \"translated into each agent's native config format (`.mcp.json`, `.codex/config.toml`,\",\n \"`.gemini/settings.json`).\",\n \"\",\n \"### Stdio server (local process)\",\n \"\",\n \"Runs a command as a child process, communicating over stdin/stdout.\",\n \"\",\n \"```jsonc\",\n '\"my-server\": {',\n ' \"command\": \"npx\",',\n ' \"args\": [\"-y\", \"my-mcp-server@latest\"],',\n ' \"env\": { // optional',\n ' \"API_KEY\": \"sk-...\"',\n \" }\",\n \"}\",\n \"```\",\n \"\",\n \"### HTTP server (remote)\",\n \"\",\n \"Connects to a remote MCP endpoint over HTTP.\",\n \"\",\n \"```jsonc\",\n '\"my-server\": {',\n ' \"type\": \"http\",',\n ' \"url\": \"https://mcp.example.com/mcp\",',\n ' \"headers\": { // optional',\n ' \"Authorization\": \"Bearer tok-...\"',\n \" }\",\n \"}\",\n \"```\",\n \"\",\n \"### Scoping servers to specific agents\",\n \"\",\n \"By default every MCP server is available to all enabled agents.\",\n \"Use `agents` to restrict a server to specific agents:\",\n \"\",\n \"```jsonc\",\n '\"my-server\": {',\n ' \"command\": \"node\",',\n ' \"args\": [\"server.js\"],',\n ' \"agents\": [\"claude-code\"] // only generated for Claude Code',\n \"}\",\n \"```\",\n \"\",\n \"Valid agent names: `claude-code`, `codex-cli`, `gemini-cli`.\",\n \"\",\n \"## Commands\",\n \"\",\n \"| Command | Description |\",\n \"|---------|-------------|\",\n \"| `meld gen` | Generate agent configs from `meld.jsonc` |\",\n \"| `meld gen --dry-run` | Preview without writing files |\",\n \"| `meld project add` | Register a project |\",\n \"| `meld project list` | List registered projects |\",\n \"| `meld open` | Open workspace in IDE |\",\n \"| `meld update` | Re-scaffold hub structure |\",\n \"\",\n \"> Edit `meld.jsonc` for configuration. Run `meld gen` after changes.\",\n \"\",\n ].join(\"\\n\");\n}\n","import { Command } from \"commander\";\nimport * as p from \"@clack/prompts\";\nimport { mkdirSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { updateConfig } from \"../config/writer.js\";\nimport { loadConfig } from \"../config/loader.js\";\nimport { generate } from \"../generate.js\";\nimport type { ProjectConfig } from \"../config/types.js\";\n\nexport const projectCommand = new Command(\"project\")\n .description(\"Manage projects\");\n\nprojectCommand\n .command(\"add\")\n .description(\"Add a project interactively\")\n .action(async () => {\n const hubDir = process.cwd();\n\n const name = await p.text({\n message: \"Project name (used as config key)\",\n placeholder: \"my-project\",\n });\n if (p.isCancel(name)) return;\n\n const path = await p.text({\n message: \"Path to project\",\n placeholder: \"~/projects/my-project\",\n });\n if (p.isCancel(path)) return;\n\n const aliasesRaw = await p.text({\n message: \"Aliases (comma-separated, how you refer to it)\",\n placeholder: \"my proj, the project\",\n defaultValue: \"\",\n });\n if (p.isCancel(aliasesRaw)) return;\n\n const aliases = (aliasesRaw as string)\n .split(\",\")\n .map((a) => a.trim())\n .filter(Boolean);\n\n const repo = await p.text({\n message: \"GitHub repo (org/repo, optional)\",\n placeholder: \"org/repo\",\n defaultValue: \"\",\n });\n if (p.isCancel(repo)) return;\n\n updateConfig(hubDir, (config) => {\n const projects = (config.projects ?? {}) as Record<string, ProjectConfig>;\n const entry: ProjectConfig = {\n path: path as string,\n aliases,\n };\n if (repo) entry.repo = repo as string;\n projects[name as string] = entry;\n config.projects = projects;\n });\n\n // Create artifacts directory for the project\n mkdirSync(join(hubDir, \"artifacts\", \"projects\", name as string), { recursive: true });\n\n generate(hubDir);\n console.log(`Added project \"${name}\" and regenerated configs.`);\n });\n\nprojectCommand\n .command(\"list\")\n .description(\"List registered projects\")\n .action(() => {\n const hubDir = process.cwd();\n const result = loadConfig(hubDir);\n if (!result.ok) {\n console.error(\"Failed to load config:\", result.errors.join(\", \"));\n process.exit(1);\n }\n\n const projects = Object.entries(result.config.projects);\n if (projects.length === 0) {\n console.log(\"No projects registered. Run: meld project add\");\n return;\n }\n\n console.log(\"Projects:\\n\");\n for (const [name, project] of projects) {\n console.log(` ${name}`);\n console.log(` Path: ${project.path}`);\n if (project.aliases.length > 0) {\n console.log(` Aliases: ${project.aliases.join(\", \")}`);\n }\n if (project.repo) {\n console.log(` Repo: ${project.repo}`);\n }\n console.log(\"\");\n }\n });\n\nprojectCommand\n .command(\"remove <name>\")\n .description(\"Remove a project\")\n .action((name: string) => {\n const hubDir = process.cwd();\n\n updateConfig(hubDir, (config) => {\n const projects = config.projects as Record<string, unknown>;\n if (!(name in projects)) {\n console.error(`Project \"${name}\" not found.`);\n process.exit(1);\n }\n delete projects[name];\n });\n\n generate(hubDir);\n console.log(`Removed project \"${name}\" and regenerated configs.`);\n });\n","import { readFileSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { parse as parseJsonc } from \"jsonc-parser\";\n\n/**\n * Reads, modifies, and writes back meld.jsonc.\n * Note: comments are lost on round-trip since we write JSON.\n * Acceptable for v1 — preserving comments requires jsonc-parser's edit API.\n */\nexport function updateConfig(\n hubDir: string,\n updater: (config: Record<string, unknown>) => void,\n): void {\n const configPath = join(hubDir, \"meld.jsonc\");\n const raw = readFileSync(configPath, \"utf-8\");\n const config = parseJsonc(raw) as Record<string, unknown>;\n updater(config);\n writeFileSync(configPath, JSON.stringify(config, null, 2));\n}\n","import { Command } from \"commander\";\nimport { execSync } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { loadConfig } from \"../config/loader.js\";\n\nconst IDE_COMMANDS: Record<string, string> = {\n cursor: \"cursor\",\n code: \"code\",\n windsurf: \"windsurf\",\n};\n\nexport const openCommand = new Command(\"open\")\n .description(\"Open the hub workspace in your IDE\")\n .option(\"--ide <name>\", \"IDE to use (cursor, code, windsurf)\")\n .action((options) => {\n const hubDir = process.cwd();\n const result = loadConfig(hubDir);\n if (!result.ok) {\n console.error(\"Failed to load config:\", result.errors.join(\", \"));\n process.exit(1);\n }\n\n const ide = options.ide ?? result.config.ide.default;\n const command = IDE_COMMANDS[ide];\n if (!command) {\n console.error(`Unknown IDE: ${ide}. Supported: ${Object.keys(IDE_COMMANDS).join(\", \")}`);\n process.exit(1);\n }\n\n const workspaceFile = join(\n hubDir,\n `${result.config.ide.workspaceName}.code-workspace`,\n );\n\n if (!existsSync(workspaceFile)) {\n console.error(`Workspace file not found: ${workspaceFile}\\nRun: meld gen`);\n process.exit(1);\n }\n\n execSync(`${command} \"${workspaceFile}\"`, { stdio: \"inherit\" });\n });\n","import { Command } from \"commander\";\nimport * as p from \"@clack/prompts\";\nimport { readFileSync, writeFileSync, mkdirSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { loadConfig } from \"../config/loader.js\";\nimport { generate } from \"../generate.js\";\nimport { readPackageSchema } from \"../hub-schema.js\";\nimport { generateReadme } from \"../readme.js\";\n\nfunction ensureDir(path: string): void {\n mkdirSync(path, { recursive: true });\n}\n\n/**\n * Injects $schema as the first property in meld.jsonc if missing.\n * Works at the text level to preserve comments and formatting.\n */\nfunction ensureSchema(hubDir: string): void {\n const configPath = join(hubDir, \"meld.jsonc\");\n const raw = readFileSync(configPath, \"utf-8\");\n\n if (raw.includes('\"$schema\"')) return;\n\n const patched = raw.replace(/^\\s*\\{/, '{\\n \"$schema\": \"./meld.schema.json\",');\n writeFileSync(configPath, patched);\n}\n\nexport const updateCommand = new Command(\"update\")\n .description(\"Re-scaffold hub structure and update defaults without touching config\")\n .action(() => {\n const hubDir = process.cwd();\n\n // 1. Load config — fail early if no meld.jsonc\n const loadResult = loadConfig(hubDir);\n if (!loadResult.ok) {\n p.log.error(\n `Cannot update: ${loadResult.errors.join(\", \")}\\nRun \\`meld init\\` first.`,\n );\n process.exit(1);\n }\n\n const config = loadResult.config;\n\n // 2. Ensure standard dirs\n const standardDirs = [\n \"context\",\n \"commands\",\n \"skills\",\n join(\"artifacts\", \"hub\"),\n \"scratch\",\n ];\n for (const dir of standardDirs) {\n ensureDir(join(hubDir, dir));\n }\n\n // 3. Ensure project artifact dirs\n for (const name of Object.keys(config.projects)) {\n ensureDir(join(hubDir, \"artifacts\", \"projects\", name));\n }\n\n // 4. Ensure $schema reference in meld.jsonc\n ensureSchema(hubDir);\n\n // 5. Refresh schema and README\n writeFileSync(join(hubDir, \"meld.schema.json\"), readPackageSchema());\n writeFileSync(join(hubDir, \"README.md\"), generateReadme(config));\n\n // 6. Regenerate agent configs\n const result = generate(hubDir);\n if (!result.ok) {\n p.log.error(`Generation failed: ${result.errors.join(\", \")}`);\n process.exit(1);\n }\n\n // 7. Report\n p.log.success(\"Updated hub structure and defaults.\");\n if (result.files.length > 0) {\n p.log.info(\"Generated files:\");\n for (const file of result.files) {\n p.log.message(` ${file.path}`);\n }\n }\n p.log.info(\"Review changes, then commit when ready.\");\n });\n","import { Command } from \"commander\";\nimport { spawnSync } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { loadConfig } from \"../config/loader.js\";\nimport { resolveAgentDir, AGENTS_DIR } from \"../config/types.js\";\nimport type { AgentName } from \"../config/types.js\";\n\nconst AGENT_COMMANDS: Record<AgentName, string> = {\n \"claude-code\": \"claude\",\n \"codex-cli\": \"codex\",\n \"gemini-cli\": \"gemini\",\n};\n\nfunction runAgent(agentName: AgentName, args: string[]): void {\n const hubDir = process.cwd();\n const result = loadConfig(hubDir);\n if (!result.ok) {\n console.error(\"Failed to load config:\", result.errors.join(\", \"));\n process.exit(1);\n }\n\n const agentConfig = result.config.agents[agentName];\n if (!agentConfig?.enabled) {\n console.error(`Agent \"${agentName}\" is not enabled in meld.jsonc`);\n process.exit(1);\n }\n\n const agentDir = join(hubDir, AGENTS_DIR, resolveAgentDir(agentName, agentConfig));\n if (!existsSync(agentDir)) {\n console.error(`Agent directory not found: ${agentDir}\\nRun: meld gen`);\n process.exit(1);\n }\n\n const command = AGENT_COMMANDS[agentName];\n const { status, signal } = spawnSync(command, args, { cwd: agentDir, stdio: \"inherit\" });\n\n if (signal) {\n process.kill(process.pid, signal);\n }\n if (status !== null && status !== 0) {\n process.exit(status);\n }\n}\n\nexport function createAgentCommands(): Command[] {\n return (Object.keys(AGENT_COMMANDS) as AgentName[]).map((agent) => {\n return new Command(agent)\n .description(`Start ${agent} in its agent directory`)\n .allowUnknownOption()\n .allowExcessArguments()\n .action((_options, cmd: Command) => {\n runAgent(agent, cmd.args);\n });\n });\n}\n","import { createCli } from \"./cli/index.js\";\n\ncreateCli().parse();\n"],"mappings":";;;AAAA,SAAS,WAAAA,gBAAe;;;ACAxB,SAAS,eAAe;;;ACAxB,SAAS,aAAAC,kBAAiB;AAC1B,SAAS,QAAAC,aAAY;;;ACDrB,SAAS,cAAc,kBAAkB;AACzC,SAAS,YAAY;AACrB,SAAS,SAAS,kBAAmC;;;ACArD,IAAM,eAA4B,CAAC,eAAe,aAAa,YAAY;AAMpE,SAAS,eAAe,OAAkC;AAC/D,QAAM,SAAmB,CAAC;AAE1B,MAAI,OAAO,UAAU,YAAY,UAAU,MAAM;AAC/C,WAAO,EAAE,IAAI,OAAO,QAAQ,CAAC,0BAA0B,EAAE;AAAA,EAC3D;AAEA,QAAM,MAAM;AAEZ,QAAM,eAAe,CAAC,YAAY,UAAU,OAAO,KAAK;AACxD,aAAW,OAAO,cAAc;AAC9B,QAAI,EAAE,OAAO,MAAM;AACjB,aAAO,KAAK,yBAAyB,GAAG,EAAE;AAAA,IAC5C;AAAA,EACF;AAEA,MAAI,OAAO,SAAS,GAAG;AACrB,WAAO,EAAE,IAAI,OAAO,OAAO;AAAA,EAC7B;AAGA,QAAM,SAAS,IAAI;AACnB,aAAW,QAAQ,OAAO,KAAK,MAAM,GAAG;AACtC,QAAI,CAAC,aAAa,SAAS,IAAiB,GAAG;AAC7C,aAAO,KAAK,uBAAuB,IAAI,qBAAqB,aAAa,KAAK,IAAI,CAAC,EAAE;AAAA,IACvF;AAEA,UAAM,QAAQ,OAAO,IAAI;AACzB,QACE,eAAe,SACZ,MAAM,aAAa,SAClB,OAAO,MAAM,cAAc,YAAY,MAAM,QAAQ,MAAM,SAAS,IACxE;AACA,aAAO,KAAK,UAAU,IAAI,+BAA+B;AAAA,IAC3D;AAAA,EACF;AAGA,QAAM,MAAM,IAAI;AAChB,aAAW,CAAC,YAAY,MAAM,KAAK,OAAO,QAAQ,GAAG,GAAG;AACtD,UAAM,IAAI;AACV,QAAI,EAAE,SAAS,QAAQ;AACrB,UAAI,OAAO,EAAE,QAAQ,YAAY,CAAC,EAAE,KAAK;AACvC,eAAO,KAAK,eAAe,UAAU,mCAAmC;AAAA,MAC1E;AAAA,IACF,OAAO;AACL,UAAI,OAAO,EAAE,YAAY,YAAY,CAAC,EAAE,SAAS;AAC/C,eAAO,KAAK,eAAe,UAAU,wCAAwC;AAAA,MAC/E;AACA,UAAI,CAAC,MAAM,QAAQ,EAAE,IAAI,GAAG;AAC1B,eAAO,KAAK,eAAe,UAAU,qCAAqC;AAAA,MAC5E;AAAA,IACF;AACA,QAAI,EAAE,UAAU,MAAM,QAAQ,EAAE,MAAM,GAAG;AACvC,iBAAW,SAAS,EAAE,QAAQ;AAC5B,YAAI,CAAC,aAAa,SAAS,KAAkB,GAAG;AAC9C,iBAAO,KAAK,eAAe,UAAU,8BAA8B,KAAK,EAAE;AAAA,QAC5E;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,MAAI,aAAa,OAAO,IAAI,WAAW,MAAM;AAC3C,QAAI,OAAO,IAAI,YAAY,UAAU;AACnC,aAAO,KAAK,+BAA+B;AAAA,IAC7C;AAAA,EACF;AAEA,MAAI,OAAO,SAAS,GAAG;AACrB,WAAO,EAAE,IAAI,OAAO,OAAO;AAAA,EAC7B;AAEA,SAAO,EAAE,IAAI,MAAM,QAAQ,MAAoB;AACjD;;;ADxEO,SAAS,WAAW,QAA4B;AACrD,QAAM,aAAa,KAAK,QAAQ,YAAY;AAE5C,MAAI,CAAC,WAAW,UAAU,GAAG;AAC3B,WAAO,EAAE,IAAI,OAAO,QAAQ,CAAC,0BAA0B,UAAU,EAAE,EAAE;AAAA,EACvE;AAEA,MAAI;AACJ,MAAI;AACF,UAAM,aAAa,YAAY,OAAO;AAAA,EACxC,SAAS,KAAK;AACZ,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,QAAQ,CAAC,0BAA2B,IAAc,OAAO,EAAE;AAAA,IAC7D;AAAA,EACF;AAEA,MAAI;AACJ,QAAM,cAA4B,CAAC;AACnC,WAAS,WAAW,KAAK,WAAW;AAEpC,MAAI,YAAY,SAAS,GAAG;AAC1B,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,QAAQ,CAAC,gCAAgC,YAAY,MAAM,iBAAiB;AAAA,IAC9E;AAAA,EACF;AAEA,SAAO,eAAe,MAAM;AAC9B;;;AEhCA,IAAM,cAAc;AAEb,SAAS,eAAe,QAAuC;AACpE,QAAM,WAAqB,CAAC;AAC5B,QAAM,WAAW,gBAAgB,QAAQ,QAAQ;AACjD,SAAO,EAAE,QAAQ,UAAU,SAAS;AACtC;AAEA,SAAS,gBAAgB,OAAgB,UAA6B;AACpE,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO,MAAM,QAAQ,aAAa,CAAC,OAAO,YAAoB;AAC5D,YAAM,WAAW,QAAQ,IAAI,OAAO;AACpC,UAAI,aAAa,QAAW;AAC1B,iBAAS,KAAK,iCAAiC,OAAO,EAAE;AACxD,eAAO;AAAA,MACT;AACA,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AACA,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO,MAAM,IAAI,CAAC,SAAS,gBAAgB,MAAM,QAAQ,CAAC;AAAA,EAC5D;AACA,MAAI,OAAO,UAAU,YAAY,UAAU,MAAM;AAC/C,UAAM,SAAkC,CAAC;AACzC,eAAW,CAAC,KAAK,GAAG,KAAK,OAAO,QAAQ,KAAK,GAAG;AAC9C,aAAO,GAAG,IAAI,gBAAgB,KAAK,QAAQ;AAAA,IAC7C;AACA,WAAO;AAAA,EACT;AACA,SAAO;AACT;;;ACrCA,SAAS,aAAa,gBAAAC,eAAc,cAAAC,mBAAkB;AACtD,SAAS,QAAAC,OAAM,UAAU,SAAS,gBAAgB;;;ACqB3C,IAAM,aAAa;AAEnB,IAAM,qBAAgD;AAAA,EAC3D,eAAe;AAAA,EACf,aAAa;AAAA,EACb,cAAc;AAChB;AAEO,SAAS,gBAAgB,MAAiB,aAAkC;AACjF,SAAO,YAAY,OAAO,mBAAmB,IAAI;AACnD;AAoBO,SAAS,UAAU,QAAwD;AAChF,SAAO,OAAO,SAAS;AACzB;AAOO,IAAM,uBAAuB;AAE7B,SAAS,mBAAmB,aAA8B;AAC/D,SAAO,eAAe;AACxB;;;AD3DO,SAAS,eAAe,QAAgB,QAAqC;AAClF,QAAM,EAAE,QAAQ,aAAa,IAAI,YAAY,QAAQ,MAAM;AAC3D,SAAO;AAAA,IACL;AAAA,IACA,aAAa,iBAAiB,MAAM;AAAA,IACpC,cAAc,kBAAkB,MAAM;AAAA,IACtC,kBAAkB,sBAAsB;AAAA,IACxC,SAAS;AAAA,IACT;AAAA,IACA,UAAU,aAAa,MAAM;AAAA,IAC7B,QAAQ,WAAW,MAAM;AAAA,EAC3B;AACF;AAEA,SAAS,iBAAiB,QAA4B;AACpD,SAAO;AAAA,IACL,KAAK,OAAO,IAAI,aAAa;AAAA,IAC7B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AACb;AAEA,SAAS,kBAAkB,QAA4B;AACrD,QAAM,WAAW,kBAAkB,MAAM;AACzC,MAAI,SAAS,WAAW,EAAG,QAAO;AAElC,QAAM,QAAkB;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,aAAW,WAAW,UAAU;AAC9B,UAAM;AAAA,MACJ,KAAK,QAAQ,IAAI,MAAM,QAAQ,QAAQ,KAAK,IAAI,CAAC,MAAM,QAAQ,IAAI,MAAM,QAAQ,QAAQ,EAAE;AAAA,IAC7F;AAAA,EACF;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;AAEA,SAAS,wBAAgC;AACvC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AACb;AAEA,SAAS,kBAAkB,QAAyC;AAClE,SAAO,OAAO,QAAQ,OAAO,QAAQ,EAAE,IAAI,CAAC,CAAC,MAAM,OAAO,OAAO;AAAA,IAC/D;AAAA,IACA,SAAS,QAAQ;AAAA,IACjB,MAAM,QAAQ;AAAA,IACd,GAAI,QAAQ,QAAQ,EAAE,MAAM,QAAQ,KAAK;AAAA,EAC3C,EAAE;AACJ;AAEA,SAAS,YAAY,QAAgB,QAAqE;AACxG,QAAM,cAAc,mBAAmB,OAAO,OAAO;AACrD,QAAM,MAAMC,MAAK,QAAQ,WAAW;AAEpC,MAAI,CAACC,YAAW,GAAG,EAAG,QAAO,EAAE,QAAQ,IAAI,cAAc,CAAC,EAAE;AAE5D,QAAM,UAAU,YAAY,KAAK,EAAE,eAAe,KAAK,CAAC;AAGxD,QAAM,UAAU,QACb,OAAO,CAAC,MAAM,EAAE,OAAO,KAAK,EAAE,KAAK,SAAS,KAAK,CAAC,EAClD,IAAI,CAAC,MAAM,EAAE,IAAI,EACjB,KAAK;AAER,QAAM,SAAS,QAAQ,SAAS,IAC5B,QAAQ,IAAI,CAAC,MAAMC,cAAaF,MAAK,KAAK,CAAC,GAAG,OAAO,EAAE,KAAK,CAAC,EAAE,KAAK,MAAM,IAC1E;AAGJ,QAAM,eAA8B,CAAC;AACrC,QAAM,UAAU,QACb,OAAO,CAAC,MAAM,EAAE,YAAY,CAAC,EAC7B,IAAI,CAAC,MAAM,EAAE,IAAI,EACjB,KAAK;AAER,aAAW,UAAU,SAAS;AAC5B,iBAAaA,MAAK,KAAK,MAAM,GAAG,KAAK,YAAY;AAAA,EACnD;AAEA,SAAO,EAAE,QAAQ,aAAa;AAChC;AAEA,SAAS,aAAa,SAAiB,YAAoB,KAA0B;AACnF,QAAM,UAAU,YAAY,SAAS,EAAE,eAAe,KAAK,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,KAAK,cAAc,EAAE,IAAI,CAAC;AACzG,aAAW,SAAS,SAAS;AAC3B,UAAM,WAAWA,MAAK,SAAS,MAAM,IAAI;AACzC,QAAI,MAAM,YAAY,GAAG;AACvB,mBAAa,UAAU,YAAY,GAAG;AAAA,IACxC,WAAW,MAAM,OAAO,GAAG;AACzB,UAAI,KAAK;AAAA,QACP,MAAM,SAAS,YAAY,QAAQ;AAAA,QACnC,SAASE,cAAa,UAAU,OAAO;AAAA,MACzC,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAEA,SAAS,aAAa,QAA+B;AACnD,QAAM,cAAcF,MAAK,QAAQ,UAAU;AAC3C,MAAI,CAACC,YAAW,WAAW,EAAG,QAAO,CAAC;AAEtC,SAAO,YAAY,WAAW,EAC3B,OAAO,CAAC,MAAM,EAAE,SAAS,KAAK,CAAC,EAC/B,KAAK,EACL,IAAI,CAAC,OAAO;AAAA,IACX,MAAM,SAAS,GAAG,QAAQ,CAAC,CAAC;AAAA,IAC5B,SAASC,cAAaF,MAAK,aAAa,CAAC,GAAG,OAAO;AAAA,EACrD,EAAE;AACN;AAEA,SAAS,WAAW,QAA6B;AAC/C,QAAM,YAAYA,MAAK,QAAQ,QAAQ;AACvC,MAAI,CAACC,YAAW,SAAS,EAAG,QAAO,CAAC;AAEpC,SAAO,YAAY,WAAW,EAAE,eAAe,KAAK,CAAC,EAClD,OAAO,CAAC,MAAM,EAAE,YAAY,CAAC,EAC7B,KAAK,CAAC,GAAG,MAAM,EAAE,KAAK,cAAc,EAAE,IAAI,CAAC,EAC3C,IAAI,CAAC,MAAM;AACV,UAAM,YAAYD,MAAK,WAAW,EAAE,MAAM,UAAU;AACpD,QAAI,CAACC,YAAW,SAAS,EAAG,QAAO;AAEnC,UAAM,MAAMC,cAAa,WAAW,OAAO;AAC3C,UAAM,EAAE,aAAa,KAAK,IAAI,iBAAiB,GAAG;AAElD,WAAO,EAAE,MAAM,EAAE,MAAM,aAAa,KAAK;AAAA,EAC3C,CAAC,EACA,OAAO,CAAC,MAAsB,MAAM,IAAI;AAC7C;AAEA,SAAS,iBAAiB,SAAyE;AACjG,QAAM,QAAQ,QAAQ,MAAM,oCAAoC;AAChE,MAAI,CAAC,OAAO;AACV,WAAO,EAAE,aAAa,CAAC,GAAG,MAAM,QAAQ;AAAA,EAC1C;AAEA,QAAM,UAAU,MAAM,CAAC;AACvB,QAAM,OAAO,MAAM,CAAC,EAAE,KAAK;AAC3B,QAAM,cAAc,gBAAgB,OAAO;AAE3C,SAAO,EAAE,aAAa,KAAK;AAC7B;AAEA,SAAS,gBAAgB,MAAuC;AAC9D,QAAM,SAAkC,CAAC;AACzC,QAAM,QAAQ,KAAK,MAAM,IAAI;AAC7B,MAAI,aAAa;AACjB,MAAI,aAA4C;AAEhD,aAAW,QAAQ,OAAO;AACxB,QAAI,KAAK,KAAK,MAAM,GAAI;AAGxB,UAAM,gBAAgB,KAAK,MAAM,sBAAsB;AACvD,QAAI,iBAAiB,YAAY;AAC/B,UAAI,CAAC,WAAY,cAAa,CAAC;AAC/B,iBAAW,cAAc,CAAC,CAAC,IAAI,cAAc,CAAC,EAAE,KAAK;AACrD;AAAA,IACF;AAGA,QAAI,cAAc,YAAY;AAC5B,aAAO,UAAU,IAAI;AACrB,mBAAa;AAAA,IACf;AAGA,UAAM,WAAW,KAAK,MAAM,oBAAoB;AAChD,QAAI,UAAU;AACZ,mBAAa,SAAS,CAAC;AACvB,YAAM,QAAQ,SAAS,CAAC,EAAE,KAAK;AAG/B,UAAI,MAAM,WAAW,GAAG,KAAK,MAAM,SAAS,GAAG,GAAG;AAChD,eAAO,UAAU,IAAI,MAAM,MAAM,GAAG,EAAE,EAAE,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,gBAAgB,EAAE,CAAC;AAAA,MACpG,WAAW,UAAU,QAAQ;AAC3B,eAAO,UAAU,IAAI;AAAA,MACvB,WAAW,UAAU,SAAS;AAC5B,eAAO,UAAU,IAAI;AAAA,MACvB,OAAO;AACL,eAAO,UAAU,IAAI,MAAM,QAAQ,gBAAgB,EAAE;AAAA,MACvD;AACA;AAAA,IACF;AAGA,UAAM,cAAc,KAAK,MAAM,eAAe;AAC9C,QAAI,aAAa;AACf,mBAAa,YAAY,CAAC;AAC1B,mBAAa,CAAC;AACd;AAAA,IACF;AAAA,EACF;AAGA,MAAI,cAAc,YAAY;AAC5B,WAAO,UAAU,IAAI;AAAA,EACvB;AAEA,SAAO;AACT;;;AE1OA,SAAS,eAAe,iBAAiB;AACzC,SAAS,QAAAC,OAAM,eAAe;AAOvB,SAAS,oBACd,QACA,OACA,UAAwB,CAAC,GACR;AACjB,MAAI,CAAC,QAAQ,QAAQ;AACnB,eAAW,QAAQ,OAAO;AACxB,YAAM,WAAWA,MAAK,QAAQ,KAAK,IAAI;AACvC,gBAAU,QAAQ,QAAQ,GAAG,EAAE,WAAW,KAAK,CAAC;AAChD,oBAAc,UAAU,KAAK,OAAO;AAAA,IACtC;AAAA,EACF;AACA,SAAO;AACT;;;ACrBO,SAAS,cAAc,OAAkD;AAC9E,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEO,SAAS,UACd,MACA,WACyB;AACzB,QAAM,SAAkC,EAAE,GAAG,KAAK;AAElD,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,SAAS,GAAG;AACpD,UAAM,UAAU,OAAO,GAAG;AAC1B,QAAI,cAAc,OAAO,KAAK,cAAc,KAAK,GAAG;AAClD,aAAO,GAAG,IAAI,UAAU,SAAS,KAAK;AACtC;AAAA,IACF;AACA,WAAO,GAAG,IAAI;AAAA,EAChB;AAEA,SAAO;AACT;AAEO,SAAS,cAAc,QAAyC;AACrE,QAAM,QAAkB,CAAC;AACzB,cAAY,CAAC,GAAG,QAAQ,KAAK;AAC7B,SAAO,GAAG,MAAM,KAAK,IAAI,CAAC;AAAA;AAC5B;AAEA,SAAS,YAAY,MAAgB,OAAgC,OAAuB;AAC1F,QAAM,UAAU,OAAO,QAAQ,KAAK,EAAE,OAAO,CAAC,CAAC,EAAE,KAAK,MAAM,UAAU,UAAa,UAAU,IAAI;AACjG,QAAM,gBAAgB,QAAQ,OAAO,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,cAAc,KAAK,CAAC;AACzE,QAAM,eAAe,QAAQ,OAAO,CAAC,CAAC,EAAE,KAAK,MAAM,cAAc,KAAK,CAAC;AAEvE,MAAI,KAAK,SAAS,KAAK,cAAc,WAAW,KAAK,aAAa,WAAW,GAAG;AAC9E;AAAA,EACF;AAEA,MAAI,KAAK,SAAS,GAAG;AACnB,QAAI,MAAM,SAAS,EAAG,OAAM,KAAK,EAAE;AACnC,UAAM,KAAK,IAAI,KAAK,IAAI,aAAa,EAAE,KAAK,GAAG,CAAC,GAAG;AAAA,EACrD;AAEA,aAAW,CAAC,KAAK,KAAK,KAAK,eAAe;AACxC,UAAM,KAAK,GAAG,cAAc,GAAG,CAAC,MAAM,gBAAgB,KAAK,CAAC,EAAE;AAAA,EAChE;AAEA,aAAW,CAAC,KAAK,KAAK,KAAK,cAAc;AACvC,gBAAY,CAAC,GAAG,MAAM,GAAG,GAAG,OAAO,KAAK;AAAA,EAC1C;AACF;AAEA,SAAS,gBAAgB,OAAwB;AAC/C,MAAI,OAAO,UAAU,SAAU,QAAO,IAAI,iBAAiB,KAAK,CAAC;AACjE,MAAI,OAAO,UAAU,UAAU;AAC7B,QAAI,CAAC,OAAO,SAAS,KAAK,GAAG;AAC3B,YAAM,IAAI,MAAM,+CAA+C,KAAK,EAAE;AAAA,IACxE;AACA,WAAO,OAAO,KAAK;AAAA,EACrB;AACA,MAAI,OAAO,UAAU,UAAW,QAAO,QAAQ,SAAS;AACxD,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO,IAAI,MAAM,IAAI,CAAC,SAAS,qBAAqB,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC;AAAA,EACvE;AAEA,QAAM,IAAI,MAAM,gCAAgC,OAAO,KAAK,EAAE;AAChE;AAEA,SAAS,qBAAqB,OAAwB;AACpD,MAAI,OAAO,UAAU,SAAU,QAAO,IAAI,iBAAiB,KAAK,CAAC;AACjE,MAAI,OAAO,UAAU,UAAU;AAC7B,QAAI,CAAC,OAAO,SAAS,KAAK,GAAG;AAC3B,YAAM,IAAI,MAAM,+CAA+C,KAAK,EAAE;AAAA,IACxE;AACA,WAAO,OAAO,KAAK;AAAA,EACrB;AACA,MAAI,OAAO,UAAU,UAAW,QAAO,QAAQ,SAAS;AAExD,QAAM,IAAI,MAAM,sCAAsC,OAAO,KAAK,EAAE;AACtE;AAEA,SAAS,cAAc,KAAqB;AAC1C,SAAO,mBAAmB,KAAK,GAAG,IAC9B,MACA,IAAI,iBAAiB,GAAG,CAAC;AAC/B;AAEA,SAAS,iBAAiB,OAAuB;AAC/C,SAAO,MACJ,QAAQ,OAAO,MAAM,EACrB,QAAQ,MAAM,KAAK,EACnB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK;AACzB;;;ACvFO,IAAM,sBAAN,MAA+C;AAAA,EACpD,OAAO;AAAA,EAEP,SAAS,QAAoB,SAA2C;AACtE,UAAM,QAAyB,CAAC;AAEhC,UAAM,KAAK;AAAA,MACT,MAAM;AAAA,MACN,SAAS,KAAK,kBAAkB,OAAO;AAAA,IACzC,CAAC;AAED,UAAM,KAAK;AAAA,MACT,MAAM;AAAA,MACN,SAAS,KAAK,eAAe,MAAM;AAAA,IACrC,CAAC;AAED,UAAM,KAAK;AAAA,MACT,MAAM;AAAA,MACN,SAAS,KAAK,cAAc,QAAQ,QAAQ,MAAM;AAAA,IACpD,CAAC;AAED,eAAW,WAAW,QAAQ,UAAU;AACtC,YAAM,KAAK;AAAA,QACT,MAAM,yBAAyB,QAAQ,IAAI;AAAA,QAC3C,SAAS,QAAQ;AAAA,MACnB,CAAC;AAAA,IACH;AAEA,eAAW,SAAS,QAAQ,QAAQ;AAClC,YAAM,KAAK;AAAA,QACT,MAAM,uBAAuB,MAAM,IAAI;AAAA,QACvC,SAAS,KAAK,WAAW,KAAK;AAAA,MAChC,CAAC;AAAA,IACH;AAEA,eAAW,QAAQ,QAAQ,cAAc;AACvC,YAAM,KAAK,EAAE,MAAM,KAAK,MAAM,SAAS,KAAK,QAAQ,CAAC;AAAA,IACvD;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,kBAAkB,SAAkC;AAC1D,UAAM,WAAqB,CAAC,QAAQ,WAAW;AAE/C,QAAI,QAAQ,cAAc;AACxB,eAAS,KAAK,QAAQ,YAAY;AAAA,IACpC;AAEA,aAAS,KAAK,QAAQ,gBAAgB;AAEtC,QAAI,QAAQ,SAAS;AACnB,eAAS,KAAK,QAAQ,OAAO;AAAA,IAC/B;AAEA,WAAO,SAAS,KAAK,MAAM;AAAA,EAC7B;AAAA,EAEQ,eAAe,QAA4B;AACjD,UAAM,UAAmD,CAAC;AAE1D,eAAW,CAAC,MAAM,MAAM,KAAK,OAAO,QAAQ,OAAO,GAAG,GAAG;AACvD,UAAI,OAAO,UAAU,CAAC,OAAO,OAAO,SAAS,aAAa,EAAG;AAE7D,UAAI,UAAU,MAAM,GAAG;AACrB,cAAM,QAAiC,EAAE,MAAM,QAAQ,KAAK,OAAO,IAAI;AACvE,YAAI,OAAO,QAAS,OAAM,UAAU,OAAO;AAC3C,YAAI,OAAO,IAAK,OAAM,MAAM,OAAO;AACnC,gBAAQ,IAAI,IAAI;AAAA,MAClB,OAAO;AACL,cAAM,QAAiC,EAAE,SAAS,OAAO,SAAS,MAAM,OAAO,KAAK;AACpF,YAAI,OAAO,IAAK,OAAM,MAAM,OAAO;AACnC,gBAAQ,IAAI,IAAI;AAAA,MAClB;AAAA,IACF;AAEA,WAAO,KAAK,UAAU,EAAE,YAAY,QAAQ,GAAG,MAAM,CAAC;AAAA,EACxD;AAAA,EAEQ,cAAc,QAAoB,QAAwB;AAChE,UAAM,WAAoC,CAAC;AAG3C,aAAS,MAAM,EAAE,oBAAoB,OAAO;AAG5C,UAAM,QAAkB,CAAC;AAGzB,UAAM,YAAY,CAAC,QAAQ,aAAa,YAAY,YAAY;AAChE,UAAM,KAAK,GAAG,SAAS;AAGvB,UAAM,mBAAmB;AAAA,MACvB;AAAA,MAAM;AAAA,MAAM;AAAA,MAAS;AAAA,MAAM;AAAA,MAAM;AAAA,MACjC;AAAA,MAAO;AAAA,MACP;AAAA,MAAQ;AAAA,MAAO;AAAA,MAAO;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACtC;AAAA,MAAS;AAAA,MAAO;AAAA,IAClB;AACA,eAAW,OAAO,kBAAkB;AAClC,YAAM,KAAK,gBAAgB,GAAG,KAAK;AAAA,IACrC;AAGA,UAAM,KAAK,UAAU,MAAM,MAAM;AACjC,UAAM,KAAK,UAAU,MAAM,MAAM;AACjC,UAAM,KAAK,UAAU,MAAM,MAAM;AACjC,UAAM,KAAK,WAAW,MAAM,MAAM;AAClC,UAAM,KAAK,UAAU,MAAM,MAAM;AAGjC,UAAM,wBAAkC,CAAC;AACzC,eAAW,CAAC,EAAE,OAAO,KAAK,OAAO,QAAQ,OAAO,QAAQ,GAAG;AACzD,YAAM,KAAK,UAAU,QAAQ,IAAI,MAAM;AACvC,YAAM,KAAK,UAAU,QAAQ,IAAI,MAAM;AACvC,YAAM,KAAK,UAAU,QAAQ,IAAI,MAAM;AACvC,YAAM,KAAK,WAAW,QAAQ,IAAI,MAAM;AACxC,YAAM,KAAK,UAAU,QAAQ,IAAI,MAAM;AACvC,4BAAsB,KAAK,QAAQ,IAAI;AAAA,IACzC;AACA,aAAS,cAAc,EAAE,OAAO,sBAAsB;AAEtD,UAAM,YAAY,OAAO,OAAO,aAAa,EAAE;AAC/C,UAAM,iBAAiB,cAAc,SAAS,IAC1C,UAAU,UAAU,SAAS,IAC7B;AAEJ,WAAO,KAAK,UAAU,gBAAgB,MAAM,CAAC;AAAA,EAC/C;AAAA,EAEQ,WAAW,OAA0B;AAC3C,UAAM,KAAK,EAAE,GAAG,MAAM,YAAY;AAGlC,QAAI,GAAG,SAAS,OAAO,GAAG,UAAU,YAAY,CAAC,MAAM,QAAQ,GAAG,KAAK,GAAG;AACxE,YAAM,WAAW,GAAG;AACpB,UAAI,SAAS,aAAa,GAAG;AAC3B,WAAG,QAAQ,SAAS,aAAa;AAAA,MACnC,OAAO;AACL,eAAO,GAAG;AAAA,MACZ;AAAA,IACF;AAEA,UAAM,mBAAmB,KAAK,qBAAqB,EAAE;AACrD,WAAO;AAAA,EAAQ,gBAAgB;AAAA;AAAA;AAAA,EAAY,MAAM,IAAI;AAAA,EACvD;AAAA,EAEQ,qBAAqB,IAAqC;AAChE,UAAM,QAAkB,CAAC;AACzB,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,EAAE,GAAG;AAC7C,UAAI,OAAO,UAAU,UAAU;AAC7B,cAAM,KAAK,GAAG,GAAG,KAAK,KAAK,EAAE;AAAA,MAC/B,WAAW,OAAO,UAAU,WAAW;AACrC,cAAM,KAAK,GAAG,GAAG,KAAK,KAAK,EAAE;AAAA,MAC/B,WAAW,MAAM,QAAQ,KAAK,GAAG;AAC/B,cAAM,KAAK,GAAG,GAAG,MAAM,MAAM,KAAK,IAAI,CAAC,GAAG;AAAA,MAC5C;AAAA,IACF;AACA,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AACF;;;AChKO,IAAM,oBAAN,MAA6C;AAAA,EAClD,OAAO;AAAA,EAEP,SAAS,QAAoB,SAA2C;AACtE,UAAM,QAAyB,CAAC;AAEhC,UAAM,KAAK;AAAA,MACT,MAAM;AAAA,MACN,SAAS,KAAK,kBAAkB,OAAO;AAAA,IACzC,CAAC;AAED,UAAM,KAAK;AAAA,MACT,MAAM;AAAA,MACN,SAAS,KAAK,gBAAgB,QAAQ,OAAO;AAAA,IAC/C,CAAC;AAED,eAAW,WAAW,QAAQ,UAAU;AACtC,YAAM,KAAK;AAAA,QACT,MAAM,2BAA2B,QAAQ,IAAI;AAAA,QAC7C,SAAS,QAAQ;AAAA,MACnB,CAAC;AAAA,IACH;AAEA,eAAW,SAAS,QAAQ,QAAQ;AAClC,YAAM,KAAK;AAAA,QACT,MAAM,uBAAuB,MAAM,IAAI;AAAA,QACvC,SAAS,KAAK,WAAW,KAAK;AAAA,MAChC,CAAC;AAAA,IACH;AAEA,eAAW,QAAQ,QAAQ,cAAc;AACvC,YAAM,KAAK,EAAE,MAAM,KAAK,MAAM,SAAS,KAAK,QAAQ,CAAC;AAAA,IACvD;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,kBAAkB,SAAkC;AAC1D,UAAM,WAAqB,CAAC,QAAQ,WAAW;AAE/C,QAAI,QAAQ,cAAc;AACxB,eAAS,KAAK,QAAQ,YAAY;AAAA,IACpC;AAEA,aAAS,KAAK,QAAQ,gBAAgB;AAEtC,QAAI,QAAQ,SAAS;AACnB,eAAS,KAAK,QAAQ,OAAO;AAAA,IAC/B;AAEA,WAAO,SAAS,KAAK,MAAM;AAAA,EAC7B;AAAA,EAEQ,gBAAgB,QAAoB,SAAkC;AAC5E,UAAM,gBAAgB,MAAM,KAAK,oBAAI,IAAI;AAAA,MACvC,QAAQ;AAAA,MACR,GAAG,OAAO,OAAO,OAAO,QAAQ,EAAE,IAAI,CAAC,YAAY,QAAQ,IAAI;AAAA,IACjE,CAAC,CAAC;AAEF,UAAM,kBAA2C;AAAA,MAC/C,iBAAiB;AAAA,MACjB,cAAc;AAAA,MACd,yBAAyB;AAAA,QACvB,gBAAgB;AAAA,MAClB;AAAA,IACF;AAEA,UAAM,aAAa,KAAK,gBAAgB,MAAM;AAC9C,QAAI,OAAO,KAAK,UAAU,EAAE,SAAS,GAAG;AACtC,sBAAgB,cAAc;AAAA,IAChC;AAEA,UAAM,YAAY,OAAO,OAAO,WAAW,EAAE;AAC7C,UAAM,eAAe,cAAc,SAAS,IACxC,UAAU,iBAAiB,SAAS,IACpC;AAEJ,WAAO,cAAc,YAAY;AAAA,EACnC;AAAA,EAEQ,gBAAgB,QAA6D;AACnF,UAAM,UAAmD,CAAC;AAE1D,eAAW,CAAC,MAAM,MAAM,KAAK,OAAO,QAAQ,OAAO,GAAG,GAAG;AACvD,UAAI,OAAO,UAAU,CAAC,OAAO,OAAO,SAAS,WAAW,EAAG;AAE3D,UAAI,UAAU,MAAM,GAAG;AACrB,cAAM,QAAiC,EAAE,KAAK,OAAO,IAAI;AACzD,YAAI,OAAO,WAAW,OAAO,KAAK,OAAO,OAAO,EAAE,SAAS,GAAG;AAC5D,gBAAM,eAAe,OAAO;AAAA,QAC9B;AACA,YAAI,OAAO,OAAO,OAAO,KAAK,OAAO,GAAG,EAAE,SAAS,GAAG;AACpD,gBAAM,MAAM,OAAO;AAAA,QACrB;AACA,gBAAQ,IAAI,IAAI;AAAA,MAClB,OAAO;AACL,cAAM,QAAiC,EAAE,SAAS,OAAO,SAAS,MAAM,OAAO,KAAK;AACpF,YAAI,OAAO,OAAO,OAAO,KAAK,OAAO,GAAG,EAAE,SAAS,GAAG;AACpD,gBAAM,MAAM,OAAO;AAAA,QACrB;AACA,gBAAQ,IAAI,IAAI;AAAA,MAClB;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,WAAW,OAA0B;AAC3C,UAAM,KAAK,EAAE,GAAG,MAAM,YAAY;AAElC,QAAI,GAAG,SAAS,OAAO,GAAG,UAAU,YAAY,CAAC,MAAM,QAAQ,GAAG,KAAK,GAAG;AACxE,YAAM,WAAW,GAAG;AACpB,UAAI,SAAS,WAAW,GAAG;AACzB,WAAG,QAAQ,SAAS,WAAW;AAAA,MACjC,OAAO;AACL,eAAO,GAAG;AAAA,MACZ;AAAA,IACF;AAEA,UAAM,mBAAmB,KAAK,qBAAqB,EAAE;AACrD,WAAO;AAAA,EAAQ,gBAAgB;AAAA;AAAA;AAAA,EAAY,MAAM,IAAI;AAAA,EACvD;AAAA,EAEQ,qBAAqB,IAAqC;AAChE,UAAM,QAAkB,CAAC;AACzB,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,EAAE,GAAG;AAC7C,UAAI,OAAO,UAAU,UAAU;AAC7B,cAAM,KAAK,GAAG,GAAG,KAAK,KAAK,EAAE;AAAA,MAC/B,WAAW,OAAO,UAAU,WAAW;AACrC,cAAM,KAAK,GAAG,GAAG,KAAK,KAAK,EAAE;AAAA,MAC/B,WAAW,MAAM,QAAQ,KAAK,GAAG;AAC/B,cAAM,KAAK,GAAG,GAAG,MAAM,MAAM,KAAK,IAAI,CAAC,GAAG;AAAA,MAC5C;AAAA,IACF;AACA,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AACF;;;ACxIO,IAAM,qBAAN,MAA8C;AAAA,EACnD,OAAO;AAAA,EAEP,SAAS,QAAoB,SAA2C;AACtE,UAAM,QAAyB,CAAC;AAEhC,UAAM,KAAK;AAAA,MACT,MAAM;AAAA,MACN,SAAS,KAAK,kBAAkB,OAAO;AAAA,IACzC,CAAC;AAED,UAAM,KAAK;AAAA,MACT,MAAM;AAAA,MACN,SAAS,KAAK,cAAc,MAAM;AAAA,IACpC,CAAC;AAED,eAAW,WAAW,QAAQ,UAAU;AACtC,YAAM,KAAK;AAAA,QACT,MAAM,yBAAyB,QAAQ,IAAI;AAAA,QAC3C,SAAS,KAAK,iBAAiB,QAAQ,MAAM,QAAQ,OAAO;AAAA,MAC9D,CAAC;AAAA,IACH;AAEA,eAAW,SAAS,QAAQ,QAAQ;AAClC,YAAM,KAAK;AAAA,QACT,MAAM,yBAAyB,MAAM,IAAI;AAAA,QACzC,SAAS,KAAK,eAAe,KAAK;AAAA,MACpC,CAAC;AAAA,IACH;AAEA,eAAW,QAAQ,QAAQ,cAAc;AACvC,YAAM,KAAK,EAAE,MAAM,KAAK,MAAM,SAAS,KAAK,QAAQ,CAAC;AAAA,IACvD;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,kBAAkB,SAAkC;AAC1D,UAAM,WAAqB,CAAC,QAAQ,WAAW;AAE/C,QAAI,QAAQ,cAAc;AACxB,eAAS,KAAK,QAAQ,YAAY;AAAA,IACpC;AAEA,aAAS,KAAK,QAAQ,gBAAgB;AAEtC,QAAI,QAAQ,SAAS;AACnB,eAAS,KAAK,QAAQ,OAAO;AAAA,IAC/B;AAEA,WAAO,SAAS,KAAK,MAAM;AAAA,EAC7B;AAAA,EAEQ,cAAc,QAA4B;AAChD,UAAM,UAAmD,CAAC;AAE1D,eAAW,CAAC,MAAM,MAAM,KAAK,OAAO,QAAQ,OAAO,GAAG,GAAG;AACvD,UAAI,OAAO,UAAU,CAAC,OAAO,OAAO,SAAS,YAAY,EAAG;AAE5D,UAAI,UAAU,MAAM,GAAG;AACrB,cAAM,QAAiC,EAAE,MAAM,QAAQ,KAAK,OAAO,IAAI;AACvE,YAAI,OAAO,QAAS,OAAM,UAAU,OAAO;AAC3C,YAAI,OAAO,IAAK,OAAM,MAAM,OAAO;AACnC,gBAAQ,IAAI,IAAI;AAAA,MAClB,OAAO;AACL,cAAM,QAAiC,EAAE,SAAS,OAAO,SAAS,MAAM,OAAO,KAAK;AACpF,YAAI,OAAO,IAAK,OAAM,MAAM,OAAO;AACnC,gBAAQ,IAAI,IAAI;AAAA,MAClB;AAAA,IACF;AAEA,UAAM,WAAoC,EAAE,YAAY,QAAQ;AAChE,UAAM,YAAY,OAAO,OAAO,YAAY,EAAE;AAC9C,UAAM,iBAAiB,cAAc,SAAS,IAC1C,UAAU,UAAU,SAAS,IAC7B;AAEJ,WAAO,KAAK,UAAU,gBAAgB,MAAM,CAAC;AAAA,EAC/C;AAAA,EAEQ,iBAAiB,MAAc,SAAyB;AAC9D,WAAO;AAAA,MACL,kBAAkB,IAAI;AAAA,MACtB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,EAAE,KAAK,IAAI;AAAA,EACb;AAAA,EAEQ,eAAe,OAA0B;AAC/C,UAAM,cAAe,MAAM,YAAY,eAA0B,MAAM;AACvE,WAAO;AAAA,MACL,YAAY,MAAM,IAAI;AAAA,MACtB,kBAAkB,WAAW;AAAA,MAC7B;AAAA,MACA;AAAA,MACA;AAAA,MACA,MAAM;AAAA,MACN;AAAA,IACF,EAAE,KAAK,IAAI;AAAA,EACb;AACF;;;AC7GA,SAAS,eAAe;AAKjB,IAAM,qBAAN,MAA8C;AAAA,EACnD,OAAO;AAAA,EAEP,SAAS,QAAoB,UAA4C;AACvE,UAAM,UAAU;AAAA,MACd,EAAE,MAAM,OAAO,IAAI,eAAe,MAAM,IAAI;AAAA,MAC5C,GAAG,OAAO,QAAQ,OAAO,QAAQ,EAAE,IAAI,CAAC,CAAC,MAAM,OAAO,OAAO;AAAA,QAC3D;AAAA,QACA,MAAM,aAAa,QAAQ,IAAI;AAAA,MACjC,EAAE;AAAA,IACJ;AAEA,UAAM,YAAY;AAAA,MAChB;AAAA,MACA,UAAU,CAAC;AAAA,IACb;AAEA,WAAO;AAAA,MACL;AAAA,QACE,MAAM,GAAG,OAAO,IAAI,aAAa;AAAA,QACjC,SAAS,KAAK,UAAU,WAAW,MAAM,CAAC;AAAA,MAC5C;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,aAAa,MAAsB;AAC1C,MAAI,KAAK,WAAW,IAAI,GAAG;AACzB,WAAO,QAAQ,IAAI,KAAK,MAAM,CAAC;AAAA,EACjC;AACA,SAAO;AACT;;;ACpCA,SAAS,gBAAAC,eAAc,cAAAC,mBAAkB;AACzC,SAAS,QAAAC,aAAY;AAKrB,IAAM,eAAe;AACrB,IAAM,aAAa;AAEZ,IAAM,qBAAN,MAA8C;AAAA,EACnD,OAAO;AAAA,EAEP,SAAS,SAAqB,SAA2C;AACvE,UAAM,QAAkB;AAAA,MACtB;AAAA,MACA;AAAA,IACF;AAEA,UAAM,eAAe;AAAA,MACnB;AAAA,MACA,GAAG;AAAA,MACH;AAAA,IACF,EAAE,KAAK,IAAI;AAEX,UAAM,UAAU,mBAAmB,QAAQ,QAAQ,YAAY;AAE/D,WAAO,CAAC,EAAE,MAAM,cAAc,QAAQ,CAAC;AAAA,EACzC;AACF;AAEA,SAAS,mBAAmB,QAAgB,cAA8B;AACxE,QAAM,gBAAgBA,MAAK,QAAQ,YAAY;AAE/C,MAAI,CAACD,YAAW,aAAa,GAAG;AAC9B,WAAO,eAAe;AAAA,EACxB;AAEA,QAAM,WAAWD,cAAa,eAAe,OAAO;AACpD,QAAM,WAAW,SAAS,QAAQ,YAAY;AAC9C,QAAM,SAAS,SAAS,QAAQ,UAAU;AAE1C,MAAI,aAAa,MAAM,WAAW,IAAI;AACpC,UAAM,UAAU,SAAS,QAAQ;AACjC,WAAO,WAAW,QAAQ,SAAS,IAAI,SAAS,MAAM,eAAe;AAAA,EACvE;AAEA,QAAM,SAAS,SAAS,MAAM,GAAG,QAAQ;AACzC,QAAM,QAAQ,SAAS,MAAM,SAAS,WAAW,MAAM;AAEvD,SAAO,SAAS,eAAe;AACjC;;;AZ1BA,IAAM,mBAAuD;AAAA,EAC3D,eAAe,MAAM,IAAI,oBAAoB;AAAA,EAC7C,aAAa,MAAM,IAAI,kBAAkB;AAAA,EACzC,cAAc,MAAM,IAAI,mBAAmB;AAC7C;AAEO,SAAS,SACd,QACA,UAA2B,CAAC,GACZ;AAChB,QAAM,aAAa,WAAW,MAAM;AACpC,MAAI,CAAC,WAAW,IAAI;AAClB,WAAO,EAAE,IAAI,OAAO,QAAQ,WAAW,OAAO;AAAA,EAChD;AAEA,QAAM,EAAE,QAAQ,SAAS,IAAI,eAAe,WAAW,MAAM;AAC7D,QAAM,UAAU,eAAe,QAAQ,MAAM;AAE7C,QAAM,WAA4B,CAAC;AAEnC,aAAW,CAAC,MAAM,WAAW,KAAK,OAAO,QAAQ,OAAO,MAAM,GAAiC;AAC7F,QAAI,CAAC,YAAY,QAAS;AAC1B,QAAI,QAAQ,SAAS,QAAQ,UAAU,KAAM;AAE7C,UAAM,WAAW,gBAAgB,MAAM,WAAW;AAClD,UAAM,UAAU,iBAAiB,IAAI;AACrC,QAAI,CAAC,QAAS;AAEd,UAAM,QAAQ,QAAQ,EAAE,SAAS,QAAQ,OAAO;AAChD,eAAW,QAAQ,OAAO;AACxB,WAAK,OAAO,GAAG,UAAU,IAAI,QAAQ,IAAI,KAAK,IAAI;AAAA,IACpD;AACA,aAAS,KAAK,GAAG,KAAK;AAAA,EACxB;AAEA,MAAI,CAAC,QAAQ,OAAO;AAClB,aAAS,KAAK,GAAG,IAAI,mBAAmB,EAAE,SAAS,QAAQ,OAAO,CAAC;AACnE,aAAS,KAAK,GAAG,IAAI,mBAAmB,EAAE,SAAS,QAAQ,OAAO,CAAC;AAAA,EACrE;AAGA,MAAI,CAAC,QAAQ,QAAQ;AACnB,eAAW,QAAQ,OAAO,KAAK,OAAO,QAAQ,GAAG;AAC/C,MAAAG,WAAUC,MAAK,QAAQ,aAAa,YAAY,IAAI,GAAG,EAAE,WAAW,KAAK,CAAC;AAAA,IAC5E;AAAA,EACF;AAEA,sBAAoB,QAAQ,UAAU,EAAE,QAAQ,QAAQ,OAAO,CAAC;AAEhE,SAAO,EAAE,IAAI,MAAM,OAAO,UAAU,SAAS;AAC/C;;;ADtEO,IAAM,aAAa,IAAI,QAAQ,KAAK,EACxC,YAAY,4CAA4C,EACxD,OAAO,aAAa,uCAAuC,EAC3D,OAAO,kBAAkB,kEAAkE,EAC3F,OAAO,CAAC,YAAY;AACnB,QAAM,SAAS,QAAQ,IAAI;AAE3B,QAAM,SAAS,SAAS,QAAQ;AAAA,IAC9B,QAAQ,QAAQ;AAAA,IAChB,OAAO,QAAQ;AAAA,EACjB,CAAC;AAED,MAAI,CAAC,OAAO,IAAI;AACd,YAAQ,MAAM,oBAAoB;AAClC,eAAW,SAAS,OAAO,QAAQ;AACjC,cAAQ,MAAM,OAAO,KAAK,EAAE;AAAA,IAC9B;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI,OAAO,SAAS,SAAS,GAAG;AAC9B,eAAW,KAAK,OAAO,UAAU;AAC/B,cAAQ,KAAK,cAAc,CAAC,EAAE;AAAA,IAChC;AACA,YAAQ,KAAK;AAAA,EACf;AAEA,MAAI,QAAQ,QAAQ;AAClB,YAAQ,IAAI,gCAA2B;AAAA,EACzC,OAAO;AACL,YAAQ,IAAI,YAAY;AAAA,EAC1B;AAEA,aAAW,QAAQ,OAAO,OAAO;AAC/B,YAAQ,IAAI,KAAK,KAAK,IAAI,EAAE;AAAA,EAC9B;AAEA,UAAQ,IAAI;AAAA,EAAK,OAAO,MAAM,MAAM,YAAY,QAAQ,SAAS,aAAa,EAAE,aAAa;AAC/F,CAAC;;;Ac1CH,SAAS,WAAAC,gBAAe;AACxB,YAAY,OAAO;AACnB,SAAS,iBAAAC,gBAAe,aAAAC,YAAW,cAAAC,aAAY,eAAAC,oBAAmB;AAClE,SAAS,gBAAgB;AACzB,SAAS,QAAAC,aAAY;;;ACJrB,SAAS,cAAAC,aAAY,gBAAAC,qBAAoB;AACzC,SAAS,WAAAC,UAAS,QAAAC,aAAY;AAC9B,SAAS,qBAAqB;AAMvB,SAAS,oBAA4B;AAC1C,MAAI,MAAMD,SAAQ,cAAc,YAAY,GAAG,CAAC;AAChD,SAAO,QAAQA,SAAQ,GAAG,GAAG;AAC3B,UAAM,aAAaC,MAAK,KAAK,kBAAkB;AAC/C,QAAIH,YAAW,UAAU,GAAG;AAC1B,aAAOC,cAAa,YAAY,OAAO;AAAA,IACzC;AACA,UAAMC,SAAQ,GAAG;AAAA,EACnB;AACA,QAAM,IAAI,MAAM,mCAAmC;AACrD;;;AChBO,SAAS,eAAe,QAA4B;AACzD,QAAM,cAAsC;AAAA,IAC1C,eAAe;AAAA,IACf,aAAa;AAAA,IACb,cAAc;AAAA,EAChB;AAEA,QAAM,gBAAwC;AAAA,IAC5C,eAAe;AAAA,IACf,aAAa;AAAA,IACb,cAAc;AAAA,EAChB;AAEA,QAAM,gBAAgB,OAAO,QAAQ,OAAO,MAAM,EAC/C,OAAO,CAAC,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,EAC3B,IAAI,CAAC,CAAC,IAAI,MAAM,IAAI;AAEvB,QAAM,UAAU,cACb,IAAI,CAAC,MAAM,YAAY,CAAC,KAAK,CAAC,EAC9B,KAAK,IAAI;AAEZ,QAAM,aAAa,cAChB,IAAI,CAAC,MAAM,cAAc,CAAC,KAAK,UAAU,CAAC,IAAI,EAC9C,KAAK,KAAK;AAEb,SAAO;AAAA,IACL,KAAK,OAAO,IAAI,aAAa;AAAA,IAC7B;AAAA,IACA;AAAA,IACA;AAAA,IACA,uBAAuB,OAAO;AAAA,IAC9B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,uBAAuB,UAAU;AAAA,IACjC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AACb;;;AF7HA,SAAS,UAAU,MAAoB;AACrC,EAAAE,WAAU,MAAM,EAAE,WAAW,KAAK,CAAC;AACrC;AAEO,IAAM,cAAc,IAAIC,SAAQ,MAAM,EAC1C,YAAY,2BAA2B,EACvC,OAAO,YAAY;AAClB,EAAE,QAAM,oCAA+B;AAEvC,QAAM,SAAS,QAAQ,IAAI;AAE3B,MAAIC,YAAWC,MAAK,QAAQ,YAAY,CAAC,GAAG;AAC1C,IAAE,MAAI,KAAK,8CAA8C;AACzD,UAAM,YAAY,MAAQ,UAAQ;AAAA,MAChC,SAAS;AAAA,MACT,cAAc;AAAA,IAChB,CAAC;AACD,QAAM,WAAS,SAAS,KAAK,CAAC,WAAW;AACvC,MAAE,SAAO,YAAY;AACrB,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AAGA,QAAM,UAAU,oBAAI,IAAI,CAAC,QAAQ,YAAY,CAAC;AAC9C,QAAM,WAAWC,aAAY,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC;AAClE,MAAI,SAAS,SAAS,GAAG;AACvB,IAAE,MAAI;AAAA,MACJ,sBAAsB,SAAS,MAAM,sBAAsB,SAAS,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,GAAG,SAAS,SAAS,IAAI,UAAU,EAAE;AAAA,IACjI;AACA,UAAM,UAAU,MAAQ,UAAQ;AAAA,MAC9B,SACE;AAAA,MACF,cAAc;AAAA,IAChB,CAAC;AACD,QAAM,WAAS,OAAO,KAAK,CAAC,SAAS;AACnC,MAAE,SAAO,YAAY;AACrB,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AAGA,QAAM,SAAS,MAAQ,cAAY;AAAA,IACjC,SAAS;AAAA,IACT,SAAS;AAAA,MACP,EAAE,OAAO,eAAe,OAAO,cAAc;AAAA,MAC7C,EAAE,OAAO,aAAa,OAAO,YAAY;AAAA,MACzC,EAAE,OAAO,cAAc,OAAO,aAAa;AAAA,IAC7C;AAAA,IACA,UAAU;AAAA,EACZ,CAAC;AAED,MAAM,WAAS,MAAM,GAAG;AACtB,IAAE,SAAO,YAAY;AACrB,YAAQ,KAAK,CAAC;AAAA,EAChB;AAGA,QAAM,MAAM,MAAQ,SAAO;AAAA,IACzB,SAAS;AAAA,IACT,SAAS;AAAA,MACP,EAAE,OAAO,UAAU,OAAO,SAAS;AAAA,MACnC,EAAE,OAAO,QAAQ,OAAO,UAAU;AAAA,MAClC,EAAE,OAAO,YAAY,OAAO,WAAW;AAAA,IACzC;AAAA,EACF,CAAC;AAED,MAAM,WAAS,GAAG,GAAG;AACnB,IAAE,SAAO,YAAY;AACrB,YAAQ,KAAK,CAAC;AAAA,EAChB;AAGA,QAAM,gBAAgB,MAAQ,OAAK;AAAA,IACjC,SAAS;AAAA,IACT,aAAa;AAAA,IACb,cAAc;AAAA,EAChB,CAAC;AAED,MAAM,WAAS,aAAa,GAAG;AAC7B,IAAE,SAAO,YAAY;AACrB,YAAQ,KAAK,CAAC;AAAA,EAChB;AAGA,QAAM,SAAqB;AAAA,IACzB,UAAU,CAAC;AAAA,IACX,QAAQ;AAAA,MACN,eAAe,EAAE,SAAU,OAAoB,SAAS,aAAa,EAAE;AAAA,MACvE,aAAa,EAAE,SAAU,OAAoB,SAAS,WAAW,EAAE;AAAA,MACnE,cAAc,EAAE,SAAU,OAAoB,SAAS,YAAY,EAAE;AAAA,IACvE;AAAA,IACA,KAAK,CAAC;AAAA,IACN,KAAK;AAAA,MACH,SAAS;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAGA,QAAM,mBAAmB,EAAE,SAAS,sBAAsB,GAAG,OAAO;AACpE,EAAAC,eAAcF,MAAK,QAAQ,YAAY,GAAG,KAAK,UAAU,kBAAkB,MAAM,CAAC,CAAC;AAGnF,EAAAE,eAAcF,MAAK,QAAQ,kBAAkB,GAAG,kBAAkB,CAAC;AAGnE,EAAAE,eAAcF,MAAK,QAAQ,WAAW,GAAG,eAAe,MAAM,CAAC;AAG/D,YAAUA,MAAK,QAAQ,SAAS,CAAC;AACjC,YAAUA,MAAK,QAAQ,UAAU,CAAC;AAClC,YAAUA,MAAK,QAAQ,QAAQ,CAAC;AAChC,YAAUA,MAAK,QAAQ,aAAa,KAAK,CAAC;AAC1C,YAAUA,MAAK,QAAQ,SAAS,CAAC;AAGjC,EAAAE,eAAcF,MAAK,QAAQ,YAAY,GAAG;AAAA,IACxC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI,IAAI,IAAI;AAGnB,QAAM,SAASD,YAAWC,MAAK,QAAQ,MAAM,CAAC;AAC9C,MAAI,CAAC,QAAQ;AACX,aAAS,YAAY,EAAE,KAAK,QAAQ,OAAO,SAAS,CAAC;AAAA,EACvD;AACA,QAAM,YAAY;AAAA,IAChB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,WAAS,WAAW,UAAU,KAAK,GAAG,CAAC,IAAI,EAAE,KAAK,QAAQ,OAAO,SAAS,CAAC;AAC3E,WAAS,iCAAiC,EAAE,KAAK,QAAQ,OAAO,SAAS,CAAC;AAE1E,EAAE;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,EAAE,KAAK,IAAI;AAAA,EACb;AACF,CAAC;;;AGlKH,SAAS,WAAAG,gBAAe;AACxB,YAAYC,QAAO;AACnB,SAAS,aAAAC,kBAAiB;AAC1B,SAAS,QAAAC,aAAY;;;ACHrB,SAAS,gBAAAC,eAAc,iBAAAC,sBAAqB;AAC5C,SAAS,QAAAC,aAAY;AACrB,SAAS,SAASC,mBAAkB;AAO7B,SAAS,aACd,QACA,SACM;AACN,QAAM,aAAaD,MAAK,QAAQ,YAAY;AAC5C,QAAM,MAAMF,cAAa,YAAY,OAAO;AAC5C,QAAM,SAASG,YAAW,GAAG;AAC7B,UAAQ,MAAM;AACd,EAAAF,eAAc,YAAY,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAC3D;;;ADTO,IAAM,iBAAiB,IAAIG,SAAQ,SAAS,EAChD,YAAY,iBAAiB;AAEhC,eACG,QAAQ,KAAK,EACb,YAAY,6BAA6B,EACzC,OAAO,YAAY;AAClB,QAAM,SAAS,QAAQ,IAAI;AAE3B,QAAM,OAAO,MAAQ,QAAK;AAAA,IACxB,SAAS;AAAA,IACT,aAAa;AAAA,EACf,CAAC;AACD,MAAM,YAAS,IAAI,EAAG;AAEtB,QAAM,OAAO,MAAQ,QAAK;AAAA,IACxB,SAAS;AAAA,IACT,aAAa;AAAA,EACf,CAAC;AACD,MAAM,YAAS,IAAI,EAAG;AAEtB,QAAM,aAAa,MAAQ,QAAK;AAAA,IAC9B,SAAS;AAAA,IACT,aAAa;AAAA,IACb,cAAc;AAAA,EAChB,CAAC;AACD,MAAM,YAAS,UAAU,EAAG;AAE5B,QAAM,UAAW,WACd,MAAM,GAAG,EACT,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,OAAO,OAAO;AAEjB,QAAM,OAAO,MAAQ,QAAK;AAAA,IACxB,SAAS;AAAA,IACT,aAAa;AAAA,IACb,cAAc;AAAA,EAChB,CAAC;AACD,MAAM,YAAS,IAAI,EAAG;AAEtB,eAAa,QAAQ,CAAC,WAAW;AAC/B,UAAM,WAAY,OAAO,YAAY,CAAC;AACtC,UAAM,QAAuB;AAAA,MAC3B;AAAA,MACA;AAAA,IACF;AACA,QAAI,KAAM,OAAM,OAAO;AACvB,aAAS,IAAc,IAAI;AAC3B,WAAO,WAAW;AAAA,EACpB,CAAC;AAGD,EAAAC,WAAUC,MAAK,QAAQ,aAAa,YAAY,IAAc,GAAG,EAAE,WAAW,KAAK,CAAC;AAEpF,WAAS,MAAM;AACf,UAAQ,IAAI,kBAAkB,IAAI,4BAA4B;AAChE,CAAC;AAEH,eACG,QAAQ,MAAM,EACd,YAAY,0BAA0B,EACtC,OAAO,MAAM;AACZ,QAAM,SAAS,QAAQ,IAAI;AAC3B,QAAM,SAAS,WAAW,MAAM;AAChC,MAAI,CAAC,OAAO,IAAI;AACd,YAAQ,MAAM,0BAA0B,OAAO,OAAO,KAAK,IAAI,CAAC;AAChE,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,WAAW,OAAO,QAAQ,OAAO,OAAO,QAAQ;AACtD,MAAI,SAAS,WAAW,GAAG;AACzB,YAAQ,IAAI,+CAA+C;AAC3D;AAAA,EACF;AAEA,UAAQ,IAAI,aAAa;AACzB,aAAW,CAAC,MAAM,OAAO,KAAK,UAAU;AACtC,YAAQ,IAAI,KAAK,IAAI,EAAE;AACvB,YAAQ,IAAI,aAAa,QAAQ,IAAI,EAAE;AACvC,QAAI,QAAQ,QAAQ,SAAS,GAAG;AAC9B,cAAQ,IAAI,gBAAgB,QAAQ,QAAQ,KAAK,IAAI,CAAC,EAAE;AAAA,IAC1D;AACA,QAAI,QAAQ,MAAM;AAChB,cAAQ,IAAI,aAAa,QAAQ,IAAI,EAAE;AAAA,IACzC;AACA,YAAQ,IAAI,EAAE;AAAA,EAChB;AACF,CAAC;AAEH,eACG,QAAQ,eAAe,EACvB,YAAY,kBAAkB,EAC9B,OAAO,CAAC,SAAiB;AACxB,QAAM,SAAS,QAAQ,IAAI;AAE3B,eAAa,QAAQ,CAAC,WAAW;AAC/B,UAAM,WAAW,OAAO;AACxB,QAAI,EAAE,QAAQ,WAAW;AACvB,cAAQ,MAAM,YAAY,IAAI,cAAc;AAC5C,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,WAAO,SAAS,IAAI;AAAA,EACtB,CAAC;AAED,WAAS,MAAM;AACf,UAAQ,IAAI,oBAAoB,IAAI,4BAA4B;AAClE,CAAC;;;AEnHH,SAAS,WAAAC,gBAAe;AACxB,SAAS,YAAAC,iBAAgB;AACzB,SAAS,cAAAC,mBAAkB;AAC3B,SAAS,QAAAC,cAAY;AAGrB,IAAM,eAAuC;AAAA,EAC3C,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,UAAU;AACZ;AAEO,IAAM,cAAc,IAAIC,SAAQ,MAAM,EAC1C,YAAY,oCAAoC,EAChD,OAAO,gBAAgB,qCAAqC,EAC5D,OAAO,CAAC,YAAY;AACnB,QAAM,SAAS,QAAQ,IAAI;AAC3B,QAAM,SAAS,WAAW,MAAM;AAChC,MAAI,CAAC,OAAO,IAAI;AACd,YAAQ,MAAM,0BAA0B,OAAO,OAAO,KAAK,IAAI,CAAC;AAChE,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,MAAM,QAAQ,OAAO,OAAO,OAAO,IAAI;AAC7C,QAAM,UAAU,aAAa,GAAG;AAChC,MAAI,CAAC,SAAS;AACZ,YAAQ,MAAM,gBAAgB,GAAG,gBAAgB,OAAO,KAAK,YAAY,EAAE,KAAK,IAAI,CAAC,EAAE;AACvF,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,gBAAgBC;AAAA,IACpB;AAAA,IACA,GAAG,OAAO,OAAO,IAAI,aAAa;AAAA,EACpC;AAEA,MAAI,CAACC,YAAW,aAAa,GAAG;AAC9B,YAAQ,MAAM,6BAA6B,aAAa;AAAA,cAAiB;AACzE,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,EAAAC,UAAS,GAAG,OAAO,KAAK,aAAa,KAAK,EAAE,OAAO,UAAU,CAAC;AAChE,CAAC;;;ACzCH,SAAS,WAAAC,gBAAe;AACxB,YAAYC,QAAO;AACnB,SAAS,gBAAAC,eAAc,iBAAAC,gBAAe,aAAAC,kBAAiB;AACvD,SAAS,QAAAC,cAAY;AAMrB,SAASC,WAAU,MAAoB;AACrC,EAAAC,WAAU,MAAM,EAAE,WAAW,KAAK,CAAC;AACrC;AAMA,SAAS,aAAa,QAAsB;AAC1C,QAAM,aAAaC,OAAK,QAAQ,YAAY;AAC5C,QAAM,MAAMC,cAAa,YAAY,OAAO;AAE5C,MAAI,IAAI,SAAS,WAAW,EAAG;AAE/B,QAAM,UAAU,IAAI,QAAQ,UAAU,uCAAuC;AAC7E,EAAAC,eAAc,YAAY,OAAO;AACnC;AAEO,IAAM,gBAAgB,IAAIC,SAAQ,QAAQ,EAC9C,YAAY,uEAAuE,EACnF,OAAO,MAAM;AACZ,QAAM,SAAS,QAAQ,IAAI;AAG3B,QAAM,aAAa,WAAW,MAAM;AACpC,MAAI,CAAC,WAAW,IAAI;AAClB,IAAE,OAAI;AAAA,MACJ,kBAAkB,WAAW,OAAO,KAAK,IAAI,CAAC;AAAA;AAAA,IAChD;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,SAAS,WAAW;AAG1B,QAAM,eAAe;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,IACAH,OAAK,aAAa,KAAK;AAAA,IACvB;AAAA,EACF;AACA,aAAW,OAAO,cAAc;AAC9B,IAAAF,WAAUE,OAAK,QAAQ,GAAG,CAAC;AAAA,EAC7B;AAGA,aAAW,QAAQ,OAAO,KAAK,OAAO,QAAQ,GAAG;AAC/C,IAAAF,WAAUE,OAAK,QAAQ,aAAa,YAAY,IAAI,CAAC;AAAA,EACvD;AAGA,eAAa,MAAM;AAGnB,EAAAE,eAAcF,OAAK,QAAQ,kBAAkB,GAAG,kBAAkB,CAAC;AACnE,EAAAE,eAAcF,OAAK,QAAQ,WAAW,GAAG,eAAe,MAAM,CAAC;AAG/D,QAAM,SAAS,SAAS,MAAM;AAC9B,MAAI,CAAC,OAAO,IAAI;AACd,IAAE,OAAI,MAAM,sBAAsB,OAAO,OAAO,KAAK,IAAI,CAAC,EAAE;AAC5D,YAAQ,KAAK,CAAC;AAAA,EAChB;AAGA,EAAE,OAAI,QAAQ,qCAAqC;AACnD,MAAI,OAAO,MAAM,SAAS,GAAG;AAC3B,IAAE,OAAI,KAAK,kBAAkB;AAC7B,eAAW,QAAQ,OAAO,OAAO;AAC/B,MAAE,OAAI,QAAQ,KAAK,KAAK,IAAI,EAAE;AAAA,IAChC;AAAA,EACF;AACA,EAAE,OAAI,KAAK,yCAAyC;AACtD,CAAC;;;ACnFH,SAAS,WAAAI,gBAAe;AACxB,SAAS,iBAAiB;AAC1B,SAAS,cAAAC,mBAAkB;AAC3B,SAAS,QAAAC,cAAY;AAKrB,IAAM,iBAA4C;AAAA,EAChD,eAAe;AAAA,EACf,aAAa;AAAA,EACb,cAAc;AAChB;AAEA,SAAS,SAAS,WAAsB,MAAsB;AAC5D,QAAM,SAAS,QAAQ,IAAI;AAC3B,QAAM,SAAS,WAAW,MAAM;AAChC,MAAI,CAAC,OAAO,IAAI;AACd,YAAQ,MAAM,0BAA0B,OAAO,OAAO,KAAK,IAAI,CAAC;AAChE,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,cAAc,OAAO,OAAO,OAAO,SAAS;AAClD,MAAI,CAAC,aAAa,SAAS;AACzB,YAAQ,MAAM,UAAU,SAAS,gCAAgC;AACjE,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,WAAWC,OAAK,QAAQ,YAAY,gBAAgB,WAAW,WAAW,CAAC;AACjF,MAAI,CAACC,YAAW,QAAQ,GAAG;AACzB,YAAQ,MAAM,8BAA8B,QAAQ;AAAA,cAAiB;AACrE,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,UAAU,eAAe,SAAS;AACxC,QAAM,EAAE,QAAQ,OAAO,IAAI,UAAU,SAAS,MAAM,EAAE,KAAK,UAAU,OAAO,UAAU,CAAC;AAEvF,MAAI,QAAQ;AACV,YAAQ,KAAK,QAAQ,KAAK,MAAM;AAAA,EAClC;AACA,MAAI,WAAW,QAAQ,WAAW,GAAG;AACnC,YAAQ,KAAK,MAAM;AAAA,EACrB;AACF;AAEO,SAAS,sBAAiC;AAC/C,SAAQ,OAAO,KAAK,cAAc,EAAkB,IAAI,CAAC,UAAU;AACjE,WAAO,IAAIC,SAAQ,KAAK,EACrB,YAAY,SAAS,KAAK,yBAAyB,EACnD,mBAAmB,EACnB,qBAAqB,EACrB,OAAO,CAAC,UAAU,QAAiB;AAClC,eAAS,OAAO,IAAI,IAAI;AAAA,IAC1B,CAAC;AAAA,EACL,CAAC;AACH;;;AtB/CO,SAAS,YAAqB;AACnC,QAAM,UAAU,IAAIC,SAAQ,MAAM,EAC/B,YAAY,mCAAmC,EAC/C,QAAQ,OAAW;AAEtB,UAAQ,WAAW,WAAW;AAC9B,UAAQ,WAAW,UAAU;AAC7B,UAAQ,WAAW,cAAc;AACjC,UAAQ,WAAW,WAAW;AAC9B,UAAQ,WAAW,aAAa;AAEhC,aAAW,OAAO,oBAAoB,GAAG;AACvC,YAAQ,WAAW,GAAG;AAAA,EACxB;AAEA,SAAO;AACT;;;AuBtBA,UAAU,EAAE,MAAM;","names":["Command","mkdirSync","join","readFileSync","existsSync","join","join","existsSync","readFileSync","join","readFileSync","existsSync","join","mkdirSync","join","Command","writeFileSync","mkdirSync","existsSync","readdirSync","join","existsSync","readFileSync","dirname","join","mkdirSync","Command","existsSync","join","readdirSync","writeFileSync","Command","p","mkdirSync","join","readFileSync","writeFileSync","join","parseJsonc","Command","mkdirSync","join","Command","execSync","existsSync","join","Command","join","existsSync","execSync","Command","p","readFileSync","writeFileSync","mkdirSync","join","ensureDir","mkdirSync","join","readFileSync","writeFileSync","Command","Command","existsSync","join","join","existsSync","Command","Command"]}
@@ -0,0 +1,97 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "title": "meld.jsonc",
4
+ "description": "Configuration for the meld agent settings generator",
5
+ "type": "object",
6
+ "required": ["projects", "agents", "mcp", "ide"],
7
+ "properties": {
8
+ "$schema": {
9
+ "type": "string",
10
+ "description": "JSON Schema reference (auto-generated by meld)"
11
+ },
12
+ "projects": {
13
+ "type": "object",
14
+ "description": "Registered projects in this workspace",
15
+ "additionalProperties": {
16
+ "type": "object",
17
+ "required": ["path", "aliases"],
18
+ "properties": {
19
+ "path": { "type": "string", "description": "Absolute or ~-relative path to the project" },
20
+ "aliases": { "type": "array", "items": { "type": "string" }, "description": "Natural language names for the project" },
21
+ "repo": { "type": "string", "description": "GitHub repository (org/repo, optional)" },
22
+ "readDocs": { "type": "boolean", "description": "Instruct agents to read the project's context file before starting work" }
23
+ }
24
+ }
25
+ },
26
+ "agents": {
27
+ "type": "object",
28
+ "description": "Agent configurations — enable/disable and set overrides per agent",
29
+ "properties": {
30
+ "claude-code": { "$ref": "#/definitions/agentConfig" },
31
+ "codex-cli": { "$ref": "#/definitions/agentConfig" },
32
+ "gemini-cli": { "$ref": "#/definitions/agentConfig" }
33
+ },
34
+ "additionalProperties": false
35
+ },
36
+ "mcp": {
37
+ "type": "object",
38
+ "description": "MCP server configurations",
39
+ "additionalProperties": {
40
+ "oneOf": [
41
+ { "$ref": "#/definitions/mcpStdioServer" },
42
+ { "$ref": "#/definitions/mcpHttpServer" }
43
+ ]
44
+ }
45
+ },
46
+ "context": {
47
+ "type": "string",
48
+ "description": "Path to context directory containing .md files. Default: ./context/",
49
+ "default": "./context/"
50
+ },
51
+ "ide": {
52
+ "type": "object",
53
+ "required": ["default", "workspaceName"],
54
+ "properties": {
55
+ "default": { "type": "string", "enum": ["cursor", "code", "windsurf"] },
56
+ "workspaceName": { "type": "string" }
57
+ }
58
+ }
59
+ },
60
+ "definitions": {
61
+ "agentName": {
62
+ "type": "string",
63
+ "enum": ["claude-code", "codex-cli", "gemini-cli"]
64
+ },
65
+ "agentConfig": {
66
+ "type": "object",
67
+ "required": ["enabled"],
68
+ "properties": {
69
+ "enabled": { "type": "boolean", "description": "Enable config generation for this agent" },
70
+ "dir": { "type": "string", "description": "Custom subdirectory name for this agent's generated files (defaults to agent-specific name)" },
71
+ "overrides": { "type": "object", "description": "Agent-specific raw config overrides merged into generated settings", "additionalProperties": true }
72
+ }
73
+ },
74
+ "mcpStdioServer": {
75
+ "type": "object",
76
+ "required": ["command", "args"],
77
+ "properties": {
78
+ "type": { "type": "string", "enum": ["stdio"], "description": "Server type (default: stdio)" },
79
+ "command": { "type": "string", "description": "Command to start the server" },
80
+ "args": { "type": "array", "items": { "type": "string" }, "description": "Command arguments" },
81
+ "env": { "type": "object", "additionalProperties": { "type": "string" }, "description": "Environment variables" },
82
+ "agents": { "type": "array", "items": { "$ref": "#/definitions/agentName" }, "description": "Scope this server to specific agents (defaults to all enabled)" }
83
+ }
84
+ },
85
+ "mcpHttpServer": {
86
+ "type": "object",
87
+ "required": ["type", "url"],
88
+ "properties": {
89
+ "type": { "type": "string", "enum": ["http"], "description": "Server type" },
90
+ "url": { "type": "string", "description": "MCP server URL" },
91
+ "headers": { "type": "object", "additionalProperties": { "type": "string" }, "description": "HTTP headers (e.g. Authorization)" },
92
+ "env": { "type": "object", "additionalProperties": { "type": "string" }, "description": "Environment variables" },
93
+ "agents": { "type": "array", "items": { "$ref": "#/definitions/agentName" }, "description": "Scope this server to specific agents (defaults to all enabled)" }
94
+ }
95
+ }
96
+ }
97
+ }
package/package.json ADDED
@@ -0,0 +1,59 @@
1
+ {
2
+ "name": "@vitld/meld-cli",
3
+ "version": "0.1.0",
4
+ "description": "Agent-agnostic settings generator for AI coding agents",
5
+ "type": "module",
6
+ "bin": {
7
+ "meld": "./dist/index.js"
8
+ },
9
+ "files": [
10
+ "dist/",
11
+ "meld.schema.json",
12
+ "LICENSE",
13
+ "README.md"
14
+ ],
15
+ "engines": {
16
+ "node": ">=20"
17
+ },
18
+ "keywords": [
19
+ "cli",
20
+ "ai",
21
+ "agent",
22
+ "claude",
23
+ "codex",
24
+ "config",
25
+ "gemini",
26
+ "generator",
27
+ "mcp",
28
+ "multi-agent",
29
+ "workspace"
30
+ ],
31
+ "license": "GPL-3.0-only",
32
+ "author": "Viktor Pontinen",
33
+ "repository": {
34
+ "type": "git",
35
+ "url": "git+https://github.com/vitld/meld-cli.git"
36
+ },
37
+ "homepage": "https://github.com/vitld/meld-cli#readme",
38
+ "bugs": {
39
+ "url": "https://github.com/vitld/meld-cli/issues"
40
+ },
41
+ "dependencies": {
42
+ "@clack/prompts": "^1.0.1",
43
+ "commander": "^14.0.3",
44
+ "jsonc-parser": "^3.3.1"
45
+ },
46
+ "devDependencies": {
47
+ "@types/node": "^25.2.3",
48
+ "tsup": "^8.5.1",
49
+ "typescript": "^5.9.3",
50
+ "vitest": "^4.0.18"
51
+ },
52
+ "scripts": {
53
+ "build": "tsup",
54
+ "dev": "tsup --watch",
55
+ "test": "vitest run",
56
+ "test:watch": "vitest",
57
+ "typecheck": "tsc --noEmit"
58
+ }
59
+ }