{"version":3,"sources":["../../../../node_modules/.pnpm/tsup@8.5.0_jiti@2.7.0_postcss@8.5.31_tsx@4.23.15_typescript@5.9.3_yaml@2.9.1/node_modules/tsup/assets/esm_shims.js","../../src/cli/index.ts","../../src/cli/executor.ts","../../src/cli/parser.ts","../../src/cli/list.ts","../../src/cli/export.ts","../../src/cli/export-html.ts","../../src/cli/open-in-browser.ts","../../src/cli/snapshot.ts","../../src/cli/governance/rules.ts","../../src/cli/governance/actions.ts","../../src/cli/governance/format.ts","../../src/cli/governance/check.ts"],"sourcesContent":["// Shim globals in esm bundle\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nconst getFilename = () => fileURLToPath(import.meta.url)\nconst getDirname = () => path.dirname(getFilename())\n\nexport const __dirname = /* @__PURE__ */ getDirname()\nexport const __filename = /* @__PURE__ */ getFilename()\n","#!/usr/bin/env node\n\nimport { program } from 'commander';\nimport { existsSync, readFileSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport { executeFunction } from './executor';\nimport { listFunctions, formatListOutput } from './list';\nimport { exportResource, exportCatalog } from './export';\nimport { exportHtml } from './export-html';\nimport { snapshotCreate, snapshotDiff, snapshotList } from './snapshot';\nimport { governanceCheck } from './governance';\nimport { runFitnessCheck } from '@eventcatalog/fitness';\nimport dotenv from 'dotenv';\n\n// Read package.json to get version\nlet version = '1.0.0';\ntry {\n  const packageJsonPath = resolve(__dirname, '../../package.json');\n  const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));\n  version = packageJson.version;\n} catch {\n  // Fall back to default version if package.json not found\n}\n\nprogram\n  .name('eventcatalog')\n  .description('EventCatalog Command-Line Interface')\n  .version(version)\n  .option('-d, --dir <path>', 'Path to the EventCatalog directory (default: current directory)', '.');\n\n// List command - show all available functions\nprogram\n  .command('list')\n  .description('List all available SDK functions')\n  .action(() => {\n    try {\n      const functions = listFunctions('.');\n      const output = formatListOutput(functions);\n      console.log(output);\n    } catch (error) {\n      console.error('Error listing functions:', error instanceof Error ? error.message : String(error));\n      process.exit(1);\n    }\n  });\n\n// Export command - export a resource to .ec DSL format, or the whole catalog as an HTML reference\nprogram\n  .command('export [custom-export]')\n  .description(\n    \"Export a catalog resource to EventCatalog DSL (.ec) format, the whole catalog as an HTML reference, or a custom export from the catalog's exports/ folder (by id)\"\n  )\n  .option('-f, --format <format>', 'Output format: dsl or html', 'dsl')\n  .option('-a, --all', 'Export the entire catalog (all resource types)', false)\n  .option('-r, --resource <type>', 'Resource type (event, command, query, service, domain)')\n  .option('--id <id>', 'Resource ID (omit to export all resources of the given type)')\n  .option('-v, --version <version>', 'Resource version (defaults to latest)')\n  .option('--hydrate', 'Include referenced resources (messages, channels, owners)', false)\n  .option('--stdout', 'Print to stdout instead of writing a file', false)\n  .option('--no-open', 'With --format html: do not open the reference in your browser')\n  .option('-o, --output <path>', 'Output file path (defaults to <id>.ec, catalog.ec, architecture.html or <custom-export>.html)')\n  .option('--check', 'With a custom export: list what is in it and what was left out, without writing it', false)\n  .action(async (customExport, opts) => {\n    try {\n      const globalOpts = program.opts() as any;\n      const dir = globalOpts.dir || '.';\n\n      if (opts.format === 'html' || customExport || opts.check) {\n        const result = await exportHtml({\n          dir,\n          output: opts.output,\n          stdout: opts.stdout,\n          customExport,\n          check: opts.check,\n          // Open it for people at a terminal; never in CI or when the output is piped\n          open: opts.open && !process.env.CI && Boolean(process.stdout.isTTY),\n        });\n        if (opts.stdout) process.stdout.write(result);\n        else console.log(result);\n        return;\n      }\n\n      if (opts.format !== 'dsl') {\n        console.error(`Unknown format '${opts.format}'. Use dsl or html.`);\n        process.exit(1);\n      }\n\n      if (opts.all) {\n        const result = await exportCatalog({\n          hydrate: opts.hydrate,\n          stdout: opts.stdout,\n          output: opts.output,\n          dir,\n        });\n        console.log(result);\n        return;\n      }\n\n      if (!opts.resource) {\n        console.error('Either --all or --resource is required');\n        process.exit(1);\n      }\n\n      const result = await exportResource({\n        resource: opts.resource,\n        id: opts.id,\n        version: opts.version,\n        hydrate: opts.hydrate,\n        stdout: opts.stdout,\n        output: opts.output,\n        dir,\n      });\n      console.log(result);\n    } catch (error) {\n      console.error(error instanceof Error ? error.message : String(error));\n      process.exit(1);\n    }\n  });\n\n// Snapshot command group\nconst snapshot = program.command('snapshot').description('Create, diff, and list catalog snapshots');\n\nsnapshot\n  .command('create')\n  .description('Take a point-in-time snapshot of the catalog')\n  .option('--label <label>', 'Human-readable label (default: ISO timestamp)')\n  .option('-o, --output <path>', 'Output directory for the snapshot file')\n  .option('--stdout', 'Print JSON to stdout instead of writing a file', false)\n  .action(async (opts) => {\n    try {\n      const globalOpts = program.opts() as any;\n      const dir = globalOpts.dir || '.';\n      const result = await snapshotCreate({ label: opts.label, output: opts.output, stdout: opts.stdout, dir });\n      console.log(result);\n    } catch (error) {\n      console.error(error instanceof Error ? error.message : String(error));\n      process.exit(1);\n    }\n  });\n\nsnapshot\n  .command('diff <fileA> <fileB>')\n  .description('Compare two snapshot files and output a structured diff')\n  .option('--format <format>', 'Output format: text or json', 'text')\n  .action(async (fileA: string, fileB: string, opts) => {\n    try {\n      const globalOpts = program.opts() as any;\n      const dir = globalOpts.dir || '.';\n      const result = await snapshotDiff({ fileA, fileB, format: opts.format, dir });\n      console.log(result);\n    } catch (error) {\n      console.error(error instanceof Error ? error.message : String(error));\n      process.exit(1);\n    }\n  });\n\nsnapshot\n  .command('list')\n  .description('List all snapshots in the catalog')\n  .option('--format <format>', 'Output format: text or json', 'text')\n  .action(async (opts) => {\n    try {\n      const globalOpts = program.opts() as any;\n      const dir = globalOpts.dir || '.';\n      const result = await snapshotList({ format: opts.format, dir });\n      console.log(result);\n    } catch (error) {\n      console.error(error instanceof Error ? error.message : String(error));\n      process.exit(1);\n    }\n  });\n\n// Governance command group\nconst governance = program.command('governance').description('Run governance rules against catalog changes');\n\ngovernance\n  .command('check')\n  .description('Compare catalog against a base branch and evaluate governance rules')\n  .option('--base <branch>', 'Base branch to compare against (default: main)')\n  .option('--target <branch>', 'Target branch to compare (default: current working directory)')\n  .option('--format <format>', 'Output format: text or json', 'text')\n  .option('--status <status>', 'Status label to include in webhook payloads (e.g. proposed, approved)')\n  .action(async (opts) => {\n    try {\n      const globalOpts = program.opts() as any;\n      const dir = globalOpts.dir || '.';\n      const result = await governanceCheck({\n        base: opts.base,\n        target: opts.target,\n        format: opts.format,\n        status: opts.status,\n        dir,\n      });\n      console.log(result.output);\n      process.exitCode = result.exitCode;\n    } catch (error) {\n      console.error(error instanceof Error ? error.message : String(error));\n      process.exit(1);\n    }\n  });\n\n// Fitness command group\nconst fitness = program.command('fitness').description('Run the architecture fitness functions in your catalog');\n\nfitness\n  .command('check')\n  .description('Run every *.fitness.ts function in the catalog, print the results and write them to a JSON report')\n  .option('-o, --output <path>', 'Where to write the report, relative to the catalog', '.eventcatalog/fitness/results.json')\n  .option('--format <format>', 'Output format: text or json', 'text')\n  .action(async (opts) => {\n    const globalOpts = program.opts() as any;\n    const dir = globalOpts.dir || '.';\n    // Fitness functions can read settings from the catalog's .env file\n    const envFile = resolve(dir, '.env');\n    if (existsSync(envFile)) dotenv.config({ path: envFile });\n    process.exitCode = await runFitnessCheck({\n      dir,\n      output: opts.output,\n      format: opts.format,\n      color: Boolean(process.stdout.isTTY) && !process.env.NO_COLOR,\n    });\n  });\n\n// Catch-all for any other command - execute as SDK function\nprogram.arguments('<function> [args...]').action(async (functionName: string, args: string[]) => {\n  try {\n    const options = program.opts() as any;\n    const dir = options.dir || '.';\n    const result = await executeFunction(dir, functionName, args);\n    console.log(JSON.stringify(result, null, 0));\n  } catch (error) {\n    console.error(error instanceof Error ? error.message : String(error));\n    process.exit(1);\n  }\n});\n\nprogram.parse(process.argv);\n\n// Show help if no command provided\nif (process.argv.length < 3) {\n  program.outputHelp();\n}\n","import { existsSync } from 'node:fs';\nimport { parseArguments } from './parser';\nimport createSDK from '@eventcatalog/sdk';\n\n/**\n * Execute a SDK function with the given arguments\n */\nexport async function executeFunction(catalogDir: string, functionName: string, rawArgs: string[]): Promise<any> {\n  // Validate catalog directory exists\n  if (!existsSync(catalogDir)) {\n    throw new Error(`Catalog directory not found: ${catalogDir}`);\n  }\n\n  // Initialize the SDK\n  const sdk = createSDK(catalogDir);\n\n  // Validate function exists\n  if (!(functionName in sdk)) {\n    throw new Error(`Function '${functionName}' not found. Use 'eventcatalog list' to see available functions.`);\n  }\n\n  const fn = (sdk as any)[functionName];\n\n  // Validate it's callable\n  if (typeof fn !== 'function') {\n    throw new Error(`'${functionName}' is not a callable function.`);\n  }\n\n  // Parse arguments\n  const parsedArgs = parseArguments(rawArgs);\n\n  // Execute function\n  try {\n    return await fn(...parsedArgs);\n  } catch (error) {\n    throw new Error(`Error executing '${functionName}': ${error instanceof Error ? error.message : String(error)}`);\n  }\n}\n","/**\n * Parse command-line arguments into typed values\n * Supports JSON objects/arrays, booleans, numbers, and strings\n */\nexport function parseArguments(rawArgs: string[]): any[] {\n  return rawArgs.map((arg, index) => {\n    // Try to parse as JSON object or array if it looks like JSON\n    if ((arg.startsWith('{') && arg.endsWith('}')) || (arg.startsWith('[') && arg.endsWith(']'))) {\n      try {\n        return JSON.parse(arg);\n      } catch (error) {\n        // If it fails to parse as JSON, treat it as a string\n        // Only throw error if it looks like valid JSON syntax was intended\n        if (arg.includes(':') || arg.includes(',')) {\n          throw new Error(`Invalid JSON in argument ${index + 1}: ${error instanceof Error ? error.message : String(error)}`);\n        }\n        // Otherwise, return as string\n        return arg;\n      }\n    }\n\n    // Parse booleans\n    if (arg === 'true') return true;\n    if (arg === 'false') return false;\n\n    // Parse numbers\n    if (/^-?\\d+(\\.\\d+)?$/.test(arg)) {\n      return Number(arg);\n    }\n\n    // Return as string\n    return arg;\n  });\n}\n","import createSDK from '@eventcatalog/sdk';\n\ninterface CategorizedFunctions {\n  [category: string]: string[];\n}\n\n/**\n * Get all available SDK functions organized by category\n */\nexport function listFunctions(catalogDir: string = '.'): CategorizedFunctions {\n  // Initialize SDK to get all functions\n  const sdk = createSDK(catalogDir);\n\n  // Get all function names from SDK\n  const functionNames = Object.keys(sdk).filter((key) => typeof (sdk as any)[key] === 'function');\n\n  // Categorize functions based on naming patterns\n  const categories: CategorizedFunctions = {\n    Events: [],\n    Commands: [],\n    Queries: [],\n    Channels: [],\n    Services: [],\n    Domains: [],\n    Entities: [],\n    DataStores: [],\n    DataProducts: [],\n    Teams: [],\n    Users: [],\n    'Custom Docs': [],\n    Messages: [],\n    Utilities: [],\n  };\n\n  functionNames.forEach((name) => {\n    if (name.includes('Event')) categories['Events'].push(name);\n    else if (name.includes('Command')) categories['Commands'].push(name);\n    else if (name.includes('Query')) categories['Queries'].push(name);\n    else if (name.includes('Channel')) categories['Channels'].push(name);\n    else if (name.includes('Service')) categories['Services'].push(name);\n    else if (name.includes('Domain')) categories['Domains'].push(name);\n    else if (name.includes('Entity')) categories['Entities'].push(name);\n    else if (name.includes('DataStore')) categories['DataStores'].push(name);\n    else if (name.includes('DataProduct')) categories['DataProducts'].push(name);\n    else if (name.includes('Team')) categories['Teams'].push(name);\n    else if (name.includes('User')) categories['Users'].push(name);\n    else if (name.includes('CustomDoc')) categories['Custom Docs'].push(name);\n    else if (name.includes('Message') || name.includes('Producers') || name.includes('Consumers'))\n      categories['Messages'].push(name);\n    else categories['Utilities'].push(name);\n  });\n\n  // Remove empty categories\n  Object.keys(categories).forEach((key) => {\n    if (categories[key].length === 0) {\n      delete categories[key];\n    }\n  });\n\n  return categories;\n}\n\n/**\n * Format and print categorized functions\n */\nexport function formatListOutput(functions: CategorizedFunctions): string {\n  let output = 'Available EventCatalog SDK Functions:\\n\\n';\n\n  Object.entries(functions).forEach(([category, names]) => {\n    output += `${category}:\\n`;\n    names.sort().forEach((name) => {\n      output += `  - ${name}\\n`;\n    });\n    output += '\\n';\n  });\n\n  return output;\n}\n","import { writeFileSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport createSDK from '@eventcatalog/sdk';\n\nconst RESOURCE_TYPES = ['event', 'command', 'query', 'service', 'domain'] as const;\ntype ResourceType = (typeof RESOURCE_TYPES)[number];\nconst SUPPORTED_RESOURCE_TYPES = RESOURCE_TYPES.join(', ');\n\nconst PLURAL_MAP: Record<string, ResourceType> = {\n  events: 'event',\n  commands: 'command',\n  queries: 'query',\n  services: 'service',\n  domains: 'domain',\n};\n\nconst KNOWN_UNSUPPORTED_EXPORT_TYPES = new Set([\n  'channel',\n  'channels',\n  'team',\n  'teams',\n  'user',\n  'users',\n  'container',\n  'containers',\n  'data-product',\n  'data-products',\n  'dataproduct',\n  'dataproducts',\n  'diagram',\n  'diagrams',\n  'flow',\n  'flows',\n]);\n\ninterface ExportOptions {\n  resource: string;\n  id?: string;\n  version?: string;\n  hydrate?: boolean;\n  stdout?: boolean;\n  output?: string;\n  dir: string;\n}\n\nfunction normalizeResourceType(resource: string): ResourceType {\n  const lower = resource.toLowerCase();\n  if (PLURAL_MAP[lower]) return PLURAL_MAP[lower];\n  return lower as ResourceType;\n}\n\nfunction assertSupportedExportType(resource: string, type: ResourceType): void {\n  const lower = resource.toLowerCase();\n\n  if (KNOWN_UNSUPPORTED_EXPORT_TYPES.has(lower)) {\n    throw new Error(\n      `Resource type '${resource}' is not yet supported for DSL export. Supported types: ${SUPPORTED_RESOURCE_TYPES}`\n    );\n  }\n\n  if (!RESOURCE_TYPES.includes(type)) {\n    throw new Error(`Invalid resource type '${resource}'. Must be one of: ${SUPPORTED_RESOURCE_TYPES}`);\n  }\n}\n\nfunction getResourceFetcher(sdk: ReturnType<typeof createSDK>, type: ResourceType) {\n  switch (type) {\n    case 'event':\n      return sdk.getEvent;\n    case 'command':\n      return sdk.getCommand;\n    case 'query':\n      return sdk.getQuery;\n    case 'service':\n      return sdk.getService;\n    case 'domain':\n      return sdk.getDomain;\n  }\n}\n\nfunction getCollectionFetcher(sdk: ReturnType<typeof createSDK>, type: ResourceType) {\n  switch (type) {\n    case 'event':\n      return sdk.getEvents;\n    case 'command':\n      return sdk.getCommands;\n    case 'query':\n      return sdk.getQueries;\n    case 'service':\n      return sdk.getServices;\n    case 'domain':\n      return sdk.getDomains;\n  }\n}\n\nfunction pluralize(type: ResourceType): string {\n  if (type === 'query') return 'queries';\n  return `${type}s`;\n}\n\nconst SECTION_ORDER = ['team', 'user', 'channel', 'event', 'command', 'query', 'service', 'domain'] as const;\n\nconst SECTION_LABELS: Record<string, string> = {\n  team: 'TEAMS',\n  user: 'USERS',\n  channel: 'CHANNELS',\n  event: 'EVENTS',\n  command: 'COMMANDS',\n  query: 'QUERIES',\n  service: 'SERVICES',\n  domain: 'DOMAINS',\n};\n\n/**\n * Groups DSL blocks by resource type and orders them with section headers.\n *\n * Raw toDSL output may interleave different resource types (e.g. teams, channels,\n * services, events). This splits on blank lines, buckets each block by its leading\n * keyword, then reassembles in SECTION_ORDER with \"// EVENTS\" style headers.\n */\nfunction groupDSLBlocks(dsl: string): string {\n  const blocks = dsl.split(/\\n\\n/).filter((b) => b.trim());\n  const buckets: Record<string, string[]> = {};\n\n  for (const block of blocks) {\n    const firstWord = block.trimStart().split(/\\s/)[0];\n    const key = firstWord === 'subdomain' ? 'domain' : firstWord;\n    if (!buckets[key]) buckets[key] = [];\n    buckets[key].push(block);\n  }\n\n  const sections: string[] = [];\n  for (const type of SECTION_ORDER) {\n    if (!buckets[type] || buckets[type].length === 0) continue;\n    const label = SECTION_LABELS[type] || type.toUpperCase();\n    sections.push(`// ${label}\\n${buckets[type].join('\\n\\n')}`);\n    delete buckets[type];\n  }\n\n  // Any remaining types not in SECTION_ORDER\n  for (const [type, items] of Object.entries(buckets)) {\n    if (items.length === 0) continue;\n    const label = type.toUpperCase();\n    sections.push(`// ${label}\\n${items.join('\\n\\n')}`);\n  }\n\n  return sections.join('\\n\\n');\n}\n\ninterface ResourceDefinition {\n  keyword: string;\n  id: string;\n  version?: string;\n}\n\n/**\n * Extracts resource definitions from DSL text by scanning for top-level\n * `<keyword> <id> {` lines and reading the version from the block body.\n */\nfunction extractResourceDefinitions(dsl: string, filterTypes: string[]): ResourceDefinition[] {\n  const results: ResourceDefinition[] = [];\n  const lines = dsl.split('\\n');\n\n  for (let i = 0; i < lines.length; i++) {\n    const trimmed = lines[i].trimStart();\n    const parts = trimmed.split(/\\s/);\n    const keyword = parts[0];\n    const id = parts[1];\n    if (!filterTypes.includes(keyword)) continue;\n    if (!id || !trimmed.endsWith('{')) continue;\n\n    // Look ahead inside the block for a `version X.Y.Z` line\n    let version: string | undefined;\n    for (let j = i + 1; j < lines.length; j++) {\n      const inner = lines[j].trim();\n      if (inner === '}') break;\n      const vMatch = inner.match(/^version\\s+(.+)$/);\n      if (vMatch) {\n        version = vMatch[1];\n        break;\n      }\n    }\n    results.push({ keyword, id, version });\n  }\n\n  return results;\n}\n\n/**\n * Builds a `visualizer main { ... }` block listing all resource definitions\n * found in the DSL output.\n *\n * When multiple versions of the same resource exist (e.g. two versions of\n * OrderService), references are version-qualified (`service OrderService@1.0.0`)\n * to avoid ambiguity. Single-version resources use bare ids.\n */\nfunction buildVisualizerBlock(dsl: string, name: string, filterTypes: ResourceType | ResourceType[]): string {\n  const types = Array.isArray(filterTypes) ? filterTypes : [filterTypes];\n  const definitions = extractResourceDefinitions(dsl, types);\n\n  if (definitions.length === 0) return '';\n\n  // Count occurrences of each keyword+id to detect duplicates needing version qualification\n  const counts = new Map<string, number>();\n  for (const def of definitions) {\n    const key = `${def.keyword}:${def.id}`;\n    counts.set(key, (counts.get(key) || 0) + 1);\n  }\n\n  const entries = definitions.map((def) => {\n    const key = `${def.keyword}:${def.id}`;\n    const needsVersion = (counts.get(key) || 0) > 1 && def.version;\n    const ref = needsVersion ? `${def.id}@${def.version}` : def.id;\n    return `  ${def.keyword} ${ref}`;\n  });\n\n  return `\\nvisualizer main {\\n  name \"${name}\"\\n${entries.join('\\n')}\\n}`;\n}\n\nexport async function exportCatalog(options: Omit<ExportOptions, 'resource'>): Promise<string> {\n  const { hydrate = false, stdout = false, output, dir } = options;\n\n  const sdk = createSDK(dir);\n  // Independent collection fetches/conversions can run in parallel.\n  // Promise.all preserves RESOURCE_TYPES order in the resulting array.\n  const dslParts = (\n    await Promise.all(\n      RESOURCE_TYPES.map(async (type) => {\n        const fetcher = getCollectionFetcher(sdk, type);\n        const resources = await fetcher({ latestOnly: true });\n        if (!resources || resources.length === 0) return '';\n        return sdk.toDSL(resources, { type, hydrate });\n      })\n    )\n  ).filter((dsl): dsl is string => Boolean(dsl));\n\n  if (dslParts.length === 0) {\n    throw new Error(`No resources found in catalog at '${dir}'`);\n  }\n\n  const combined = dslParts.join('\\n\\n');\n  const grouped = groupDSLBlocks(combined);\n  const vizBlock = buildVisualizerBlock(grouped, 'Full Catalog', [...RESOURCE_TYPES]);\n  const dsl = vizBlock ? `${grouped}\\n${vizBlock}` : grouped;\n\n  if (stdout) {\n    return dsl;\n  }\n\n  const filename = output || 'catalog.ec';\n  const filepath = resolve(filename);\n  writeFileSync(filepath, dsl + '\\n', 'utf-8');\n\n  return ['', `  Exported full catalog to ${filepath}`, ''].join('\\n');\n}\n\nexport async function exportAll(options: ExportOptions): Promise<string> {\n  const { resource, hydrate = false, stdout = false, output, dir } = options;\n\n  const type = normalizeResourceType(resource);\n  assertSupportedExportType(resource, type);\n\n  const plural = pluralize(type);\n  const sdk = createSDK(dir);\n\n  const fetcher = getCollectionFetcher(sdk, type);\n  const allResources = (await fetcher({ latestOnly: true })) || [];\n\n  if (allResources.length === 0) {\n    throw new Error(`No ${plural} found in catalog at '${dir}'`);\n  }\n\n  const rawDsl = await sdk.toDSL(allResources, { type, hydrate });\n  const grouped = groupDSLBlocks(rawDsl);\n  const vizBlock = buildVisualizerBlock(grouped, `All ${plural}`, type);\n  const dsl = vizBlock ? `${grouped}\\n${vizBlock}` : grouped;\n\n  if (stdout) {\n    return dsl;\n  }\n\n  const filename = output || `${plural}.ec`;\n  const filepath = resolve(filename);\n  writeFileSync(filepath, dsl + '\\n', 'utf-8');\n\n  return ['', `  Exported ${allResources.length} ${plural} to ${filepath}`, ''].join('\\n');\n}\n\nexport async function exportResource(options: ExportOptions): Promise<string> {\n  const { resource, id, version, hydrate = false, stdout = false, output, dir } = options;\n\n  if (!id) {\n    return exportAll(options);\n  }\n\n  const type = normalizeResourceType(resource);\n  assertSupportedExportType(resource, type);\n\n  const sdk = createSDK(dir);\n\n  const fetcher = getResourceFetcher(sdk, type);\n  const data = await fetcher(id, version);\n\n  if (!data) {\n    const versionStr = version ? `@${version}` : ' (latest)';\n    throw new Error(`${resource} '${id}${versionStr}' not found in catalog at '${dir}'`);\n  }\n\n  const rawDsl = await sdk.toDSL(data, { type, hydrate });\n\n  // When hydrating, toDSL pulls in related resources (services, channels, owners)\n  // so we group by type with section headers and widen the visualizer filter to\n  // include all resource types that may appear in the hydrated output.\n  const grouped = hydrate ? groupDSLBlocks(rawDsl) : rawDsl;\n  const vizTypes: ResourceType[] = hydrate ? [...RESOURCE_TYPES] : [type];\n  const vizBlock = buildVisualizerBlock(grouped, `View of ${id}`, vizTypes);\n  const dsl = vizBlock ? `${grouped}\\n${vizBlock}` : grouped;\n\n  if (stdout) {\n    return dsl;\n  }\n\n  const filename = output || `${id}.ec`;\n  const filepath = resolve(filename);\n  writeFileSync(filepath, dsl + '\\n', 'utf-8');\n\n  return ['', `  Exported ${type} '${id}' to ${filepath}`, ''].join('\\n');\n}\n","import { writeFileSync } from 'node:fs';\nimport { relative, resolve } from 'node:path';\nimport {\n  formatCustomExportReport,\n  renderCustomExports,\n  renderHtml,\n  summariseCustomExportReport,\n  writeHtml,\n} from '@eventcatalog/exporters';\nimport { openInBrowser } from './open-in-browser';\n\ninterface ExportHtmlOptions {\n  dir: string;\n  output?: string;\n  stdout?: boolean;\n  /** Open the written file in the default browser. */\n  open?: boolean;\n  /** How to open it; replaceable in tests. */\n  openFile?: (filePath: string) => Promise<boolean>;\n  /** A custom export from the catalog's exports/ folder (by id) rather than the whole catalog. */\n  customExport?: string;\n  /** With `customExport`: say what's in it and what was left out, without writing it. */\n  check?: boolean;\n}\n\nconst indent = (text: string) =>\n  text\n    .split('\\n')\n    .map((line) => (line ? `  ${line}` : line))\n    .join('\\n');\n\n/**\n * `eventcatalog export --format html`: the whole catalog as one self-contained HTML architecture reference, or with\n * `eventcatalog export <id>` one of the catalog's custom exports (part of it, chosen for people outside the team).\n */\nexport async function exportHtml({\n  dir,\n  output,\n  stdout = false,\n  open = false,\n  openFile = openInBrowser,\n  customExport,\n  check = false,\n}: ExportHtmlOptions): Promise<string> {\n  if (check && !customExport) throw new Error('--check needs a custom export: eventcatalog export <id> --check');\n  if (customExport) return exportCustom({ dir, output, stdout, open, openFile, id: customExport, check });\n  if (stdout) return (await renderHtml(dir)).html;\n\n  const { path, bytes, durationMs, model } = await writeHtml({ dir, outputPath: resolve(output || 'architecture.html') });\n  const lines = [\n    '',\n    `  Exported architecture reference to ${path}`,\n    `  ${model.messages.length} messages, ${model.services.length} services, ${model.domains.length} domains · ${Math.round(bytes / 1024)} KB in ${durationMs} ms`,\n  ];\n  if (open)\n    lines.push((await openFile(path)) ? '  Opened it in your browser' : `  Could not open a browser. Open ${path} yourself.`);\n  return [...lines, ''].join('\\n');\n}\n\nasync function exportCustom({\n  dir,\n  output,\n  stdout,\n  open,\n  openFile,\n  id,\n  check,\n}: Required<Pick<ExportHtmlOptions, 'dir' | 'stdout' | 'open' | 'openFile' | 'check'>> & { output?: string; id: string }) {\n  // Only this export's own problems stop it: a broken file next to it doesn't\n  const { rendered, failed } = await renderCustomExports(dir, { only: [id] });\n  const failure = failed.find((f) => f.id === id);\n  if (failure || !rendered.length) throw failure?.error ?? new Error(`Could not export \"${id}\".`);\n  const [{ spec, html, report }] = rendered;\n  const heading = `  ${spec.title} (${spec.file ?? spec.id})`;\n\n  if (check) {\n    const text = ['', heading, indent(formatCustomExportReport(report)), ''].join('\\n');\n    // A selector that matches nothing usually means a resource was renamed or removed: fail, so CI notices\n    if (report.unmatched.length)\n      throw new Error(\n        `${text}\\n  ${report.unmatched.length} selector(s) in ${spec.file ?? spec.id} matched nothing in the catalog.\\n`\n      );\n    return text;\n  }\n  if (stdout) return html;\n\n  const path = resolve(output || `${spec.id}.html`);\n  writeFileSync(path, html, 'utf-8');\n  const lines = [\n    '',\n    `  Exported \"${spec.title}\" to ${path}`,\n    `  ${summariseCustomExportReport(report)} · ${Math.round(Buffer.byteLength(html) / 1024)} KB`,\n    `  See what's in it and what was left out: eventcatalog export ${spec.id} --check`,\n  ];\n  if (report.unmatched.length) lines.push(`  Not found: ${report.unmatched.map((u) => `${u.field} ${u.selector}`).join(', ')}`);\n  if (open)\n    lines.push(\n      (await openFile(path))\n        ? '  Opened it in your browser'\n        : `  Could not open a browser. Open ${relative(process.cwd(), path)} yourself.`\n    );\n  return [...lines, ''].join('\\n');\n}\n","import { spawn } from 'node:child_process';\n\n/**\n * Opens a file in the default browser. Resolves false when no browser could be launched; it never throws.\n * The path is always passed as a single argument and never through a shell, so its characters can't run commands.\n */\nexport const openInBrowser = (filePath: string): Promise<boolean> =>\n  new Promise((resolve) => {\n    const [command, args] =\n      process.platform === 'darwin'\n        ? ['open', [filePath]]\n        : process.platform === 'win32'\n          ? ['explorer.exe', [filePath]]\n          : ['xdg-open', [filePath]];\n    try {\n      const child = spawn(command, args, { stdio: 'ignore', detached: true });\n      child.once('error', () => resolve(false));\n      child.once('spawn', () => {\n        child.unref();\n        resolve(true);\n      });\n    } catch {\n      resolve(false);\n    }\n  });\n","import { resolve } from 'node:path';\nimport { rmSync } from 'node:fs';\nimport createSDK from '@eventcatalog/sdk';\n\nexport const snapshotCreate = async (opts: { label?: string; output?: string; stdout?: boolean; dir: string }) => {\n  const dir = resolve(opts.dir);\n  const sdk = createSDK(dir);\n\n  const result = await sdk.createSnapshot({\n    label: opts.label,\n    outputDir: opts.output ? resolve(opts.output) : undefined,\n  });\n\n  if (opts.stdout) {\n    rmSync(result.filePath, { force: true });\n    return JSON.stringify(result.snapshot, null, 2);\n  }\n\n  const resources = result.snapshot.resources;\n  const counts = [\n    resources.services.length && `${resources.services.length} services`,\n    resources.messages.events.length && `${resources.messages.events.length} events`,\n    resources.messages.commands.length && `${resources.messages.commands.length} commands`,\n    resources.messages.queries.length && `${resources.messages.queries.length} queries`,\n    resources.domains.length && `${resources.domains.length} domains`,\n    resources.channels.length && `${resources.channels.length} channels`,\n  ]\n    .filter(Boolean)\n    .join(', ');\n\n  return `Snapshot created: ${result.filePath}\\nResources: ${counts}`;\n};\n\nconst formatDiffText = (diff: any): string => {\n  const lines: string[] = [];\n\n  const labelA = diff.snapshotA.label;\n  const labelB = diff.snapshotB.label;\n  lines.push(`Comparing: ${labelA} vs ${labelB}`);\n  lines.push('');\n\n  if (diff.resources.length > 0) {\n    lines.push(`Resources (${diff.resources.length} changes):`);\n    for (const r of diff.resources) {\n      const prefix = r.changeType === 'added' ? '+' : r.changeType === 'removed' ? '-' : r.changeType === 'versioned' ? '^' : '~';\n      const version = r.changeType === 'versioned' ? `${r.previousVersion} -> ${r.newVersion}` : r.version;\n      const fields = r.changedFields ? ` (${r.changedFields.join(', ')})` : '';\n      lines.push(`  ${prefix} ${r.resourceId}@${version}  [${r.type}] ${r.changeType}${fields}`);\n    }\n    lines.push('');\n  }\n\n  if (diff.relationships.length > 0) {\n    lines.push(`Relationships (${diff.relationships.length} changes):`);\n    for (const r of diff.relationships) {\n      const prefix = r.changeType === 'added' ? '+' : '-';\n      lines.push(\n        `  ${prefix} ${r.serviceId} --${r.direction}--> ${r.resourceId}${r.resourceVersion ? `@${r.resourceVersion}` : ''}`\n      );\n    }\n    lines.push('');\n  }\n\n  if (diff.summary.totalChanges === 0) {\n    lines.push('No changes detected.');\n  } else {\n    lines.push(`Summary: ${diff.resources.length} resource changes, ${diff.relationships.length} relationship changes`);\n  }\n\n  return lines.join('\\n');\n};\n\nexport const snapshotDiff = async (opts: { fileA: string; fileB: string; format?: string; dir: string }) => {\n  const dir = resolve(opts.dir);\n  const sdk = createSDK(dir);\n\n  const diff = await sdk.diffSnapshots(resolve(opts.fileA), resolve(opts.fileB));\n\n  if (opts.format === 'json') {\n    return JSON.stringify(diff, null, 2);\n  }\n\n  return formatDiffText(diff);\n};\n\nexport const snapshotList = async (opts: { format?: string; dir: string }) => {\n  const dir = resolve(opts.dir);\n  const sdk = createSDK(dir);\n\n  const snapshots = await sdk.listSnapshots();\n\n  if (opts.format === 'json') {\n    return JSON.stringify(snapshots, null, 2);\n  }\n\n  if (snapshots.length === 0) {\n    return 'No snapshots found.';\n  }\n\n  const lines = ['Snapshots:', ''];\n  for (const s of snapshots) {\n    const git = s.git ? ` (${s.git.branch} ${s.git.commit})` : '';\n    lines.push(`  ${s.label}  ${s.createdAt}${git}`);\n    lines.push(`    ${s.filePath}`);\n  }\n\n  return lines.join('\\n');\n};\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport { createHash } from 'node:crypto';\nimport yaml from 'js-yaml';\nimport { satisfies, validRange } from 'semver';\nimport createSDK from '@eventcatalog/sdk';\nimport type { SnapshotDiff, RelationshipChange, CatalogSnapshot, ResourceChange } from '@eventcatalog/sdk';\nimport type {\n  GovernanceConfig,\n  GovernanceTrigger,\n  GovernanceResult,\n  DeprecationChange,\n  SchemaChange,\n  BreakingSchemaChange,\n} from './types';\nimport { detectBreakingChanges } from '@eventcatalog/breaking-changes';\nimport type { CompatibilityStrategy } from '@eventcatalog/breaking-changes';\n\nexport const loadGovernanceConfig = (catalogDir: string): GovernanceConfig => {\n  const yamlPath = path.join(catalogDir, 'governance.yaml');\n  const ymlPath = path.join(catalogDir, 'governance.yml');\n\n  const configPath = fs.existsSync(yamlPath) ? yamlPath : fs.existsSync(ymlPath) ? ymlPath : null;\n\n  if (!configPath) {\n    return { rules: [] };\n  }\n\n  const content = fs.readFileSync(configPath, 'utf-8');\n  const parsed = yaml.load(content) as GovernanceConfig;\n  const rules = parsed?.rules || [];\n\n  for (const rule of rules) {\n    for (const action of rule.actions) {\n      if (action.type === 'fail' && action.message !== undefined && typeof action.message !== 'string') {\n        throw new Error(`Invalid \"message\" in fail action for rule \"${rule.name}\". Must be a string.`);\n      }\n    }\n  }\n\n  if (parsed?.compatibility?.strategy) {\n    const validStrategies = new Set(['BACKWARD', 'FORWARD', 'FULL', 'NONE']);\n    if (!validStrategies.has(parsed.compatibility.strategy)) {\n      throw new Error(\n        `Invalid compatibility strategy \"${parsed.compatibility.strategy}\". Must be one of: BACKWARD, FORWARD, FULL, NONE.`\n      );\n    }\n  }\n\n  return {\n    ...(parsed?.compatibility && { compatibility: parsed.compatibility }),\n    rules,\n  };\n};\n\nconst TRIGGER_FILTERS: Partial<Record<GovernanceTrigger, (change: RelationshipChange) => boolean>> = {\n  consumer_added: (c) => c.direction === 'receives' && c.changeType === 'added',\n  consumer_removed: (c) => c.direction === 'receives' && c.changeType === 'removed',\n  producer_added: (c) => c.direction === 'sends' && c.changeType === 'added',\n  producer_removed: (c) => c.direction === 'sends' && c.changeType === 'removed',\n};\n\nexport const buildServiceMessageSets = (\n  snapshot: CatalogSnapshot\n): { produces: Map<string, Set<string>>; consumes: Map<string, Set<string>> } => {\n  const produces = new Map<string, Set<string>>();\n  const consumes = new Map<string, Set<string>>();\n\n  for (const service of snapshot.resources.services) {\n    const serviceId = service.id as string;\n    if (service.sends) {\n      const ids = new Set<string>();\n      for (const s of service.sends) ids.add(s.id as string);\n      produces.set(serviceId, ids);\n    }\n    if (service.receives) {\n      const ids = new Set<string>();\n      for (const r of service.receives) ids.add(r.id as string);\n      consumes.set(serviceId, ids);\n    }\n  }\n\n  return { produces, consumes };\n};\n\ntype ServiceMessageSets = ReturnType<typeof buildServiceMessageSets>;\n\nconst matchesResourceId = (\n  resourceId: string,\n  serviceId: string | undefined,\n  resources: string[],\n  messageSets?: ServiceMessageSets\n): boolean => {\n  return resources.some((r) => {\n    if (r === '*') return true;\n    if (r.startsWith('service:')) {\n      if (serviceId) return serviceId === r.slice(8);\n      // For deprecation: match if the specified service produces this message\n      return messageSets?.produces.get(r.slice(8))?.has(resourceId) ?? false;\n    }\n    if (r.startsWith('message:')) return resourceId === r.slice(8);\n    if (r.startsWith('produces:')) return messageSets?.produces.get(r.slice(9))?.has(resourceId) ?? false;\n    if (r.startsWith('consumes:')) return messageSets?.consumes.get(r.slice(9))?.has(resourceId) ?? false;\n    return false;\n  });\n};\n\nconst REMOVED_TRIGGERS: Set<GovernanceTrigger> = new Set(['consumer_removed', 'producer_removed']);\n\nconst MESSAGE_RESOURCE_TYPES = new Set(['event', 'command', 'query']);\n\nconst buildMessageMap = (snapshot: CatalogSnapshot): Map<string, Record<string, any>> => {\n  const map = new Map<string, Record<string, any>>();\n  for (const msg of snapshot.resources.messages.events) map.set(msg.id as string, msg);\n  for (const msg of snapshot.resources.messages.commands) map.set(msg.id as string, msg);\n  for (const msg of snapshot.resources.messages.queries) map.set(msg.id as string, msg);\n  return map;\n};\n\ntype ServiceEntry = { id: string; version: string; owners?: string[] };\n\nconst buildServiceIndex = (snapshot: CatalogSnapshot, direction: 'sends' | 'receives'): Map<string, ServiceEntry[]> => {\n  const index = new Map<string, ServiceEntry[]>();\n  for (const service of snapshot.resources.services) {\n    const pointers = service[direction] as Array<{ id: string }> | undefined;\n    if (!pointers) continue;\n    for (const pointer of pointers) {\n      let entries = index.get(pointer.id);\n      if (!entries) {\n        entries = [];\n        index.set(pointer.id, entries);\n      }\n      const entry: ServiceEntry = {\n        id: service.id as string,\n        version: service.version as string,\n      };\n      if (service.owners && Array.isArray(service.owners) && service.owners.length > 0) {\n        entry.owners = service.owners as string[];\n      }\n      entries.push(entry);\n    }\n  }\n  return index;\n};\n\nconst getMessageTypeKey = (resourceId: string, type: string): string => `${type}:${resourceId}`;\n\nconst buildLatestMessageVersionMap = (snapshot: CatalogSnapshot): Map<string, string> => {\n  const versions = new Map<string, string>();\n\n  for (const event of snapshot.resources.messages.events) {\n    versions.set(getMessageTypeKey(event.id as string, 'event'), event.version as string);\n  }\n  for (const command of snapshot.resources.messages.commands) {\n    versions.set(getMessageTypeKey(command.id as string, 'command'), command.version as string);\n  }\n  for (const query of snapshot.resources.messages.queries) {\n    versions.set(getMessageTypeKey(query.id as string, 'query'), query.version as string);\n  }\n\n  return versions;\n};\n\nconst getTargetMessageVersion = (resourceChange: ResourceChange): string => {\n  if (resourceChange.changeType === 'versioned') {\n    return resourceChange.newVersion || resourceChange.version;\n  }\n  return resourceChange.version;\n};\n\nconst pointerTargetsChangedVersion = (\n  pointer: { id: string; version?: string },\n  resourceChange: ResourceChange,\n  latestMessageVersions: Map<string, string>\n): boolean => {\n  if (pointer.id !== resourceChange.resourceId) return false;\n\n  const targetVersion = getTargetMessageVersion(resourceChange);\n  const pointerVersion = pointer.version;\n\n  if (!pointerVersion || pointerVersion === 'latest') {\n    const latestVersion = latestMessageVersions.get(getMessageTypeKey(resourceChange.resourceId, resourceChange.type));\n    if (!latestVersion) return true;\n    return latestVersion === targetVersion;\n  }\n\n  if (validRange(pointerVersion)) {\n    try {\n      return satisfies(targetVersion, pointerVersion);\n    } catch {\n      return false;\n    }\n  }\n\n  return pointerVersion === targetVersion;\n};\n\nconst getServicesForSchemaChange = (\n  snapshot: CatalogSnapshot,\n  direction: 'sends' | 'receives',\n  resourceChange: ResourceChange,\n  latestMessageVersions: Map<string, string>\n): ServiceEntry[] => {\n  const matches: ServiceEntry[] = [];\n\n  for (const service of snapshot.resources.services) {\n    const pointers = service[direction] as Array<{ id: string; version?: string }> | undefined;\n    if (!pointers) continue;\n\n    const hasMatch = pointers.some((pointer) => pointerTargetsChangedVersion(pointer, resourceChange, latestMessageVersions));\n    if (!hasMatch) continue;\n\n    const entry: ServiceEntry = {\n      id: service.id as string,\n      version: service.version as string,\n    };\n\n    if (service.owners && Array.isArray(service.owners) && service.owners.length > 0) {\n      entry.owners = service.owners as string[];\n    }\n\n    matches.push(entry);\n  }\n\n  return matches;\n};\n\nconst matchesSchemaChangeResource = (schemaChange: SchemaChange, resources: string[]): boolean => {\n  return resources.some((resource) => {\n    if (resource === '*') return true;\n    if (resource.startsWith('message:')) return schemaChange.resourceChange.resourceId === resource.slice(8);\n    if (resource.startsWith('consumes:'))\n      return schemaChange.consumerServices.some((service) => service.id === resource.slice(9));\n    if (resource.startsWith('produces:'))\n      return schemaChange.producerServices.some((service) => service.id === resource.slice(9));\n    if (resource.startsWith('service:')) return schemaChange.producerServices.some((service) => service.id === resource.slice(8));\n    return false;\n  });\n};\n\nconst evaluateDeprecationRules = (\n  diff: SnapshotDiff,\n  config: GovernanceConfig,\n  targetSnapshot: CatalogSnapshot,\n  targetMessageSets: ServiceMessageSets,\n  baseSnapshot?: CatalogSnapshot\n): GovernanceResult[] => {\n  const deprecationRules = config.rules.filter((rule) => rule.when.includes('message_deprecated'));\n  if (deprecationRules.length === 0) return [];\n\n  const targetMessages = buildMessageMap(targetSnapshot);\n  const baseMessages = baseSnapshot ? buildMessageMap(baseSnapshot) : undefined;\n  const producerIndex = buildServiceIndex(targetSnapshot, 'sends');\n\n  // Find messages that were newly deprecated\n  const deprecatedResources = diff.resources.filter((rc) => {\n    if (!MESSAGE_RESOURCE_TYPES.has(rc.type)) return false;\n    if (!rc.changedFields?.includes('deprecated')) return false;\n\n    // Confirm the message is deprecated in the target (not un-deprecated)\n    const targetMessage = targetMessages.get(rc.resourceId);\n    if (!targetMessage || !targetMessage.deprecated) return false;\n\n    // Confirm it was NOT deprecated in the base\n    if (baseMessages) {\n      const baseMessage = baseMessages.get(rc.resourceId);\n      if (baseMessage && baseMessage.deprecated) return false;\n    }\n\n    return true;\n  });\n\n  if (deprecatedResources.length === 0) return [];\n\n  const results: GovernanceResult[] = [];\n\n  for (const rule of deprecationRules) {\n    const matched: DeprecationChange[] = [];\n\n    for (const rc of deprecatedResources) {\n      if (!matchesResourceId(rc.resourceId, undefined, rule.resources, targetMessageSets)) continue;\n\n      const producers = producerIndex.get(rc.resourceId) || [];\n      matched.push({ resourceChange: rc, producerServices: producers });\n    }\n\n    if (matched.length > 0) {\n      results.push({ rule, trigger: 'message_deprecated', matchedChanges: [], deprecationChanges: matched });\n    }\n  }\n\n  return results;\n};\n\nconst evaluateSchemaChangeRules = (\n  diff: SnapshotDiff,\n  config: GovernanceConfig,\n  targetSnapshot: CatalogSnapshot\n): GovernanceResult[] => {\n  const schemaRules = config.rules.filter((rule) => rule.when.includes('schema_changed'));\n  if (schemaRules.length === 0) return [];\n\n  const schemaChangedResources = diff.resources.filter((rc) => {\n    if (!MESSAGE_RESOURCE_TYPES.has(rc.type)) return false;\n    return rc.changedFields?.includes('schemaHash');\n  });\n\n  if (schemaChangedResources.length === 0) return [];\n\n  const latestMessageVersions = buildLatestMessageVersionMap(targetSnapshot);\n  const schemaChanges = schemaChangedResources.map((resourceChange) => ({\n    resourceChange,\n    producerServices: getServicesForSchemaChange(targetSnapshot, 'sends', resourceChange, latestMessageVersions),\n    consumerServices: getServicesForSchemaChange(targetSnapshot, 'receives', resourceChange, latestMessageVersions),\n  }));\n\n  const results: GovernanceResult[] = [];\n\n  for (const rule of schemaRules) {\n    const matched = schemaChanges.filter((schemaChange) => matchesSchemaChangeResource(schemaChange, rule.resources));\n\n    if (matched.length > 0) {\n      results.push({ rule, trigger: 'schema_changed', matchedChanges: [], schemaChanges: matched });\n    }\n  }\n\n  return results;\n};\n\nconst evaluateBreakingSchemaChangeRules = (\n  diff: SnapshotDiff,\n  config: GovernanceConfig,\n  targetSnapshot: CatalogSnapshot\n): GovernanceResult[] => {\n  const breakingRules = config.rules.filter((rule) => rule.when.includes('schema_breaking_change'));\n  if (breakingRules.length === 0) return [];\n\n  const strategy = config.compatibility?.strategy;\n  if (!strategy || strategy === 'NONE') return [];\n\n  const schemaChangedResources = diff.resources.filter((rc) => {\n    if (!MESSAGE_RESOURCE_TYPES.has(rc.type)) return false;\n    return rc.changedFields?.includes('schemaHash');\n  });\n\n  if (schemaChangedResources.length === 0) return [];\n\n  const latestMessageVersions = buildLatestMessageVersionMap(targetSnapshot);\n  const breakingSchemaChanges: BreakingSchemaChange[] = schemaChangedResources.map((resourceChange) => ({\n    resourceChange,\n    producerServices: getServicesForSchemaChange(targetSnapshot, 'sends', resourceChange, latestMessageVersions),\n    consumerServices: getServicesForSchemaChange(targetSnapshot, 'receives', resourceChange, latestMessageVersions),\n    breakingChanges: [],\n  }));\n\n  const results: GovernanceResult[] = [];\n\n  for (const rule of breakingRules) {\n    const matched = breakingSchemaChanges.filter((sc) => matchesSchemaChangeResource(sc, rule.resources));\n    if (matched.length > 0) {\n      results.push({ rule, trigger: 'schema_breaking_change', matchedChanges: [], breakingSchemaChanges: matched });\n    }\n  }\n\n  return results;\n};\n\nexport const evaluateGovernanceRules = (\n  diff: SnapshotDiff,\n  config: GovernanceConfig,\n  targetSnapshot?: CatalogSnapshot,\n  baseSnapshot?: CatalogSnapshot\n): GovernanceResult[] => {\n  const results: GovernanceResult[] = [];\n  const targetMessageSets = targetSnapshot ? buildServiceMessageSets(targetSnapshot) : undefined;\n  const baseMessageSets = baseSnapshot ? buildServiceMessageSets(baseSnapshot) : undefined;\n\n  for (const rule of config.rules) {\n    for (const trigger of rule.when) {\n      const filter = TRIGGER_FILTERS[trigger];\n      if (!filter) continue;\n\n      // For removed triggers, resolve produces:/consumes: prefixes against\n      // the base snapshot where the relationship still existed.\n      const messageSets = REMOVED_TRIGGERS.has(trigger) && baseMessageSets ? baseMessageSets : targetMessageSets;\n\n      const matchedChanges = diff.relationships.filter(\n        (c) => filter(c) && matchesResourceId(c.resourceId, c.serviceId, rule.resources, messageSets)\n      );\n\n      if (matchedChanges.length > 0) {\n        results.push({ rule, trigger, matchedChanges });\n      }\n    }\n  }\n\n  // Evaluate deprecation rules separately (they operate on resource changes, not relationship changes)\n  if (targetSnapshot && targetMessageSets) {\n    results.push(...evaluateDeprecationRules(diff, config, targetSnapshot, targetMessageSets, baseSnapshot));\n    results.push(...evaluateSchemaChangeRules(diff, config, targetSnapshot));\n    results.push(...evaluateBreakingSchemaChangeRules(diff, config, targetSnapshot));\n  }\n\n  return results;\n};\n\nconst PRODUCER_TRIGGERS: Set<GovernanceTrigger> = new Set(['producer_added', 'producer_removed']);\n\nexport const isProducerTrigger = (trigger: GovernanceTrigger): boolean => PRODUCER_TRIGGERS.has(trigger);\n\nexport const getChangeVerb = (trigger: GovernanceTrigger, changeType: 'added' | 'removed'): string => {\n  const producer = isProducerTrigger(trigger);\n  return changeType === 'added'\n    ? producer\n      ? 'now producing'\n      : 'now consuming'\n    : producer\n      ? 'no longer producing'\n      : 'no longer consuming';\n};\n\nexport const resolveEnvVars = (value: string): string => {\n  return value.replace(/\\$([A-Z_][A-Z0-9_]*)/g, (match, varName) => {\n    const envValue = process.env[varName];\n    if (envValue === undefined) {\n      throw new Error(`Environment variable ${varName} is not set`);\n    }\n    return envValue;\n  });\n};\n\ntype SDK = ReturnType<typeof createSDK>;\n\nconst readSchemaDetails = async (\n  sdk: SDK,\n  resourceId: string,\n  version: string,\n  type: string\n): Promise<{ content?: string; schemaPath?: string; schemaHash?: string }> => {\n  if (!MESSAGE_RESOURCE_TYPES.has(type)) return {};\n  try {\n    const schema = await sdk.getSchemaForMessage(resourceId, version);\n    if (!schema) return {};\n    return {\n      content: schema.schema,\n      schemaPath: schema.fileName,\n      schemaHash: createHash('sha256').update(schema.schema).digest('hex'),\n    };\n  } catch {\n    return {};\n  }\n};\n\nexport const enrichSchemaContent = async (\n  results: GovernanceResult[],\n  baseCatalogDir: string,\n  targetCatalogDir: string,\n  compatibilityStrategy?: CompatibilityStrategy\n): Promise<void> => {\n  const baseSDK = createSDK(baseCatalogDir);\n  const targetSDK = createSDK(targetCatalogDir);\n\n  const promises: Promise<void>[] = [];\n\n  for (const result of results) {\n    if (!result.schemaChanges) continue;\n    for (const sc of result.schemaChanges) {\n      const { resourceId, version, type, changeType, previousVersion, newVersion } = sc.resourceChange;\n      const baseVersion = changeType === 'versioned' ? previousVersion || version : version;\n      const targetVersion = changeType === 'versioned' ? newVersion || version : version;\n      promises.push(\n        (async () => {\n          const [before, after] = await Promise.all([\n            readSchemaDetails(baseSDK, resourceId, baseVersion, type),\n            readSchemaDetails(targetSDK, resourceId, targetVersion, type),\n          ]);\n          sc.before = before.content;\n          sc.after = after.content;\n          sc.beforeSchemaPath = before.schemaPath;\n          sc.afterSchemaPath = after.schemaPath;\n          sc.beforeSchemaHash = before.schemaHash;\n          sc.afterSchemaHash = after.schemaHash;\n        })()\n      );\n    }\n  }\n\n  for (const result of results) {\n    if (!result.breakingSchemaChanges || !compatibilityStrategy) continue;\n    for (const bsc of result.breakingSchemaChanges) {\n      const { resourceId, version, type, changeType, previousVersion, newVersion } = bsc.resourceChange;\n      const baseVersion = changeType === 'versioned' ? previousVersion || version : version;\n      const targetVersion = changeType === 'versioned' ? newVersion || version : version;\n      promises.push(\n        (async () => {\n          const [before, after] = await Promise.all([\n            readSchemaDetails(baseSDK, resourceId, baseVersion, type),\n            readSchemaDetails(targetSDK, resourceId, targetVersion, type),\n          ]);\n          bsc.before = before.content;\n          bsc.after = after.content;\n          bsc.beforeSchemaPath = before.schemaPath;\n          bsc.afterSchemaPath = after.schemaPath;\n          bsc.beforeSchemaHash = before.schemaHash;\n          bsc.afterSchemaHash = after.schemaHash;\n\n          if (before.content && after.content) {\n            let beforeSchema: object | undefined;\n            let afterSchema: object | undefined;\n            try {\n              beforeSchema = JSON.parse(before.content);\n              afterSchema = JSON.parse(after.content);\n            } catch {\n              // Schema is not valid JSON — skip breaking change detection\n            }\n            if (beforeSchema && afterSchema) {\n              bsc.breakingChanges = detectBreakingChanges(beforeSchema, afterSchema, compatibilityStrategy);\n            }\n          }\n        })()\n      );\n    }\n  }\n\n  await Promise.all(promises);\n};\n","import { randomUUID } from 'node:crypto';\nimport type { CatalogSnapshot } from '@eventcatalog/sdk';\nimport type { CompatibilityStrategy } from '@eventcatalog/breaking-changes';\nimport type { GovernanceResult } from './types';\nimport { resolveEnvVars, isProducerTrigger, getChangeVerb } from './rules';\n\nexport type MessageTypeMap = Map<string, string>;\nexport type ServiceOwnersMap = Map<string, string[]>;\n\nexport type GovernanceActionOptions = {\n  messageTypes?: MessageTypeMap;\n  status?: string;\n  serviceOwners?: ServiceOwnersMap;\n  baseRef?: string;\n  targetRef?: string;\n  compatibilityStrategy?: CompatibilityStrategy;\n};\n\nexport const buildMessageTypeMap = (snapshot: CatalogSnapshot): MessageTypeMap => {\n  const map: MessageTypeMap = new Map();\n  for (const event of snapshot.resources.messages.events) {\n    map.set(event.id as string, 'event');\n  }\n  for (const command of snapshot.resources.messages.commands) {\n    map.set(command.id as string, 'command');\n  }\n  for (const query of snapshot.resources.messages.queries) {\n    map.set(query.id as string, 'query');\n  }\n  return map;\n};\n\nexport const buildServiceOwnersMap = (snapshot: CatalogSnapshot): ServiceOwnersMap => {\n  const map: ServiceOwnersMap = new Map();\n  for (const service of snapshot.resources.services) {\n    if (service.owners && Array.isArray(service.owners) && service.owners.length > 0) {\n      map.set(service.id as string, service.owners as string[]);\n    }\n  }\n  return map;\n};\n\nexport const executeGovernanceActions = async (\n  results: GovernanceResult[],\n  opts: GovernanceActionOptions = {}\n): Promise<string[]> => {\n  const { messageTypes, status, serviceOwners, baseRef, targetRef, compatibilityStrategy } = opts;\n  const webhookCalls: Array<{ urlTemplate: string; request: Promise<Response> }> = [];\n  const now = new Date().toISOString();\n\n  for (const result of results) {\n    for (const action of result.rule.actions) {\n      if (action.type !== 'webhook') continue;\n\n      const url = resolveEnvVars(action.url);\n      const headers: Record<string, string> = { 'Content-Type': 'application/json' };\n\n      if (action.headers) {\n        for (const [key, value] of Object.entries(action.headers)) {\n          headers[key] = resolveEnvVars(value);\n        }\n      }\n\n      // Handle schema changes\n      if (result.schemaChanges && result.schemaChanges.length > 0) {\n        for (const sc of result.schemaChanges) {\n          const messageType = messageTypes?.get(sc.resourceChange.resourceId) || 'message';\n\n          const payload = {\n            specversion: '1.0',\n            type: 'eventcatalog.governance.schema_changed',\n            source: 'eventcatalog/governance',\n            id: randomUUID(),\n            time: now,\n            datacontenttype: 'application/json',\n            data: {\n              schemaVersion: 1,\n              ...(status && { status }),\n              summary: `Schema changed for ${messageType} ${sc.resourceChange.resourceId}`,\n              message: {\n                id: sc.resourceChange.resourceId,\n                version: sc.resourceChange.version,\n                type: messageType,\n              },\n              schema: {\n                beforeHash: sc.beforeSchemaHash ?? null,\n                afterHash: sc.afterSchemaHash ?? null,\n                beforePath: sc.beforeSchemaPath ?? null,\n                afterPath: sc.afterSchemaPath ?? null,\n              },\n              refs: {\n                base: baseRef ?? null,\n                target: targetRef ?? null,\n              },\n              consumers: sc.consumerServices,\n              producers: sc.producerServices,\n            },\n          };\n\n          webhookCalls.push({\n            urlTemplate: action.url,\n            request: fetch(url, { method: 'POST', headers, body: JSON.stringify(payload) }),\n          });\n        }\n        continue;\n      }\n\n      // Handle breaking schema changes\n      if (result.breakingSchemaChanges && result.breakingSchemaChanges.length > 0) {\n        for (const bsc of result.breakingSchemaChanges) {\n          const messageType = messageTypes?.get(bsc.resourceChange.resourceId) || 'message';\n\n          const payload = {\n            specversion: '1.0',\n            type: 'eventcatalog.governance.schema_breaking_change',\n            source: 'eventcatalog/governance',\n            id: randomUUID(),\n            time: now,\n            datacontenttype: 'application/json',\n            data: {\n              schemaVersion: 1,\n              ...(status && { status }),\n              ...(compatibilityStrategy && { compatibilityStrategy }),\n              summary: `Breaking schema change detected for ${messageType} ${bsc.resourceChange.resourceId}`,\n              message: {\n                id: bsc.resourceChange.resourceId,\n                version: bsc.resourceChange.version,\n                type: messageType,\n              },\n              schema: {\n                beforeHash: bsc.beforeSchemaHash ?? null,\n                afterHash: bsc.afterSchemaHash ?? null,\n                beforePath: bsc.beforeSchemaPath ?? null,\n                afterPath: bsc.afterSchemaPath ?? null,\n              },\n              breakingChanges: bsc.breakingChanges,\n              refs: {\n                base: baseRef ?? null,\n                target: targetRef ?? null,\n              },\n              consumers: bsc.consumerServices,\n              producers: bsc.producerServices,\n            },\n          };\n\n          webhookCalls.push({\n            urlTemplate: action.url,\n            request: fetch(url, { method: 'POST', headers, body: JSON.stringify(payload) }),\n          });\n        }\n        continue;\n      }\n\n      // Handle deprecation changes\n      if (result.deprecationChanges && result.deprecationChanges.length > 0) {\n        for (const dc of result.deprecationChanges) {\n          const messageType = messageTypes?.get(dc.resourceChange.resourceId) || 'message';\n\n          const producers =\n            dc.producerServices.length > 0\n              ? dc.producerServices\n              : [{ id: 'unknown', version: 'unknown' } as { id: string; version: string; owners?: string[] }];\n\n          for (const producer of producers) {\n            const payload = {\n              specversion: '1.0',\n              type: `eventcatalog.governance.message_deprecated`,\n              source: 'eventcatalog/governance',\n              id: randomUUID(),\n              time: now,\n              datacontenttype: 'application/json',\n              data: {\n                schemaVersion: 1,\n                ...(status && { status }),\n                summary: `${dc.resourceChange.resourceId} (${messageType}) has been deprecated by ${producer.id}`,\n                producer: {\n                  id: producer.id,\n                  version: producer.version,\n                  ...(producer.owners && { owners: producer.owners }),\n                },\n                message: {\n                  id: dc.resourceChange.resourceId,\n                  version: dc.resourceChange.version,\n                  type: messageType,\n                },\n              },\n            };\n\n            webhookCalls.push({\n              urlTemplate: action.url,\n              request: fetch(url, { method: 'POST', headers, body: JSON.stringify(payload) }),\n            });\n          }\n        }\n        continue;\n      }\n\n      // Handle relationship changes\n      for (const change of result.matchedChanges) {\n        const verb = getChangeVerb(result.trigger, change.changeType);\n        const messageType = messageTypes?.get(change.resourceId) || 'message';\n        const serviceRole = isProducerTrigger(result.trigger) ? 'producer' : 'consumer';\n\n        const payload = {\n          specversion: '1.0',\n          type: `eventcatalog.governance.${result.trigger}`,\n          source: 'eventcatalog/governance',\n          id: randomUUID(),\n          time: now,\n          datacontenttype: 'application/json',\n          data: {\n            schemaVersion: 1,\n            ...(status && { status }),\n            summary: `${change.serviceId} is ${verb} the ${messageType} ${change.resourceId}`,\n            [serviceRole]: {\n              id: change.serviceId,\n              version: change.serviceVersion,\n              ...(serviceOwners?.get(change.serviceId) && { owners: serviceOwners.get(change.serviceId) }),\n            },\n            message: {\n              id: change.resourceId,\n              version: change.resourceVersion,\n              type: messageType,\n            },\n          },\n        };\n\n        webhookCalls.push({\n          urlTemplate: action.url,\n          request: fetch(url, { method: 'POST', headers, body: JSON.stringify(payload) }),\n        });\n      }\n    }\n  }\n\n  const settled = await Promise.allSettled(webhookCalls.map((c) => c.request));\n\n  return settled.map((result, i) => {\n    const url = webhookCalls[i].urlTemplate;\n    if (result.status === 'fulfilled') {\n      const res = result.value;\n      if (!res.ok) {\n        return `  Webhook failed: ${url} ✗ (HTTP ${res.status})`;\n      }\n      return `  Webhook sent: ${url} ✓`;\n    }\n    return `  Webhook failed: ${url} ✗ (${result.reason instanceof Error ? result.reason.message : String(result.reason)})`;\n  });\n};\n","import type { GovernanceResult } from './types';\nimport { getChangeVerb } from './rules';\n\nexport const formatGovernanceOutput = (results: GovernanceResult[]): string => {\n  if (results.length === 0) {\n    return 'No governance rules triggered. Catalog is compliant.';\n  }\n\n  const lines: string[] = ['Governance:', ''];\n\n  for (const result of results) {\n    lines.push(`  Rule \"${result.rule.name}\" triggered (${result.trigger}):`);\n\n    if (result.schemaChanges && result.schemaChanges.length > 0) {\n      for (const sc of result.schemaChanges) {\n        const consumers = sc.consumerServices.length > 0 ? sc.consumerServices.map((c) => c.id).join(', ') : 'no known consumers';\n        lines.push(\n          `    ! Schema changed for ${sc.resourceChange.resourceId} (${sc.resourceChange.type}) — consumers: ${consumers}`\n        );\n      }\n    } else if (result.deprecationChanges && result.deprecationChanges.length > 0) {\n      for (const dc of result.deprecationChanges) {\n        const producers = dc.producerServices.length > 0 ? dc.producerServices.map((p) => p.id).join(', ') : 'unknown producer';\n        lines.push(`    ! ${dc.resourceChange.resourceId} (${dc.resourceChange.type}) deprecated by ${producers}`);\n      }\n    } else {\n      for (const change of result.matchedChanges) {\n        const prefix = change.changeType === 'added' ? '+' : '-';\n        const verb = getChangeVerb(result.trigger, change.changeType);\n        lines.push(`    ${prefix} ${change.serviceId} is ${verb} ${change.resourceId}`);\n      }\n    }\n\n    lines.push('');\n  }\n\n  return lines.join('\\n');\n};\n\nexport const formatFailureOutput = (failures: Array<{ ruleName: string; messages: string[] }>): string => {\n  if (failures.length === 0) return '';\n\n  const lines: string[] = [];\n\n  for (const f of failures) {\n    lines.push(`FAILED: ${f.ruleName}`);\n    for (const msg of f.messages) {\n      lines.push(`  ${msg}`);\n    }\n  }\n\n  return lines.join('\\n');\n};\n","import path from 'node:path';\nimport { execSync } from 'node:child_process';\nimport { mkdtempSync, rmSync } from 'node:fs';\nimport { tmpdir } from 'node:os';\nimport dotenv from 'dotenv';\nimport createSDK from '@eventcatalog/sdk';\nimport { loadGovernanceConfig, evaluateGovernanceRules, enrichSchemaContent, resolveEnvVars } from './rules';\nimport { formatGovernanceOutput, formatFailureOutput } from './format';\nimport { executeGovernanceActions, buildMessageTypeMap, buildServiceOwnersMap } from './actions';\nimport type { GovernanceCheckResult } from './types';\n\nexport type GovernanceCheckOptions = {\n  base?: string;\n  target?: string;\n  format?: string;\n  status?: string;\n  dir: string;\n};\n\nconst BRANCH_NAME_RE = /^[a-zA-Z0-9._\\-/]+$/;\n\nconst extractBranchToTempDir = (branch: string, catalogDir: string, tempDirs: string[]): string => {\n  if (!BRANCH_NAME_RE.test(branch)) {\n    throw new Error(`Invalid branch name: \"${branch}\"`);\n  }\n  const tmpDir = mkdtempSync(path.join(tmpdir(), 'ec-governance-'));\n  tempDirs.push(tmpDir);\n  try {\n    execSync(`git archive ${branch} | tar -x -C ${tmpDir}`, { cwd: catalogDir, stdio: 'pipe' });\n  } catch {\n    throw new Error(`Failed to extract branch \"${branch}\". Is it a valid git branch?`);\n  }\n  return tmpDir;\n};\n\nexport const governanceCheck = async (opts: GovernanceCheckOptions): Promise<GovernanceCheckResult> => {\n  const dir = path.resolve(opts.dir);\n\n  // Load .env file from catalog directory (contains webhook secrets, etc.)\n  dotenv.config({ path: path.join(dir, '.env') });\n\n  const baseBranch = opts.base || 'main';\n\n  const tempDirs: string[] = [];\n  const trackTempDir = (prefix: string): string => {\n    const d = mkdtempSync(path.join(tmpdir(), prefix));\n    tempDirs.push(d);\n    return d;\n  };\n\n  try {\n    const baseTmpDir = extractBranchToTempDir(baseBranch, dir, tempDirs);\n\n    const baseSnapshotDir = trackTempDir('ec-snap-base-');\n    const targetSnapshotDir = trackTempDir('ec-snap-target-');\n\n    const baseSDK = createSDK(baseTmpDir);\n    const baseResult = await baseSDK.createSnapshot({ label: `base-${baseBranch}`, outputDir: baseSnapshotDir });\n\n    let targetResult;\n    let targetCatalogDir: string;\n    if (opts.target) {\n      targetCatalogDir = extractBranchToTempDir(opts.target, dir, tempDirs);\n      const targetSDK = createSDK(targetCatalogDir);\n      targetResult = await targetSDK.createSnapshot({ label: `target-${opts.target}`, outputDir: targetSnapshotDir });\n    } else {\n      targetCatalogDir = dir;\n      const targetSDK = createSDK(dir);\n      targetResult = await targetSDK.createSnapshot({ label: 'current', outputDir: targetSnapshotDir });\n    }\n\n    const diff = await baseSDK.diffSnapshots(baseResult.filePath, targetResult.filePath);\n\n    const config = loadGovernanceConfig(dir);\n\n    if (config.rules.length === 0) {\n      return { output: 'No governance.yaml (or governance.yml) found or no rules defined.', exitCode: 0, failures: [] };\n    }\n\n    const results = evaluateGovernanceRules(diff, config, targetResult.snapshot, baseResult.snapshot);\n\n    // Populate before/after schema content for any schema_changed results\n    await enrichSchemaContent(results, baseTmpDir, targetCatalogDir, config.compatibility?.strategy);\n\n    // Remove schema_breaking_change results where no actual breaking changes were found\n    const filteredResults = results.filter((r) => {\n      if (r.trigger !== 'schema_breaking_change') return true;\n      if (!r.breakingSchemaChanges) return false;\n      r.breakingSchemaChanges = r.breakingSchemaChanges.filter((bsc) => bsc.breakingChanges.length > 0);\n      return r.breakingSchemaChanges.length > 0;\n    });\n\n    // Mark results that have fail actions and collect their messages\n    for (const result of filteredResults) {\n      const failActions = result.rule.actions.filter((a) => a.type === 'fail');\n      if (failActions.length > 0) {\n        result.failed = true;\n        result.failMessages = failActions\n          .map((a) => ('message' in a && a.message ? resolveEnvVars(a.message) : undefined))\n          .filter((m): m is string => m !== undefined);\n      }\n    }\n\n    // Always execute actions (webhooks) regardless of output format\n    const messageTypes = buildMessageTypeMap(targetResult.snapshot);\n    const serviceOwners = buildServiceOwnersMap(targetResult.snapshot);\n    const actionOutput = await executeGovernanceActions(filteredResults, {\n      messageTypes,\n      status: opts.status,\n      serviceOwners,\n      baseRef: baseBranch,\n      targetRef: opts.target || 'working-directory',\n      compatibilityStrategy: config.compatibility?.strategy,\n    });\n\n    // Collect failures\n    const failures = filteredResults\n      .filter((r) => r.failed)\n      .map((r) => ({ ruleName: r.rule.name, messages: r.failMessages || [] }));\n\n    if (opts.format === 'json') {\n      const jsonOutput = {\n        baseBranch,\n        target: opts.target || 'working directory',\n        results: filteredResults,\n        summary: {\n          rulesTriggered: filteredResults.length,\n          failures: failures.length,\n          passed: failures.length === 0,\n        },\n        diff: diff.summary,\n      };\n      return { output: JSON.stringify(jsonOutput, null, 2), exitCode: failures.length > 0 ? 1 : 0, failures };\n    }\n\n    const targetLabel = opts.target || 'working directory';\n    const lines: string[] = [`Governance check: comparing ${targetLabel} against ${baseBranch}`, ''];\n\n    lines.push(formatGovernanceOutput(filteredResults));\n\n    if (actionOutput.length > 0) {\n      lines.push('');\n      lines.push(...actionOutput);\n    }\n\n    if (filteredResults.length > 0) {\n      const webhookCount = actionOutput.filter((l) => l.includes('Webhook sent')).length;\n      const parts = [`${filteredResults.length} rule${filteredResults.length === 1 ? '' : 's'} triggered`];\n      if (webhookCount > 0) parts.push(`${webhookCount} webhook${webhookCount === 1 ? '' : 's'} sent`);\n      lines.push('');\n      lines.push(parts.join(', ') + '.');\n    }\n\n    // Append failure output\n    const failureOutput = formatFailureOutput(failures);\n    if (failureOutput) {\n      lines.push('');\n      lines.push(failureOutput);\n    }\n\n    return { output: lines.join('\\n'), exitCode: failures.length > 0 ? 1 : 0, failures };\n  } finally {\n    for (const d of tempDirs) {\n      rmSync(d, { recursive: true, force: true });\n    }\n  }\n};\n"],"mappings":"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","names":["existsSync","resolve","createSDK","createSDK","version","dsl","writeFileSync","resolve","resolve","path","resolve","writeFileSync","resolve","createSDK","version","path","createSDK","snapshot","version","snapshot","path","rmSync","createSDK","path","createSDK","rmSync","dotenv","resolve","result","existsSync"]}