@runcontext/cli 0.4.2 → 0.4.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/commands/lint.ts","../src/formatters/pretty.ts","../src/formatters/json.ts","../src/formatters/sarif.ts","../src/formatters/github.ts","../src/formatters/junit.ts","../src/commands/build.ts","../src/commands/tier.ts","../src/commands/explain.ts","../src/commands/fix.ts","../src/commands/introspect.ts","../src/commands/verify.ts","../src/commands/dev.ts","../src/commands/init.ts","../src/commands/site.ts","../src/commands/serve.ts","../src/commands/validate-osi.ts","../src/commands/enrich.ts","../src/commands/rules.ts","../src/commands/setup.ts","../src/setup/steps/connect.ts","../src/setup/mcp-discovery.ts","../src/setup/steps/scaffold.ts","../src/setup/display.ts","../src/setup/steps/enrich-silver.ts","../src/setup/steps/enrich-gold.ts","../src/setup/steps/verify.ts","../src/setup/steps/autofix.ts","../src/setup/steps/claude-md.ts","../src/commands/blueprint.ts","../src/commands/new.ts"],"sourcesContent":["// ContextKit CLI v0.2\n\nimport { Command } from 'commander';\nimport { lintCommand } from './commands/lint.js';\nimport { buildCommand } from './commands/build.js';\nimport { tierCommand } from './commands/tier.js';\nimport { explainCommand } from './commands/explain.js';\nimport { fixCommand } from './commands/fix.js';\nimport { devCommand } from './commands/dev.js';\nimport { initCommand } from './commands/init.js';\nimport { siteCommand } from './commands/site.js';\nimport { serveCommand } from './commands/serve.js';\nimport { validateOsiCommand } from './commands/validate-osi.js';\nimport { introspectCommand } from './commands/introspect.js';\nimport { verifyCommand } from './commands/verify.js';\nimport { enrichCommand } from './commands/enrich.js';\nimport { rulesCommand } from './commands/rules.js';\nimport { setupCommand } from './commands/setup.js';\nimport { blueprintCommand } from './commands/blueprint.js';\nimport { newCommand } from './commands/new.js';\n\nconst program = new Command();\n\nprogram\n .name('context')\n .description('ContextKit — AI-ready metadata governance over OSI')\n .version('0.4.2');\n\n// Register all commands\nprogram.addCommand(lintCommand);\nprogram.addCommand(buildCommand);\nprogram.addCommand(tierCommand);\nprogram.addCommand(explainCommand);\nprogram.addCommand(fixCommand);\nprogram.addCommand(devCommand);\nprogram.addCommand(initCommand);\nprogram.addCommand(siteCommand);\nprogram.addCommand(serveCommand);\nprogram.addCommand(validateOsiCommand);\nprogram.addCommand(introspectCommand);\nprogram.addCommand(verifyCommand);\nprogram.addCommand(enrichCommand);\nprogram.addCommand(rulesCommand);\nprogram.addCommand(setupCommand);\nprogram.addCommand(blueprintCommand);\nprogram.addCommand(newCommand);\n\nprogram.parse();\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport path from 'node:path';\nimport { readFileSync, writeFileSync } from 'node:fs';\nimport {\n compile,\n loadConfigAsync,\n LintEngine,\n ALL_RULES,\n filterByDirectives,\n applyFixes,\n loadPlugins,\n computeCacheHash,\n readCache,\n writeCache,\n type Diagnostic,\n type Severity,\n type MetadataTier,\n} from '@runcontext/core';\nimport { formatDiagnostics } from '../formatters/pretty.js';\nimport { formatJson } from '../formatters/json.js';\nimport { formatSarif } from '../formatters/sarif.js';\nimport { formatGitHub } from '../formatters/github.js';\nimport { formatJUnit } from '../formatters/junit.js';\n\ntype FormatType = 'pretty' | 'json' | 'sarif' | 'github' | 'junit';\n\nconst VALID_FORMATS: FormatType[] = ['pretty', 'json', 'sarif', 'github', 'junit'];\n\n/**\n * Detect the best default format based on CI environment.\n */\nfunction detectFormat(): FormatType {\n if (process.env.GITHUB_ACTIONS) return 'github';\n if (process.env.CI) return 'json';\n return 'pretty';\n}\n\n/**\n * Parse --rule overrides: \"ruleId:severity\" pairs.\n * Accumulates across multiple --rule flags.\n */\nfunction collectRule(value: string, previous: Record<string, string>): Record<string, string> {\n const lastColon = value.lastIndexOf(':');\n if (lastColon === -1) {\n throw new Error(`Invalid --rule format: \"${value}\". Expected \"ruleId:severity\" (e.g., \"governance/grain-required:error\")`);\n }\n const ruleId = value.slice(0, lastColon);\n const severity = value.slice(lastColon + 1);\n if (!['error', 'warning', 'off'].includes(severity)) {\n throw new Error(`Invalid severity \"${severity}\" in --rule \"${value}\". Must be error, warning, or off.`);\n }\n previous[ruleId] = severity;\n return previous;\n}\n\n/**\n * Format diagnostics using the specified format.\n */\nfunction formatOutput(diagnostics: Diagnostic[], format: FormatType): string {\n switch (format) {\n case 'json':\n return formatJson(diagnostics);\n case 'sarif':\n return formatSarif(diagnostics);\n case 'github':\n return formatGitHub(diagnostics);\n case 'junit':\n return formatJUnit(diagnostics);\n case 'pretty':\n default:\n return formatDiagnostics(diagnostics);\n }\n}\n\nexport const lintCommand = new Command('lint')\n .description('Run all lint rules against context files')\n .option('--context-dir <path>', 'Path to context directory')\n .option('--format <type>', `Output format: ${VALID_FORMATS.join(', ')}`)\n .option('--max-warnings <count>', 'Exit with error if warning count exceeds this threshold', parseInt)\n .option('--output-file <path>', 'Write formatted output to a file')\n .option('--rule <ruleId:severity>', 'Override rule severity (repeatable)', collectRule, {})\n .option('--fix', 'Automatically fix problems')\n .option('--fix-dry-run', 'Show what --fix would change without writing')\n .option('--cache', 'Only lint changed files (uses .contextkit-cache)')\n .option('--no-cache', 'Bypass the lint cache')\n .action(async (opts) => {\n try {\n const config = await loadConfigAsync(process.cwd());\n const contextDir = opts.contextDir\n ? path.resolve(opts.contextDir)\n : path.resolve(config.context_dir);\n const rootDir = process.cwd();\n\n // Determine output format (explicit flag > CI auto-detect)\n const format: FormatType = opts.format\n ? (VALID_FORMATS.includes(opts.format) ? opts.format : 'pretty')\n : detectFormat();\n\n // Check cache if --cache is enabled\n const useCache = opts.cache === true;\n if (useCache) {\n const configContent = JSON.stringify(config) + JSON.stringify(opts.rule ?? {});\n const hash = computeCacheHash(contextDir, configContent);\n const cached = readCache(rootDir, hash);\n if (cached) {\n const output = formatOutput(cached, format);\n if (opts.outputFile) {\n writeFileSync(path.resolve(opts.outputFile), output, 'utf-8');\n const ec = cached.filter((d) => d.severity === 'error').length;\n const wc = cached.filter((d) => d.severity === 'warning').length;\n console.log(`Results written to ${opts.outputFile} (${ec} error(s), ${wc} warning(s)) (cached)`);\n } else {\n console.log(output);\n }\n const hasErrors = cached.some((d) => d.severity === 'error');\n if (hasErrors) process.exit(1);\n return;\n }\n }\n\n // Compile the context graph\n const { graph, diagnostics: compileDiags, directives } = await compile({\n contextDir,\n config,\n rootDir,\n });\n\n // Merge severity overrides: config file + CLI --rule overrides (CLI wins)\n const configOverrides = (config.lint?.severity_overrides ?? {}) as Record<string, Severity | 'off'>;\n const cliOverrides = opts.rule as Record<string, string>;\n const overrides: Record<string, Severity | 'off'> = {\n ...configOverrides,\n ...cliOverrides as Record<string, Severity | 'off'>,\n };\n\n // Run lint engine with built-in + plugin rules\n const engine = new LintEngine(Object.keys(overrides).length > 0 ? overrides : undefined);\n for (const rule of ALL_RULES) {\n engine.register(rule);\n }\n if (config.plugins && config.plugins.length > 0) {\n const pluginRules = await loadPlugins(config.plugins);\n for (const rule of pluginRules) {\n engine.register(rule);\n }\n }\n const lintDiags = engine.run(graph);\n\n // Merge compile diagnostics with lint diagnostics, then filter by inline directives\n let allDiags: Diagnostic[] = filterByDirectives(\n [...compileDiags, ...lintDiags],\n directives,\n );\n\n // Apply auto-fixes if --fix or --fix-dry-run\n if (opts.fix || opts.fixDryRun) {\n const fixable = allDiags.filter((d) => d.fixable && d.fix);\n if (fixable.length > 0) {\n const fixes = applyFixes(fixable, (filePath) => readFileSync(filePath, 'utf-8'));\n\n if (opts.fixDryRun) {\n console.log(chalk.blue(`Would fix ${fixable.length} issue(s) in ${fixes.size} file(s):`));\n for (const [file] of fixes) {\n console.log(chalk.gray(` ${file}`));\n }\n console.log('');\n } else {\n // Write fixes to disk\n for (const [file, content] of fixes) {\n writeFileSync(file, content, 'utf-8');\n }\n console.log(chalk.green(`Fixed ${fixable.length} issue(s) in ${fixes.size} file(s).`));\n\n // Re-lint to show remaining issues\n const { graph: reGraph, diagnostics: reCompileDiags, directives: reDirs } = await compile({\n contextDir,\n config,\n rootDir: process.cwd(),\n });\n const reEngine = new LintEngine(Object.keys(overrides).length > 0 ? overrides : undefined);\n for (const rule of ALL_RULES) {\n reEngine.register(rule);\n }\n const reLintDiags = reEngine.run(reGraph);\n allDiags = filterByDirectives([...reCompileDiags, ...reLintDiags], reDirs);\n }\n }\n }\n\n // Enforce minimum_tier policy\n if (config.minimum_tier) {\n const tierOrder: MetadataTier[] = ['none', 'bronze', 'silver', 'gold'];\n const minIdx = tierOrder.indexOf(config.minimum_tier);\n for (const [modelName, score] of graph.tiers) {\n const actualIdx = tierOrder.indexOf(score.tier);\n if (actualIdx < minIdx) {\n allDiags.push({\n ruleId: 'tier/minimum-tier',\n severity: 'error',\n message: `Model \"${modelName}\" is tier \"${score.tier}\" but minimum_tier is \"${config.minimum_tier}\"`,\n location: { file: `model:${modelName}`, line: 1, column: 1 },\n fixable: false,\n });\n }\n }\n }\n\n // Write cache if enabled\n if (useCache) {\n const configContent = JSON.stringify(config) + JSON.stringify(opts.rule ?? {});\n const hash = computeCacheHash(contextDir, configContent);\n writeCache(rootDir, hash, allDiags);\n }\n\n // Format output\n const output = formatOutput(allDiags, format);\n\n // Write to file if --output-file specified\n if (opts.outputFile) {\n writeFileSync(path.resolve(opts.outputFile), output, 'utf-8');\n // Print summary to stdout\n const errorCount = allDiags.filter((d) => d.severity === 'error').length;\n const warnCount = allDiags.filter((d) => d.severity === 'warning').length;\n console.log(`Results written to ${opts.outputFile} (${errorCount} error(s), ${warnCount} warning(s))`);\n } else {\n console.log(output);\n }\n\n // Check --max-warnings threshold\n const warnCount = allDiags.filter((d) => d.severity === 'warning').length;\n if (opts.maxWarnings !== undefined && !isNaN(opts.maxWarnings) && warnCount > opts.maxWarnings) {\n console.error(\n chalk.red(`Too many warnings: ${warnCount} (max allowed: ${opts.maxWarnings})`),\n );\n process.exit(1);\n }\n\n // Exit with code 1 if there are errors\n const hasErrors = allDiags.some((d) => d.severity === 'error');\n if (hasErrors) {\n process.exit(1);\n }\n } catch (err) {\n console.error(chalk.red(`Lint failed: ${(err as Error).message}`));\n process.exit(1);\n }\n });\n","import chalk from 'chalk';\nimport type { Diagnostic, TierScore, TierCheckResult } from '@runcontext/core';\n\n/**\n * Format an array of diagnostics as colorized, human-readable text.\n */\nexport function formatDiagnostics(diagnostics: Diagnostic[]): string {\n if (diagnostics.length === 0) {\n return chalk.green('No issues found.');\n }\n\n const lines: string[] = [];\n\n for (const d of diagnostics) {\n const icon =\n d.severity === 'error' ? chalk.red('error') : chalk.yellow('warning');\n const loc = chalk.gray(\n `${d.location.file}:${d.location.line}:${d.location.column}`,\n );\n const rule = chalk.gray(`[${d.ruleId}]`);\n const fixTag = d.fixable ? chalk.blue(' (fixable)') : '';\n\n lines.push(` ${icon} ${d.message} ${rule}${fixTag}`);\n lines.push(` ${loc}`);\n }\n\n const errorCount = diagnostics.filter((d) => d.severity === 'error').length;\n const warnCount = diagnostics.filter((d) => d.severity === 'warning').length;\n\n lines.push('');\n const parts: string[] = [];\n if (errorCount > 0) parts.push(chalk.red(`${errorCount} error(s)`));\n if (warnCount > 0) parts.push(chalk.yellow(`${warnCount} warning(s)`));\n lines.push(parts.join(', '));\n\n return lines.join('\\n');\n}\n\n/**\n * Format a tier score as colorized, human-readable text.\n */\nexport function formatTierScore(score: TierScore): string {\n const lines: string[] = [];\n\n const tierColor = getTierColor(score.tier);\n lines.push(\n `${chalk.bold(score.model)}: ${tierColor(score.tier.toUpperCase())}`,\n );\n lines.push('');\n\n lines.push(formatTierSection('Bronze', score.bronze.passed, score.bronze.checks));\n lines.push(formatTierSection('Silver', score.silver.passed, score.silver.checks));\n lines.push(formatTierSection('Gold', score.gold.passed, score.gold.checks));\n\n return lines.join('\\n');\n}\n\nfunction formatTierSection(\n label: string,\n passed: boolean,\n checks: TierCheckResult[],\n): string {\n const lines: string[] = [];\n const status = passed ? chalk.green('PASS') : chalk.red('FAIL');\n lines.push(` ${label}: ${status}`);\n\n for (const check of checks) {\n const icon = check.passed ? chalk.green(' +') : chalk.red(' -');\n lines.push(` ${icon} ${check.label}`);\n if (check.detail && !check.passed) {\n lines.push(chalk.gray(` ${check.detail}`));\n }\n }\n\n return lines.join('\\n');\n}\n\nfunction getTierColor(tier: string): (text: string) => string {\n switch (tier) {\n case 'gold':\n return chalk.yellow;\n case 'silver':\n return chalk.white;\n case 'bronze':\n return chalk.hex('#CD7F32');\n default:\n return chalk.gray;\n }\n}\n\n/**\n * Format a generic info message.\n */\nexport function formatInfo(message: string): string {\n return chalk.blue(message);\n}\n\n/**\n * Format an error message.\n */\nexport function formatError(message: string): string {\n return chalk.red(`Error: ${message}`);\n}\n\n/**\n * Format a success message.\n */\nexport function formatSuccess(message: string): string {\n return chalk.green(message);\n}\n","/**\n * Format any value as pretty-printed JSON.\n */\nexport function formatJson(data: unknown): string {\n return JSON.stringify(data, null, 2);\n}\n","import type { Diagnostic } from '@runcontext/core';\n\ninterface SarifRuleDescriptor {\n id: string;\n shortDescription: { text: string };\n}\n\ninterface SarifResult {\n ruleId: string;\n level: 'error' | 'warning' | 'note';\n message: { text: string };\n locations: Array<{\n physicalLocation: {\n artifactLocation: { uri: string };\n region: { startLine: number; startColumn: number };\n };\n }>;\n}\n\ninterface SarifRun {\n tool: {\n driver: {\n name: string;\n version: string;\n informationUri: string;\n rules: SarifRuleDescriptor[];\n };\n };\n results: SarifResult[];\n}\n\ninterface SarifLog {\n $schema: string;\n version: string;\n runs: SarifRun[];\n}\n\nfunction mapSeverity(severity: string): 'error' | 'warning' | 'note' {\n switch (severity) {\n case 'error':\n return 'error';\n case 'warning':\n return 'warning';\n default:\n return 'note';\n }\n}\n\n/**\n * Format diagnostics as SARIF v2.1.0 JSON.\n * GitHub natively consumes this for code scanning alerts.\n */\nexport function formatSarif(diagnostics: Diagnostic[]): string {\n // Collect unique rules\n const ruleMap = new Map<string, SarifRuleDescriptor>();\n for (const d of diagnostics) {\n if (!ruleMap.has(d.ruleId)) {\n ruleMap.set(d.ruleId, {\n id: d.ruleId,\n shortDescription: { text: d.message },\n });\n }\n }\n\n const results: SarifResult[] = diagnostics.map((d) => ({\n ruleId: d.ruleId,\n level: mapSeverity(d.severity),\n message: { text: d.message },\n locations: [\n {\n physicalLocation: {\n artifactLocation: { uri: d.location.file },\n region: {\n startLine: d.location.line,\n startColumn: d.location.column,\n },\n },\n },\n ],\n }));\n\n const sarif: SarifLog = {\n $schema:\n 'https://raw.githubusercontent.com/oasis-tcs/sarif-spec/main/sarif-2.1/schema/sarif-schema-2.1.0.json',\n version: '2.1.0',\n runs: [\n {\n tool: {\n driver: {\n name: 'ContextKit',\n version: '0.4.2',\n informationUri: 'https://github.com/erickittelson/ContextKit',\n rules: Array.from(ruleMap.values()),\n },\n },\n results,\n },\n ],\n };\n\n return JSON.stringify(sarif, null, 2);\n}\n","import type { Diagnostic } from '@runcontext/core';\n\n/**\n * Format diagnostics as GitHub Actions workflow commands.\n * Output: ::warning file={f},line={l},col={c},title={ruleId}::{message}\n * Works in any GitHub Actions workflow — annotations appear inline on PRs.\n */\nexport function formatGitHub(diagnostics: Diagnostic[]): string {\n if (diagnostics.length === 0) {\n return '';\n }\n\n const lines: string[] = [];\n\n for (const d of diagnostics) {\n const level = d.severity === 'error' ? 'error' : 'warning';\n lines.push(\n `::${level} file=${d.location.file},line=${d.location.line},col=${d.location.column},title=${d.ruleId}::${d.message}`,\n );\n }\n\n return lines.join('\\n');\n}\n","import type { Diagnostic } from '@runcontext/core';\n\nfunction escapeXml(str: string): string {\n return str\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&apos;');\n}\n\n/**\n * Format diagnostics as JUnit XML.\n * Consumed by Jenkins, GitLab CI, CircleCI, Azure DevOps.\n * Groups diagnostics by file as <testsuite>, each diagnostic as <testcase> with <failure>.\n */\nexport function formatJUnit(diagnostics: Diagnostic[]): string {\n // Group diagnostics by file\n const byFile = new Map<string, Diagnostic[]>();\n for (const d of diagnostics) {\n const file = d.location.file;\n if (!byFile.has(file)) {\n byFile.set(file, []);\n }\n byFile.get(file)!.push(d);\n }\n\n const lines: string[] = [];\n lines.push('<?xml version=\"1.0\" encoding=\"UTF-8\"?>');\n lines.push(\n `<testsuites name=\"ContextKit\" tests=\"${diagnostics.length}\" failures=\"${diagnostics.length}\">`,\n );\n\n for (const [file, diags] of byFile) {\n lines.push(\n ` <testsuite name=\"${escapeXml(file)}\" tests=\"${diags.length}\" failures=\"${diags.length}\">`,\n );\n\n for (const d of diags) {\n const name = `${d.ruleId} (${d.location.line}:${d.location.column})`;\n lines.push(` <testcase name=\"${escapeXml(name)}\" classname=\"${escapeXml(file)}\">`);\n lines.push(\n ` <failure message=\"${escapeXml(d.message)}\" type=\"${d.severity}\">${escapeXml(d.ruleId)}: ${escapeXml(d.message)} at ${escapeXml(file)}:${d.location.line}:${d.location.column}</failure>`,\n );\n lines.push(' </testcase>');\n }\n\n lines.push(' </testsuite>');\n }\n\n lines.push('</testsuites>');\n return lines.join('\\n');\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport path from 'node:path';\nimport fs from 'node:fs';\nimport { compile, loadConfig, emitManifest } from '@runcontext/core';\nimport { formatJson } from '../formatters/json.js';\nimport { formatSuccess, formatError } from '../formatters/pretty.js';\n\nexport const buildCommand = new Command('build')\n .description('Compile context files and emit manifest JSON')\n .option('--context-dir <path>', 'Path to context directory')\n .option('--output-dir <path>', 'Path to output directory')\n .option('--format <type>', 'Output format: pretty or json', 'pretty')\n .action(async (opts) => {\n try {\n const config = loadConfig(process.cwd());\n const contextDir = opts.contextDir\n ? path.resolve(opts.contextDir)\n : path.resolve(config.context_dir);\n const outputDir = opts.outputDir\n ? path.resolve(opts.outputDir)\n : path.resolve(config.output_dir);\n\n // Compile the context graph\n const { graph, diagnostics } = await compile({ contextDir, config, rootDir: process.cwd() });\n\n // Check for compile errors\n const errors = diagnostics.filter((d) => d.severity === 'error');\n if (errors.length > 0) {\n if (opts.format === 'json') {\n console.log(formatJson({ success: false, errors }));\n } else {\n console.error(\n chalk.red(`Build failed with ${errors.length} error(s):`),\n );\n for (const e of errors) {\n console.error(chalk.red(` - ${e.message} [${e.ruleId}]`));\n }\n }\n process.exit(1);\n }\n\n // Emit manifest\n const manifest = emitManifest(graph, config);\n\n // Write to output directory\n fs.mkdirSync(outputDir, { recursive: true });\n const outputPath = path.join(outputDir, 'contextkit-manifest.json');\n fs.writeFileSync(outputPath, JSON.stringify(manifest, null, 2), 'utf-8');\n\n if (opts.format === 'json') {\n console.log(formatJson({ success: true, outputPath, manifest }));\n } else {\n console.log(formatSuccess(`Manifest written to ${outputPath}`));\n }\n } catch (err) {\n console.error(formatError((err as Error).message));\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport path from 'node:path';\nimport { compile, loadConfig, computeTier, type TierScore } from '@runcontext/core';\nimport { formatTierScore, formatError } from '../formatters/pretty.js';\nimport { formatJson } from '../formatters/json.js';\n\nexport const tierCommand = new Command('tier')\n .description('Show tier scorecard for one or all models')\n .argument('[model-name]', 'Specific model name to check')\n .option('--context-dir <path>', 'Path to context directory')\n .option('--format <type>', 'Output format: pretty or json', 'pretty')\n .action(async (modelName: string | undefined, opts) => {\n try {\n const config = loadConfig(process.cwd());\n const contextDir = opts.contextDir\n ? path.resolve(opts.contextDir)\n : path.resolve(config.context_dir);\n\n const { graph } = await compile({ contextDir, config, rootDir: process.cwd() });\n\n let scores: TierScore[];\n\n if (modelName) {\n // Single model\n if (!graph.models.has(modelName)) {\n console.error(formatError(`Model '${modelName}' not found.`));\n const available = [...graph.models.keys()].join(', ');\n if (available) {\n console.error(chalk.gray(`Available models: ${available}`));\n }\n process.exit(1);\n }\n scores = [computeTier(modelName, graph)];\n } else {\n // All models\n scores = [...graph.models.keys()].map((name) =>\n computeTier(name, graph),\n );\n }\n\n if (scores.length === 0) {\n console.log(\n opts.format === 'json'\n ? formatJson([])\n : chalk.yellow('No models found.'),\n );\n return;\n }\n\n if (opts.format === 'json') {\n console.log(formatJson(scores));\n } else {\n for (const score of scores) {\n console.log(formatTierScore(score));\n console.log('');\n }\n }\n } catch (err) {\n console.error(formatError((err as Error).message));\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport path from 'node:path';\nimport { compile, loadConfig } from '@runcontext/core';\nimport { formatJson } from '../formatters/json.js';\nimport { formatError } from '../formatters/pretty.js';\n\nexport const explainCommand = new Command('explain')\n .description('Look up models, terms, or owners by name and show details')\n .argument('<name>', 'Name of a model, term, or owner to look up')\n .option('--context-dir <path>', 'Path to context directory')\n .option('--format <type>', 'Output format: pretty or json', 'pretty')\n .action(async (name: string, opts) => {\n try {\n const config = loadConfig(process.cwd());\n const contextDir = opts.contextDir\n ? path.resolve(opts.contextDir)\n : path.resolve(config.context_dir);\n\n const { graph } = await compile({ contextDir, config, rootDir: process.cwd() });\n\n const results: Array<{ type: string; name: string; data: unknown }> = [];\n\n // Search models\n if (graph.models.has(name)) {\n results.push({ type: 'model', name, data: graph.models.get(name) });\n }\n\n // Search terms\n if (graph.terms.has(name)) {\n results.push({ type: 'term', name, data: graph.terms.get(name) });\n }\n\n // Search owners\n if (graph.owners.has(name)) {\n results.push({ type: 'owner', name, data: graph.owners.get(name) });\n }\n\n // Search governance\n if (graph.governance.has(name)) {\n results.push({\n type: 'governance',\n name,\n data: graph.governance.get(name),\n });\n }\n\n // Search rules\n if (graph.rules.has(name)) {\n results.push({ type: 'rules', name, data: graph.rules.get(name) });\n }\n\n // Search lineage\n if (graph.lineage.has(name)) {\n results.push({ type: 'lineage', name, data: graph.lineage.get(name) });\n }\n\n if (results.length === 0) {\n console.error(formatError(`No matching entity found for '${name}'.`));\n process.exit(1);\n }\n\n if (opts.format === 'json') {\n console.log(formatJson(results));\n } else {\n for (const result of results) {\n console.log(chalk.bold(`${result.type}: ${result.name}`));\n console.log(chalk.gray('---'));\n console.log(JSON.stringify(result.data, null, 2));\n console.log('');\n }\n }\n } catch (err) {\n console.error(formatError((err as Error).message));\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport path from 'node:path';\nimport fs from 'node:fs';\nimport {\n compile,\n loadConfig,\n LintEngine,\n ALL_RULES,\n applyFixes,\n createAdapter,\n type Severity,\n type DataSourceConfig,\n} from '@runcontext/core';\nimport { formatSuccess, formatError } from '../formatters/pretty.js';\nimport { formatJson } from '../formatters/json.js';\nimport { parseDbUrl } from './introspect.js';\nimport { collectDataValidation } from './verify.js';\n\nexport const fixCommand = new Command('fix')\n .description('Auto-fix lint issues')\n .option('--context-dir <path>', 'Path to context directory')\n .option('--format <type>', 'Output format: pretty or json', 'pretty')\n .option('--dry-run', 'Show what would be fixed without writing files')\n .option('--db <url>', 'Database URL for data-aware fixes (postgres:// or path.duckdb)')\n .option('--source <name>', 'Use a specific data_source from config')\n .action(async (opts) => {\n try {\n const config = loadConfig(process.cwd());\n const contextDir = opts.contextDir\n ? path.resolve(opts.contextDir)\n : path.resolve(config.context_dir);\n\n // Compile and lint\n const { graph } = await compile({ contextDir, config, rootDir: process.cwd() });\n\n // If --db or data_sources configured, connect and collect validation data\n let dsConfig: DataSourceConfig | undefined;\n if (opts.db) {\n dsConfig = parseDbUrl(opts.db);\n } else {\n const sources = config.data_sources;\n if (sources && Object.keys(sources).length > 0) {\n const name = opts.source ?? Object.keys(sources)[0]!;\n dsConfig = sources[name];\n }\n }\n\n if (dsConfig) {\n const adapter = await createAdapter(dsConfig);\n await adapter.connect();\n graph.dataValidation = await collectDataValidation(adapter, graph);\n await adapter.disconnect();\n }\n\n const overrides = config.lint?.severity_overrides as\n | Record<string, Severity | 'off'>\n | undefined;\n const engine = new LintEngine(overrides);\n for (const rule of ALL_RULES) {\n engine.register(rule);\n }\n const diagnostics = engine.run(graph);\n\n const fixable = diagnostics.filter((d) => d.fixable);\n\n if (fixable.length === 0) {\n if (opts.format === 'json') {\n console.log(formatJson({ fixedFiles: [], fixCount: 0 }));\n } else {\n console.log(chalk.green('No fixable issues found.'));\n }\n return;\n }\n\n // Apply fixes\n const readFile = (filePath: string) =>\n fs.readFileSync(filePath, 'utf-8');\n const fixedFiles = applyFixes(fixable, readFile);\n\n if (opts.dryRun) {\n if (opts.format === 'json') {\n const entries = [...fixedFiles.entries()].map(([file, content]) => ({\n file,\n content,\n }));\n console.log(\n formatJson({ dryRun: true, fixCount: fixable.length, entries }),\n );\n } else {\n console.log(\n chalk.yellow(`Dry run: ${fixable.length} issue(s) would be fixed in ${fixedFiles.size} file(s):`),\n );\n for (const file of fixedFiles.keys()) {\n console.log(chalk.gray(` ${file}`));\n }\n }\n return;\n }\n\n // Write fixed files\n for (const [file, content] of fixedFiles) {\n fs.writeFileSync(file, content, 'utf-8');\n }\n\n if (opts.format === 'json') {\n console.log(\n formatJson({\n fixedFiles: [...fixedFiles.keys()],\n fixCount: fixable.length,\n }),\n );\n } else {\n console.log(\n formatSuccess(\n `Fixed ${fixable.length} issue(s) in ${fixedFiles.size} file(s).`,\n ),\n );\n }\n } catch (err) {\n console.error(formatError((err as Error).message));\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport path from 'node:path';\nimport { mkdirSync, writeFileSync, existsSync, readFileSync, unlinkSync } from 'node:fs';\nimport * as p from '@clack/prompts';\nimport {\n loadConfig,\n createAdapter,\n scaffoldFromSchema,\n MissingDriverError,\n} from '@runcontext/core';\nimport type { DataSourceConfig } from '@runcontext/core';\n\nexport function parseDbUrl(db: string): DataSourceConfig {\n // URL-scheme based detection\n if (db.startsWith('duckdb://')) {\n return { adapter: 'duckdb', path: db.slice('duckdb://'.length) };\n }\n if (db.startsWith('postgres://') || db.startsWith('postgresql://')) {\n return { adapter: 'postgres', connection: db };\n }\n if (db.startsWith('mysql://')) {\n return { adapter: 'mysql', connection: db };\n }\n if (db.startsWith('mssql://') || db.startsWith('sqlserver://')) {\n return { adapter: 'mssql', connection: db };\n }\n if (db.startsWith('clickhouse://')) {\n return { adapter: 'clickhouse', host: db } as DataSourceConfig;\n }\n if (db.startsWith('snowflake://')) {\n // snowflake://account/database/schema\n const parts = db.slice('snowflake://'.length).split('/');\n return {\n adapter: 'snowflake',\n account: parts[0] ?? '',\n database: parts[1] ?? '',\n schema: parts[2] ?? '',\n } as DataSourceConfig;\n }\n if (db.startsWith('bigquery://')) {\n // bigquery://project/dataset\n const parts = db.slice('bigquery://'.length).split('/');\n return {\n adapter: 'bigquery',\n project: parts[0] ?? '',\n dataset: parts[1] ?? '',\n } as DataSourceConfig;\n }\n\n // File-extension based detection\n if (db.endsWith('.duckdb')) {\n return { adapter: 'duckdb', path: db };\n }\n if (db.endsWith('.sqlite') || db.endsWith('.sqlite3')) {\n return { adapter: 'sqlite', path: db } as DataSourceConfig;\n }\n if (db.endsWith('.db')) {\n // .db files could be either DuckDB or SQLite; default to duckdb for backward compat\n return { adapter: 'duckdb', path: db };\n }\n\n throw new Error(\n `Cannot determine adapter from \"${db}\". Use a URL prefix (duckdb://, postgres://, mysql://, mssql://, clickhouse://, snowflake://, bigquery://) or a recognized file extension (.duckdb, .db, .sqlite, .sqlite3).`,\n );\n}\n\nexport const introspectCommand = new Command('introspect')\n .description('Introspect a database and scaffold Bronze-level OSI metadata. Supports: duckdb://, postgres://, mysql://, mssql://, snowflake://, bigquery://, clickhouse://, .sqlite, .duckdb files, and Databricks (via config).')\n .option(\n '--db <url>',\n 'Database URL (duckdb://path.duckdb, postgres://user:pass@host/db, mysql://..., mssql://..., snowflake://account/db/schema, bigquery://project/dataset, clickhouse://host, or file.sqlite)',\n )\n .option(\n '--source <name>',\n 'Use a named data_source from contextkit.config.yaml',\n )\n .option('--tables <glob>', 'Filter tables by glob pattern (e.g., \"vw_*\")')\n .option('--select', 'Interactively select which tables to include')\n .option(\n '--model-name <name>',\n 'Name for the generated model (default: derived from source)',\n )\n .action(async (opts) => {\n try {\n const config = loadConfig(process.cwd());\n const contextDir = path.resolve(config.context_dir);\n\n // Resolve data source config\n let dsConfig: DataSourceConfig;\n let dsName: string;\n\n if (opts.db) {\n dsConfig = parseDbUrl(opts.db);\n dsName = opts.source ?? 'default';\n } else if (opts.source) {\n if (!config.data_sources?.[opts.source]) {\n console.error(\n chalk.red(\n `Data source \"${opts.source}\" not found in config`,\n ),\n );\n process.exit(1);\n }\n dsConfig = config.data_sources[opts.source]!;\n dsName = opts.source;\n } else {\n const sources = config.data_sources;\n if (!sources || Object.keys(sources).length === 0) {\n console.error(\n chalk.red(\n 'No data source specified. Use --db <url> or configure data_sources in config',\n ),\n );\n process.exit(1);\n }\n const firstName = Object.keys(sources)[0]!;\n dsConfig = sources[firstName]!;\n dsName = firstName;\n }\n\n // Connect\n const adapter = await createAdapter(dsConfig);\n await adapter.connect();\n console.log(\n chalk.green(\n `Connected to ${dsConfig.adapter}: ${dsConfig.path ?? dsConfig.connection}`,\n ),\n );\n\n // Introspect\n let tables = await adapter.listTables();\n\n if (opts.tables) {\n const pattern = opts.tables.replace(/\\*/g, '.*');\n const regex = new RegExp(`^${pattern}$`, 'i');\n tables = tables.filter((t) => regex.test(t.name));\n }\n\n console.log(`Discovered ${tables.length} tables/views`);\n\n // Interactive table selection\n if (opts.select && tables.length > 1) {\n const selection = await p.multiselect({\n message: `Select tables to include (${tables.length} found)`,\n options: tables.map((t) => ({\n value: t.name,\n label: t.name,\n hint: `${t.row_count.toLocaleString()} rows`,\n })),\n initialValues: tables.map((t) => t.name),\n required: true,\n });\n if (p.isCancel(selection)) {\n await adapter.disconnect();\n process.exit(0);\n }\n const selected = new Set(selection as string[]);\n tables = tables.filter((t) => selected.has(t.name));\n console.log(`Selected ${tables.length} tables`);\n }\n\n const columns: Record<string, any[]> = {};\n for (const table of tables) {\n columns[table.name] = await adapter.listColumns(table.name);\n }\n\n const totalCols = Object.values(columns).reduce(\n (sum, cols) => sum + cols.length,\n 0,\n );\n console.log(`Found ${totalCols} columns total`);\n\n await adapter.disconnect();\n\n const modelName =\n opts.modelName ??\n dsName.replace(/[^a-z0-9-]/gi, '-').toLowerCase();\n\n const result = scaffoldFromSchema({\n modelName,\n dataSourceName: dsName,\n tables,\n columns,\n });\n\n // Write files\n for (const dir of ['models', 'governance', 'owners']) {\n const dirPath = path.join(contextDir, dir);\n if (!existsSync(dirPath)) mkdirSync(dirPath, { recursive: true });\n }\n\n const osiPath = path.join(contextDir, 'models', result.files.osi);\n const govPath = path.join(\n contextDir,\n 'governance',\n result.files.governance,\n );\n const ownerPath = path.join(contextDir, 'owners', result.files.owner);\n\n writeFileSync(osiPath, result.osiYaml, 'utf-8');\n writeFileSync(govPath, result.governanceYaml, 'utf-8');\n if (!existsSync(ownerPath)) {\n writeFileSync(ownerPath, result.ownerYaml, 'utf-8');\n }\n\n console.log('');\n console.log(chalk.green('Scaffolded:'));\n console.log(` ${path.relative(process.cwd(), osiPath)}`);\n console.log(` ${path.relative(process.cwd(), govPath)}`);\n console.log(` ${path.relative(process.cwd(), ownerPath)}`);\n // Clean up example template files from `context init`\n const exampleFiles = [\n path.join(contextDir, 'models', 'example-model.osi.yaml'),\n path.join(contextDir, 'governance', 'example-model.governance.yaml'),\n path.join(contextDir, 'glossary', 'glossary.term.yaml'),\n path.join(contextDir, 'owners', 'data-team.owner.yaml'),\n ];\n let removedCount = 0;\n for (const exFile of exampleFiles) {\n if (existsSync(exFile)) {\n try {\n const content = readFileSync(exFile, 'utf-8');\n if (content.includes('example-model') || content.includes('Replace this') || content.includes('Example Term') || content.includes('team: data-team')) {\n unlinkSync(exFile);\n removedCount++;\n }\n } catch {\n // Ignore errors reading/removing example files\n }\n }\n }\n if (removedCount > 0) {\n p.log.info(`Removed ${removedCount} example template file(s) from init`);\n }\n\n console.log('');\n console.log(chalk.cyan('Run `context tier` to check your tier score.'));\n console.log(\n chalk.cyan('Run `context verify` to validate against data.'),\n );\n } catch (err) {\n if (err instanceof MissingDriverError) {\n console.error(chalk.yellow(`\\nMissing driver: \"${err.driverPackage}\" is required for ${err.adapter}.\\n`));\n console.error(chalk.white(`Install it with:\\n npm install ${err.driverPackage}\\n`));\n } else {\n console.error(\n chalk.red(`Introspect failed: ${(err as Error).message}`),\n );\n }\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport path from 'node:path';\nimport {\n compile,\n loadConfig,\n LintEngine,\n ALL_RULES,\n createAdapter,\n type ContextGraph,\n type DataValidationInfo,\n type DataAdapter,\n type DataSourceConfig,\n type Diagnostic,\n type FieldGovernance,\n} from '@runcontext/core';\nimport { formatDiagnostics } from '../formatters/pretty.js';\nimport { parseDbUrl } from './introspect.js';\n\n/**\n * Resolve a dataset name to an actual table name in the database.\n */\nfunction findTable(\n dsName: string,\n graph: ContextGraph,\n existingTables: Map<string, number>,\n): string | undefined {\n if (existingTables.has(dsName)) return dsName;\n for (const [, model] of graph.models) {\n const ds = model.datasets.find((d) => d.name === dsName);\n if (ds?.source) {\n const tableName = ds.source.split('.').pop()!;\n if (existingTables.has(tableName)) return tableName;\n }\n }\n return undefined;\n}\n\n/**\n * Introspect the database and collect validation data for the graph.\n */\nexport async function collectDataValidation(\n adapter: DataAdapter,\n graph: ContextGraph,\n): Promise<DataValidationInfo> {\n const validation: DataValidationInfo = {\n existingTables: new Map(),\n existingColumns: new Map(),\n actualSampleValues: new Map(),\n goldenQueryResults: new Map(),\n guardrailResults: new Map(),\n };\n\n // 1. List all tables with row counts\n const tables = await adapter.listTables();\n for (const t of tables) {\n validation.existingTables.set(t.name, t.row_count);\n }\n\n // 2. List columns for all discovered tables\n for (const t of tables) {\n const cols = await adapter.listColumns(t.name);\n const colMap = new Map(cols.map((c) => [c.name, c.data_type]));\n validation.existingColumns.set(t.name, colMap);\n }\n\n // 3. Collect sample values for governance fields\n for (const [, gov] of graph.governance) {\n if (!gov.fields) continue;\n for (const [fieldKey, fieldGov] of Object.entries(gov.fields) as [string, FieldGovernance][]) {\n if (!fieldGov.sample_values || fieldGov.sample_values.length === 0)\n continue;\n const dotIdx = fieldKey.indexOf('.');\n if (dotIdx < 0) continue;\n const dsName = fieldKey.substring(0, dotIdx);\n const fieldName = fieldKey.substring(dotIdx + 1);\n const tableName = findTable(dsName, graph, validation.existingTables);\n if (!tableName) continue;\n try {\n const result = await adapter.query(\n `SELECT DISTINCT CAST(\"${fieldName}\" AS VARCHAR) AS val FROM \"${tableName}\" WHERE \"${fieldName}\" IS NOT NULL LIMIT 50`,\n );\n validation.actualSampleValues.set(\n fieldKey,\n result.rows.map((r) => String(r.val)),\n );\n } catch {\n /* skip fields that can't be queried */\n }\n }\n }\n\n // 4. Execute golden queries\n for (const [, rules] of graph.rules) {\n if (!rules.golden_queries) continue;\n for (let i = 0; i < rules.golden_queries.length; i++) {\n const gq = rules.golden_queries[i]!;\n try {\n const result = await adapter.query(gq.sql);\n validation.goldenQueryResults.set(i, {\n success: true,\n rowCount: result.row_count,\n });\n } catch (err) {\n validation.goldenQueryResults.set(i, {\n success: false,\n error: (err as Error).message,\n });\n }\n }\n }\n\n // 5. Validate guardrail filter SQL\n for (const [, rules] of graph.rules) {\n if (!rules.guardrail_filters) continue;\n for (let i = 0; i < rules.guardrail_filters.length; i++) {\n const gf = rules.guardrail_filters[i]!;\n const testTable = gf.tables?.[0] ?? 'unknown';\n const tableName = findTable(testTable, graph, validation.existingTables);\n if (!tableName) {\n validation.guardrailResults.set(i, {\n valid: false,\n error: `Table \"${testTable}\" not found`,\n });\n continue;\n }\n try {\n await adapter.query(\n `SELECT 1 FROM \"${tableName}\" WHERE ${gf.filter} LIMIT 1`,\n );\n validation.guardrailResults.set(i, { valid: true });\n } catch (err) {\n validation.guardrailResults.set(i, {\n valid: false,\n error: (err as Error).message,\n });\n }\n }\n }\n\n return validation;\n}\n\nexport const verifyCommand = new Command('verify')\n .description('Validate metadata accuracy against a live database')\n .option('--source <name>', 'Use a specific data_source from config')\n .option('--db <url>', 'Database URL override (postgres:// or path.duckdb)')\n .option('--context-dir <path>', 'Path to context directory')\n .option('--format <type>', 'Output format: pretty or json', 'pretty')\n .action(async (opts) => {\n try {\n const config = loadConfig(process.cwd());\n const contextDir = opts.contextDir\n ? path.resolve(opts.contextDir)\n : path.resolve(config.context_dir);\n\n // Compile the context graph\n const { graph, diagnostics: compileDiags } = await compile({\n contextDir,\n config,\n });\n\n // Resolve data source configuration\n let dsConfig: DataSourceConfig;\n if (opts.db) {\n dsConfig = parseDbUrl(opts.db);\n } else {\n const sources = config.data_sources;\n if (!sources || Object.keys(sources).length === 0) {\n console.error(\n chalk.red(\n 'No data source configured. Add data_sources to contextkit.config.yaml or use --db.',\n ),\n );\n process.exit(1);\n }\n const name = opts.source ?? Object.keys(sources)[0]!;\n const resolved = sources[name];\n if (!resolved) {\n console.error(\n chalk.red(\n `Data source \"${name}\" not found. Available: ${Object.keys(sources).join(', ')}`,\n ),\n );\n process.exit(1);\n return; // unreachable, but helps TypeScript narrow the type\n }\n dsConfig = resolved;\n }\n\n // Connect and collect validation data\n const adapter = await createAdapter(dsConfig);\n await adapter.connect();\n console.log(chalk.green(`Connected to ${dsConfig.adapter}`));\n console.log('Collecting validation data...\\n');\n\n graph.dataValidation = await collectDataValidation(adapter, graph);\n await adapter.disconnect();\n\n // Run only data/* rules\n const engine = new LintEngine();\n for (const rule of ALL_RULES) {\n if (rule.id.startsWith('data/')) {\n engine.register(rule);\n }\n }\n const dataDiags = engine.run(graph);\n\n // Merge compile errors that are relevant (optional) + data diagnostics\n const allDiags: Diagnostic[] = [...dataDiags];\n\n // Output results\n if (allDiags.length === 0) {\n const tableCount = graph.dataValidation.existingTables.size;\n const totalRows = [\n ...graph.dataValidation.existingTables.values(),\n ].reduce((a, b) => a + b, 0);\n console.log(chalk.green('All data validation checks passed.\\n'));\n console.log(\n `Verified against ${tableCount} table(s) (${totalRows.toLocaleString()} total rows)`,\n );\n } else {\n console.log(formatDiagnostics(allDiags));\n }\n\n const hasErrors = allDiags.some((d) => d.severity === 'error');\n if (hasErrors) process.exit(1);\n } catch (err) {\n console.error(chalk.red(`Verify failed: ${(err as Error).message}`));\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport path from 'node:path';\nimport { readFileSync, writeFileSync } from 'node:fs';\nimport {\n compile,\n loadConfig,\n LintEngine,\n ALL_RULES,\n filterByDirectives,\n applyFixes,\n type Diagnostic,\n type Severity,\n} from '@runcontext/core';\nimport { formatDiagnostics } from '../formatters/pretty.js';\n\n/** Serialize a diagnostic to a comparable key. */\nfunction diagKey(d: Diagnostic): string {\n return `${d.ruleId}|${d.location.file}:${d.location.line}:${d.location.column}|${d.message}`;\n}\n\nlet previousDiags: Map<string, Diagnostic> = new Map();\n\nasync function runLint(\n contextDir: string,\n fix: boolean,\n): Promise<void> {\n const config = loadConfig(process.cwd());\n\n const { graph, diagnostics: compileDiags, directives } = await compile({\n contextDir,\n config,\n rootDir: process.cwd(),\n });\n\n const overrides = config.lint?.severity_overrides as\n | Record<string, Severity | 'off'>\n | undefined;\n const engine = new LintEngine(overrides);\n for (const rule of ALL_RULES) {\n engine.register(rule);\n }\n const lintDiags = engine.run(graph);\n let allDiags = filterByDirectives([...compileDiags, ...lintDiags], directives);\n\n // Apply fixes in watch mode if --fix\n if (fix) {\n const fixable = allDiags.filter((d) => d.fixable && d.fix);\n if (fixable.length > 0) {\n const fixes = applyFixes(fixable, (filePath) => readFileSync(filePath, 'utf-8'));\n for (const [file, content] of fixes) {\n writeFileSync(file, content, 'utf-8');\n }\n // Re-lint after fixes\n const { graph: reGraph, diagnostics: reCompileDiags, directives: reDirs } = await compile({\n contextDir,\n config,\n rootDir: process.cwd(),\n });\n const reEngine = new LintEngine(overrides);\n for (const rule of ALL_RULES) {\n reEngine.register(rule);\n }\n allDiags = filterByDirectives([...reCompileDiags, ...reEngine.run(reGraph)], reDirs);\n\n if (fixable.length > 0) {\n console.log(chalk.green(` Auto-fixed ${fixable.length} issue(s).`));\n }\n }\n }\n\n // Build current diagnostics map\n const currentDiags = new Map<string, Diagnostic>();\n for (const d of allDiags) {\n currentDiags.set(diagKey(d), d);\n }\n\n // Compute diff\n const newIssues: Diagnostic[] = [];\n const resolved: Diagnostic[] = [];\n\n for (const [key, d] of currentDiags) {\n if (!previousDiags.has(key)) newIssues.push(d);\n }\n for (const [key, d] of previousDiags) {\n if (!currentDiags.has(key)) resolved.push(d);\n }\n\n // Display\n console.clear();\n console.log(chalk.gray(`[${new Date().toLocaleTimeString()}] Linting...`));\n\n if (previousDiags.size > 0) {\n // Show diff summary\n if (resolved.length > 0) {\n console.log(chalk.green(` ${resolved.length} issue(s) resolved`));\n }\n if (newIssues.length > 0) {\n console.log(chalk.red(` ${newIssues.length} new issue(s)`));\n }\n if (resolved.length === 0 && newIssues.length === 0) {\n console.log(chalk.gray(' No changes'));\n }\n console.log('');\n }\n\n console.log(formatDiagnostics(allDiags));\n console.log('');\n\n previousDiags = currentDiags;\n}\n\nexport const devCommand = new Command('dev')\n .description('Watch mode — re-run lint on file changes')\n .option('--context-dir <path>', 'Path to context directory')\n .option('--fix', 'Auto-fix problems on each re-lint')\n .option('--studio', 'Open interactive metadata editor in the browser')\n .option('--port <number>', 'Studio server port (default: 4040)', '4040')\n .option('--host <address>', 'Studio server host (default: localhost)', 'localhost')\n .action(async (opts) => {\n try {\n const config = loadConfig(process.cwd());\n const contextDir = opts.contextDir\n ? path.resolve(opts.contextDir)\n : path.resolve(config.context_dir);\n const fix = opts.fix === true;\n\n console.log(chalk.blue(`Watching ${contextDir} for changes...`));\n if (fix) console.log(chalk.blue('Auto-fix enabled.'));\n console.log(chalk.gray('Press Ctrl+C to stop.\\n'));\n\n // Initial lint run\n await runLint(contextDir, fix);\n\n // Studio server (started before watcher so recompileAndBroadcast is available)\n let recompileAndBroadcast: (() => Promise<void>) | undefined;\n\n if (opts.studio) {\n const { startStudioServer } = await import('../studio/server.js');\n const studioPort = parseInt(opts.port, 10);\n const { server: _studioServer, recompileAndBroadcast: rab } = await startStudioServer({\n contextDir,\n rootDir: process.cwd(),\n port: studioPort,\n host: opts.host,\n });\n recompileAndBroadcast = rab;\n const studioUrl = `http://${opts.host === '0.0.0.0' ? 'localhost' : opts.host}:${studioPort}`;\n console.log(chalk.green(`\\n Studio running at ${chalk.bold(studioUrl)}\\n`));\n\n // Open browser safely using execFile (no shell injection)\n const { execFile } = await import('node:child_process');\n const openCmd = process.platform === 'darwin' ? 'open' : process.platform === 'win32' ? 'cmd' : 'xdg-open';\n const openArgs = process.platform === 'win32' ? ['/c', 'start', studioUrl] : [studioUrl];\n execFile(openCmd, openArgs, (err) => {\n if (err) console.log(chalk.gray(` Open ${studioUrl} in your browser`));\n });\n }\n\n // Dynamic import of chokidar for watch mode\n const { watch } = await import('chokidar');\n\n let debounceTimer: ReturnType<typeof setTimeout> | null = null;\n\n const watcher = watch(contextDir, {\n ignored: /(^|[/\\\\])\\../, // ignore dotfiles\n persistent: true,\n ignoreInitial: true,\n });\n\n watcher.on('all', (_event, _filePath) => {\n if (debounceTimer) clearTimeout(debounceTimer);\n debounceTimer = setTimeout(async () => {\n try {\n await runLint(contextDir, fix);\n if (recompileAndBroadcast) {\n await recompileAndBroadcast();\n }\n } catch (err) {\n console.error(\n chalk.red(`Lint error: ${(err as Error).message}`),\n );\n }\n }, 300);\n });\n } catch (err) {\n console.error(chalk.red(`Dev mode failed: ${(err as Error).message}`));\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport path from 'node:path';\nimport fs from 'node:fs';\nimport { formatSuccess, formatError } from '../formatters/pretty.js';\n\nconst EXAMPLE_OSI = `version: \"1.0\"\n\nsemantic_model:\n - name: example-model\n description: An example semantic model\n ai_context:\n instructions: \"Use this model for general analytics queries\"\n synonyms: [\"example\", \"sample model\"]\n\n datasets:\n - name: example_table\n source: warehouse.public.example_table\n primary_key: [id]\n description: \"Example table\"\n fields:\n - name: id\n expression:\n dialects:\n - dialect: ANSI_SQL\n expression: id\n description: \"Primary key\"\n type: number\n - name: name\n expression:\n dialects:\n - dialect: ANSI_SQL\n expression: name\n description: \"Name field\"\n type: string\n`;\n\nconst EXAMPLE_GOVERNANCE = `model: example-model\nowner: data-team\nclassification: internal\nsecurity:\n pii: false\n access_level: internal\ndatasets:\n example_table:\n grain: one row per example entity\n fields:\n id:\n description: \"Primary key\"\n name:\n description: \"Name field\"\n`;\n\nconst EXAMPLE_TERM = `glossary:\n - term: Example Term\n definition: A sample glossary term to demonstrate the format\n aliases: [\"sample term\"]\n owner: data-team\n`;\n\nconst EXAMPLE_OWNER = `team: data-team\nname: Data Team\nemail: data-team@example.com\nslack: \"#data-team\"\nmembers:\n - name: Jane Doe\n role: lead\n`;\n\nconst EXAMPLE_CONFIG = `context_dir: context\noutput_dir: dist\nminimum_tier: bronze\n`;\n\nexport const initCommand = new Command('init')\n .description('Scaffold a v0.2 ContextKit project structure')\n .option('--dir <path>', 'Root directory for the project', '.')\n .action(async (opts) => {\n try {\n const rootDir = path.resolve(opts.dir);\n const contextDir = path.join(rootDir, 'context');\n\n // Create directory structure\n const dirs = [\n path.join(contextDir, 'models'),\n path.join(contextDir, 'governance'),\n path.join(contextDir, 'glossary'),\n path.join(contextDir, 'owners'),\n ];\n\n for (const dir of dirs) {\n fs.mkdirSync(dir, { recursive: true });\n }\n\n // Write example files (only if they don't already exist)\n const files: Array<{ path: string; content: string }> = [\n {\n path: path.join(contextDir, 'models', 'example-model.osi.yaml'),\n content: EXAMPLE_OSI,\n },\n {\n path: path.join(\n contextDir,\n 'governance',\n 'example-model.governance.yaml',\n ),\n content: EXAMPLE_GOVERNANCE,\n },\n {\n path: path.join(contextDir, 'glossary', 'glossary.term.yaml'),\n content: EXAMPLE_TERM,\n },\n {\n path: path.join(contextDir, 'owners', 'data-team.owner.yaml'),\n content: EXAMPLE_OWNER,\n },\n {\n path: path.join(rootDir, 'contextkit.config.yaml'),\n content: EXAMPLE_CONFIG,\n },\n ];\n\n let created = 0;\n let skipped = 0;\n\n for (const file of files) {\n if (fs.existsSync(file.path)) {\n console.log(chalk.gray(` skip ${path.relative(rootDir, file.path)} (exists)`));\n skipped++;\n } else {\n fs.writeFileSync(file.path, file.content, 'utf-8');\n console.log(chalk.green(` create ${path.relative(rootDir, file.path)}`));\n created++;\n }\n }\n\n console.log('');\n console.log(\n formatSuccess(\n `Initialized ContextKit project: ${created} file(s) created, ${skipped} skipped.`,\n ),\n );\n console.log('');\n console.log(chalk.gray('Next steps:'));\n console.log(chalk.gray(' 1. Edit the example files in context/'));\n console.log(chalk.gray(' 2. Run: context lint'));\n console.log(chalk.gray(' 3. Run: context build'));\n } catch (err) {\n console.error(formatError((err as Error).message));\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport path from 'node:path';\nimport { compile, loadConfig, emitManifest } from '@runcontext/core';\nimport { formatError } from '../formatters/pretty.js';\n\nexport const siteCommand = new Command('site')\n .description('Build a static documentation site from compiled context')\n .option('--context-dir <path>', 'Path to context directory')\n .option('--output-dir <path>', 'Path to site output directory')\n .action(async (opts) => {\n try {\n const config = loadConfig(process.cwd());\n const contextDir = opts.contextDir\n ? path.resolve(opts.contextDir)\n : path.resolve(config.context_dir);\n\n // Compile the context graph\n const { graph } = await compile({ contextDir, config, rootDir: process.cwd() });\n const manifest = emitManifest(graph, config);\n\n // Try to import the site generator\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- dynamic import\n let buildSite: ((...args: any[]) => Promise<void>) | undefined;\n try {\n const siteModule = await import('@runcontext/site');\n buildSite = siteModule.buildSite;\n } catch {\n // @runcontext/site not yet implemented\n }\n\n if (!buildSite) {\n console.log(\n chalk.yellow(\n 'Site generator is not yet available. Install @runcontext/site to enable this command.',\n ),\n );\n process.exit(0);\n }\n\n const outputDir = opts.outputDir\n ? path.resolve(opts.outputDir)\n : path.resolve(config.site?.base_path ?? 'site');\n\n await buildSite(manifest, config, outputDir);\n console.log(chalk.green(`Site built to ${outputDir}`));\n } catch (err) {\n console.error(formatError((err as Error).message));\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { formatError } from '../formatters/pretty.js';\n\nexport const serveCommand = new Command('serve')\n .description('Start the MCP server (stdio or HTTP transport)')\n .option('--context-dir <path>', 'Path to context directory')\n .option('--http', 'Serve over HTTP instead of stdio')\n .option('--port <number>', 'HTTP port (default: 3000)', '3000')\n .option('--host <address>', 'HTTP host (default: 0.0.0.0)', '0.0.0.0')\n .action(async (opts) => {\n try {\n // Dynamic import — @runcontext/mcp is an optional peer\n let mcpModule: Record<string, unknown> | undefined;\n try {\n mcpModule = await import('@runcontext/mcp');\n } catch {\n // @runcontext/mcp not installed\n }\n\n if (!mcpModule) {\n console.log(\n chalk.yellow(\n 'MCP server is not available. Install @runcontext/mcp to enable this command.',\n ),\n );\n process.exit(1);\n }\n\n if (opts.http) {\n const startServerHttp = mcpModule.startServerHttp as (options?: {\n contextDir?: string;\n rootDir?: string;\n port?: number;\n host?: string;\n }) => Promise<void>;\n\n const port = parseInt(opts.port, 10);\n console.log(chalk.blue(`Starting MCP server (HTTP on port ${port})...`));\n await startServerHttp({\n contextDir: opts.contextDir,\n rootDir: process.cwd(),\n port,\n host: opts.host,\n });\n } else {\n const startServer = mcpModule.startServer as (options?: {\n contextDir?: string;\n rootDir?: string;\n }) => Promise<unknown>;\n\n console.log(chalk.blue('Starting MCP server (stdio transport)...'));\n await startServer({\n contextDir: opts.contextDir,\n rootDir: process.cwd(),\n });\n }\n } catch (err) {\n console.error(formatError((err as Error).message));\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport path from 'node:path';\nimport { parseFile, osiDocumentSchema } from '@runcontext/core';\nimport { formatJson } from '../formatters/json.js';\nimport { formatError, formatSuccess } from '../formatters/pretty.js';\n\nexport const validateOsiCommand = new Command('validate-osi')\n .description('Validate a single OSI file against the schema')\n .argument('<file>', 'Path to the OSI YAML file')\n .option('--format <type>', 'Output format: pretty or json', 'pretty')\n .action(async (file: string, opts) => {\n try {\n const filePath = path.resolve(file);\n\n // Parse the file\n const parsed = await parseFile(filePath, 'model');\n\n // Validate against the schema\n const result = osiDocumentSchema.safeParse(parsed.data);\n\n if (result.success) {\n if (opts.format === 'json') {\n console.log(\n formatJson({\n valid: true,\n file: filePath,\n data: result.data,\n }),\n );\n } else {\n console.log(formatSuccess(`${filePath} is valid.`));\n }\n } else {\n const issues = result.error.issues.map((issue) => ({\n path: issue.path.join('.'),\n message: issue.message,\n }));\n\n if (opts.format === 'json') {\n console.log(\n formatJson({\n valid: false,\n file: filePath,\n issues,\n }),\n );\n } else {\n console.error(chalk.red(`Validation failed for ${filePath}:`));\n for (const issue of issues) {\n console.error(chalk.red(` ${issue.path}: ${issue.message}`));\n }\n }\n process.exit(1);\n }\n } catch (err) {\n console.error(formatError((err as Error).message));\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport path from 'node:path';\nimport { readFileSync, writeFileSync, mkdirSync, existsSync, readdirSync } from 'node:fs';\nimport * as yaml from 'yaml';\nimport {\n compile,\n loadConfig,\n computeTier,\n createAdapter,\n suggestEnrichments,\n inferSemanticRole,\n inferAggregation,\n} from '@runcontext/core';\nimport type { DataSourceConfig } from '@runcontext/core';\nimport { parseDbUrl } from './introspect.js';\n\n/**\n * Recursively search a directory for a file matching a glob-like pattern.\n * Returns the first match or undefined.\n */\nfunction findFileRecursive(dir: string, suffix: string): string | undefined {\n if (!existsSync(dir)) return undefined;\n const entries = readdirSync(dir, { withFileTypes: true });\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n const found = findFileRecursive(fullPath, suffix);\n if (found) return found;\n } else if (entry.name.endsWith(suffix)) {\n return fullPath;\n }\n }\n return undefined;\n}\n\nexport const enrichCommand = new Command('enrich')\n .description('Suggest or apply metadata enrichments to reach a target tier')\n .option('--target <tier>', 'Target tier: silver or gold', 'silver')\n .option('--apply', 'Write suggestions to YAML files')\n .option('--source <name>', 'Data source for sample values')\n .option('--db <url>', 'Database URL for sample values')\n .option('--context-dir <path>', 'Path to context directory')\n .action(async (opts) => {\n try {\n const config = loadConfig(process.cwd());\n const contextDir = opts.contextDir\n ? path.resolve(opts.contextDir)\n : path.resolve(config.context_dir);\n const target = opts.target;\n\n if (!['silver', 'gold'].includes(target)) {\n console.error(chalk.red('--target must be \"silver\" or \"gold\"'));\n process.exit(1);\n }\n\n // Compile graph — follows the pattern from tier command\n const { graph } = await compile({ contextDir, config });\n\n for (const [modelName] of graph.models) {\n const tierScore = computeTier(modelName, graph);\n console.log(chalk.bold(`${modelName}: ${tierScore.tier.toUpperCase()}`));\n\n if (tierScore.tier === target || (target === 'silver' && tierScore.tier === 'gold')) {\n console.log(chalk.green(` Already at ${target} or above.\\n`));\n continue;\n }\n\n const model = graph.models.get(modelName)!;\n const datasetNames = model.datasets.map((d) => d.name);\n const suggestions = suggestEnrichments(target as 'silver' | 'gold', tierScore, datasetNames);\n\n if (\n !suggestions.governance &&\n !suggestions.lineage &&\n !suggestions.glossaryTerms &&\n !suggestions.needsRulesFile &&\n !suggestions.needsSampleValues &&\n !suggestions.needsSemanticRoles\n ) {\n console.log(chalk.green(' No suggestions needed.\\n'));\n continue;\n }\n\n // Report suggestions\n if (suggestions.governance?.trust) {\n console.log(chalk.yellow(` + Add trust: ${suggestions.governance.trust}`));\n }\n if (suggestions.governance?.tags) {\n console.log(chalk.yellow(` + Add tags: [${suggestions.governance.tags.join(', ')}]`));\n }\n if (suggestions.governance?.refreshAll) {\n console.log(chalk.yellow(` + Add refresh: ${suggestions.governance.refreshAll}`));\n }\n if (suggestions.lineage) {\n console.log(chalk.yellow(` + Add lineage with ${suggestions.lineage.upstream?.length ?? 0} upstream sources`));\n }\n if (suggestions.glossaryTerms) {\n console.log(chalk.yellow(` + Generate ${suggestions.glossaryTerms.length} glossary term(s)`));\n }\n if (suggestions.needsSampleValues) {\n console.log(chalk.yellow(' + Populate sample_values from database'));\n }\n if (suggestions.needsSemanticRoles) {\n console.log(chalk.yellow(' + Infer semantic_role for all fields'));\n }\n if (suggestions.needsRulesFile) {\n console.log(chalk.yellow(' + Generate rules file'));\n }\n\n if (!opts.apply) {\n console.log(chalk.cyan('\\n Run with --apply to write these changes.\\n'));\n continue;\n }\n\n // Apply suggestions to governance YAML\n const govFilePath = findFileRecursive(contextDir, `${modelName}.governance.yaml`);\n if (govFilePath) {\n const govContent = readFileSync(govFilePath, 'utf-8');\n const govDoc = yaml.parse(govContent) ?? {};\n\n if (suggestions.governance?.trust) {\n govDoc.trust = suggestions.governance.trust;\n }\n if (suggestions.governance?.tags) {\n govDoc.tags = suggestions.governance.tags;\n }\n if (suggestions.governance?.refreshAll) {\n for (const dsName of Object.keys(govDoc.datasets ?? {})) {\n govDoc.datasets[dsName].refresh = suggestions.governance.refreshAll;\n }\n }\n\n // Infer semantic roles if needed\n if (suggestions.needsSemanticRoles) {\n govDoc.fields = govDoc.fields ?? {};\n let adapter: any = null;\n const dsConfig: DataSourceConfig | undefined = opts.db\n ? parseDbUrl(opts.db)\n : config.data_sources?.[opts.source ?? Object.keys(config.data_sources ?? {})[0]];\n\n if (dsConfig) {\n adapter = await createAdapter(dsConfig);\n await adapter.connect();\n }\n\n for (const ds of model.datasets) {\n let columns: any[] = [];\n if (adapter) {\n const tableName = ds.source?.split('.').pop() ?? ds.name;\n try {\n columns = await adapter.listColumns(tableName);\n } catch {\n // Column introspection failed — fall back to name-based heuristics\n }\n }\n for (const field of ds.fields ?? []) {\n const fieldKey = `${ds.name}.${field.name}`;\n if (govDoc.fields[fieldKey]?.semantic_role) continue;\n const col = columns.find((c: any) => c.name === field.name);\n const isPK = col?.is_primary_key ?? field.name.endsWith('_id');\n const dataType = col?.data_type ?? 'VARCHAR';\n govDoc.fields[fieldKey] = govDoc.fields[fieldKey] ?? {};\n const role = inferSemanticRole(field.name, dataType, isPK);\n govDoc.fields[fieldKey].semantic_role = role;\n if (role === 'metric') {\n govDoc.fields[fieldKey].default_aggregation = inferAggregation(field.name);\n govDoc.fields[fieldKey].additive = govDoc.fields[fieldKey].default_aggregation === 'SUM';\n }\n }\n }\n\n if (adapter) await adapter.disconnect();\n }\n\n // Populate sample values if needed\n if (suggestions.needsSampleValues) {\n govDoc.fields = govDoc.fields ?? {};\n const dsConfig2: DataSourceConfig | undefined = opts.db\n ? parseDbUrl(opts.db)\n : config.data_sources?.[opts.source ?? Object.keys(config.data_sources ?? {})[0]];\n\n if (dsConfig2) {\n const adapter2 = await createAdapter(dsConfig2);\n await adapter2.connect();\n let count = 0;\n for (const ds of model.datasets) {\n if (count >= 2) break;\n const tableName = ds.source?.split('.').pop() ?? ds.name;\n for (const field of ds.fields ?? []) {\n if (count >= 2) break;\n const fieldKey = `${ds.name}.${field.name}`;\n if (govDoc.fields[fieldKey]?.sample_values?.length > 0) continue;\n try {\n const result = await adapter2.query(\n `SELECT DISTINCT CAST(\"${field.name}\" AS VARCHAR) AS val FROM \"${tableName}\" WHERE \"${field.name}\" IS NOT NULL LIMIT 5`,\n );\n if (result.rows.length > 0) {\n govDoc.fields[fieldKey] = govDoc.fields[fieldKey] ?? {};\n govDoc.fields[fieldKey].sample_values = result.rows.map((r: any) => String(r.val));\n count++;\n }\n } catch {\n // Query failed — skip this field\n }\n }\n }\n await adapter2.disconnect();\n }\n }\n\n writeFileSync(govFilePath, yaml.stringify(govDoc, { lineWidth: 120 }), 'utf-8');\n console.log(chalk.green(` Updated: ${path.relative(process.cwd(), govFilePath)}`));\n }\n\n // Write lineage file\n if (suggestions.lineage) {\n const lineageDir = path.join(contextDir, 'lineage');\n if (!existsSync(lineageDir)) mkdirSync(lineageDir, { recursive: true });\n const lineagePath = path.join(lineageDir, `${modelName}.lineage.yaml`);\n if (!existsSync(lineagePath)) {\n const lineageDoc = {\n model: modelName,\n upstream: suggestions.lineage.upstream,\n };\n writeFileSync(lineagePath, yaml.stringify(lineageDoc, { lineWidth: 120 }), 'utf-8');\n console.log(chalk.green(` Created: ${path.relative(process.cwd(), lineagePath)}`));\n }\n }\n\n // Write glossary terms\n if (suggestions.glossaryTerms) {\n const glossaryDir = path.join(contextDir, 'glossary');\n if (!existsSync(glossaryDir)) mkdirSync(glossaryDir, { recursive: true });\n for (const term of suggestions.glossaryTerms) {\n const termPath = path.join(glossaryDir, `${term.id}.term.yaml`);\n if (!existsSync(termPath)) {\n writeFileSync(termPath, yaml.stringify(term, { lineWidth: 120 }), 'utf-8');\n console.log(chalk.green(` Created: ${path.relative(process.cwd(), termPath)}`));\n }\n }\n }\n\n // Stub rules file\n if (suggestions.needsRulesFile) {\n const rulesDir = path.join(contextDir, 'rules');\n if (!existsSync(rulesDir)) mkdirSync(rulesDir, { recursive: true });\n const rulesPath = path.join(rulesDir, `${modelName}.rules.yaml`);\n if (!existsSync(rulesPath)) {\n const rulesDoc = {\n model: modelName,\n golden_queries: [\n { question: 'TODO: What is the total count?', sql: 'SELECT COUNT(*) FROM table_name' },\n { question: 'TODO: What are the top records?', sql: 'SELECT * FROM table_name LIMIT 10' },\n { question: 'TODO: What is the distribution?', sql: 'SELECT column, COUNT(*) FROM table_name GROUP BY column' },\n ],\n business_rules: [\n { name: 'TODO: rule-name', definition: 'TODO: describe the business rule' },\n ],\n guardrail_filters: [\n { name: 'TODO: filter-name', filter: 'column IS NOT NULL', reason: 'TODO: explain why' },\n ],\n hierarchies: [\n { name: 'TODO: hierarchy-name', levels: ['level1', 'level2'], dataset: datasetNames[0] ?? 'dataset' },\n ],\n };\n writeFileSync(rulesPath, yaml.stringify(rulesDoc, { lineWidth: 120 }), 'utf-8');\n console.log(chalk.green(` Created: ${path.relative(process.cwd(), rulesPath)} (with TODOs)`));\n }\n }\n\n console.log('');\n }\n } catch (err) {\n console.error(chalk.red(`Enrich failed: ${(err as Error).message}`));\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { ALL_RULES, type LintRule, type RuleTier } from '@runcontext/core';\nimport { formatJson } from '../formatters/json.js';\n\nfunction formatRuleTable(rules: LintRule[]): string {\n if (rules.length === 0) {\n return chalk.gray('No rules match the filters.');\n }\n\n const lines: string[] = [];\n\n // Header\n const header = `${'ID'.padEnd(40)} ${'Tier'.padEnd(8)} ${'Severity'.padEnd(10)} ${'Fix'.padEnd(5)} Description`;\n lines.push(chalk.bold(header));\n lines.push(chalk.gray('─'.repeat(100)));\n\n for (const rule of rules) {\n const tier = rule.tier ?? '—';\n const tierCol = colorTier(tier);\n const fixCol = rule.fixable ? chalk.green('yes') : chalk.gray('no');\n const sevCol =\n rule.defaultSeverity === 'error'\n ? chalk.red(rule.defaultSeverity)\n : chalk.yellow(rule.defaultSeverity);\n const deprecated = rule.deprecated ? chalk.gray(' (deprecated)') : '';\n\n lines.push(\n `${rule.id.padEnd(40)} ${tierCol.padEnd(8 + (tierCol.length - tier.length))} ${sevCol.padEnd(10 + (sevCol.length - rule.defaultSeverity.length))} ${fixCol.padEnd(5 + (fixCol.length - (rule.fixable ? 3 : 2)))} ${rule.description}${deprecated}`,\n );\n }\n\n lines.push('');\n lines.push(chalk.gray(`${rules.length} rule(s) total`));\n\n return lines.join('\\n');\n}\n\nfunction colorTier(tier: string): string {\n switch (tier) {\n case 'gold':\n return chalk.yellow(tier);\n case 'silver':\n return chalk.white(tier);\n case 'bronze':\n return chalk.hex('#CD7F32')(tier);\n default:\n return chalk.gray(tier);\n }\n}\n\nexport const rulesCommand = new Command('rules')\n .description('List all lint rules with metadata')\n .option('--tier <tier>', 'Filter by tier: bronze, silver, gold')\n .option('--fixable', 'Show only fixable rules')\n .option('--format <type>', 'Output format: pretty or json', 'pretty')\n .action((opts) => {\n let rules = [...ALL_RULES];\n\n // Filter by tier\n if (opts.tier) {\n const tier = opts.tier as RuleTier;\n rules = rules.filter((r) => r.tier === tier);\n }\n\n // Filter by fixable\n if (opts.fixable) {\n rules = rules.filter((r) => r.fixable);\n }\n\n if (opts.format === 'json') {\n const data = rules.map((r) => ({\n id: r.id,\n tier: r.tier ?? null,\n defaultSeverity: r.defaultSeverity,\n fixable: r.fixable,\n description: r.description,\n deprecated: r.deprecated ?? false,\n replacedBy: r.replacedBy ?? null,\n }));\n console.log(formatJson(data));\n } else {\n console.log(formatRuleTable(rules));\n }\n });\n","import { Command } from 'commander';\nimport * as p from '@clack/prompts';\nimport chalk from 'chalk';\nimport { runConnectStep } from '../setup/steps/connect.js';\nimport { runScaffoldStep } from '../setup/steps/scaffold.js';\nimport { runEnrichSilverStep } from '../setup/steps/enrich-silver.js';\nimport { runEnrichGoldStep } from '../setup/steps/enrich-gold.js';\nimport { runVerifyStep } from '../setup/steps/verify.js';\nimport { runAutofixStep } from '../setup/steps/autofix.js';\nimport { runAgentInstructionsStep } from '../setup/steps/claude-md.js';\nimport { displayTierScore } from '../setup/display.js';\n\nexport const setupCommand = new Command('setup')\n .description('Interactive wizard — detects databases, introspects schema, scaffolds metadata, enriches to Silver, generates agent instructions. Supports DuckDB, PostgreSQL, MySQL, SQL Server, SQLite, Snowflake, BigQuery, ClickHouse, and Databricks.')\n .action(async () => {\n p.intro(chalk.bgCyan(chalk.black(' ContextKit Setup ')));\n\n const ctx = await runConnectStep();\n if (!ctx) return;\n\n try {\n // Build step list based on target tier\n const steps: Array<{ name: string; fn: (ctx: any) => Promise<any> }> = [\n { name: 'Scaffold Bronze', fn: runScaffoldStep },\n ];\n\n if (ctx.targetTier === 'silver' || ctx.targetTier === 'gold') {\n steps.push({ name: 'Enrich to Silver', fn: runEnrichSilverStep });\n }\n if (ctx.targetTier === 'gold') {\n steps.push({ name: 'Enrich to Gold', fn: runEnrichGoldStep });\n }\n\n steps.push(\n { name: 'Verify data', fn: runVerifyStep },\n { name: 'Auto-fix', fn: runAutofixStep },\n { name: 'Generate agent instructions', fn: runAgentInstructionsStep },\n );\n\n // Run each step\n const results: Array<{ name: string; summary: string }> = [];\n for (let i = 0; i < steps.length; i++) {\n const step = steps[i]!;\n p.log.step(`${chalk.dim(`[${i + 1}/${steps.length}]`)} ${step.name}`);\n const result = await step.fn(ctx);\n results.push({ name: step.name, summary: result.summary });\n }\n\n // Final summary\n const summaryLines = results\n .map((r) => ` ${chalk.green('+')} ${r.name}: ${r.summary}`)\n .join('\\n');\n p.note(summaryLines, 'Summary');\n\n if (ctx.tierScore) {\n displayTierScore(ctx.tierScore);\n }\n\n // Show next steps based on current tier vs target\n const currentTier = ctx.tierScore?.tier ?? 'none';\n const reachedTarget =\n (ctx.targetTier === 'bronze' && ['bronze', 'silver', 'gold'].includes(currentTier)) ||\n (ctx.targetTier === 'silver' && ['silver', 'gold'].includes(currentTier)) ||\n (ctx.targetTier === 'gold' && currentTier === 'gold');\n\n if (reachedTarget) {\n p.outro(`Done! You're at ${chalk.bold(currentTier.toUpperCase())}. Run ${chalk.cyan('context tier')} anytime to check.`);\n } else if (ctx.targetTier === 'gold' && currentTier !== 'gold') {\n // Gold needs AI curation — show the handoff\n const nextSteps = [\n `Your metadata is at ${chalk.bold(currentTier.toUpperCase())} — Gold needs human curation.`,\n '',\n `${chalk.bold('If you\\'re an AI agent:')}`,\n ` Read ${chalk.cyan('context/AGENT_INSTRUCTIONS.md')} for the full curation guide.`,\n ` Run ${chalk.cyan('context tier')} → pick a failing check → query the database → fix it → repeat.`,\n ` Ask the user about ownership, metric intent, and business rules as you go.`,\n '',\n `${chalk.bold('If you\\'re a human:')}`,\n ` Tell your AI agent: \"Read context/AGENT_INSTRUCTIONS.md and get this project to Gold.\"`,\n ` The agent will go back and forth with you, asking about your data as it builds.`,\n ` Or use ${chalk.cyan('context dev --studio')} to edit metadata visually in the browser.`,\n ];\n p.note(nextSteps.join('\\n'), 'Next Steps');\n p.outro(`Run ${chalk.cyan('context tier')} to check your scorecard.`);\n } else {\n p.outro(`Run ${chalk.cyan('context tier')} to check your scorecard.`);\n }\n } finally {\n try {\n await ctx.adapter.disconnect();\n } catch {\n // ignore disconnect errors\n }\n }\n });\n","import * as p from '@clack/prompts';\nimport path from 'node:path';\nimport { existsSync, readFileSync, writeFileSync } from 'node:fs';\nimport { execFileSync } from 'node:child_process';\nimport * as yaml from 'yaml';\nimport { loadConfig, createAdapter, MissingDriverError } from '@runcontext/core';\nimport type { ColumnInfo, DataSourceConfig } from '@runcontext/core';\nimport { parseDbUrl } from '../../commands/introspect.js';\nimport { discoverDatabases, toDataSourceConfig } from '../mcp-discovery.js';\nimport type { SetupContext, TargetTier, UserIntent } from '../types.js';\n\ninterface DetectedDb {\n dsConfig: DataSourceConfig;\n label: string;\n}\n\n/** Try to auto-detect a single database from config, env vars, or MCP config. */\nfunction autoDetectDb(cwd: string): DetectedDb | undefined {\n // 1. contextkit.config.yaml\n try {\n const config = loadConfig(cwd);\n if (config.data_sources && Object.keys(config.data_sources).length > 0) {\n const name = Object.keys(config.data_sources)[0]!;\n const ds = config.data_sources[name]!;\n const loc = ds.path ?? ds.connection ?? name;\n return { dsConfig: ds, label: `${ds.adapter} — ${loc} (from contextkit.config.yaml)` };\n }\n } catch { /* no config */ }\n\n // 2. Environment variables\n if (process.env.DATABASE_URL) {\n try {\n const ds = parseDbUrl(process.env.DATABASE_URL);\n return { dsConfig: ds, label: `${ds.adapter} — $DATABASE_URL` };\n } catch { /* invalid */ }\n }\n if (process.env.DUCKDB_PATH && existsSync(process.env.DUCKDB_PATH)) {\n return {\n dsConfig: { adapter: 'duckdb', path: process.env.DUCKDB_PATH },\n label: `duckdb — $DUCKDB_PATH`,\n };\n }\n\n // 3. MCP config discovery (multiple files)\n try {\n const discovered = discoverDatabases(cwd);\n if (discovered.length > 0) {\n const first = discovered[0]!;\n const ds = toDataSourceConfig(first);\n if (ds) {\n return { dsConfig: ds, label: first.label };\n }\n }\n } catch { /* discovery failed */ }\n\n // 4. Legacy fallback: .claude/mcp.json duckdb server\n const mcpPath = path.join(cwd, '.claude', 'mcp.json');\n if (existsSync(mcpPath)) {\n try {\n const mcpConfig = JSON.parse(readFileSync(mcpPath, 'utf-8'));\n const duckdbServer = mcpConfig.mcpServers?.duckdb;\n if (duckdbServer?.args) {\n const args = duckdbServer.args as string[];\n const idx = args.indexOf('--db-path');\n if (idx >= 0 && args[idx + 1]) {\n const dbPath = args[idx + 1]!;\n if (existsSync(dbPath)) {\n return {\n dsConfig: { adapter: 'duckdb', path: dbPath },\n label: `duckdb — ${path.basename(dbPath)} (from .claude/mcp.json)`,\n };\n }\n }\n }\n } catch { /* malformed */ }\n }\n\n return undefined;\n}\n\n/** Discover all databases from MCP config files for the selection menu. */\nfunction discoverAllDatabases(cwd: string): DetectedDb[] {\n try {\n return discoverDatabases(cwd)\n .map((d) => {\n const dsConfig = toDataSourceConfig(d);\n if (!dsConfig) return null;\n return { dsConfig, label: d.label };\n })\n .filter((d): d is DetectedDb => d !== null);\n } catch {\n return [];\n }\n}\n\n/** Prompt for file path or env var (DuckDB / SQLite). */\nasync function promptForFileDb(\n adapter: 'duckdb' | 'sqlite',\n ext: string,\n envDefault: string,\n): Promise<DataSourceConfig | undefined> {\n const method = await p.select({\n message: 'How do you connect?',\n options: [\n { value: 'env', label: 'Environment variable', hint: `e.g. ${envDefault}` },\n { value: 'path', label: 'File path', hint: `e.g. ./warehouse${ext}` },\n ],\n });\n if (p.isCancel(method)) return undefined;\n\n if (method === 'env') {\n const envName = await p.text({\n message: 'Environment variable name',\n initialValue: envDefault,\n validate(value) {\n if (!value) return 'Required';\n const resolved = process.env[value];\n if (!resolved) return `$${value} is not set`;\n if (!existsSync(resolved)) return `$${value} points to \"${resolved}\" which does not exist`;\n },\n });\n if (p.isCancel(envName)) return undefined;\n return { adapter, path: process.env[envName as string]! } as DataSourceConfig;\n } else {\n const filePath = await p.text({\n message: `Path to ${ext} file`,\n placeholder: `./warehouse${ext}`,\n validate(value) {\n if (!value) return 'Required';\n if (!existsSync(value)) return `File not found: ${value}`;\n },\n });\n if (p.isCancel(filePath)) return undefined;\n return { adapter, path: path.resolve(filePath as string) } as DataSourceConfig;\n }\n}\n\n/** Prompt for connection-string based databases (Postgres, MySQL, MSSQL). */\nasync function promptForConnectionString(\n adapter: 'postgres' | 'mysql' | 'mssql',\n scheme: string,\n envDefault: string,\n): Promise<DataSourceConfig | undefined> {\n const method = await p.select({\n message: 'How do you connect?',\n options: [\n { value: 'env', label: 'Environment variable', hint: `e.g. ${envDefault}` },\n { value: 'url', label: 'Connection string', hint: `${scheme}://...` },\n ],\n });\n if (p.isCancel(method)) return undefined;\n\n if (method === 'env') {\n const envName = await p.text({\n message: 'Environment variable name',\n initialValue: envDefault,\n validate(value) {\n if (!value) return 'Required';\n const resolved = process.env[value];\n if (!resolved) return `$${value} is not set`;\n },\n });\n if (p.isCancel(envName)) return undefined;\n return { adapter, connection: process.env[envName as string]! } as DataSourceConfig;\n } else {\n const url = await p.text({\n message: 'Connection string',\n placeholder: `${scheme}://user:pass@host:5432/dbname`,\n validate(value) {\n if (!value) return 'Required';\n if (!value.startsWith(`${scheme}://`)) {\n return `Must start with ${scheme}://`;\n }\n },\n });\n if (p.isCancel(url)) return undefined;\n return { adapter, connection: url as string } as DataSourceConfig;\n }\n}\n\n/** Prompt for Snowflake credentials. */\nasync function promptForSnowflake(): Promise<DataSourceConfig | undefined> {\n const account = await p.text({\n message: 'Snowflake account identifier',\n placeholder: 'xy12345.us-east-1',\n validate(value) { if (!value) return 'Required'; },\n });\n if (p.isCancel(account)) return undefined;\n\n const username = await p.text({\n message: 'Username',\n validate(value) { if (!value) return 'Required'; },\n });\n if (p.isCancel(username)) return undefined;\n\n const password = await p.password({\n message: 'Password',\n validate(value) { if (!value) return 'Required'; },\n });\n if (p.isCancel(password)) return undefined;\n\n const warehouse = await p.text({\n message: 'Warehouse',\n placeholder: 'COMPUTE_WH',\n validate(value) { if (!value) return 'Required'; },\n });\n if (p.isCancel(warehouse)) return undefined;\n\n const database = await p.text({\n message: 'Database',\n validate(value) { if (!value) return 'Required'; },\n });\n if (p.isCancel(database)) return undefined;\n\n const schema = await p.text({\n message: 'Schema',\n initialValue: 'PUBLIC',\n validate(value) { if (!value) return 'Required'; },\n });\n if (p.isCancel(schema)) return undefined;\n\n return {\n adapter: 'snowflake',\n account: account as string,\n username: username as string,\n password: password as string,\n warehouse: warehouse as string,\n database: database as string,\n schema: schema as string,\n } as DataSourceConfig;\n}\n\n/** Prompt for BigQuery credentials. */\nasync function promptForBigQuery(): Promise<DataSourceConfig | undefined> {\n const project = await p.text({\n message: 'Google Cloud project ID',\n validate(value) { if (!value) return 'Required'; },\n });\n if (p.isCancel(project)) return undefined;\n\n const dataset = await p.text({\n message: 'Dataset',\n validate(value) { if (!value) return 'Required'; },\n });\n if (p.isCancel(dataset)) return undefined;\n\n const keyFilename = await p.text({\n message: 'Path to service account key file (JSON)',\n placeholder: './service-account.json',\n validate(value) {\n if (!value) return 'Required';\n if (!existsSync(value)) return `File not found: ${value}`;\n },\n });\n if (p.isCancel(keyFilename)) return undefined;\n\n return {\n adapter: 'bigquery',\n project: project as string,\n dataset: dataset as string,\n keyFilename: path.resolve(keyFilename as string),\n } as DataSourceConfig;\n}\n\n/** Prompt for ClickHouse credentials. */\nasync function promptForClickHouse(): Promise<DataSourceConfig | undefined> {\n const host = await p.text({\n message: 'Host',\n initialValue: 'localhost',\n validate(value) { if (!value) return 'Required'; },\n });\n if (p.isCancel(host)) return undefined;\n\n const port = await p.text({\n message: 'HTTP port',\n initialValue: '8123',\n validate(value) {\n if (!value) return 'Required';\n if (!/^\\d+$/.test(value)) return 'Must be a number';\n },\n });\n if (p.isCancel(port)) return undefined;\n\n const database = await p.text({\n message: 'Database',\n initialValue: 'default',\n validate(value) { if (!value) return 'Required'; },\n });\n if (p.isCancel(database)) return undefined;\n\n const username = await p.text({\n message: 'Username',\n initialValue: 'default',\n validate(value) { if (!value) return 'Required'; },\n });\n if (p.isCancel(username)) return undefined;\n\n const password = await p.password({\n message: 'Password (leave empty if none)',\n });\n if (p.isCancel(password)) return undefined;\n\n return {\n adapter: 'clickhouse',\n host: host as string,\n port: parseInt(port as string, 10),\n database: database as string,\n username: username as string,\n password: (password as string) || undefined,\n } as DataSourceConfig;\n}\n\n/** Prompt for Databricks credentials. */\nasync function promptForDatabricks(): Promise<DataSourceConfig | undefined> {\n const serverHostname = await p.text({\n message: 'Server hostname',\n placeholder: 'abc-12345678-wxyz.cloud.databricks.com',\n validate(value) { if (!value) return 'Required'; },\n });\n if (p.isCancel(serverHostname)) return undefined;\n\n const httpPath = await p.text({\n message: 'HTTP path',\n placeholder: '/sql/1.0/warehouses/abcdef1234567890',\n validate(value) { if (!value) return 'Required'; },\n });\n if (p.isCancel(httpPath)) return undefined;\n\n const token = await p.password({\n message: 'Personal access token',\n validate(value) { if (!value) return 'Required'; },\n });\n if (p.isCancel(token)) return undefined;\n\n return {\n adapter: 'databricks',\n serverHostname: serverHostname as string,\n httpPath: httpPath as string,\n token: token as string,\n } as DataSourceConfig;\n}\n\n/** Prompt user to select a connector and provide connection details. */\nasync function promptForConnection(): Promise<DataSourceConfig | undefined> {\n const cwd = process.cwd();\n const discovered = discoverAllDatabases(cwd);\n\n // Use string values for all options; discovered dbs use \"discovered:N\" keys\n const discoveredMap = new Map<string, DataSourceConfig>();\n const options: Array<{ value: string; label: string; hint?: string }> = [];\n\n for (let i = 0; i < discovered.length; i++) {\n const key = `discovered:${i}`;\n discoveredMap.set(key, discovered[i]!.dsConfig);\n options.push({ value: key, label: discovered[i]!.label });\n }\n\n if (discovered.length > 0) {\n options.push({ value: '__separator__', label: '\\u2500\\u2500\\u2500 Or connect manually \\u2500\\u2500\\u2500' });\n }\n\n options.push(\n { value: 'duckdb', label: 'DuckDB', hint: 'Local .duckdb file' },\n { value: 'postgres', label: 'PostgreSQL', hint: 'Connection string' },\n { value: 'mysql', label: 'MySQL / MariaDB', hint: 'Connection string' },\n { value: 'mssql', label: 'SQL Server', hint: 'Connection string' },\n { value: 'snowflake', label: 'Snowflake', hint: 'Account credentials' },\n { value: 'bigquery', label: 'BigQuery', hint: 'Google Cloud project' },\n { value: 'clickhouse', label: 'ClickHouse', hint: 'HTTP connection' },\n { value: 'databricks', label: 'Databricks', hint: 'Workspace connection' },\n { value: 'sqlite', label: 'SQLite', hint: 'Local .db file' },\n );\n\n const selection = await p.select({\n message: 'Select your database',\n options,\n });\n if (p.isCancel(selection)) return undefined;\n\n const connector = selection as string;\n\n // If user picked a discovered database, return its config directly\n if (discoveredMap.has(connector)) {\n return discoveredMap.get(connector)!;\n }\n\n // If user somehow picked the separator, re-prompt\n if (connector === '__separator__') return promptForConnection();\n\n switch (connector) {\n case 'duckdb':\n return promptForFileDb('duckdb', '.duckdb', 'DUCKDB_PATH');\n case 'sqlite':\n return promptForFileDb('sqlite', '.db', 'SQLITE_PATH');\n case 'postgres':\n return promptForConnectionString('postgres', 'postgres', 'DATABASE_URL');\n case 'mysql':\n return promptForConnectionString('mysql', 'mysql', 'MYSQL_URL');\n case 'mssql':\n return promptForConnectionString('mssql', 'mssql', 'MSSQL_URL');\n case 'snowflake':\n return promptForSnowflake();\n case 'bigquery':\n return promptForBigQuery();\n case 'clickhouse':\n return promptForClickHouse();\n case 'databricks':\n return promptForDatabricks();\n default:\n return undefined;\n }\n}\n\nexport async function runConnectStep(): Promise<SetupContext | undefined> {\n const cwd = process.cwd();\n let dsConfig: DataSourceConfig;\n\n // Auto-detect first\n const detected = autoDetectDb(cwd);\n\n if (detected) {\n p.log.info(`Detected: ${detected.label}`);\n const useDetected = await p.confirm({ message: 'Use this database?' });\n if (p.isCancel(useDetected)) {\n p.cancel('Setup cancelled.');\n return undefined;\n }\n if (useDetected) {\n dsConfig = detected.dsConfig;\n } else {\n const manual = await promptForConnection();\n if (!manual) { p.cancel('Setup cancelled.'); return undefined; }\n dsConfig = manual;\n }\n } else {\n const manual = await promptForConnection();\n if (!manual) { p.cancel('Setup cancelled.'); return undefined; }\n dsConfig = manual;\n }\n\n // Connect and discover\n const spin = p.spinner();\n spin.start('Connecting to database...');\n\n let adapter;\n try {\n adapter = await createAdapter(dsConfig);\n await adapter.connect();\n } catch (err) {\n spin.stop('Connection failed');\n\n if (err instanceof MissingDriverError) {\n p.log.warn(`The ${err.adapter} adapter requires the \"${err.driverPackage}\" npm package.`);\n const shouldInstall = await p.confirm({\n message: `Install \"${err.driverPackage}\" now?`,\n });\n\n if (!p.isCancel(shouldInstall) && shouldInstall) {\n const installSpin = p.spinner();\n installSpin.start(`Installing ${err.driverPackage}...`);\n try {\n // Use execFileSync to avoid shell injection — package name is from a hardcoded map\n execFileSync('npm', ['install', err.driverPackage], {\n stdio: 'pipe',\n cwd: process.cwd(),\n });\n installSpin.stop(`Installed ${err.driverPackage}`);\n\n // Retry connection\n spin.start('Retrying connection...');\n try {\n adapter = await createAdapter(dsConfig);\n await adapter.connect();\n spin.stop('Connected');\n } catch (retryErr) {\n spin.stop('Connection failed');\n p.log.error((retryErr as Error).message);\n p.cancel('Could not connect to database.');\n return undefined;\n }\n } catch {\n installSpin.stop('Installation failed');\n p.log.error(`Could not install ${err.driverPackage}. Try manually:\\n npm install ${err.driverPackage}`);\n p.cancel('Could not connect to database.');\n return undefined;\n }\n } else {\n p.log.info(`Install it manually with:\\n npm install ${err.driverPackage}`);\n p.cancel('Could not connect to database.');\n return undefined;\n }\n } else {\n p.log.error((err as Error).message);\n p.cancel('Could not connect to database.');\n return undefined;\n }\n }\n\n const allTables = await adapter.listTables();\n spin.stop(`Found ${allTables.length} tables`);\n\n // Let user select which tables to include\n let tables = allTables;\n if (allTables.length > 1) {\n const tableSelection = await p.multiselect({\n message: `Select tables to include (${allTables.length} found)`,\n options: allTables.map((t) => ({\n value: t.name,\n label: t.name,\n hint: `${t.row_count.toLocaleString()} rows`,\n })),\n initialValues: allTables.map((t) => t.name),\n required: true,\n });\n if (p.isCancel(tableSelection)) {\n p.cancel('Setup cancelled.');\n await adapter.disconnect();\n return undefined;\n }\n const selected = new Set(tableSelection as string[]);\n tables = allTables.filter((t) => selected.has(t.name));\n }\n\n // Introspect columns for selected tables\n const colSpin = p.spinner();\n colSpin.start(`Introspecting ${tables.length} tables...`);\n const columns: Record<string, ColumnInfo[]> = {};\n for (const table of tables) {\n columns[table.name] = await adapter.listColumns(table.name);\n }\n const totalCols = Object.values(columns).reduce((sum, c) => sum + c.length, 0);\n colSpin.stop(`${tables.length} tables, ${totalCols} columns`);\n\n // Show selected tables\n const tableLines = tables\n .map((t) => ` ${t.name.padEnd(30)} ${t.row_count.toLocaleString()} rows`)\n .join('\\n');\n p.note(tableLines, 'Selected Tables');\n\n // Model name\n const defaultModel = path.basename(cwd).replace(/[^a-z0-9-]/gi, '-').toLowerCase();\n const modelInput = await p.text({\n message: 'Model name',\n initialValue: defaultModel,\n validate(value) {\n if (!value) return 'Required';\n if (!/^[a-z0-9-]+$/.test(value)) return 'Use lowercase letters, numbers, and hyphens only';\n },\n });\n if (p.isCancel(modelInput)) {\n p.cancel('Setup cancelled.');\n await adapter.disconnect();\n return undefined;\n }\n\n // Target tier\n const tierInput = await p.select({\n message: 'Target metadata tier',\n options: [\n { value: 'bronze', label: 'Bronze', hint: 'Schema + ownership + grain' },\n { value: 'silver', label: 'Silver', hint: '+ trust, lineage, glossary, refresh, sample values' },\n { value: 'gold', label: 'Gold', hint: '+ semantic roles, rules, golden queries (needs curation)' },\n ],\n });\n if (p.isCancel(tierInput)) {\n p.cancel('Setup cancelled.');\n await adapter.disconnect();\n return undefined;\n }\n\n // Gather user intent for AI-guided curation\n let intent: UserIntent | undefined;\n\n const wantsIntent = await p.confirm({\n message: 'Describe what you\\'re building? (helps AI agents curate better metadata)',\n });\n\n if (!p.isCancel(wantsIntent) && wantsIntent) {\n const goalsInput = await p.text({\n message: 'What are you trying to accomplish with this data?',\n placeholder: 'e.g., Analyze coffee shop site selection using demographic and market signals',\n });\n if (p.isCancel(goalsInput)) {\n p.cancel('Setup cancelled.');\n await adapter.disconnect();\n return undefined;\n }\n\n const metricsInput = await p.text({\n message: 'What metrics or outcomes matter most? (optional)',\n placeholder: 'e.g., opportunity score, supply saturation, demand signals',\n });\n\n const audienceInput = await p.text({\n message: 'Who will consume this data? (optional)',\n placeholder: 'e.g., AI agents writing SQL, analysts building dashboards',\n });\n\n intent = {\n goals: goalsInput as string,\n metrics: p.isCancel(metricsInput) ? undefined : (metricsInput as string) || undefined,\n audience: p.isCancel(audienceInput) ? undefined : (audienceInput as string) || undefined,\n };\n }\n\n // Ensure config file\n const configPath = path.join(cwd, 'contextkit.config.yaml');\n let config;\n try {\n config = loadConfig(cwd);\n } catch {\n config = { context_dir: './context' };\n }\n\n if (!config.data_sources || Object.keys(config.data_sources).length === 0) {\n const newConfig = {\n context_dir: config.context_dir ?? './context',\n data_sources: { default: dsConfig },\n };\n writeFileSync(configPath, yaml.stringify(newConfig, { lineWidth: 120 }), 'utf-8');\n config = loadConfig(cwd);\n }\n\n const contextDir = path.resolve(cwd, config.context_dir ?? './context');\n\n return {\n cwd,\n contextDir,\n dsConfig,\n adapter,\n tables,\n columns,\n modelName: modelInput as string,\n targetTier: tierInput as TargetTier,\n intent,\n };\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport * as os from 'node:os';\nimport type { AdapterType, DataSourceConfig } from '@runcontext/core';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface McpConfigLocation {\n ide: string; // 'claude-code' | 'cursor' | 'vscode' | 'windsurf' | 'claude-desktop'\n scope: string; // 'user' | 'project' | 'managed'\n path: string; // resolved absolute path\n}\n\nexport interface DiscoveredDatabase {\n ide: string;\n scope: string;\n serverName: string;\n adapterType: AdapterType;\n connectionDetails: {\n path?: string;\n connection?: string;\n host?: string;\n port?: number;\n database?: string;\n command: string;\n args: string[];\n env?: Record<string, string>;\n };\n label: string;\n}\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\n/** Server-name substrings that hint at a database adapter type. */\nconst NAME_PATTERNS: Record<string, AdapterType> = {\n duckdb: 'duckdb',\n motherduck: 'duckdb',\n postgres: 'postgres',\n postgresql: 'postgres',\n neon: 'postgres',\n supabase: 'postgres',\n mysql: 'mysql',\n sqlite: 'sqlite',\n snowflake: 'snowflake',\n bigquery: 'bigquery',\n clickhouse: 'clickhouse',\n databricks: 'databricks',\n mssql: 'mssql',\n 'sql-server': 'mssql',\n redshift: 'postgres', // Redshift is Postgres-compatible\n};\n\n/** Known MCP package names mapped to adapter types. */\nconst PACKAGE_PATTERNS: Record<string, AdapterType> = {\n '@motherduck/mcp': 'duckdb',\n 'mcp-server-duckdb': 'duckdb',\n 'mcp-server-postgres': 'postgres',\n 'mcp-server-postgresql': 'postgres',\n '@neon/mcp': 'postgres',\n '@supabase/mcp': 'postgres',\n 'mcp-server-mysql': 'mysql',\n 'mcp-server-sqlite': 'sqlite',\n 'mcp-server-snowflake': 'snowflake',\n 'mcp-server-bigquery': 'bigquery',\n 'mcp-server-clickhouse': 'clickhouse',\n 'mcp-server-databricks': 'databricks',\n 'mcp-server-mssql': 'mssql',\n 'mcp-server-redshift': 'postgres',\n};\n\n/** Environment variable names that typically hold connection info. */\nconst CONNECTION_ENV_VARS = [\n 'DATABASE_URL',\n 'POSTGRES_URL',\n 'POSTGRESQL_URL',\n 'PG_CONNECTION_STRING',\n 'MYSQL_URL',\n 'MYSQL_CONNECTION_STRING',\n 'DUCKDB_PATH',\n 'SQLITE_PATH',\n 'SNOWFLAKE_ACCOUNT',\n 'BIGQUERY_PROJECT',\n 'CLICKHOUSE_URL',\n 'DATABRICKS_HOST',\n 'MSSQL_CONNECTION_STRING',\n 'REDSHIFT_URL',\n];\n\n/** CLI flag names that carry connection details. */\nconst CONNECTION_FLAGS = [\n '--db-path',\n '--database',\n '--connection-string',\n '--connection',\n '--host',\n '--port',\n '--db',\n '--dsn',\n];\n\n/** URI scheme prefixes for inline connection strings. */\nconst URI_SCHEMES: Record<string, AdapterType> = {\n 'postgres://': 'postgres',\n 'postgresql://': 'postgres',\n 'mysql://': 'mysql',\n 'clickhouse://': 'clickhouse',\n 'mssql://': 'mssql',\n 'jdbc:': 'postgres', // conservative fallback\n};\n\n// ---------------------------------------------------------------------------\n// Config location helpers\n// ---------------------------------------------------------------------------\n\nfunction getConfigLocations(cwd: string): McpConfigLocation[] {\n const home = os.homedir();\n const isMac = process.platform === 'darwin';\n\n const locations: McpConfigLocation[] = [\n // Claude Code\n { ide: 'claude-code', scope: 'user', path: path.join(home, '.claude.json') },\n { ide: 'claude-code', scope: 'project', path: path.join(cwd, '.mcp.json') },\n\n // Cursor\n { ide: 'cursor', scope: 'user', path: path.join(home, '.cursor', 'mcp.json') },\n { ide: 'cursor', scope: 'project', path: path.join(cwd, '.cursor', 'mcp.json') },\n\n // VS Code / Copilot\n { ide: 'vscode', scope: 'project', path: path.join(cwd, '.vscode', 'mcp.json') },\n\n // Windsurf\n { ide: 'windsurf', scope: 'user', path: path.join(home, '.codeium', 'windsurf', 'mcp_config.json') },\n ];\n\n if (isMac) {\n locations.push(\n {\n ide: 'claude-code',\n scope: 'managed',\n path: path.join('/', 'Library', 'Application Support', 'ClaudeCode', 'managed-mcp.json'),\n },\n {\n ide: 'claude-desktop',\n scope: 'user',\n path: path.join(home, 'Library', 'Application Support', 'Claude', 'claude_desktop_config.json'),\n },\n );\n }\n\n return locations;\n}\n\n// ---------------------------------------------------------------------------\n// JSON parsing helpers\n// ---------------------------------------------------------------------------\n\nfunction readJsonSafe(filePath: string): unknown | null {\n try {\n if (!fs.existsSync(filePath)) return null;\n const raw = fs.readFileSync(filePath, 'utf-8');\n return JSON.parse(raw);\n } catch {\n return null;\n }\n}\n\n/**\n * Extract the servers map from a parsed config.\n * VS Code uses `servers`, everything else uses `mcpServers`.\n */\nfunction extractServers(\n json: unknown,\n ide: string,\n): Record<string, McpServerEntry> | null {\n if (json === null || typeof json !== 'object') return null;\n const obj = json as Record<string, unknown>;\n\n // VS Code uses the `servers` key\n if (ide === 'vscode') {\n const servers = obj['servers'];\n if (servers && typeof servers === 'object') {\n return servers as Record<string, McpServerEntry>;\n }\n return null;\n }\n\n // Everything else: mcpServers\n const mcpServers = obj['mcpServers'];\n if (mcpServers && typeof mcpServers === 'object') {\n return mcpServers as Record<string, McpServerEntry>;\n }\n return null;\n}\n\ninterface McpServerEntry {\n command?: string;\n args?: string[];\n env?: Record<string, string>;\n [key: string]: unknown;\n}\n\n// ---------------------------------------------------------------------------\n// Environment variable expansion\n// ---------------------------------------------------------------------------\n\n/**\n * Expand `${VAR}` and `${VAR:-default}` patterns using process.env.\n */\nfunction expandEnvValue(value: string): string {\n return value.replace(/\\$\\{([^}]+)\\}/g, (_match, expr: string) => {\n const defaultSep = expr.indexOf(':-');\n if (defaultSep !== -1) {\n const varName = expr.slice(0, defaultSep);\n const defaultVal = expr.slice(defaultSep + 2);\n return process.env[varName] ?? defaultVal;\n }\n return process.env[expr] ?? '';\n });\n}\n\nfunction expandEnvMap(env: Record<string, string> | undefined): Record<string, string> | undefined {\n if (!env) return undefined;\n const expanded: Record<string, string> = {};\n for (const [key, value] of Object.entries(env)) {\n expanded[key] = expandEnvValue(String(value));\n }\n return expanded;\n}\n\n// ---------------------------------------------------------------------------\n// Adapter type detection\n// ---------------------------------------------------------------------------\n\nfunction detectAdapterType(\n serverName: string,\n entry: McpServerEntry,\n): AdapterType | null {\n const nameLower = serverName.toLowerCase();\n\n // 1. Match by server name substring\n for (const [pattern, adapter] of Object.entries(NAME_PATTERNS)) {\n if (nameLower.includes(pattern)) return adapter;\n }\n\n // 2. Match by known package in command or args\n const allTokens = [entry.command ?? '', ...(entry.args ?? [])].map((s) =>\n String(s).toLowerCase(),\n );\n for (const [pkg, adapter] of Object.entries(PACKAGE_PATTERNS)) {\n if (allTokens.some((t) => t.includes(pkg.toLowerCase()))) return adapter;\n }\n\n // 3. Match by database-related CLI flags in args\n const argsStr = (entry.args ?? []).join(' ').toLowerCase();\n for (const flag of CONNECTION_FLAGS) {\n if (argsStr.includes(flag)) {\n // Try to infer adapter from surrounding context\n return inferAdapterFromArgs(entry.args ?? []);\n }\n }\n\n // 4. Match by env var names\n if (entry.env) {\n for (const envVar of CONNECTION_ENV_VARS) {\n if (envVar in entry.env) {\n return inferAdapterFromEnvVar(envVar, entry.env[envVar] ?? '');\n }\n }\n }\n\n // 5. Match by URI scheme in args\n for (const arg of entry.args ?? []) {\n for (const [scheme, adapter] of Object.entries(URI_SCHEMES)) {\n if (String(arg).startsWith(scheme)) return adapter;\n }\n }\n\n return null;\n}\n\nfunction inferAdapterFromEnvVar(varName: string, value: string): AdapterType | null {\n const upper = varName.toUpperCase();\n if (upper.includes('POSTGRES') || upper.includes('PG_')) return 'postgres';\n if (upper.includes('MYSQL')) return 'mysql';\n if (upper.includes('DUCKDB')) return 'duckdb';\n if (upper.includes('SQLITE')) return 'sqlite';\n if (upper.includes('SNOWFLAKE')) return 'snowflake';\n if (upper.includes('BIGQUERY')) return 'bigquery';\n if (upper.includes('CLICKHOUSE')) return 'clickhouse';\n if (upper.includes('DATABRICKS')) return 'databricks';\n if (upper.includes('MSSQL')) return 'mssql';\n if (upper.includes('REDSHIFT')) return 'postgres';\n\n // Fall back to checking the value for URI schemes\n if (upper === 'DATABASE_URL') {\n for (const [scheme, adapter] of Object.entries(URI_SCHEMES)) {\n if (String(value).startsWith(scheme)) return adapter;\n }\n }\n\n return 'postgres'; // conservative default for DATABASE_URL-style vars\n}\n\nfunction inferAdapterFromArgs(args: string[]): AdapterType | null {\n const joined = args.join(' ').toLowerCase();\n for (const [scheme, adapter] of Object.entries(URI_SCHEMES)) {\n if (joined.includes(scheme)) return adapter;\n }\n // Check for file extensions that hint at the adapter\n if (joined.includes('.duckdb') || joined.includes('.db') || joined.includes('duckdb')) return 'duckdb';\n if (joined.includes('.sqlite') || joined.includes('.sqlite3')) return 'sqlite';\n return null;\n}\n\n// ---------------------------------------------------------------------------\n// Connection detail extraction\n// ---------------------------------------------------------------------------\n\nfunction extractConnectionDetails(\n entry: McpServerEntry,\n adapterType: AdapterType,\n): DiscoveredDatabase['connectionDetails'] {\n const args = (entry.args ?? []).map(String);\n const env = expandEnvMap(entry.env);\n const command = String(entry.command ?? '');\n\n const details: DiscoveredDatabase['connectionDetails'] = {\n command,\n args,\n env,\n };\n\n // Extract from CLI flags\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n const nextArg = i + 1 < args.length ? args[i + 1] : undefined;\n\n if ((arg === '--db-path' || arg === '--database' || arg === '--db') && nextArg) {\n if (adapterType === 'duckdb' || adapterType === 'sqlite') {\n details.path = nextArg;\n } else {\n details.database = nextArg;\n }\n }\n if ((arg === '--connection-string' || arg === '--connection' || arg === '--dsn') && nextArg) {\n details.connection = nextArg;\n }\n if (arg === '--host' && nextArg) {\n details.host = nextArg;\n }\n if (arg === '--port' && nextArg) {\n const port = parseInt(nextArg, 10);\n if (!isNaN(port)) details.port = port;\n }\n }\n\n // Extract inline connection strings from positional args\n if (!details.connection && !details.path) {\n for (const arg of args) {\n for (const scheme of Object.keys(URI_SCHEMES)) {\n if (arg.startsWith(scheme)) {\n details.connection = arg;\n break;\n }\n }\n if (details.connection) break;\n\n // Check for file paths that look like databases\n if (\n (adapterType === 'duckdb' || adapterType === 'sqlite') &&\n (arg.endsWith('.duckdb') || arg.endsWith('.db') || arg.endsWith('.sqlite') || arg.endsWith('.sqlite3'))\n ) {\n details.path = arg;\n break;\n }\n }\n }\n\n // Extract from environment variables\n if (env) {\n if (!details.connection) {\n for (const varName of CONNECTION_ENV_VARS) {\n if (env[varName]) {\n const val = env[varName];\n // URI-style connection strings\n for (const scheme of Object.keys(URI_SCHEMES)) {\n if (val.startsWith(scheme)) {\n details.connection = val;\n break;\n }\n }\n if (details.connection) break;\n\n // File path for duckdb/sqlite\n if (\n (adapterType === 'duckdb' || adapterType === 'sqlite') &&\n (varName.includes('PATH') || varName.includes('DATABASE'))\n ) {\n details.path = val;\n break;\n }\n }\n }\n }\n\n // Pick up host/port/database from common env vars\n if (!details.host && env['HOST']) details.host = env['HOST'];\n if (!details.host && env['DB_HOST']) details.host = env['DB_HOST'];\n if (!details.port && env['PORT']) {\n const p = parseInt(env['PORT'], 10);\n if (!isNaN(p)) details.port = p;\n }\n if (!details.port && env['DB_PORT']) {\n const p = parseInt(env['DB_PORT'], 10);\n if (!isNaN(p)) details.port = p;\n }\n if (!details.database && env['DB_NAME']) details.database = env['DB_NAME'];\n }\n\n return details;\n}\n\n// ---------------------------------------------------------------------------\n// Label building\n// ---------------------------------------------------------------------------\n\nconst IDE_LABELS: Record<string, string> = {\n 'claude-code': 'Claude Code',\n cursor: 'Cursor',\n vscode: 'VS Code',\n windsurf: 'Windsurf',\n 'claude-desktop': 'Claude Desktop',\n};\n\nconst ADAPTER_LABELS: Record<AdapterType, string> = {\n duckdb: 'DuckDB',\n postgres: 'PostgreSQL',\n mysql: 'MySQL',\n sqlite: 'SQLite',\n snowflake: 'Snowflake',\n bigquery: 'BigQuery',\n clickhouse: 'ClickHouse',\n databricks: 'Databricks',\n mssql: 'SQL Server',\n};\n\nfunction buildLabel(\n serverName: string,\n adapterType: AdapterType,\n details: DiscoveredDatabase['connectionDetails'],\n ide: string,\n): string {\n const adapterLabel = ADAPTER_LABELS[adapterType] ?? adapterType;\n const ideLabel = IDE_LABELS[ide] ?? ide;\n\n // Try to find a meaningful descriptor\n let descriptor = '';\n if (details.path) {\n descriptor = path.basename(details.path);\n } else if (details.database) {\n descriptor = details.database;\n } else if (details.connection) {\n // Extract database name from connection string\n try {\n const url = new URL(details.connection);\n const dbName = url.pathname.replace(/^\\//, '');\n if (dbName) descriptor = dbName;\n } catch {\n // Not a parseable URL; use host if available\n }\n }\n if (!descriptor && details.host) {\n descriptor = details.host;\n }\n\n if (descriptor) {\n return `${adapterLabel} \\u2014 ${descriptor} (from ${ideLabel})`;\n }\n return `${adapterLabel} \\u2014 ${serverName} (from ${ideLabel})`;\n}\n\n// ---------------------------------------------------------------------------\n// Deduplication\n// ---------------------------------------------------------------------------\n\nfunction deduplicationKey(db: DiscoveredDatabase): string {\n const parts: string[] = [db.adapterType];\n if (db.connectionDetails.path) parts.push(db.connectionDetails.path);\n if (db.connectionDetails.connection) parts.push(db.connectionDetails.connection);\n if (db.connectionDetails.host) parts.push(db.connectionDetails.host);\n if (db.connectionDetails.port) parts.push(String(db.connectionDetails.port));\n if (db.connectionDetails.database) parts.push(db.connectionDetails.database);\n // If no distinguishing details, use server name to avoid collapsing unrelated entries\n if (parts.length === 1) parts.push(db.serverName);\n return parts.join('|');\n}\n\n// ---------------------------------------------------------------------------\n// Main discovery\n// ---------------------------------------------------------------------------\n\n/**\n * Scans all known IDE MCP config files and discovers database connections\n * that the user already has configured.\n *\n * Never throws. Returns an empty array if nothing is found or on any error.\n */\nexport function discoverDatabases(cwd: string): DiscoveredDatabase[] {\n const results: DiscoveredDatabase[] = [];\n\n try {\n const locations = getConfigLocations(cwd);\n\n for (const loc of locations) {\n try {\n const json = readJsonSafe(loc.path);\n if (json === null) continue;\n\n const servers = extractServers(json, loc.ide);\n if (!servers) continue;\n\n for (const [serverName, entry] of Object.entries(servers)) {\n try {\n if (!entry || typeof entry !== 'object') continue;\n\n const adapterType = detectAdapterType(serverName, entry);\n if (!adapterType) continue;\n\n const connectionDetails = extractConnectionDetails(entry, adapterType);\n const label = buildLabel(serverName, adapterType, connectionDetails, loc.ide);\n\n results.push({\n ide: loc.ide,\n scope: loc.scope,\n serverName,\n adapterType,\n connectionDetails,\n label,\n });\n } catch {\n // Skip malformed server entry\n }\n }\n } catch {\n // Skip unreadable/malformed config file\n }\n }\n } catch {\n // Fatal-level error — return whatever we have\n }\n\n // Deduplicate: keep the first occurrence (project-scoped sorts first)\n const scopeOrder: Record<string, number> = { project: 0, user: 1, managed: 2 };\n results.sort((a, b) => {\n const sa = scopeOrder[a.scope] ?? 9;\n const sb = scopeOrder[b.scope] ?? 9;\n return sa - sb;\n });\n\n const seen = new Set<string>();\n const deduped: DiscoveredDatabase[] = [];\n for (const db of results) {\n const key = deduplicationKey(db);\n if (!seen.has(key)) {\n seen.add(key);\n deduped.push(db);\n }\n }\n\n return deduped;\n}\n\n// ---------------------------------------------------------------------------\n// Conversion to DataSourceConfig\n// ---------------------------------------------------------------------------\n\n/**\n * Converts a DiscoveredDatabase into a DataSourceConfig that can be written\n * into contextkit.config.yaml. Returns null if the connection details are\n * insufficient to create a usable config.\n */\nexport function toDataSourceConfig(discovered: DiscoveredDatabase): DataSourceConfig | null {\n const { adapterType, connectionDetails } = discovered;\n\n switch (adapterType) {\n case 'duckdb':\n case 'sqlite': {\n const filePath = connectionDetails.path;\n if (!filePath) return null;\n return { adapter: adapterType, path: filePath };\n }\n\n case 'postgres':\n case 'mysql':\n case 'mssql': {\n if (connectionDetails.connection) {\n return { adapter: adapterType, connection: connectionDetails.connection };\n }\n // Try to build from host/port/database\n if (connectionDetails.host) {\n const config: DataSourceConfig = {\n adapter: adapterType,\n host: connectionDetails.host,\n };\n if (connectionDetails.port) config.port = connectionDetails.port;\n if (connectionDetails.database) config.database = connectionDetails.database;\n return config;\n }\n return null;\n }\n\n case 'snowflake': {\n // Need at minimum an account\n if (connectionDetails.host) {\n return {\n adapter: 'snowflake',\n account: connectionDetails.host,\n database: connectionDetails.database,\n };\n }\n return null;\n }\n\n case 'bigquery': {\n if (connectionDetails.database) {\n return {\n adapter: 'bigquery',\n project: connectionDetails.database,\n };\n }\n return null;\n }\n\n case 'clickhouse': {\n if (connectionDetails.connection) {\n return { adapter: 'clickhouse', host: connectionDetails.connection };\n }\n if (connectionDetails.host) {\n const config: DataSourceConfig = {\n adapter: 'clickhouse',\n host: connectionDetails.host,\n };\n if (connectionDetails.port) config.port = connectionDetails.port;\n if (connectionDetails.database) config.database = connectionDetails.database;\n return config;\n }\n return null;\n }\n\n case 'databricks': {\n if (connectionDetails.host) {\n return {\n adapter: 'databricks',\n serverHostname: connectionDetails.host,\n };\n }\n return null;\n }\n\n default:\n return null;\n }\n}\n","import * as p from '@clack/prompts';\nimport path from 'node:path';\nimport { mkdirSync, writeFileSync, existsSync } from 'node:fs';\nimport { scaffoldFromSchema, compile, computeTier, loadConfig } from '@runcontext/core';\nimport type { SetupContext, StepResult } from '../types.js';\nimport { displayTierScore } from '../display.js';\n\nexport async function runScaffoldStep(ctx: SetupContext): Promise<StepResult> {\n const shouldRun = await p.confirm({\n message: 'Scaffold Bronze metadata from database schema?',\n });\n if (p.isCancel(shouldRun) || !shouldRun) {\n return { skipped: true, summary: 'Skipped' };\n }\n\n const spin = p.spinner();\n spin.start('Scaffolding Bronze metadata...');\n\n const result = scaffoldFromSchema({\n modelName: ctx.modelName,\n dataSourceName: 'default',\n tables: ctx.tables,\n columns: ctx.columns,\n });\n\n // Create directories\n for (const dir of ['models', 'governance', 'owners', 'reference']) {\n const dirPath = path.join(ctx.contextDir, dir);\n if (!existsSync(dirPath)) mkdirSync(dirPath, { recursive: true });\n }\n\n // Create reference README if it doesn't exist\n const refReadme = path.join(ctx.contextDir, 'reference', 'README.md');\n if (!existsSync(refReadme)) {\n writeFileSync(refReadme, `# Reference Documents\n\nDrop files here that help describe your data — the AI agent will read them when curating metadata.\n\nExamples of useful reference documents:\n- Data dictionaries (CSV, Excel, PDF)\n- Confluence or wiki exports\n- ERD diagrams or schema docs\n- Business glossaries from your organization\n- Dashboard screenshots or descriptions\n- Data pipeline documentation\n- Slack/email threads explaining metric definitions\n\nThe agent will use these as context when writing descriptions, defining metrics,\ncreating glossary terms, and building business context. The more context you\nprovide, the better the metadata quality.\n\nSupported formats: .md, .txt, .csv, .json, .yaml, .pdf\n`, 'utf-8');\n }\n\n // Write files\n const created: string[] = [];\n const files = [\n { rel: path.join('models', result.files.osi), content: result.osiYaml },\n { rel: path.join('governance', result.files.governance), content: result.governanceYaml },\n { rel: path.join('owners', result.files.owner), content: result.ownerYaml },\n ];\n\n for (const f of files) {\n const fullPath = path.join(ctx.contextDir, f.rel);\n writeFileSync(fullPath, f.content, 'utf-8');\n created.push(f.rel);\n }\n\n // Recompile and compute tier\n const config = loadConfig(ctx.cwd);\n const { graph } = await compile({ contextDir: ctx.contextDir, config, rootDir: ctx.cwd });\n ctx.graph = graph;\n ctx.tierScore = computeTier(ctx.modelName, graph);\n\n spin.stop(`Created ${created.length} files`);\n\n const fileList = created.map((f) => ` ${f}`).join('\\n');\n p.note(fileList, 'Files Created');\n displayTierScore(ctx.tierScore);\n\n return { skipped: false, summary: `${created.length} files → ${ctx.tierScore.tier.toUpperCase()}` };\n}\n","import * as p from '@clack/prompts';\nimport type { TierScore } from '@runcontext/core';\nimport { formatTierScore } from '../formatters/pretty.js';\n\nexport function displayTierScore(score: TierScore): void {\n p.note(formatTierScore(score), 'Tier Scorecard');\n}\n","import * as p from '@clack/prompts';\nimport path from 'node:path';\nimport { readFileSync, writeFileSync, mkdirSync, existsSync, readdirSync } from 'node:fs';\nimport * as yaml from 'yaml';\nimport {\n compile,\n computeTier,\n suggestEnrichments,\n loadConfig,\n createAdapter,\n} from '@runcontext/core';\nimport type { SetupContext, StepResult } from '../types.js';\nimport { displayTierScore } from '../display.js';\n\nfunction findFileRecursive(dir: string, suffix: string): string | undefined {\n if (!existsSync(dir)) return undefined;\n const entries = readdirSync(dir, { withFileTypes: true });\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n const found = findFileRecursive(fullPath, suffix);\n if (found) return found;\n } else if (entry.name.endsWith(suffix)) {\n return fullPath;\n }\n }\n return undefined;\n}\n\nexport async function runEnrichSilverStep(ctx: SetupContext): Promise<StepResult> {\n // Recompile to get fresh state\n const config = loadConfig(ctx.cwd);\n const { graph } = await compile({ contextDir: ctx.contextDir, config, rootDir: ctx.cwd });\n ctx.graph = graph;\n const tierScore = computeTier(ctx.modelName, graph);\n\n if (tierScore.silver.passed) {\n p.log.success('Already at Silver or above — skipping.');\n ctx.tierScore = tierScore;\n return { skipped: true, summary: 'Already Silver' };\n }\n\n const model = graph.models.get(ctx.modelName);\n if (!model) {\n p.log.error(`Model \"${ctx.modelName}\" not found in graph.`);\n return { skipped: true, summary: 'Model not found' };\n }\n\n const datasetNames = model.datasets.map((d) => d.name);\n const suggestions = suggestEnrichments('silver', tierScore, datasetNames);\n\n // Build preview of what will be added\n const preview: string[] = [];\n if (suggestions.governance?.trust) preview.push(`+ trust: ${suggestions.governance.trust}`);\n if (suggestions.governance?.tags) preview.push(`+ tags: [${suggestions.governance.tags.join(', ')}]`);\n if (suggestions.governance?.refreshAll) preview.push(`+ refresh: ${suggestions.governance.refreshAll} (all datasets)`);\n if (suggestions.lineage) preview.push(`+ ${suggestions.lineage.upstream?.length ?? 0} lineage upstream source(s)`);\n if (suggestions.glossaryTerms) preview.push(`+ ${suggestions.glossaryTerms.length} glossary term(s)`);\n if (suggestions.needsSampleValues) preview.push('+ sample_values from live data');\n\n if (preview.length > 0) {\n p.note(preview.join('\\n'), 'Silver Enrichments');\n }\n\n const shouldRun = await p.confirm({\n message: 'Apply Silver enrichments?',\n });\n if (p.isCancel(shouldRun) || !shouldRun) {\n return { skipped: true, summary: 'Skipped' };\n }\n\n const spin = p.spinner();\n spin.start('Enriching to Silver...');\n\n // Apply governance changes\n const govFilePath = findFileRecursive(ctx.contextDir, `${ctx.modelName}.governance.yaml`);\n if (govFilePath) {\n const govContent = readFileSync(govFilePath, 'utf-8');\n const govDoc = yaml.parse(govContent) ?? {};\n\n if (suggestions.governance?.trust) govDoc.trust = suggestions.governance.trust;\n if (suggestions.governance?.tags) govDoc.tags = suggestions.governance.tags;\n if (suggestions.governance?.refreshAll) {\n for (const dsName of Object.keys(govDoc.datasets ?? {})) {\n govDoc.datasets[dsName].refresh = suggestions.governance.refreshAll;\n }\n }\n\n // Populate sample values from DB\n if (suggestions.needsSampleValues) {\n govDoc.fields = govDoc.fields ?? {};\n try {\n let count = 0;\n for (const ds of model.datasets) {\n if (count >= 2) break;\n const tableName = ds.source?.split('.').pop() ?? ds.name;\n for (const field of ds.fields ?? []) {\n if (count >= 2) break;\n const fieldKey = `${ds.name}.${field.name}`;\n if (govDoc.fields[fieldKey]?.sample_values?.length > 0) continue;\n try {\n const result = await ctx.adapter.query(\n `SELECT DISTINCT CAST(\"${field.name}\" AS VARCHAR) AS val FROM \"${tableName}\" WHERE \"${field.name}\" IS NOT NULL LIMIT 5`,\n );\n if (result.rows.length > 0) {\n govDoc.fields[fieldKey] = govDoc.fields[fieldKey] ?? {};\n govDoc.fields[fieldKey].sample_values = result.rows.map((r: any) => String(r.val));\n count++;\n }\n } catch {\n // skip fields that can't be queried\n }\n }\n }\n } catch {\n // adapter query failed — skip sample values\n }\n }\n\n writeFileSync(govFilePath, yaml.stringify(govDoc, { lineWidth: 120 }), 'utf-8');\n }\n\n // Write lineage file\n if (suggestions.lineage) {\n const lineageDir = path.join(ctx.contextDir, 'lineage');\n if (!existsSync(lineageDir)) mkdirSync(lineageDir, { recursive: true });\n const lineagePath = path.join(lineageDir, `${ctx.modelName}.lineage.yaml`);\n if (!existsSync(lineagePath)) {\n const lineageDoc = { model: ctx.modelName, upstream: suggestions.lineage.upstream };\n writeFileSync(lineagePath, yaml.stringify(lineageDoc, { lineWidth: 120 }), 'utf-8');\n }\n }\n\n // Write glossary terms\n if (suggestions.glossaryTerms) {\n const glossaryDir = path.join(ctx.contextDir, 'glossary');\n if (!existsSync(glossaryDir)) mkdirSync(glossaryDir, { recursive: true });\n for (const term of suggestions.glossaryTerms) {\n const termPath = path.join(glossaryDir, `${term.id}.term.yaml`);\n if (!existsSync(termPath)) {\n writeFileSync(termPath, yaml.stringify(term, { lineWidth: 120 }), 'utf-8');\n }\n }\n }\n\n // Recompile and score\n const { graph: newGraph } = await compile({ contextDir: ctx.contextDir, config, rootDir: ctx.cwd });\n ctx.graph = newGraph;\n ctx.tierScore = computeTier(ctx.modelName, newGraph);\n\n spin.stop('Applied Silver enrichments');\n displayTierScore(ctx.tierScore);\n\n return { skipped: false, summary: ctx.tierScore.tier.toUpperCase() };\n}\n","import * as p from '@clack/prompts';\nimport path from 'node:path';\nimport { readFileSync, writeFileSync, mkdirSync, existsSync, readdirSync } from 'node:fs';\nimport * as yaml from 'yaml';\nimport {\n compile,\n computeTier,\n suggestEnrichments,\n inferSemanticRole,\n inferAggregation,\n loadConfig,\n} from '@runcontext/core';\nimport type { SetupContext, StepResult } from '../types.js';\nimport { displayTierScore } from '../display.js';\n\nfunction findFileRecursive(dir: string, suffix: string): string | undefined {\n if (!existsSync(dir)) return undefined;\n const entries = readdirSync(dir, { withFileTypes: true });\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n const found = findFileRecursive(fullPath, suffix);\n if (found) return found;\n } else if (entry.name.endsWith(suffix)) {\n return fullPath;\n }\n }\n return undefined;\n}\n\nexport async function runEnrichGoldStep(ctx: SetupContext): Promise<StepResult> {\n const config = loadConfig(ctx.cwd);\n const { graph } = await compile({ contextDir: ctx.contextDir, config, rootDir: ctx.cwd });\n ctx.graph = graph;\n const tierScore = computeTier(ctx.modelName, graph);\n\n if (tierScore.gold.passed) {\n p.log.success('Already at Gold — skipping.');\n ctx.tierScore = tierScore;\n return { skipped: true, summary: 'Already Gold' };\n }\n\n const model = graph.models.get(ctx.modelName);\n if (!model) {\n p.log.error(`Model \"${ctx.modelName}\" not found.`);\n return { skipped: true, summary: 'Model not found' };\n }\n\n const datasetNames = model.datasets.map((d) => d.name);\n const suggestions = suggestEnrichments('gold', tierScore, datasetNames);\n\n // Build preview\n const preview: string[] = [];\n if (suggestions.needsSemanticRoles) preview.push('+ Infer semantic_role for all fields');\n if (suggestions.needsRulesFile) preview.push('+ Generate rules file (golden queries, guardrails, hierarchies)');\n if (suggestions.governance?.trust) preview.push(`+ trust: ${suggestions.governance.trust}`);\n preview.push('+ Add version, business_context stubs to governance');\n preview.push('+ Add ai_context placeholder to model');\n preview.push('+ Infer relationships from column name patterns');\n\n if (preview.length > 0) {\n p.note(preview.join('\\n'), 'Gold Enrichments');\n }\n\n p.log.warning('Gold enrichments create TODO placeholders that need manual curation.');\n\n const shouldRun = await p.confirm({\n message: 'Apply Gold enrichments?',\n });\n if (p.isCancel(shouldRun) || !shouldRun) {\n return { skipped: true, summary: 'Skipped' };\n }\n\n const spin = p.spinner();\n spin.start('Enriching to Gold...');\n\n // Apply governance changes\n const govFilePath = findFileRecursive(ctx.contextDir, `${ctx.modelName}.governance.yaml`);\n if (govFilePath) {\n const govContent = readFileSync(govFilePath, 'utf-8');\n const govDoc = yaml.parse(govContent) ?? {};\n\n if (suggestions.governance?.trust) govDoc.trust = suggestions.governance.trust;\n\n // Infer semantic roles for all fields\n if (suggestions.needsSemanticRoles) {\n govDoc.fields = govDoc.fields ?? {};\n\n for (const ds of model.datasets) {\n const tableName = ds.source?.split('.').pop() ?? ds.name;\n let dbColumns: any[] = [];\n try {\n dbColumns = await ctx.adapter.listColumns(tableName);\n } catch {\n // fall back to name-based heuristics\n }\n\n for (const field of ds.fields ?? []) {\n const fieldKey = `${ds.name}.${field.name}`;\n if (govDoc.fields[fieldKey]?.semantic_role) continue;\n const col = dbColumns.find((c: any) => c.name === field.name);\n const isPK = col?.is_primary_key ?? field.name.endsWith('_id');\n const dataType = col?.data_type ?? 'VARCHAR';\n govDoc.fields[fieldKey] = govDoc.fields[fieldKey] ?? {};\n const role = inferSemanticRole(field.name, dataType, isPK);\n govDoc.fields[fieldKey].semantic_role = role;\n if (role === 'metric') {\n govDoc.fields[fieldKey].default_aggregation = inferAggregation(field.name);\n govDoc.fields[fieldKey].additive = govDoc.fields[fieldKey].default_aggregation === 'SUM';\n }\n }\n }\n }\n\n // Add version if missing\n if (!govDoc.version) {\n govDoc.version = '0.1.0';\n }\n\n // Add business_context stubs if missing\n if (!govDoc.business_context || govDoc.business_context.length === 0) {\n govDoc.business_context = [\n { name: 'TODO: Use Case Name', description: 'TODO: Describe the analytical use case and business value.' },\n ];\n }\n\n writeFileSync(govFilePath, yaml.stringify(govDoc, { lineWidth: 120 }), 'utf-8');\n }\n\n // Add ai_context to model if missing\n const modelFilePath = findFileRecursive(ctx.contextDir, `${ctx.modelName}.osi.yaml`);\n if (modelFilePath) {\n const modelContent = readFileSync(modelFilePath, 'utf-8');\n const modelDoc = yaml.parse(modelContent) ?? {};\n const semModels = modelDoc.semantic_model ?? [];\n let changed = false;\n\n for (const sm of semModels) {\n if (sm.name !== ctx.modelName) continue;\n\n // Add ai_context placeholder if missing\n if (!sm.ai_context) {\n sm.ai_context = 'TODO: Describe how an AI agent should use this model, common pitfalls, and important filters.';\n changed = true;\n }\n\n // Infer relationships from column name patterns (e.g., business_id → FK to yelp_business)\n if (!sm.relationships || sm.relationships.length === 0) {\n const datasets = sm.datasets ?? [];\n const dsNames = new Set(datasets.map((d: any) => d.name));\n const inferred: any[] = [];\n\n for (const ds of datasets) {\n for (const field of ds.fields ?? []) {\n const fname = field.name as string;\n // Match patterns like \"business_id\" → look for dataset \"business\" or similar\n const idMatch = fname.match(/^(.+)_id$/);\n if (idMatch && idMatch[1]) {\n const targetBase = idMatch[1];\n // Find a dataset that matches the target name\n for (const targetDs of datasets) {\n if (targetDs.name === ds.name) continue;\n const targetName = targetDs.name as string;\n // Match if target dataset name contains the base or vice versa\n if (targetName.includes(targetBase) || targetBase.includes(targetName)) {\n // Check target has a matching field\n const targetHasField = (targetDs.fields ?? []).some((f: any) => f.name === fname);\n if (targetHasField) {\n const relName = `${ds.name}-to-${targetName}`;\n if (!inferred.some((r: any) => r.name === relName)) {\n inferred.push({\n name: relName,\n from: ds.name,\n to: targetName,\n from_columns: [fname],\n to_columns: [fname],\n });\n }\n }\n }\n }\n }\n }\n }\n\n if (inferred.length > 0) {\n sm.relationships = inferred;\n changed = true;\n }\n }\n }\n\n if (changed) {\n writeFileSync(modelFilePath, yaml.stringify(modelDoc, { lineWidth: 120 }), 'utf-8');\n }\n }\n\n // Stub rules file\n if (suggestions.needsRulesFile) {\n const rulesDir = path.join(ctx.contextDir, 'rules');\n if (!existsSync(rulesDir)) mkdirSync(rulesDir, { recursive: true });\n const rulesPath = path.join(rulesDir, `${ctx.modelName}.rules.yaml`);\n if (!existsSync(rulesPath)) {\n const rulesDoc = {\n model: ctx.modelName,\n golden_queries: [\n { question: 'TODO: What is the total count?', sql: 'SELECT COUNT(*) FROM table_name' },\n { question: 'TODO: What are the top records?', sql: 'SELECT * FROM table_name LIMIT 10' },\n { question: 'TODO: What is the distribution?', sql: 'SELECT column, COUNT(*) FROM table_name GROUP BY column' },\n ],\n business_rules: [\n { name: 'TODO: rule-name', definition: 'TODO: describe the business rule' },\n ],\n guardrail_filters: [\n { name: 'TODO: filter-name', filter: 'column IS NOT NULL', reason: 'TODO: explain why' },\n ],\n hierarchies: [\n { name: 'TODO: hierarchy-name', levels: ['level1', 'level2'], dataset: datasetNames[0] ?? 'dataset' },\n ],\n };\n writeFileSync(rulesPath, yaml.stringify(rulesDoc, { lineWidth: 120 }), 'utf-8');\n }\n }\n\n // Recompile and score\n const { graph: newGraph } = await compile({ contextDir: ctx.contextDir, config, rootDir: ctx.cwd });\n ctx.graph = newGraph;\n ctx.tierScore = computeTier(ctx.modelName, newGraph);\n\n spin.stop('Applied Gold enrichments');\n\n const todos = suggestions.needsRulesFile\n ? '\\nThe rules file contains TODO placeholders — edit context/rules/ to complete Gold.'\n : '';\n if (todos) p.log.warning(todos);\n\n displayTierScore(ctx.tierScore);\n\n return { skipped: false, summary: `${ctx.tierScore.tier.toUpperCase()} (may need curation)` };\n}\n","import * as p from '@clack/prompts';\nimport {\n compile,\n LintEngine,\n ALL_RULES,\n computeTier,\n loadConfig,\n} from '@runcontext/core';\nimport { collectDataValidation } from '../../commands/verify.js';\nimport type { SetupContext, StepResult } from '../types.js';\nimport { displayTierScore } from '../display.js';\n\nexport async function runVerifyStep(ctx: SetupContext): Promise<StepResult> {\n const shouldRun = await p.confirm({\n message: 'Verify metadata against live data?',\n });\n if (p.isCancel(shouldRun) || !shouldRun) {\n return { skipped: true, summary: 'Skipped' };\n }\n\n const spin = p.spinner();\n spin.start('Verifying against database...');\n\n const config = loadConfig(ctx.cwd);\n const { graph } = await compile({ contextDir: ctx.contextDir, config, rootDir: ctx.cwd });\n\n graph.dataValidation = await collectDataValidation(ctx.adapter, graph);\n\n const engine = new LintEngine();\n for (const rule of ALL_RULES) {\n if (rule.id.startsWith('data/')) engine.register(rule);\n }\n const dataDiags = engine.run(graph);\n\n ctx.graph = graph;\n ctx.tierScore = computeTier(ctx.modelName, graph);\n\n const errors = dataDiags.filter((d) => d.severity === 'error').length;\n const warnings = dataDiags.filter((d) => d.severity === 'warning').length;\n\n if (dataDiags.length === 0) {\n spin.stop('All data validation checks passed');\n } else {\n spin.stop(`${errors} error(s), ${warnings} warning(s)`);\n const details = dataDiags\n .map((d) => ` ${d.severity === 'error' ? 'x' : '!'} ${d.message}`)\n .join('\\n');\n p.note(details, 'Data Validation Issues');\n }\n\n return {\n skipped: false,\n summary: dataDiags.length === 0 ? 'Clean' : `${errors} errors, ${warnings} warnings`,\n };\n}\n","import * as p from '@clack/prompts';\nimport fs from 'node:fs';\nimport {\n compile,\n LintEngine,\n ALL_RULES,\n applyFixes,\n computeTier,\n loadConfig,\n createAdapter,\n} from '@runcontext/core';\nimport { collectDataValidation } from '../../commands/verify.js';\nimport type { SetupContext, StepResult } from '../types.js';\nimport { displayTierScore } from '../display.js';\n\nexport async function runAutofixStep(ctx: SetupContext): Promise<StepResult> {\n const config = loadConfig(ctx.cwd);\n const { graph } = await compile({ contextDir: ctx.contextDir, config, rootDir: ctx.cwd });\n\n // Collect data validation for data-aware fixes\n graph.dataValidation = await collectDataValidation(ctx.adapter, graph);\n\n const engine = new LintEngine();\n for (const rule of ALL_RULES) engine.register(rule);\n const diagnostics = engine.run(graph);\n const fixable = diagnostics.filter((d) => d.fixable);\n\n if (fixable.length === 0) {\n p.log.success('No fixable issues found.');\n ctx.graph = graph;\n ctx.tierScore = computeTier(ctx.modelName, graph);\n return { skipped: true, summary: 'Nothing to fix' };\n }\n\n const shouldRun = await p.confirm({\n message: `Auto-fix ${fixable.length} issue(s)?`,\n });\n if (p.isCancel(shouldRun) || !shouldRun) {\n return { skipped: true, summary: 'Skipped' };\n }\n\n const spin = p.spinner();\n spin.start('Fixing...');\n\n const readFile = (filePath: string) => fs.readFileSync(filePath, 'utf-8');\n const fixedFiles = applyFixes(fixable, readFile);\n\n for (const [file, content] of fixedFiles) {\n fs.writeFileSync(file, content, 'utf-8');\n }\n\n // Recompile and score\n const { graph: newGraph } = await compile({ contextDir: ctx.contextDir, config, rootDir: ctx.cwd });\n ctx.graph = newGraph;\n ctx.tierScore = computeTier(ctx.modelName, newGraph);\n\n spin.stop(`Fixed ${fixable.length} issue(s) in ${fixedFiles.size} file(s)`);\n displayTierScore(ctx.tierScore);\n\n return { skipped: false, summary: `${fixable.length} issues fixed` };\n}\n","import * as p from '@clack/prompts';\nimport path from 'node:path';\nimport { existsSync, writeFileSync } from 'node:fs';\nimport type { SetupContext, StepResult } from '../types.js';\n\nfunction buildAgentInstructions(ctx: SetupContext): string {\n const modelName = ctx.modelName;\n const tier = ctx.tierScore?.tier?.toUpperCase() ?? 'UNKNOWN';\n const tableList = ctx.tables.map((t) => t.name).join(', ');\n const dbInfo = ctx.dsConfig.path ?? ctx.dsConfig.connection ?? 'configured';\n\n // Extract dataset info from graph\n const model = ctx.graph?.models.get(modelName);\n const datasets = model?.datasets ?? [];\n const datasetList = datasets.map((ds) => `- \\`${ds.name}\\` — ${ds.fields?.length ?? 0} fields`).join('\\n');\n\n // Extract failing checks\n const failingChecks: string[] = [];\n if (ctx.tierScore) {\n for (const check of ctx.tierScore.bronze.checks) {\n if (!check.passed) failingChecks.push(`- ${check.id}: ${check.detail ?? check.label}`);\n }\n for (const check of ctx.tierScore.silver.checks) {\n if (!check.passed) failingChecks.push(`- ${check.id}: ${check.detail ?? check.label}`);\n }\n for (const check of ctx.tierScore.gold.checks) {\n if (!check.passed) failingChecks.push(`- ${check.id}: ${check.detail ?? check.label}`);\n }\n }\n const failingSection =\n failingChecks.length > 0\n ? `### Failing Checks\\n\\n${failingChecks.join('\\n')}`\n : 'All checks passing.';\n\n // Build intent section if user provided goals\n const intentSection = ctx.intent\n ? `## Project Goals\n\n${ctx.intent.goals}\n${ctx.intent.metrics ? `\\n**Key metrics/outcomes:** ${ctx.intent.metrics}` : ''}\n${ctx.intent.audience ? `\\n**Audience:** ${ctx.intent.audience}` : ''}\n\nUse these goals to prioritize which datasets, fields, and metrics to curate first.\n\n`\n : '';\n\n return `# ContextKit Agent Instructions\n\nModel: **${modelName}** | Current Tier: **${tier}**\nDatabase: ${ctx.dsConfig.adapter} (${dbInfo})\nTables: ${tableList}\n\n${intentSection}## The Cardinal Rule: Never Fabricate Metadata\n\n**Every piece of metadata you write must be grounded in evidence from the actual data.**\n\n- NEVER invent owner names, emails, team names, or contact info\n- NEVER write a field description that is just the column name repeated\n- NEVER assign a semantic_role without first querying the column's actual values\n- NEVER mark a field as additive without understanding what summing it means\n- NEVER write lineage entries without knowing the actual data sources\n- NEVER write a business_context narrative you can't justify from the data\n- NEVER create a glossary definition that is just \"Definition for X\"\n\nIf you don't know something, **ask the user**. A honest \"I'm not sure — can you tell me what this field means?\" is infinitely better than fabricated metadata that looks plausible but is wrong.\n\n## Database Safety — MANDATORY\n\n**Your job is to READ the database to build metadata. You must NEVER modify the database.**\n\n### Hard Rules (no exceptions)\n\n- **READ-ONLY.** Never execute INSERT, UPDATE, DELETE, DROP, ALTER, CREATE, TRUNCATE, MERGE, REPLACE, or any DDL/DML statement\n- **LIMIT everything.** Every SELECT must include \\`LIMIT\\`. Use \\`LIMIT 20\\` for sample values, \\`LIMIT 100\\` max for golden query validation. Never run unlimited queries\n- **No full table scans.** Never \\`SELECT * FROM large_table\\` without a WHERE clause and LIMIT. For row counts, use \\`COUNT(*)\\` — never pull all rows to count them\n- **No expensive aggregations.** Avoid \\`GROUP BY\\` on high-cardinality columns across full tables. When checking distinct values, use \\`SELECT DISTINCT col FROM table LIMIT 20\\`, not \\`SELECT DISTINCT col FROM table\\`\n- **No cross joins or cartesian products.** Never join tables without a proper join condition\n- **No recursive or deeply nested queries.** Keep queries simple — you're sampling data, not building reports\n- **No EXPLAIN ANALYZE on cloud warehouses.** On Snowflake, BigQuery, Databricks, etc., even EXPLAIN can trigger computation. Use metadata queries (information_schema) instead when possible\n\n### Cost Awareness\n\nCloud data warehouses (Snowflake, BigQuery, Databricks, Redshift) charge per query based on data scanned. **Every query costs money.**\n\n- Prefer \\`information_schema\\` queries over scanning actual tables\n- Use \\`LIMIT\\` on every query — no exceptions\n- Sample a few rows to understand a column, don't scan the full table\n- For BigQuery: always qualify table names with dataset to avoid scanning wrong tables\n- For Snowflake: use \\`SAMPLE\\` clause when available instead of full table scans\n- If you need row counts, use table metadata or \\`COUNT(*)\\` — never \\`SELECT *\\`\n- Batch your questions: gather what you need to know, then write ONE efficient query instead of many small ones\n\n### What You ARE Allowed To Do\n\n\\`\\`\\`sql\n-- YES: Sample values (always with LIMIT)\nSELECT DISTINCT column_name FROM table_name LIMIT 20;\n\n-- YES: Basic stats for a column (single column, not full row)\nSELECT MIN(col), MAX(col), COUNT(DISTINCT col) FROM table_name;\n\n-- YES: Row count\nSELECT COUNT(*) FROM table_name;\n\n-- YES: Schema metadata (free or near-free on all platforms)\nSELECT column_name, data_type FROM information_schema.columns\nWHERE table_name = 'my_table';\n\n-- YES: Validate a golden query (with LIMIT)\nSELECT geoid, score FROM vw_rankings ORDER BY score DESC LIMIT 10;\n\\`\\`\\`\n\n### What You Must NEVER Do\n\n\\`\\`\\`sql\n-- NEVER: Modify data\nINSERT INTO / UPDATE / DELETE FROM / DROP TABLE / ALTER TABLE\n\n-- NEVER: Unlimited scans\nSELECT * FROM large_table;\nSELECT DISTINCT high_cardinality_col FROM big_table;\n\n-- NEVER: Expensive cross-table operations without LIMIT\nSELECT * FROM a JOIN b ON a.id = b.id JOIN c ON b.id = c.id;\n\n-- NEVER: Write to the database in any way\nCREATE TABLE / CREATE VIEW / CREATE INDEX\n\\`\\`\\`\n\nIf a query might be expensive and you're not sure, **ask the user first**. \"This table looks large — is it OK if I run a COUNT(*)?\" is always the right call.\n\n## Reference Documents\n\nCheck \\`context/reference/\\` for any files the user has provided — data dictionaries, Confluence exports, ERDs, business glossaries, dashboard docs, etc. **Read these first** before querying the database. They contain domain knowledge that will dramatically improve your metadata quality.\n\nIf the folder is empty, ask the user: \"Do you have any existing documentation about this data? Data dictionaries, wiki pages, spreadsheets? Drop them in context/reference/ and I'll use them.\"\n\n## On Session Start\n\n1. Check \\`context/reference/\\` for any reference documents — read them if present\n2. Run \\`context tier\\` to check the current metadata tier (Bronze/Silver/Gold)\n3. Report the current tier and summarize failing checks\n4. Ask the user what they'd like to focus on — don't start changing files unprompted\n5. If the user says \"get me to Gold\" or \"build my semantic layer,\" follow the iterative workflow below\n\n## The Iterative Workflow\n\nBuilding a semantic layer is a **conversation**. You and the user go back and forth — you query the data, propose metadata, ask questions, and iterate. Here's the loop:\n\n\\`\\`\\`\n ┌─────────────────────────┐\n │ context tier │\n │ (check failing checks) │\n └──────────┬──────────────┘\n │\n ┌──────────▼──────────────┐\n │ Pick highest-impact │\n │ failing check │\n └──────────┬──────────────┘\n │\n ┌──────────▼──────────────┐\n │ Query the database │\n │ to gather evidence │\n └──────────┬──────────────┘\n │\n ┌──────────▼──────────────┐\n │ Need user input? │──── YES ──→ Ask the user\n └──────────┬──────────────┘ (then continue)\n │ NO\n ┌──────────▼──────────────┐\n │ Edit YAML metadata │\n └──────────┬──────────────┘\n │\n ┌──────────▼──────────────┐\n │ context lint │\n │ context tier │\n └──────────┬──────────────┘\n │\n ┌──────────▼──────────────┐\n │ All Gold checks pass? │──── NO ──→ Loop back\n └──────────┬──────────────┘\n │ YES\n ✓ DONE\n\\`\\`\\`\n\n### What to Ask the User About\n\nYou know the data. The user knows the business. Ask them about:\n\n- **Ownership** — \"Who owns this data? What team maintains it?\"\n- **Metric intent** — \"Should revenue be summed or averaged? Is this an additive metric?\"\n- **Business rules** — \"Are there any filters that should always be applied? (e.g., only active records)\"\n- **Data lineage** — \"Where does this data come from originally? What upstream system?\"\n- **Use cases** — \"What questions do people ask this data? What dashboards use it?\"\n- **Glossary terms** — \"What does 'churn rate' mean in your organization?\"\n- **Data quality** — \"I see 15% null values in this column — is that expected?\"\n\nDon't batch all questions at once. Ask as you encounter each field or concept that needs clarification.\n\n### CLI Commands to Use\n\n\\`\\`\\`bash\n# Check where you are\ncontext tier # Show Bronze/Silver/Gold scorecard with failing checks\ncontext lint # Run all 40 lint rules\ncontext explain ${modelName} # Full model details — governance, rules, lineage, tier\n\n# Build and fix\ncontext enrich --target silver --apply --source default # Auto-enrich to Silver\ncontext fix --write # Auto-fix lint issues where possible\ncontext verify # Validate metadata against the live database\n\n# Serve to other agents\ncontext serve --stdio # Start MCP server (for Claude, Cursor, etc.)\ncontext dev --studio # Open visual editor in browser\n\\`\\`\\`\n\n### Do NOT Stop Until Gold\n\n1. Run \\`context tier\\` and collect every failing check\n2. For each failing check, query the database to gather evidence, then fix the metadata\n3. Run \\`context tier\\` again\n4. If checks still fail, go back to step 2\n5. **Do NOT stop until every Gold check passes** or you hit something that genuinely requires human input\n6. For checks you cannot fix, ask the user or leave a clear TODO explaining what's needed\n\nYou must iterate — a single pass is never enough. Each \\`context tier\\` run may reveal new failures after earlier ones are fixed.\n\n## How to Curate Metadata (the right way)\n\n### Before writing ANY metadata, query the database first\n\nFor every field you're about to describe or classify (**always with LIMIT, always read-only**):\n\n\\`\\`\\`sql\n-- What type of values does this column contain?\nSELECT DISTINCT column_name FROM table LIMIT 20;\n\n-- For numeric columns: is this a metric or dimension?\nSELECT MIN(col), MAX(col), AVG(col), COUNT(DISTINCT col) FROM table LIMIT 1;\n\n-- For potential metrics: does SUM make sense?\n-- If SUM produces a meaningful business number → additive: true\n-- If SUM is meaningless (e.g., summing percentages, scores, ratings) → additive: false\n\n-- REMEMBER: Never run queries without LIMIT. Never modify data.\n\\`\\`\\`\n\n### Semantic Role Decision Tree\n\nQuery the column first, then apply this logic:\n\n1. **Is it a primary key or foreign key?** → \\`identifier\\`\n2. **Is it a date or timestamp?** → \\`date\\`\n3. **Is it numeric AND does aggregation make business sense?**\n - Does SUM make sense? (counts, amounts, quantities) → \\`metric\\`, \\`additive: true\\`\n - Does only AVG/MIN/MAX make sense? (rates, percentages, scores, ratings) → \\`metric\\`, \\`additive: false\\`\n4. **Everything else** → \\`dimension\\`\n\nCommon mistakes to avoid:\n- \\`stars\\` (ratings) → metric with AVG, NOT additive (summing star ratings is meaningless)\n- \\`_per_10k_people\\` (rates) → metric with AVG, NOT additive\n- \\`_score\\` (composite scores) → metric with AVG, NOT additive\n- \\`useful/funny/cool\\` (vote counts) → metric with SUM, additive\n- \\`_count\\` fields → metric with SUM, additive (usually)\n\n### Field Descriptions\n\nWrite descriptions that help someone who has never seen this database understand what the column contains. Include:\n- What the value represents\n- Units or scale (if applicable)\n- Where the data comes from (if known)\n- Any known quirks or caveats\n\nBad: \\`description: total_population\\`\nGood: \\`description: Total resident population of the census tract from American Community Survey 5-year estimates\\`\n\nBad: \\`description: stars\\`\nGood: \\`description: Average Yelp star rating (1.0-5.0 scale) based on all reviews for this business\\`\n\n### Lineage\n\nUpstream sources are the EXTERNAL systems that feed data into this warehouse. They are NOT the tables in the warehouse itself.\n\nAsk yourself: \"Where did this data originally come from before it was loaded here?\"\n\nBad lineage:\n\\`\\`\\`yaml\nupstream:\n - source: yelp_business # This is a table IN the warehouse, not an upstream source\n type: pipeline\n\\`\\`\\`\n\nGood lineage:\n\\`\\`\\`yaml\nupstream:\n - source: yelp-academic-dataset\n type: file\n notes: Yelp Open Dataset (academic use), loaded via CSV import\n\\`\\`\\`\n\n### Owner Files\n\nDo NOT create fake owner identities. If the real owner is unknown:\n- Keep the existing owner file as-is\n- Note in the file that contact info needs to be filled in by a real person\n- NEVER invent email addresses like \\`analytics@example.com\\`\n\n### Business Context\n\nWrite business_context entries that describe real analytical use cases you can verify from the data. Query the data to understand what questions it can answer before writing narratives.\n\n### Golden Queries\n\nEvery golden query MUST be tested against the actual database before you write it. Run the SQL, verify it returns sensible results, then document it.\n\n### Data Quality\n\nWhen you discover data quality issues (null values, broken joins, missing data), FLAG THEM — don't hide them. Add notes in governance or report them to the user.\n\n## This Project\n\n### Datasets\n\n${datasetList || '(none detected)'}\n\n${failingSection}\n\n## Serving to Other Agents via MCP\n\nOnce the semantic layer reaches Silver or Gold, serve it so other AI agents can use the curated metadata:\n\n\\`\\`\\`bash\n# Start MCP server (agents connect via stdio)\ncontext serve --stdio\n\n# Or via HTTP for remote/multi-agent setups\ncontext serve --http --port 3000\n\\`\\`\\`\n\nTo add ContextKit as an MCP server in another agent's config:\n\n\\`\\`\\`json\n{\n \"mcpServers\": {\n \"contextkit\": {\n \"command\": \"npx\",\n \"args\": [\"@runcontext/cli\", \"serve\", \"--stdio\"]\n }\n }\n}\n\\`\\`\\`\n\n### Exporting AI Blueprints\n\nExport the Gold-tier outcome as a portable YAML file:\n\n\\`\\`\\`bash\ncontext blueprint ${modelName}\n# → blueprints/${modelName}.data-product.osi.yaml\n\\`\\`\\`\n\nThis AI Blueprint contains the complete semantic specification — share it, serve it via MCP, or import it into any OSI-compliant tool.\n\n## MCP Tools (if using ContextKit as an MCP server)\n\n| Tool | Parameters | What it does |\n|------|-----------|-------------|\n| \\`context_search\\` | \\`query\\` | Find models, datasets, fields, terms by keyword |\n| \\`context_explain\\` | \\`model\\` | Full model details — governance, rules, lineage, tier |\n| \\`context_validate\\` | — | Run linter, get errors and warnings |\n| \\`context_tier\\` | \\`model\\` | Tier scorecard with all check results |\n| \\`context_golden_query\\` | \\`question\\` | Find pre-validated SQL for a question |\n| \\`context_guardrails\\` | \\`tables[]\\` | Get required WHERE clauses for tables |\n\n## Tier Checks Quick Reference\n\n**Bronze (7):** descriptions, owner, security, grain, table_type\n**Silver (+6):** trust, 2+ tags, glossary linked, lineage, refresh, 2+ sample_values\n**Gold (+24):** semantic_role on ALL fields, metric aggregation/additive, 1+ guardrail, 3+ golden queries, 1+ business rule, 1+ hierarchy, 1+ default_filter, trust=endorsed, contactable owner, 1+ relationship, description ≥50 chars, ai_context (no TODO), 1+ business_context, version, field descriptions not lazy, glossary definitions substantive, lineage references real sources, grain statements specific, ai_context filled in, 3+ relationships (models with 3+ datasets), 1+ computed metric, 3+ glossary terms (models with 5+ datasets)\n\n## How to Reach Gold: Curation Recipes\n\n### Metrics (gold/metrics-defined)\n\nInspect computed views in the database. Any calculated column is a candidate metric.\n\n\\`\\`\\`sql\n-- Find computed columns in views (information_schema queries are free/cheap)\nSELECT column_name, data_type\nFROM information_schema.columns\nWHERE table_name LIKE 'vw_%' AND data_type IN ('DOUBLE', 'FLOAT', 'INTEGER', 'BIGINT', 'DECIMAL')\nLIMIT 100;\n\\`\\`\\`\n\nFor each computed column (e.g., \\`opportunity_score\\`, \\`shops_per_10k\\`, \\`demand_signal_pct\\`):\n1. Query it to understand what it measures\n2. Add it to the model's \\`metrics[]\\` array in the OSI YAML\n3. Include the SQL expression, aggregation type (SUM/AVG), and a human description\n4. Mark whether it's additive (can be summed across dimensions)\n\nExample:\n\\`\\`\\`yaml\nmetrics:\n - name: opportunity_score\n expression:\n dialects:\n - dialect: DuckDB\n expression: \"(population/10000)*2 + (income/50000)*2 + (10-shops_per_10k)*3 + transit*1.5 + demand*0.5\"\n description: Composite score ranking census tracts for coffee shop viability\n aggregation: AVG\n additive: false\n\\`\\`\\`\n\n### Glossary Terms (gold/glossary-coverage)\n\nFor each key business concept your model measures, create a glossary term file.\n\nThink about the terms a new analyst would need defined:\n- What is \"supply saturation\"? (> 5.0 shops per 10k people)\n- What is a \"demand signal\"? (review mentioning wait/line/crowded/busy)\n- What is \"opportunity score\"? (composite ranking formula)\n\nFor each term, create \\`context/glossary/<term-name>.term.yaml\\`:\n\\`\\`\\`yaml\nterm: supply-saturation\ndefinition: >\n A measure of coffee shop density per census tract. Calculated as\n shops per 10,000 residents. Tracts with > 5.0 are considered saturated.\nowner: analytics-team\ntags: [coffee-analytics]\n\\`\\`\\`\n\nModels with 5+ datasets need at least 3 glossary terms linked by shared tags or owner.\n\n### Relationships (gold/relationships-coverage)\n\nFor each join in the SQL views, define a relationship in the OSI model.\n\n\\`\\`\\`sql\n-- Find joins by examining view definitions (metadata query, low cost)\n-- Look for patterns: ON table_a.col = table_b.col\n-- Or spatial joins: ABS(a.lat - b.lat) < threshold\n-- NEVER run the actual joins yourself to \"test\" them — just document the relationship\n\\`\\`\\`\n\nFor each join:\n\\`\\`\\`yaml\nrelationships:\n - name: business-to-tract\n left_dataset: yelp_business\n right_dataset: census_tract\n join_type: spatial\n cardinality: many-to-one\n description: Businesses assigned to nearest census tract within 0.02 degrees (~1 mile)\n\\`\\`\\`\n\nModels with 3+ datasets need at least 3 relationships.\n\n### Golden Queries\n\nWrite 3-5 SQL queries answering common business questions. **Test each query with LIMIT first!**\n\n\\`\\`\\`sql\n-- Validate with LIMIT (never run unbounded queries to \"test\"):\nSELECT geoid, tract_name, opportunity_score\nFROM vw_candidate_zones ORDER BY opportunity_score DESC LIMIT 10;\n\n-- The golden query YAML can document the full query, but when you TEST it, always use LIMIT\n\\`\\`\\`\n\n## YAML Formats\n\n**Governance** (\\`context/governance/*.governance.yaml\\`):\n\\`\\`\\`yaml\nmodel: my-model\nowner: team-name\nversion: \"1.0.0\"\ntrust: endorsed\nsecurity: internal\ntags: [domain-tag-1, domain-tag-2]\nbusiness_context:\n - name: Use Case Name\n description: What analytical question this data answers and for whom.\ndatasets:\n my_table:\n grain: \"One row per [entity] identified by [key]\"\n table_type: fact # fact | dimension | event | view\n refresh: daily\nfields:\n dataset.field:\n semantic_role: metric # metric | dimension | identifier | date\n default_aggregation: SUM # SUM | AVG | COUNT | COUNT_DISTINCT | MIN | MAX\n additive: true # can this metric be summed across dimensions?\n default_filter: \"is_open = 1\"\n sample_values: [\"val1\", \"val2\"]\n\\`\\`\\`\n\n**Rules** (\\`context/rules/*.rules.yaml\\`):\n\\`\\`\\`yaml\nmodel: my-model\ngolden_queries:\n - question: What are the top items by count?\n sql: SELECT name, count FROM my_table ORDER BY count DESC LIMIT 10\n intent: Identify top performers by volume\n caveats: Filters to active records only\nbusiness_rules:\n - name: valid-ratings\n definition: All ratings must be between 1 and 5\nguardrail_filters:\n - name: active-only\n filter: \"status = 'active'\"\n reason: Exclude inactive records from analytics\n tables: [my_table]\nhierarchies:\n - name: geography\n levels: [state, city, postal_code]\n dataset: my_table\n\\`\\`\\`\n\n## File Structure\n\n\\`\\`\\`\ncontext/\n models/*.osi.yaml # OSI semantic model (schema, relationships, metrics)\n governance/*.governance.yaml # Ownership, trust, security, semantic roles\n rules/*.rules.yaml # Golden queries, business rules, guardrails\n lineage/*.lineage.yaml # Upstream sources\n glossary/*.term.yaml # Business term definitions\n owners/*.owner.yaml # Team ownership records\n reference/ # User-provided docs (data dictionaries, wiki exports, etc.)\n AGENT_INSTRUCTIONS.md # This file\n\\`\\`\\`\n`;\n}\n\nexport async function runAgentInstructionsStep(ctx: SetupContext): Promise<StepResult> {\n const instructionsPath = path.join(ctx.contextDir, 'AGENT_INSTRUCTIONS.md');\n\n if (existsSync(instructionsPath)) {\n const shouldOverwrite = await p.confirm({\n message: 'context/AGENT_INSTRUCTIONS.md already exists. Overwrite with updated instructions?',\n });\n if (p.isCancel(shouldOverwrite) || !shouldOverwrite) {\n return { skipped: true, summary: 'context/AGENT_INSTRUCTIONS.md already exists, kept existing' };\n }\n }\n\n const content = buildAgentInstructions(ctx);\n writeFileSync(instructionsPath, content, 'utf-8');\n\n p.log.success('Generated context/AGENT_INSTRUCTIONS.md — the agent curation guide');\n\n return { skipped: false, summary: 'Generated context/AGENT_INSTRUCTIONS.md' };\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport path from 'node:path';\nimport fs from 'node:fs';\nimport { compile, loadConfig, emitManifest } from '@runcontext/core';\nimport type { Manifest, AIContext } from '@runcontext/core';\nimport { formatError, formatSuccess } from '../formatters/pretty.js';\n\nexport const blueprintCommand = new Command('blueprint')\n .description('Export AI Blueprints — portable, Gold-tier data product specs (OSI v1.0 YAML)')\n .argument('[model]', 'Model name to export (omit for all models)')\n .option('--context-dir <path>', 'Path to context directory')\n .option('--out <path>', 'Output directory for blueprint files', './blueprints')\n .option('--stdout', 'Print to stdout instead of writing files')\n .action(async (modelArg, opts) => {\n try {\n const config = loadConfig(process.cwd());\n const contextDir = opts.contextDir\n ? path.resolve(opts.contextDir)\n : path.resolve(config.context_dir);\n\n const { graph, diagnostics } = await compile({ contextDir, config, rootDir: process.cwd() });\n\n const errors = diagnostics.filter((d) => d.severity === 'error');\n if (errors.length > 0) {\n console.error(chalk.red(`Build failed with ${errors.length} error(s). Run \"context build\" to see details.`));\n process.exit(1);\n }\n\n const manifest = emitManifest(graph, config);\n const modelNames = modelArg\n ? [modelArg]\n : Object.keys(manifest.models);\n\n if (modelNames.length === 0) {\n console.error(chalk.yellow('No models found. Run \"context introspect\" first.'));\n process.exit(1);\n }\n\n // Validate requested model exists\n if (modelArg && !manifest.models[modelArg]) {\n const available = Object.keys(manifest.models).join(', ');\n console.error(formatError(`Model \"${modelArg}\" not found. Available: ${available}`));\n process.exit(1);\n }\n\n if (!opts.stdout) {\n const outDir = path.resolve(opts.out);\n fs.mkdirSync(outDir, { recursive: true });\n }\n\n for (const name of modelNames) {\n const yaml = emitBlueprint(name, manifest);\n\n if (opts.stdout) {\n if (modelNames.length > 1) {\n console.log(chalk.gray(`# ── ${name} ${'─'.repeat(60 - name.length)}`));\n }\n console.log(yaml);\n } else {\n const outDir = path.resolve(opts.out);\n const filePath = path.join(outDir, `${name}.data-product.osi.yaml`);\n fs.writeFileSync(filePath, yaml, 'utf-8');\n console.log(formatSuccess(`${filePath}`));\n }\n }\n\n if (!opts.stdout) {\n const outDir = path.resolve(opts.out);\n console.log(\n chalk.blue(`\\n${modelNames.length} AI Blueprint(s) written to ${outDir}/`),\n );\n console.log(chalk.gray('These portable YAML files contain the full semantic spec for each data product.'));\n console.log(chalk.gray('Share them, serve them via MCP, or import them into any OSI-compliant tool.'));\n }\n } catch (err) {\n console.error(formatError((err as Error).message));\n process.exit(1);\n }\n });\n\n/**\n * Emit a single model as a full OSI-compliant data product YAML.\n */\nexport function emitBlueprint(name: string, manifest: Manifest): string {\n const model = manifest.models[name];\n const governance = manifest.governance[name];\n const rules = manifest.rules[name];\n const tier = manifest.tiers[name];\n\n const lines: string[] = [];\n\n // Header\n lines.push(`# ${name}.data-product.osi.yaml`);\n lines.push(`# AI Blueprint — Open Semantic Interchange (OSI) v1.0`);\n lines.push(`# The complete semantic spec for this data product, ready for any AI agent`);\n lines.push(`# Generated by ContextKit (context blueprint)`);\n lines.push(``);\n lines.push(`osi_version: \"1.0\"`);\n lines.push(``);\n lines.push(`semantic_model:`);\n lines.push(` name: ${name}`);\n\n if (model?.description) {\n lines.push(` description: >`);\n wrapText(lines, model.description, 4);\n }\n\n // Governance header\n if (governance) {\n if (governance.owner) lines.push(` owner: ${governance.owner}`);\n if (governance.trust) lines.push(` trust_status: ${governance.trust}`);\n }\n if (tier) {\n lines.push(` tier: ${tier.tier ?? 'bronze'}`);\n }\n if (governance?.tags && governance.tags.length > 0) {\n lines.push(` tags:`);\n for (const tag of governance.tags) {\n lines.push(` - ${tag}`);\n }\n }\n\n // Glossary (terms that reference this model)\n const relatedTerms = Object.entries(manifest.terms).filter(([, term]) => {\n const maps = term.maps_to ?? [];\n return maps.some((m) => m.startsWith(`${name}.`));\n });\n if (relatedTerms.length > 0) {\n lines.push(``);\n lines.push(` # ── Glossary ────────────────────────────────────────────────`);\n lines.push(` glossary:`);\n for (const [, term] of relatedTerms) {\n lines.push(` - term: ${term.id}`);\n if (term.definition) {\n lines.push(` definition: >`);\n wrapText(lines, term.definition, 8);\n }\n if (term.synonyms && term.synonyms.length > 0) {\n lines.push(` synonyms:`);\n for (const s of term.synonyms) {\n lines.push(` - ${s}`);\n }\n }\n if (term.maps_to && term.maps_to.length > 0) {\n lines.push(` related_fields:`);\n for (const m of term.maps_to) {\n lines.push(` - ${m}`);\n }\n }\n }\n }\n\n // Datasets\n if (model?.datasets && model.datasets.length > 0) {\n lines.push(``);\n lines.push(` # ── Datasets ────────────────────────────────────────────────`);\n lines.push(` datasets:`);\n for (const ds of model.datasets) {\n lines.push(` - name: ${ds.name}`);\n if (ds.description) {\n lines.push(` description: ${yamlStr(ds.description)}`);\n }\n if (ds.source) lines.push(` source: ${ds.source}`);\n if (ds.primary_key && ds.primary_key.length > 0) {\n lines.push(` primary_key: [${ds.primary_key.join(', ')}]`);\n }\n\n // Dataset-level governance\n const dsGov = governance?.datasets?.[ds.name];\n if (dsGov) {\n if (dsGov.grain) lines.push(` grain: ${dsGov.grain}`);\n if (dsGov.table_type) lines.push(` table_type: ${dsGov.table_type}`);\n }\n\n if (ds.ai_context) {\n emitAiContext(lines, ds.ai_context, 6);\n }\n\n // Fields\n if (ds.fields && ds.fields.length > 0) {\n lines.push(` fields:`);\n for (const f of ds.fields) {\n lines.push(` - name: ${f.name}`);\n if (f.expression) {\n const expr = typeof f.expression === 'string' ? f.expression : JSON.stringify(f.expression);\n lines.push(` expression: ${expr}`);\n }\n if (f.description) {\n lines.push(` description: ${yamlStr(f.description)}`);\n }\n if (f.dimension) lines.push(` dimension: true`);\n if (f.label) lines.push(` label: true`);\n\n // Field-level governance\n const fGov = governance?.fields?.[`${ds.name}.${f.name}`] ?? governance?.fields?.[f.name];\n if (fGov) {\n if (fGov.semantic_role) lines.push(` semantic_role: ${fGov.semantic_role}`);\n if (fGov.default_aggregation) lines.push(` aggregation: ${fGov.default_aggregation}`);\n if (fGov.sample_values && fGov.sample_values.length > 0) {\n lines.push(` sample_values:`);\n for (const sv of fGov.sample_values) {\n lines.push(` - ${sv}`);\n }\n }\n if (fGov.default_filter) lines.push(` default_filter: ${yamlStr(fGov.default_filter)}`);\n }\n\n if (f.ai_context) {\n emitAiContext(lines, f.ai_context, 10);\n }\n }\n }\n }\n }\n\n // Relationships\n if (model?.relationships && model.relationships.length > 0) {\n lines.push(``);\n lines.push(` # ── Relationships ───────────────────────────────────────────`);\n lines.push(` relationships:`);\n for (const rel of model.relationships) {\n lines.push(` - name: ${rel.name}`);\n lines.push(` from:`);\n lines.push(` dataset: ${rel.from}`);\n lines.push(` columns: [${rel.from_columns.join(', ')}]`);\n lines.push(` to:`);\n lines.push(` dataset: ${rel.to}`);\n lines.push(` columns: [${rel.to_columns.join(', ')}]`);\n if (rel.cardinality) lines.push(` cardinality: ${rel.cardinality}`);\n }\n }\n\n // Metrics\n if (model?.metrics && model.metrics.length > 0) {\n lines.push(``);\n lines.push(` # ── Metrics ─────────────────────────────────────────────────`);\n lines.push(` metrics:`);\n for (const met of model.metrics) {\n lines.push(` - name: ${met.name}`);\n if (met.expression) {\n const expr = typeof met.expression === 'string' ? met.expression : JSON.stringify(met.expression);\n lines.push(` expression: ${expr}`);\n }\n if (met.description) {\n lines.push(` description: ${yamlStr(met.description)}`);\n }\n if (met.ai_context) {\n emitAiContext(lines, met.ai_context, 6);\n }\n }\n }\n\n // Business rules\n if (rules?.business_rules && rules.business_rules.length > 0) {\n lines.push(``);\n lines.push(` # ── Business Rules ──────────────────────────────────────────`);\n lines.push(` business_rules:`);\n for (const br of rules.business_rules) {\n lines.push(` - name: ${br.name}`);\n if (br.definition) lines.push(` definition: ${yamlStr(br.definition)}`);\n if (br.enforcement && br.enforcement.length > 0) {\n lines.push(` enforcement:`);\n for (const e of br.enforcement) {\n lines.push(` - ${yamlStr(e)}`);\n }\n }\n if (br.avoid && br.avoid.length > 0) {\n lines.push(` avoid:`);\n for (const a of br.avoid) {\n lines.push(` - ${yamlStr(a)}`);\n }\n }\n if (br.applied_always) lines.push(` applied_always: true`);\n }\n }\n\n // Guardrail filters\n if (rules?.guardrail_filters && rules.guardrail_filters.length > 0) {\n lines.push(``);\n lines.push(` # ── Guardrails ──────────────────────────────────────────────`);\n lines.push(` guardrail_filters:`);\n for (const gf of rules.guardrail_filters) {\n lines.push(` - name: ${gf.name}`);\n if (gf.reason) lines.push(` reason: ${yamlStr(gf.reason)}`);\n if (gf.filter) lines.push(` filter: ${yamlStr(gf.filter)}`);\n if (gf.tables && gf.tables.length > 0) {\n lines.push(` tables: [${gf.tables.join(', ')}]`);\n }\n }\n }\n\n // Golden queries\n if (rules?.golden_queries && rules.golden_queries.length > 0) {\n lines.push(``);\n lines.push(` # ── Golden Queries ──────────────────────────────────────────`);\n lines.push(` golden_queries:`);\n for (const gq of rules.golden_queries) {\n lines.push(` - question: ${yamlStr(gq.question)}`);\n if (gq.intent) lines.push(` intent: ${yamlStr(gq.intent)}`);\n if (gq.sql) {\n lines.push(` sql: |`);\n for (const sqlLine of gq.sql.split('\\n')) {\n lines.push(` ${sqlLine}`);\n }\n }\n if (gq.dialect) lines.push(` dialect: ${gq.dialect}`);\n if (gq.caveats) lines.push(` caveats: ${yamlStr(gq.caveats)}`);\n }\n }\n\n lines.push(``);\n return lines.join('\\n');\n}\n\n/** Emit ai_context as YAML (string or AIContext object format). */\nfunction emitAiContext(lines: string[], ctx: string | AIContext, indent: number): void {\n const pad = ' '.repeat(indent);\n if (typeof ctx === 'string') {\n lines.push(`${pad}ai_context: ${yamlStr(ctx)}`);\n } else {\n lines.push(`${pad}ai_context:`);\n if (ctx.instructions) {\n lines.push(`${pad} instructions: >`);\n wrapText(lines, ctx.instructions, indent + 4);\n }\n if (ctx.synonyms && ctx.synonyms.length > 0) {\n lines.push(`${pad} synonyms:`);\n for (const s of ctx.synonyms) {\n lines.push(`${pad} - ${s}`);\n }\n }\n if (ctx.examples && ctx.examples.length > 0) {\n lines.push(`${pad} examples:`);\n for (const e of ctx.examples) {\n lines.push(`${pad} - ${yamlStr(e)}`);\n }\n }\n }\n}\n\n/** Quote a string for safe YAML output. */\nfunction yamlStr(s: string): string {\n if (s.includes('\\n') || s.includes(': ') || s.includes('#') || s.includes('\"') || s.includes(\"'\")) {\n return JSON.stringify(s);\n }\n return s;\n}\n\n/** Wrap long text into indented lines. */\nfunction wrapText(lines: string[], text: string, indent: number): void {\n const pad = ' '.repeat(indent);\n const words = text.replace(/\\n/g, ' ').split(/\\s+/);\n let line = '';\n for (const word of words) {\n if (line.length + word.length + 1 > 76) {\n lines.push(`${pad}${line.trim()}`);\n line = '';\n }\n line += word + ' ';\n }\n if (line.trim()) {\n lines.push(`${pad}${line.trim()}`);\n }\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport path from 'node:path';\nimport fs from 'node:fs';\nimport * as yaml from 'yaml';\nimport { loadConfig } from '@runcontext/core';\nimport { formatSuccess, formatError } from '../formatters/pretty.js';\n\nconst STARTER_OSI = (name: string, dataSource?: string) => {\n const doc: Record<string, unknown> = {\n version: '1.0',\n semantic_model: [\n {\n name,\n description: `Data product: ${name}`,\n ...(dataSource ? { data_source: dataSource } : {}),\n datasets: [],\n },\n ],\n };\n return yaml.stringify(doc, { lineWidth: 120 });\n};\n\nconst STARTER_GOVERNANCE = (name: string) => {\n const doc = {\n model: name,\n owner: 'default-team',\n security: 'internal',\n datasets: {},\n };\n return yaml.stringify(doc, { lineWidth: 120 });\n};\n\nconst STARTER_RULES = (name: string) => {\n const doc = {\n model: name,\n business_rules: [],\n guardrail_filters: [],\n golden_queries: [],\n };\n return yaml.stringify(doc, { lineWidth: 120 });\n};\n\nconst STARTER_OWNER = () => {\n const doc = {\n id: 'default-team',\n display_name: 'Default Team',\n };\n return yaml.stringify(doc, { lineWidth: 120 });\n};\n\nexport const newCommand = new Command('new')\n .description('Scaffold a new data product inside your context directory')\n .argument('<name>', 'Name for the data product (e.g. sales-analytics)')\n .option('--source <name>', 'Bind to a named data source from contextkit.config.yaml')\n .option('--context-dir <path>', 'Path to context directory')\n .action(async (name: string, opts) => {\n try {\n const config = loadConfig(process.cwd());\n const contextDir = opts.contextDir\n ? path.resolve(opts.contextDir)\n : path.resolve(config.context_dir);\n\n // Validate data source exists if specified\n if (opts.source && config.data_sources) {\n const sources = config.data_sources as Record<string, unknown>;\n if (!sources[opts.source]) {\n const available = Object.keys(sources).join(', ');\n console.error(formatError(\n `Data source \"${opts.source}\" not found in contextkit.config.yaml. Available: ${available || '(none)'}`,\n ));\n process.exit(1);\n }\n }\n\n // Create data product directories\n const dirs = [\n path.join(contextDir, 'models'),\n path.join(contextDir, 'governance'),\n path.join(contextDir, 'owners'),\n path.join(contextDir, 'reference'),\n ];\n\n for (const dir of dirs) {\n if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });\n }\n\n // Write starter files (skip if they already exist)\n const files = [\n {\n rel: path.join('models', `${name}.osi.yaml`),\n content: STARTER_OSI(name, opts.source),\n },\n {\n rel: path.join('governance', `${name}.governance.yaml`),\n content: STARTER_GOVERNANCE(name),\n },\n {\n rel: path.join('governance', `${name}.rules.yaml`),\n content: STARTER_RULES(name),\n },\n {\n rel: path.join('owners', 'default-team.owner.yaml'),\n content: STARTER_OWNER(),\n },\n ];\n\n const created: string[] = [];\n const skipped: string[] = [];\n\n for (const f of files) {\n const fullPath = path.join(contextDir, f.rel);\n if (fs.existsSync(fullPath)) {\n skipped.push(f.rel);\n } else {\n fs.writeFileSync(fullPath, f.content, 'utf-8');\n created.push(f.rel);\n }\n }\n\n // Summary\n console.log('');\n if (created.length > 0) {\n console.log(formatSuccess(`Data product \"${name}\" scaffolded`));\n console.log('');\n for (const f of created) {\n console.log(chalk.green(` + ${f}`));\n }\n }\n if (skipped.length > 0) {\n for (const f of skipped) {\n console.log(chalk.gray(` ~ ${f} (exists)`));\n }\n }\n\n console.log('');\n console.log(chalk.gray('Next steps:'));\n console.log(chalk.gray(` 1. Run ${chalk.cyan(`context introspect --db <url>`)} to populate from a database`));\n console.log(chalk.gray(` 2. Run ${chalk.cyan(`context enrich --target silver --apply`)} to auto-fill descriptions`));\n console.log(chalk.gray(` 3. Run ${chalk.cyan(`context tier`)} to check progress toward Gold`));\n console.log(chalk.gray(` 4. Run ${chalk.cyan(`context blueprint ${name}`)} to export the AI Blueprint`));\n } catch (err) {\n console.error(formatError((err as Error).message));\n process.exit(1);\n }\n });\n"],"mappings":"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AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAyJG,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAuHzB,eAAe,iBAAiB;AAAA;AAAA,EAEhC,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAA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","names":["Command","chalk","output","hasErrors","chalk","warnCount","Command","chalk","path","compile","Command","path","compile","chalk","Command","chalk","path","compile","loadConfig","Command","loadConfig","path","compile","chalk","Command","chalk","path","compile","loadConfig","Command","loadConfig","path","compile","chalk","Command","chalk","path","fs","compile","loadConfig","LintEngine","ALL_RULES","applyFixes","createAdapter","Command","chalk","path","writeFileSync","readFileSync","loadConfig","Command","chalk","path","compile","loadConfig","LintEngine","ALL_RULES","createAdapter","Command","loadConfig","path","compile","chalk","createAdapter","LintEngine","ALL_RULES","Command","loadConfig","path","compile","createAdapter","LintEngine","ALL_RULES","chalk","fs","applyFixes","Command","chalk","path","readFileSync","writeFileSync","compile","loadConfig","LintEngine","ALL_RULES","filterByDirectives","applyFixes","loadConfig","compile","LintEngine","ALL_RULES","filterByDirectives","applyFixes","readFileSync","writeFileSync","chalk","Command","path","Command","chalk","path","fs","Command","path","fs","chalk","Command","chalk","path","compile","loadConfig","emitManifest","Command","loadConfig","path","compile","emitManifest","chalk","Command","chalk","Command","chalk","Command","chalk","path","Command","path","chalk","Command","chalk","path","readFileSync","writeFileSync","mkdirSync","existsSync","compile","loadConfig","computeTier","createAdapter","existsSync","path","Command","loadConfig","chalk","compile","computeTier","readFileSync","createAdapter","writeFileSync","mkdirSync","Command","chalk","ALL_RULES","chalk","Command","ALL_RULES","Command","p","chalk","p","path","existsSync","readFileSync","writeFileSync","yaml","loadConfig","createAdapter","MissingDriverError","fs","path","p","loadConfig","existsSync","path","readFileSync","password","createAdapter","MissingDriverError","writeFileSync","p","path","mkdirSync","writeFileSync","existsSync","scaffoldFromSchema","compile","computeTier","loadConfig","p","scaffoldFromSchema","path","existsSync","mkdirSync","writeFileSync","loadConfig","compile","computeTier","p","path","readFileSync","writeFileSync","mkdirSync","existsSync","readdirSync","yaml","compile","computeTier","suggestEnrichments","loadConfig","findFileRecursive","existsSync","readdirSync","path","loadConfig","compile","computeTier","suggestEnrichments","readFileSync","writeFileSync","mkdirSync","p","path","readFileSync","writeFileSync","mkdirSync","existsSync","readdirSync","yaml","compile","computeTier","suggestEnrichments","inferSemanticRole","inferAggregation","loadConfig","findFileRecursive","existsSync","readdirSync","path","loadConfig","compile","computeTier","suggestEnrichments","readFileSync","inferSemanticRole","inferAggregation","writeFileSync","mkdirSync","p","compile","LintEngine","ALL_RULES","computeTier","loadConfig","loadConfig","compile","LintEngine","ALL_RULES","computeTier","p","fs","compile","LintEngine","ALL_RULES","applyFixes","computeTier","loadConfig","loadConfig","compile","LintEngine","ALL_RULES","computeTier","fs","applyFixes","p","path","existsSync","writeFileSync","Command","chalk","Command","chalk","path","fs","compile","loadConfig","emitManifest","Command","loadConfig","path","compile","chalk","emitManifest","fs","yaml","text","Command","chalk","path","fs","yaml","loadConfig","Command","loadConfig","path","fs","chalk","Command"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/commands/lint.ts","../src/formatters/pretty.ts","../src/formatters/json.ts","../src/formatters/sarif.ts","../src/formatters/github.ts","../src/formatters/junit.ts","../src/commands/build.ts","../src/commands/tier.ts","../src/commands/explain.ts","../src/commands/fix.ts","../src/commands/introspect.ts","../src/commands/verify.ts","../src/commands/dev.ts","../src/commands/init.ts","../src/commands/site.ts","../src/commands/serve.ts","../src/commands/validate-osi.ts","../src/commands/enrich.ts","../src/commands/rules.ts","../src/commands/setup.ts","../src/setup/steps/connect.ts","../src/setup/mcp-discovery.ts","../src/setup/steps/scaffold.ts","../src/setup/display.ts","../src/setup/steps/enrich-silver.ts","../src/setup/steps/enrich-gold.ts","../src/setup/steps/verify.ts","../src/setup/steps/autofix.ts","../src/setup/steps/claude-md.ts","../src/commands/blueprint.ts","../src/commands/new.ts"],"sourcesContent":["// ContextKit CLI v0.2\n\nimport { Command } from 'commander';\nimport { lintCommand } from './commands/lint.js';\nimport { buildCommand } from './commands/build.js';\nimport { tierCommand } from './commands/tier.js';\nimport { explainCommand } from './commands/explain.js';\nimport { fixCommand } from './commands/fix.js';\nimport { devCommand } from './commands/dev.js';\nimport { initCommand } from './commands/init.js';\nimport { siteCommand } from './commands/site.js';\nimport { serveCommand } from './commands/serve.js';\nimport { validateOsiCommand } from './commands/validate-osi.js';\nimport { introspectCommand } from './commands/introspect.js';\nimport { verifyCommand } from './commands/verify.js';\nimport { enrichCommand } from './commands/enrich.js';\nimport { rulesCommand } from './commands/rules.js';\nimport { setupCommand } from './commands/setup.js';\nimport { blueprintCommand } from './commands/blueprint.js';\nimport { newCommand } from './commands/new.js';\n\nconst program = new Command();\n\nprogram\n .name('context')\n .description('ContextKit — AI-ready metadata governance over OSI')\n .version('0.4.4');\n\n// Register all commands\nprogram.addCommand(lintCommand);\nprogram.addCommand(buildCommand);\nprogram.addCommand(tierCommand);\nprogram.addCommand(explainCommand);\nprogram.addCommand(fixCommand);\nprogram.addCommand(devCommand);\nprogram.addCommand(initCommand);\nprogram.addCommand(siteCommand);\nprogram.addCommand(serveCommand);\nprogram.addCommand(validateOsiCommand);\nprogram.addCommand(introspectCommand);\nprogram.addCommand(verifyCommand);\nprogram.addCommand(enrichCommand);\nprogram.addCommand(rulesCommand);\nprogram.addCommand(setupCommand);\nprogram.addCommand(blueprintCommand);\nprogram.addCommand(newCommand);\n\nprogram.parse();\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport path from 'node:path';\nimport { readFileSync, writeFileSync } from 'node:fs';\nimport {\n compile,\n loadConfigAsync,\n LintEngine,\n ALL_RULES,\n filterByDirectives,\n applyFixes,\n loadPlugins,\n computeCacheHash,\n readCache,\n writeCache,\n type Diagnostic,\n type Severity,\n type MetadataTier,\n} from '@runcontext/core';\nimport { formatDiagnostics } from '../formatters/pretty.js';\nimport { formatJson } from '../formatters/json.js';\nimport { formatSarif } from '../formatters/sarif.js';\nimport { formatGitHub } from '../formatters/github.js';\nimport { formatJUnit } from '../formatters/junit.js';\n\ntype FormatType = 'pretty' | 'json' | 'sarif' | 'github' | 'junit';\n\nconst VALID_FORMATS: FormatType[] = ['pretty', 'json', 'sarif', 'github', 'junit'];\n\n/**\n * Detect the best default format based on CI environment.\n */\nfunction detectFormat(): FormatType {\n if (process.env.GITHUB_ACTIONS) return 'github';\n if (process.env.CI) return 'json';\n return 'pretty';\n}\n\n/**\n * Parse --rule overrides: \"ruleId:severity\" pairs.\n * Accumulates across multiple --rule flags.\n */\nfunction collectRule(value: string, previous: Record<string, string>): Record<string, string> {\n const lastColon = value.lastIndexOf(':');\n if (lastColon === -1) {\n throw new Error(`Invalid --rule format: \"${value}\". Expected \"ruleId:severity\" (e.g., \"governance/grain-required:error\")`);\n }\n const ruleId = value.slice(0, lastColon);\n const severity = value.slice(lastColon + 1);\n if (!['error', 'warning', 'off'].includes(severity)) {\n throw new Error(`Invalid severity \"${severity}\" in --rule \"${value}\". Must be error, warning, or off.`);\n }\n previous[ruleId] = severity;\n return previous;\n}\n\n/**\n * Format diagnostics using the specified format.\n */\nfunction formatOutput(diagnostics: Diagnostic[], format: FormatType): string {\n switch (format) {\n case 'json':\n return formatJson(diagnostics);\n case 'sarif':\n return formatSarif(diagnostics);\n case 'github':\n return formatGitHub(diagnostics);\n case 'junit':\n return formatJUnit(diagnostics);\n case 'pretty':\n default:\n return formatDiagnostics(diagnostics);\n }\n}\n\nexport const lintCommand = new Command('lint')\n .description('Run all lint rules against context files')\n .option('--context-dir <path>', 'Path to context directory')\n .option('--format <type>', `Output format: ${VALID_FORMATS.join(', ')}`)\n .option('--max-warnings <count>', 'Exit with error if warning count exceeds this threshold', parseInt)\n .option('--output-file <path>', 'Write formatted output to a file')\n .option('--rule <ruleId:severity>', 'Override rule severity (repeatable)', collectRule, {})\n .option('--fix', 'Automatically fix problems')\n .option('--fix-dry-run', 'Show what --fix would change without writing')\n .option('--cache', 'Only lint changed files (uses .contextkit-cache)')\n .option('--no-cache', 'Bypass the lint cache')\n .action(async (opts) => {\n try {\n const config = await loadConfigAsync(process.cwd());\n const contextDir = opts.contextDir\n ? path.resolve(opts.contextDir)\n : path.resolve(config.context_dir);\n const rootDir = process.cwd();\n\n // Determine output format (explicit flag > CI auto-detect)\n const format: FormatType = opts.format\n ? (VALID_FORMATS.includes(opts.format) ? opts.format : 'pretty')\n : detectFormat();\n\n // Check cache if --cache is enabled\n const useCache = opts.cache === true;\n if (useCache) {\n const configContent = JSON.stringify(config) + JSON.stringify(opts.rule ?? {});\n const hash = computeCacheHash(contextDir, configContent);\n const cached = readCache(rootDir, hash);\n if (cached) {\n const output = formatOutput(cached, format);\n if (opts.outputFile) {\n writeFileSync(path.resolve(opts.outputFile), output, 'utf-8');\n const ec = cached.filter((d) => d.severity === 'error').length;\n const wc = cached.filter((d) => d.severity === 'warning').length;\n console.log(`Results written to ${opts.outputFile} (${ec} error(s), ${wc} warning(s)) (cached)`);\n } else {\n console.log(output);\n }\n const hasErrors = cached.some((d) => d.severity === 'error');\n if (hasErrors) process.exit(1);\n return;\n }\n }\n\n // Compile the context graph\n const { graph, diagnostics: compileDiags, directives } = await compile({\n contextDir,\n config,\n rootDir,\n });\n\n // Merge severity overrides: config file + CLI --rule overrides (CLI wins)\n const configOverrides = (config.lint?.severity_overrides ?? {}) as Record<string, Severity | 'off'>;\n const cliOverrides = opts.rule as Record<string, string>;\n const overrides: Record<string, Severity | 'off'> = {\n ...configOverrides,\n ...cliOverrides as Record<string, Severity | 'off'>,\n };\n\n // Run lint engine with built-in + plugin rules\n const engine = new LintEngine(Object.keys(overrides).length > 0 ? overrides : undefined);\n for (const rule of ALL_RULES) {\n engine.register(rule);\n }\n if (config.plugins && config.plugins.length > 0) {\n const pluginRules = await loadPlugins(config.plugins);\n for (const rule of pluginRules) {\n engine.register(rule);\n }\n }\n const lintDiags = engine.run(graph);\n\n // Merge compile diagnostics with lint diagnostics, then filter by inline directives\n let allDiags: Diagnostic[] = filterByDirectives(\n [...compileDiags, ...lintDiags],\n directives,\n );\n\n // Apply auto-fixes if --fix or --fix-dry-run\n if (opts.fix || opts.fixDryRun) {\n const fixable = allDiags.filter((d) => d.fixable && d.fix);\n if (fixable.length > 0) {\n const fixes = applyFixes(fixable, (filePath) => readFileSync(filePath, 'utf-8'));\n\n if (opts.fixDryRun) {\n console.log(chalk.blue(`Would fix ${fixable.length} issue(s) in ${fixes.size} file(s):`));\n for (const [file] of fixes) {\n console.log(chalk.gray(` ${file}`));\n }\n console.log('');\n } else {\n // Write fixes to disk\n for (const [file, content] of fixes) {\n writeFileSync(file, content, 'utf-8');\n }\n console.log(chalk.green(`Fixed ${fixable.length} issue(s) in ${fixes.size} file(s).`));\n\n // Re-lint to show remaining issues\n const { graph: reGraph, diagnostics: reCompileDiags, directives: reDirs } = await compile({\n contextDir,\n config,\n rootDir: process.cwd(),\n });\n const reEngine = new LintEngine(Object.keys(overrides).length > 0 ? overrides : undefined);\n for (const rule of ALL_RULES) {\n reEngine.register(rule);\n }\n const reLintDiags = reEngine.run(reGraph);\n allDiags = filterByDirectives([...reCompileDiags, ...reLintDiags], reDirs);\n }\n }\n }\n\n // Enforce minimum_tier policy\n if (config.minimum_tier) {\n const tierOrder: MetadataTier[] = ['none', 'bronze', 'silver', 'gold'];\n const minIdx = tierOrder.indexOf(config.minimum_tier);\n for (const [modelName, score] of graph.tiers) {\n const actualIdx = tierOrder.indexOf(score.tier);\n if (actualIdx < minIdx) {\n allDiags.push({\n ruleId: 'tier/minimum-tier',\n severity: 'error',\n message: `Model \"${modelName}\" is tier \"${score.tier}\" but minimum_tier is \"${config.minimum_tier}\"`,\n location: { file: `model:${modelName}`, line: 1, column: 1 },\n fixable: false,\n });\n }\n }\n }\n\n // Write cache if enabled\n if (useCache) {\n const configContent = JSON.stringify(config) + JSON.stringify(opts.rule ?? {});\n const hash = computeCacheHash(contextDir, configContent);\n writeCache(rootDir, hash, allDiags);\n }\n\n // Format output\n const output = formatOutput(allDiags, format);\n\n // Write to file if --output-file specified\n if (opts.outputFile) {\n writeFileSync(path.resolve(opts.outputFile), output, 'utf-8');\n // Print summary to stdout\n const errorCount = allDiags.filter((d) => d.severity === 'error').length;\n const warnCount = allDiags.filter((d) => d.severity === 'warning').length;\n console.log(`Results written to ${opts.outputFile} (${errorCount} error(s), ${warnCount} warning(s))`);\n } else {\n console.log(output);\n }\n\n // Check --max-warnings threshold\n const warnCount = allDiags.filter((d) => d.severity === 'warning').length;\n if (opts.maxWarnings !== undefined && !isNaN(opts.maxWarnings) && warnCount > opts.maxWarnings) {\n console.error(\n chalk.red(`Too many warnings: ${warnCount} (max allowed: ${opts.maxWarnings})`),\n );\n process.exit(1);\n }\n\n // Exit with code 1 if there are errors\n const hasErrors = allDiags.some((d) => d.severity === 'error');\n if (hasErrors) {\n process.exit(1);\n }\n } catch (err) {\n console.error(chalk.red(`Lint failed: ${(err as Error).message}`));\n process.exit(1);\n }\n });\n","import chalk from 'chalk';\nimport type { Diagnostic, TierScore, TierCheckResult } from '@runcontext/core';\n\n/**\n * Format an array of diagnostics as colorized, human-readable text.\n */\nexport function formatDiagnostics(diagnostics: Diagnostic[]): string {\n if (diagnostics.length === 0) {\n return chalk.green('No issues found.');\n }\n\n const lines: string[] = [];\n\n for (const d of diagnostics) {\n const icon =\n d.severity === 'error' ? chalk.red('error') : chalk.yellow('warning');\n const loc = chalk.gray(\n `${d.location.file}:${d.location.line}:${d.location.column}`,\n );\n const rule = chalk.gray(`[${d.ruleId}]`);\n const fixTag = d.fixable ? chalk.blue(' (fixable)') : '';\n\n lines.push(` ${icon} ${d.message} ${rule}${fixTag}`);\n lines.push(` ${loc}`);\n }\n\n const errorCount = diagnostics.filter((d) => d.severity === 'error').length;\n const warnCount = diagnostics.filter((d) => d.severity === 'warning').length;\n\n lines.push('');\n const parts: string[] = [];\n if (errorCount > 0) parts.push(chalk.red(`${errorCount} error(s)`));\n if (warnCount > 0) parts.push(chalk.yellow(`${warnCount} warning(s)`));\n lines.push(parts.join(', '));\n\n return lines.join('\\n');\n}\n\n/**\n * Format a tier score as colorized, human-readable text.\n */\nexport function formatTierScore(score: TierScore): string {\n const lines: string[] = [];\n\n const tierColor = getTierColor(score.tier);\n lines.push(\n `${chalk.bold(score.model)}: ${tierColor(score.tier.toUpperCase())}`,\n );\n lines.push('');\n\n lines.push(formatTierSection('Bronze', score.bronze.passed, score.bronze.checks));\n lines.push(formatTierSection('Silver', score.silver.passed, score.silver.checks));\n lines.push(formatTierSection('Gold', score.gold.passed, score.gold.checks));\n\n return lines.join('\\n');\n}\n\nfunction formatTierSection(\n label: string,\n passed: boolean,\n checks: TierCheckResult[],\n): string {\n const lines: string[] = [];\n const status = passed ? chalk.green('PASS') : chalk.red('FAIL');\n lines.push(` ${label}: ${status}`);\n\n for (const check of checks) {\n const icon = check.passed ? chalk.green(' +') : chalk.red(' -');\n lines.push(` ${icon} ${check.label}`);\n if (check.detail && !check.passed) {\n lines.push(chalk.gray(` ${check.detail}`));\n }\n }\n\n return lines.join('\\n');\n}\n\nfunction getTierColor(tier: string): (text: string) => string {\n switch (tier) {\n case 'gold':\n return chalk.yellow;\n case 'silver':\n return chalk.white;\n case 'bronze':\n return chalk.hex('#CD7F32');\n default:\n return chalk.gray;\n }\n}\n\n/**\n * Format a generic info message.\n */\nexport function formatInfo(message: string): string {\n return chalk.blue(message);\n}\n\n/**\n * Format an error message.\n */\nexport function formatError(message: string): string {\n return chalk.red(`Error: ${message}`);\n}\n\n/**\n * Format a success message.\n */\nexport function formatSuccess(message: string): string {\n return chalk.green(message);\n}\n","/**\n * Format any value as pretty-printed JSON.\n */\nexport function formatJson(data: unknown): string {\n return JSON.stringify(data, null, 2);\n}\n","import type { Diagnostic } from '@runcontext/core';\n\ninterface SarifRuleDescriptor {\n id: string;\n shortDescription: { text: string };\n}\n\ninterface SarifResult {\n ruleId: string;\n level: 'error' | 'warning' | 'note';\n message: { text: string };\n locations: Array<{\n physicalLocation: {\n artifactLocation: { uri: string };\n region: { startLine: number; startColumn: number };\n };\n }>;\n}\n\ninterface SarifRun {\n tool: {\n driver: {\n name: string;\n version: string;\n informationUri: string;\n rules: SarifRuleDescriptor[];\n };\n };\n results: SarifResult[];\n}\n\ninterface SarifLog {\n $schema: string;\n version: string;\n runs: SarifRun[];\n}\n\nfunction mapSeverity(severity: string): 'error' | 'warning' | 'note' {\n switch (severity) {\n case 'error':\n return 'error';\n case 'warning':\n return 'warning';\n default:\n return 'note';\n }\n}\n\n/**\n * Format diagnostics as SARIF v2.1.0 JSON.\n * GitHub natively consumes this for code scanning alerts.\n */\nexport function formatSarif(diagnostics: Diagnostic[]): string {\n // Collect unique rules\n const ruleMap = new Map<string, SarifRuleDescriptor>();\n for (const d of diagnostics) {\n if (!ruleMap.has(d.ruleId)) {\n ruleMap.set(d.ruleId, {\n id: d.ruleId,\n shortDescription: { text: d.message },\n });\n }\n }\n\n const results: SarifResult[] = diagnostics.map((d) => ({\n ruleId: d.ruleId,\n level: mapSeverity(d.severity),\n message: { text: d.message },\n locations: [\n {\n physicalLocation: {\n artifactLocation: { uri: d.location.file },\n region: {\n startLine: d.location.line,\n startColumn: d.location.column,\n },\n },\n },\n ],\n }));\n\n const sarif: SarifLog = {\n $schema:\n 'https://raw.githubusercontent.com/oasis-tcs/sarif-spec/main/sarif-2.1/schema/sarif-schema-2.1.0.json',\n version: '2.1.0',\n runs: [\n {\n tool: {\n driver: {\n name: 'ContextKit',\n version: '0.4.4',\n informationUri: 'https://github.com/erickittelson/ContextKit',\n rules: Array.from(ruleMap.values()),\n },\n },\n results,\n },\n ],\n };\n\n return JSON.stringify(sarif, null, 2);\n}\n","import type { Diagnostic } from '@runcontext/core';\n\n/**\n * Format diagnostics as GitHub Actions workflow commands.\n * Output: ::warning file={f},line={l},col={c},title={ruleId}::{message}\n * Works in any GitHub Actions workflow — annotations appear inline on PRs.\n */\nexport function formatGitHub(diagnostics: Diagnostic[]): string {\n if (diagnostics.length === 0) {\n return '';\n }\n\n const lines: string[] = [];\n\n for (const d of diagnostics) {\n const level = d.severity === 'error' ? 'error' : 'warning';\n lines.push(\n `::${level} file=${d.location.file},line=${d.location.line},col=${d.location.column},title=${d.ruleId}::${d.message}`,\n );\n }\n\n return lines.join('\\n');\n}\n","import type { Diagnostic } from '@runcontext/core';\n\nfunction escapeXml(str: string): string {\n return str\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&apos;');\n}\n\n/**\n * Format diagnostics as JUnit XML.\n * Consumed by Jenkins, GitLab CI, CircleCI, Azure DevOps.\n * Groups diagnostics by file as <testsuite>, each diagnostic as <testcase> with <failure>.\n */\nexport function formatJUnit(diagnostics: Diagnostic[]): string {\n // Group diagnostics by file\n const byFile = new Map<string, Diagnostic[]>();\n for (const d of diagnostics) {\n const file = d.location.file;\n if (!byFile.has(file)) {\n byFile.set(file, []);\n }\n byFile.get(file)!.push(d);\n }\n\n const lines: string[] = [];\n lines.push('<?xml version=\"1.0\" encoding=\"UTF-8\"?>');\n lines.push(\n `<testsuites name=\"ContextKit\" tests=\"${diagnostics.length}\" failures=\"${diagnostics.length}\">`,\n );\n\n for (const [file, diags] of byFile) {\n lines.push(\n ` <testsuite name=\"${escapeXml(file)}\" tests=\"${diags.length}\" failures=\"${diags.length}\">`,\n );\n\n for (const d of diags) {\n const name = `${d.ruleId} (${d.location.line}:${d.location.column})`;\n lines.push(` <testcase name=\"${escapeXml(name)}\" classname=\"${escapeXml(file)}\">`);\n lines.push(\n ` <failure message=\"${escapeXml(d.message)}\" type=\"${d.severity}\">${escapeXml(d.ruleId)}: ${escapeXml(d.message)} at ${escapeXml(file)}:${d.location.line}:${d.location.column}</failure>`,\n );\n lines.push(' </testcase>');\n }\n\n lines.push(' </testsuite>');\n }\n\n lines.push('</testsuites>');\n return lines.join('\\n');\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport path from 'node:path';\nimport fs from 'node:fs';\nimport { compile, loadConfig, emitManifest } from '@runcontext/core';\nimport { formatJson } from '../formatters/json.js';\nimport { formatSuccess, formatError } from '../formatters/pretty.js';\n\nexport const buildCommand = new Command('build')\n .description('Compile context files and emit manifest JSON')\n .option('--context-dir <path>', 'Path to context directory')\n .option('--output-dir <path>', 'Path to output directory')\n .option('--format <type>', 'Output format: pretty or json', 'pretty')\n .action(async (opts) => {\n try {\n const config = loadConfig(process.cwd());\n const contextDir = opts.contextDir\n ? path.resolve(opts.contextDir)\n : path.resolve(config.context_dir);\n const outputDir = opts.outputDir\n ? path.resolve(opts.outputDir)\n : path.resolve(config.output_dir);\n\n // Compile the context graph\n const { graph, diagnostics } = await compile({ contextDir, config, rootDir: process.cwd() });\n\n // Check for compile errors\n const errors = diagnostics.filter((d) => d.severity === 'error');\n if (errors.length > 0) {\n if (opts.format === 'json') {\n console.log(formatJson({ success: false, errors }));\n } else {\n console.error(\n chalk.red(`Build failed with ${errors.length} error(s):`),\n );\n for (const e of errors) {\n console.error(chalk.red(` - ${e.message} [${e.ruleId}]`));\n }\n }\n process.exit(1);\n }\n\n // Emit manifest\n const manifest = emitManifest(graph, config);\n\n // Write to output directory\n fs.mkdirSync(outputDir, { recursive: true });\n const outputPath = path.join(outputDir, 'contextkit-manifest.json');\n fs.writeFileSync(outputPath, JSON.stringify(manifest, null, 2), 'utf-8');\n\n if (opts.format === 'json') {\n console.log(formatJson({ success: true, outputPath, manifest }));\n } else {\n console.log(formatSuccess(`Manifest written to ${outputPath}`));\n }\n } catch (err) {\n console.error(formatError((err as Error).message));\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport path from 'node:path';\nimport { compile, loadConfig, computeTier, type TierScore } from '@runcontext/core';\nimport { formatTierScore, formatError } from '../formatters/pretty.js';\nimport { formatJson } from '../formatters/json.js';\n\nexport const tierCommand = new Command('tier')\n .description('Show tier scorecard for one or all models')\n .argument('[model-name]', 'Specific model name to check')\n .option('--context-dir <path>', 'Path to context directory')\n .option('--format <type>', 'Output format: pretty or json', 'pretty')\n .action(async (modelName: string | undefined, opts) => {\n try {\n const config = loadConfig(process.cwd());\n const contextDir = opts.contextDir\n ? path.resolve(opts.contextDir)\n : path.resolve(config.context_dir);\n\n const { graph } = await compile({ contextDir, config, rootDir: process.cwd() });\n\n let scores: TierScore[];\n\n if (modelName) {\n // Single model\n if (!graph.models.has(modelName)) {\n console.error(formatError(`Model '${modelName}' not found.`));\n const available = [...graph.models.keys()].join(', ');\n if (available) {\n console.error(chalk.gray(`Available models: ${available}`));\n }\n process.exit(1);\n }\n scores = [computeTier(modelName, graph)];\n } else {\n // All models\n scores = [...graph.models.keys()].map((name) =>\n computeTier(name, graph),\n );\n }\n\n if (scores.length === 0) {\n console.log(\n opts.format === 'json'\n ? formatJson([])\n : chalk.yellow('No models found.'),\n );\n return;\n }\n\n if (opts.format === 'json') {\n console.log(formatJson(scores));\n } else {\n for (const score of scores) {\n console.log(formatTierScore(score));\n console.log('');\n }\n }\n } catch (err) {\n console.error(formatError((err as Error).message));\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport path from 'node:path';\nimport { compile, loadConfig } from '@runcontext/core';\nimport { formatJson } from '../formatters/json.js';\nimport { formatError } from '../formatters/pretty.js';\n\nexport const explainCommand = new Command('explain')\n .description('Look up models, terms, or owners by name and show details')\n .argument('<name>', 'Name of a model, term, or owner to look up')\n .option('--context-dir <path>', 'Path to context directory')\n .option('--format <type>', 'Output format: pretty or json', 'pretty')\n .action(async (name: string, opts) => {\n try {\n const config = loadConfig(process.cwd());\n const contextDir = opts.contextDir\n ? path.resolve(opts.contextDir)\n : path.resolve(config.context_dir);\n\n const { graph } = await compile({ contextDir, config, rootDir: process.cwd() });\n\n const results: Array<{ type: string; name: string; data: unknown }> = [];\n\n // Search models\n if (graph.models.has(name)) {\n results.push({ type: 'model', name, data: graph.models.get(name) });\n }\n\n // Search terms\n if (graph.terms.has(name)) {\n results.push({ type: 'term', name, data: graph.terms.get(name) });\n }\n\n // Search owners\n if (graph.owners.has(name)) {\n results.push({ type: 'owner', name, data: graph.owners.get(name) });\n }\n\n // Search governance\n if (graph.governance.has(name)) {\n results.push({\n type: 'governance',\n name,\n data: graph.governance.get(name),\n });\n }\n\n // Search rules\n if (graph.rules.has(name)) {\n results.push({ type: 'rules', name, data: graph.rules.get(name) });\n }\n\n // Search lineage\n if (graph.lineage.has(name)) {\n results.push({ type: 'lineage', name, data: graph.lineage.get(name) });\n }\n\n if (results.length === 0) {\n console.error(formatError(`No matching entity found for '${name}'.`));\n process.exit(1);\n }\n\n if (opts.format === 'json') {\n console.log(formatJson(results));\n } else {\n for (const result of results) {\n console.log(chalk.bold(`${result.type}: ${result.name}`));\n console.log(chalk.gray('---'));\n console.log(JSON.stringify(result.data, null, 2));\n console.log('');\n }\n }\n } catch (err) {\n console.error(formatError((err as Error).message));\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport path from 'node:path';\nimport fs from 'node:fs';\nimport {\n compile,\n loadConfig,\n LintEngine,\n ALL_RULES,\n applyFixes,\n createAdapter,\n type Severity,\n type DataSourceConfig,\n} from '@runcontext/core';\nimport { formatSuccess, formatError } from '../formatters/pretty.js';\nimport { formatJson } from '../formatters/json.js';\nimport { parseDbUrl } from './introspect.js';\nimport { collectDataValidation } from './verify.js';\n\nexport const fixCommand = new Command('fix')\n .description('Auto-fix lint issues')\n .option('--context-dir <path>', 'Path to context directory')\n .option('--format <type>', 'Output format: pretty or json', 'pretty')\n .option('--dry-run', 'Show what would be fixed without writing files')\n .option('--db <url>', 'Database URL for data-aware fixes (postgres:// or path.duckdb)')\n .option('--source <name>', 'Use a specific data_source from config')\n .action(async (opts) => {\n try {\n const config = loadConfig(process.cwd());\n const contextDir = opts.contextDir\n ? path.resolve(opts.contextDir)\n : path.resolve(config.context_dir);\n\n // Compile and lint\n const { graph } = await compile({ contextDir, config, rootDir: process.cwd() });\n\n // If --db or data_sources configured, connect and collect validation data\n let dsConfig: DataSourceConfig | undefined;\n if (opts.db) {\n dsConfig = parseDbUrl(opts.db);\n } else {\n const sources = config.data_sources;\n if (sources && Object.keys(sources).length > 0) {\n const name = opts.source ?? Object.keys(sources)[0]!;\n dsConfig = sources[name];\n }\n }\n\n if (dsConfig) {\n const adapter = await createAdapter(dsConfig);\n await adapter.connect();\n graph.dataValidation = await collectDataValidation(adapter, graph);\n await adapter.disconnect();\n }\n\n const overrides = config.lint?.severity_overrides as\n | Record<string, Severity | 'off'>\n | undefined;\n const engine = new LintEngine(overrides);\n for (const rule of ALL_RULES) {\n engine.register(rule);\n }\n const diagnostics = engine.run(graph);\n\n const fixable = diagnostics.filter((d) => d.fixable);\n\n if (fixable.length === 0) {\n if (opts.format === 'json') {\n console.log(formatJson({ fixedFiles: [], fixCount: 0 }));\n } else {\n console.log(chalk.green('No fixable issues found.'));\n }\n return;\n }\n\n // Apply fixes\n const readFile = (filePath: string) =>\n fs.readFileSync(filePath, 'utf-8');\n const fixedFiles = applyFixes(fixable, readFile);\n\n if (opts.dryRun) {\n if (opts.format === 'json') {\n const entries = [...fixedFiles.entries()].map(([file, content]) => ({\n file,\n content,\n }));\n console.log(\n formatJson({ dryRun: true, fixCount: fixable.length, entries }),\n );\n } else {\n console.log(\n chalk.yellow(`Dry run: ${fixable.length} issue(s) would be fixed in ${fixedFiles.size} file(s):`),\n );\n for (const file of fixedFiles.keys()) {\n console.log(chalk.gray(` ${file}`));\n }\n }\n return;\n }\n\n // Write fixed files\n for (const [file, content] of fixedFiles) {\n fs.writeFileSync(file, content, 'utf-8');\n }\n\n if (opts.format === 'json') {\n console.log(\n formatJson({\n fixedFiles: [...fixedFiles.keys()],\n fixCount: fixable.length,\n }),\n );\n } else {\n console.log(\n formatSuccess(\n `Fixed ${fixable.length} issue(s) in ${fixedFiles.size} file(s).`,\n ),\n );\n }\n } catch (err) {\n console.error(formatError((err as Error).message));\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport path from 'node:path';\nimport { mkdirSync, writeFileSync, existsSync, readFileSync, unlinkSync } from 'node:fs';\nimport * as p from '@clack/prompts';\nimport {\n loadConfig,\n createAdapter,\n scaffoldFromSchema,\n MissingDriverError,\n} from '@runcontext/core';\nimport type { DataSourceConfig } from '@runcontext/core';\n\nexport function parseDbUrl(db: string): DataSourceConfig {\n // URL-scheme based detection\n if (db.startsWith('duckdb://')) {\n return { adapter: 'duckdb', path: db.slice('duckdb://'.length) };\n }\n if (db.startsWith('postgres://') || db.startsWith('postgresql://')) {\n return { adapter: 'postgres', connection: db };\n }\n if (db.startsWith('mysql://')) {\n return { adapter: 'mysql', connection: db };\n }\n if (db.startsWith('mssql://') || db.startsWith('sqlserver://')) {\n return { adapter: 'mssql', connection: db };\n }\n if (db.startsWith('clickhouse://')) {\n return { adapter: 'clickhouse', host: db } as DataSourceConfig;\n }\n if (db.startsWith('snowflake://')) {\n // snowflake://account/database/schema\n const parts = db.slice('snowflake://'.length).split('/');\n return {\n adapter: 'snowflake',\n account: parts[0] ?? '',\n database: parts[1] ?? '',\n schema: parts[2] ?? '',\n } as DataSourceConfig;\n }\n if (db.startsWith('bigquery://')) {\n // bigquery://project/dataset\n const parts = db.slice('bigquery://'.length).split('/');\n return {\n adapter: 'bigquery',\n project: parts[0] ?? '',\n dataset: parts[1] ?? '',\n } as DataSourceConfig;\n }\n\n // File-extension based detection\n if (db.endsWith('.duckdb')) {\n return { adapter: 'duckdb', path: db };\n }\n if (db.endsWith('.sqlite') || db.endsWith('.sqlite3')) {\n return { adapter: 'sqlite', path: db } as DataSourceConfig;\n }\n if (db.endsWith('.db')) {\n // .db files could be either DuckDB or SQLite; default to duckdb for backward compat\n return { adapter: 'duckdb', path: db };\n }\n\n throw new Error(\n `Cannot determine adapter from \"${db}\". Use a URL prefix (duckdb://, postgres://, mysql://, mssql://, clickhouse://, snowflake://, bigquery://) or a recognized file extension (.duckdb, .db, .sqlite, .sqlite3).`,\n );\n}\n\nexport const introspectCommand = new Command('introspect')\n .description('Introspect a database and scaffold Bronze-level OSI metadata. Supports: duckdb://, postgres://, mysql://, mssql://, snowflake://, bigquery://, clickhouse://, .sqlite, .duckdb files, and Databricks (via config).')\n .option(\n '--db <url>',\n 'Database URL (duckdb://path.duckdb, postgres://user:pass@host/db, mysql://..., mssql://..., snowflake://account/db/schema, bigquery://project/dataset, clickhouse://host, or file.sqlite)',\n )\n .option(\n '--source <name>',\n 'Use a named data_source from contextkit.config.yaml',\n )\n .option('--tables <glob>', 'Filter tables by glob pattern (e.g., \"vw_*\")')\n .option('--select', 'Interactively select which tables to include')\n .option(\n '--model-name <name>',\n 'Name for the generated model (default: derived from source)',\n )\n .action(async (opts) => {\n try {\n const config = loadConfig(process.cwd());\n const contextDir = path.resolve(config.context_dir);\n\n // Resolve data source config\n let dsConfig: DataSourceConfig;\n let dsName: string;\n\n if (opts.db) {\n dsConfig = parseDbUrl(opts.db);\n dsName = opts.source ?? 'default';\n } else if (opts.source) {\n if (!config.data_sources?.[opts.source]) {\n console.error(\n chalk.red(\n `Data source \"${opts.source}\" not found in config`,\n ),\n );\n process.exit(1);\n }\n dsConfig = config.data_sources[opts.source]!;\n dsName = opts.source;\n } else {\n const sources = config.data_sources;\n if (!sources || Object.keys(sources).length === 0) {\n console.error(\n chalk.red(\n 'No data source specified. Use --db <url> or configure data_sources in config',\n ),\n );\n process.exit(1);\n }\n const firstName = Object.keys(sources)[0]!;\n dsConfig = sources[firstName]!;\n dsName = firstName;\n }\n\n // Connect\n const adapter = await createAdapter(dsConfig);\n await adapter.connect();\n console.log(\n chalk.green(\n `Connected to ${dsConfig.adapter}: ${dsConfig.path ?? dsConfig.connection}`,\n ),\n );\n\n // Introspect\n let tables = await adapter.listTables();\n\n if (opts.tables) {\n const pattern = opts.tables.replace(/\\*/g, '.*');\n const regex = new RegExp(`^${pattern}$`, 'i');\n tables = tables.filter((t) => regex.test(t.name));\n }\n\n console.log(`Discovered ${tables.length} tables/views`);\n\n // Interactive table selection\n if (opts.select && tables.length > 1) {\n const selection = await p.multiselect({\n message: `Select tables to include (${tables.length} found)`,\n options: tables.map((t) => ({\n value: t.name,\n label: t.name,\n hint: `${t.row_count.toLocaleString()} rows`,\n })),\n initialValues: tables.map((t) => t.name),\n required: true,\n });\n if (p.isCancel(selection)) {\n await adapter.disconnect();\n process.exit(0);\n }\n const selected = new Set(selection as string[]);\n tables = tables.filter((t) => selected.has(t.name));\n console.log(`Selected ${tables.length} tables`);\n }\n\n const columns: Record<string, any[]> = {};\n for (const table of tables) {\n columns[table.name] = await adapter.listColumns(table.name);\n }\n\n const totalCols = Object.values(columns).reduce(\n (sum, cols) => sum + cols.length,\n 0,\n );\n console.log(`Found ${totalCols} columns total`);\n\n await adapter.disconnect();\n\n const modelName =\n opts.modelName ??\n dsName.replace(/[^a-z0-9-]/gi, '-').toLowerCase();\n\n const result = scaffoldFromSchema({\n modelName,\n dataSourceName: dsName,\n tables,\n columns,\n });\n\n // Write files\n for (const dir of ['models', 'governance', 'owners']) {\n const dirPath = path.join(contextDir, dir);\n if (!existsSync(dirPath)) mkdirSync(dirPath, { recursive: true });\n }\n\n const osiPath = path.join(contextDir, 'models', result.files.osi);\n const govPath = path.join(\n contextDir,\n 'governance',\n result.files.governance,\n );\n const ownerPath = path.join(contextDir, 'owners', result.files.owner);\n\n writeFileSync(osiPath, result.osiYaml, 'utf-8');\n writeFileSync(govPath, result.governanceYaml, 'utf-8');\n if (!existsSync(ownerPath)) {\n writeFileSync(ownerPath, result.ownerYaml, 'utf-8');\n }\n\n console.log('');\n console.log(chalk.green('Scaffolded:'));\n console.log(` ${path.relative(process.cwd(), osiPath)}`);\n console.log(` ${path.relative(process.cwd(), govPath)}`);\n console.log(` ${path.relative(process.cwd(), ownerPath)}`);\n // Clean up example template files from `context init`\n const exampleFiles = [\n path.join(contextDir, 'models', 'example-model.osi.yaml'),\n path.join(contextDir, 'governance', 'example-model.governance.yaml'),\n path.join(contextDir, 'glossary', 'glossary.term.yaml'),\n path.join(contextDir, 'owners', 'data-team.owner.yaml'),\n ];\n let removedCount = 0;\n for (const exFile of exampleFiles) {\n if (existsSync(exFile)) {\n try {\n const content = readFileSync(exFile, 'utf-8');\n if (content.includes('example-model') || content.includes('Replace this') || content.includes('Example Term') || content.includes('team: data-team')) {\n unlinkSync(exFile);\n removedCount++;\n }\n } catch {\n // Ignore errors reading/removing example files\n }\n }\n }\n if (removedCount > 0) {\n p.log.info(`Removed ${removedCount} example template file(s) from init`);\n }\n\n console.log('');\n console.log(chalk.cyan('Run `context tier` to check your tier score.'));\n console.log(\n chalk.cyan('Run `context verify` to validate against data.'),\n );\n } catch (err) {\n if (err instanceof MissingDriverError) {\n console.error(chalk.yellow(`\\nMissing driver: \"${err.driverPackage}\" is required for ${err.adapter}.\\n`));\n console.error(chalk.white(`Install it with:\\n npm install ${err.driverPackage}\\n`));\n } else {\n console.error(\n chalk.red(`Introspect failed: ${(err as Error).message}`),\n );\n }\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport path from 'node:path';\nimport {\n compile,\n loadConfig,\n LintEngine,\n ALL_RULES,\n createAdapter,\n type ContextGraph,\n type DataValidationInfo,\n type DataAdapter,\n type DataSourceConfig,\n type Diagnostic,\n type FieldGovernance,\n} from '@runcontext/core';\nimport { formatDiagnostics } from '../formatters/pretty.js';\nimport { parseDbUrl } from './introspect.js';\n\n/**\n * Resolve a dataset name to an actual table name in the database.\n */\nfunction findTable(\n dsName: string,\n graph: ContextGraph,\n existingTables: Map<string, number>,\n): string | undefined {\n if (existingTables.has(dsName)) return dsName;\n for (const [, model] of graph.models) {\n const ds = model.datasets.find((d) => d.name === dsName);\n if (ds?.source) {\n const tableName = ds.source.split('.').pop()!;\n if (existingTables.has(tableName)) return tableName;\n }\n }\n return undefined;\n}\n\n/**\n * Introspect the database and collect validation data for the graph.\n */\nexport async function collectDataValidation(\n adapter: DataAdapter,\n graph: ContextGraph,\n): Promise<DataValidationInfo> {\n const validation: DataValidationInfo = {\n existingTables: new Map(),\n existingColumns: new Map(),\n actualSampleValues: new Map(),\n goldenQueryResults: new Map(),\n guardrailResults: new Map(),\n };\n\n // 1. List all tables with row counts\n const tables = await adapter.listTables();\n for (const t of tables) {\n validation.existingTables.set(t.name, t.row_count);\n }\n\n // 2. List columns for all discovered tables\n for (const t of tables) {\n const cols = await adapter.listColumns(t.name);\n const colMap = new Map(cols.map((c) => [c.name, c.data_type]));\n validation.existingColumns.set(t.name, colMap);\n }\n\n // 3. Collect sample values for governance fields\n for (const [, gov] of graph.governance) {\n if (!gov.fields) continue;\n for (const [fieldKey, fieldGov] of Object.entries(gov.fields) as [string, FieldGovernance][]) {\n if (!fieldGov.sample_values || fieldGov.sample_values.length === 0)\n continue;\n const dotIdx = fieldKey.indexOf('.');\n if (dotIdx < 0) continue;\n const dsName = fieldKey.substring(0, dotIdx);\n const fieldName = fieldKey.substring(dotIdx + 1);\n const tableName = findTable(dsName, graph, validation.existingTables);\n if (!tableName) continue;\n try {\n const result = await adapter.query(\n `SELECT DISTINCT CAST(\"${fieldName}\" AS VARCHAR) AS val FROM \"${tableName}\" WHERE \"${fieldName}\" IS NOT NULL LIMIT 50`,\n );\n validation.actualSampleValues.set(\n fieldKey,\n result.rows.map((r) => String(r.val)),\n );\n } catch {\n /* skip fields that can't be queried */\n }\n }\n }\n\n // 4. Execute golden queries\n for (const [, rules] of graph.rules) {\n if (!rules.golden_queries) continue;\n for (let i = 0; i < rules.golden_queries.length; i++) {\n const gq = rules.golden_queries[i]!;\n try {\n const result = await adapter.query(gq.sql);\n validation.goldenQueryResults.set(i, {\n success: true,\n rowCount: result.row_count,\n });\n } catch (err) {\n validation.goldenQueryResults.set(i, {\n success: false,\n error: (err as Error).message,\n });\n }\n }\n }\n\n // 5. Validate guardrail filter SQL\n for (const [, rules] of graph.rules) {\n if (!rules.guardrail_filters) continue;\n for (let i = 0; i < rules.guardrail_filters.length; i++) {\n const gf = rules.guardrail_filters[i]!;\n const testTable = gf.tables?.[0] ?? 'unknown';\n const tableName = findTable(testTable, graph, validation.existingTables);\n if (!tableName) {\n validation.guardrailResults.set(i, {\n valid: false,\n error: `Table \"${testTable}\" not found`,\n });\n continue;\n }\n try {\n await adapter.query(\n `SELECT 1 FROM \"${tableName}\" WHERE ${gf.filter} LIMIT 1`,\n );\n validation.guardrailResults.set(i, { valid: true });\n } catch (err) {\n validation.guardrailResults.set(i, {\n valid: false,\n error: (err as Error).message,\n });\n }\n }\n }\n\n return validation;\n}\n\nexport const verifyCommand = new Command('verify')\n .description('Validate metadata accuracy against a live database')\n .option('--source <name>', 'Use a specific data_source from config')\n .option('--db <url>', 'Database URL override (postgres:// or path.duckdb)')\n .option('--context-dir <path>', 'Path to context directory')\n .option('--format <type>', 'Output format: pretty or json', 'pretty')\n .action(async (opts) => {\n try {\n const config = loadConfig(process.cwd());\n const contextDir = opts.contextDir\n ? path.resolve(opts.contextDir)\n : path.resolve(config.context_dir);\n\n // Compile the context graph\n const { graph, diagnostics: compileDiags } = await compile({\n contextDir,\n config,\n });\n\n // Resolve data source configuration\n let dsConfig: DataSourceConfig;\n if (opts.db) {\n dsConfig = parseDbUrl(opts.db);\n } else {\n const sources = config.data_sources;\n if (!sources || Object.keys(sources).length === 0) {\n console.error(\n chalk.red(\n 'No data source configured. Add data_sources to contextkit.config.yaml or use --db.',\n ),\n );\n process.exit(1);\n }\n const name = opts.source ?? Object.keys(sources)[0]!;\n const resolved = sources[name];\n if (!resolved) {\n console.error(\n chalk.red(\n `Data source \"${name}\" not found. Available: ${Object.keys(sources).join(', ')}`,\n ),\n );\n process.exit(1);\n return; // unreachable, but helps TypeScript narrow the type\n }\n dsConfig = resolved;\n }\n\n // Connect and collect validation data\n const adapter = await createAdapter(dsConfig);\n await adapter.connect();\n console.log(chalk.green(`Connected to ${dsConfig.adapter}`));\n console.log('Collecting validation data...\\n');\n\n graph.dataValidation = await collectDataValidation(adapter, graph);\n await adapter.disconnect();\n\n // Run only data/* rules\n const engine = new LintEngine();\n for (const rule of ALL_RULES) {\n if (rule.id.startsWith('data/')) {\n engine.register(rule);\n }\n }\n const dataDiags = engine.run(graph);\n\n // Merge compile errors that are relevant (optional) + data diagnostics\n const allDiags: Diagnostic[] = [...dataDiags];\n\n // Output results\n if (allDiags.length === 0) {\n const tableCount = graph.dataValidation.existingTables.size;\n const totalRows = [\n ...graph.dataValidation.existingTables.values(),\n ].reduce((a, b) => a + b, 0);\n console.log(chalk.green('All data validation checks passed.\\n'));\n console.log(\n `Verified against ${tableCount} table(s) (${totalRows.toLocaleString()} total rows)`,\n );\n } else {\n console.log(formatDiagnostics(allDiags));\n }\n\n const hasErrors = allDiags.some((d) => d.severity === 'error');\n if (hasErrors) process.exit(1);\n } catch (err) {\n console.error(chalk.red(`Verify failed: ${(err as Error).message}`));\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport path from 'node:path';\nimport { readFileSync, writeFileSync } from 'node:fs';\nimport {\n compile,\n loadConfig,\n LintEngine,\n ALL_RULES,\n filterByDirectives,\n applyFixes,\n type Diagnostic,\n type Severity,\n} from '@runcontext/core';\nimport { formatDiagnostics } from '../formatters/pretty.js';\n\n/** Serialize a diagnostic to a comparable key. */\nfunction diagKey(d: Diagnostic): string {\n return `${d.ruleId}|${d.location.file}:${d.location.line}:${d.location.column}|${d.message}`;\n}\n\nlet previousDiags: Map<string, Diagnostic> = new Map();\n\nasync function runLint(\n contextDir: string,\n fix: boolean,\n): Promise<void> {\n const config = loadConfig(process.cwd());\n\n const { graph, diagnostics: compileDiags, directives } = await compile({\n contextDir,\n config,\n rootDir: process.cwd(),\n });\n\n const overrides = config.lint?.severity_overrides as\n | Record<string, Severity | 'off'>\n | undefined;\n const engine = new LintEngine(overrides);\n for (const rule of ALL_RULES) {\n engine.register(rule);\n }\n const lintDiags = engine.run(graph);\n let allDiags = filterByDirectives([...compileDiags, ...lintDiags], directives);\n\n // Apply fixes in watch mode if --fix\n if (fix) {\n const fixable = allDiags.filter((d) => d.fixable && d.fix);\n if (fixable.length > 0) {\n const fixes = applyFixes(fixable, (filePath) => readFileSync(filePath, 'utf-8'));\n for (const [file, content] of fixes) {\n writeFileSync(file, content, 'utf-8');\n }\n // Re-lint after fixes\n const { graph: reGraph, diagnostics: reCompileDiags, directives: reDirs } = await compile({\n contextDir,\n config,\n rootDir: process.cwd(),\n });\n const reEngine = new LintEngine(overrides);\n for (const rule of ALL_RULES) {\n reEngine.register(rule);\n }\n allDiags = filterByDirectives([...reCompileDiags, ...reEngine.run(reGraph)], reDirs);\n\n if (fixable.length > 0) {\n console.log(chalk.green(` Auto-fixed ${fixable.length} issue(s).`));\n }\n }\n }\n\n // Build current diagnostics map\n const currentDiags = new Map<string, Diagnostic>();\n for (const d of allDiags) {\n currentDiags.set(diagKey(d), d);\n }\n\n // Compute diff\n const newIssues: Diagnostic[] = [];\n const resolved: Diagnostic[] = [];\n\n for (const [key, d] of currentDiags) {\n if (!previousDiags.has(key)) newIssues.push(d);\n }\n for (const [key, d] of previousDiags) {\n if (!currentDiags.has(key)) resolved.push(d);\n }\n\n // Display\n console.clear();\n console.log(chalk.gray(`[${new Date().toLocaleTimeString()}] Linting...`));\n\n if (previousDiags.size > 0) {\n // Show diff summary\n if (resolved.length > 0) {\n console.log(chalk.green(` ${resolved.length} issue(s) resolved`));\n }\n if (newIssues.length > 0) {\n console.log(chalk.red(` ${newIssues.length} new issue(s)`));\n }\n if (resolved.length === 0 && newIssues.length === 0) {\n console.log(chalk.gray(' No changes'));\n }\n console.log('');\n }\n\n console.log(formatDiagnostics(allDiags));\n console.log('');\n\n previousDiags = currentDiags;\n}\n\nexport const devCommand = new Command('dev')\n .description('Watch mode — re-run lint on file changes')\n .option('--context-dir <path>', 'Path to context directory')\n .option('--fix', 'Auto-fix problems on each re-lint')\n .option('--studio', 'Open interactive metadata editor in the browser')\n .option('--port <number>', 'Studio server port (default: 4040)', '4040')\n .option('--host <address>', 'Studio server host (default: localhost)', 'localhost')\n .action(async (opts) => {\n try {\n const config = loadConfig(process.cwd());\n const contextDir = opts.contextDir\n ? path.resolve(opts.contextDir)\n : path.resolve(config.context_dir);\n const fix = opts.fix === true;\n\n console.log(chalk.blue(`Watching ${contextDir} for changes...`));\n if (fix) console.log(chalk.blue('Auto-fix enabled.'));\n console.log(chalk.gray('Press Ctrl+C to stop.\\n'));\n\n // Initial lint run\n await runLint(contextDir, fix);\n\n // Studio server (started before watcher so recompileAndBroadcast is available)\n let recompileAndBroadcast: (() => Promise<void>) | undefined;\n\n if (opts.studio) {\n const { startStudioServer } = await import('../studio/server.js');\n const studioPort = parseInt(opts.port, 10);\n const { server: _studioServer, recompileAndBroadcast: rab } = await startStudioServer({\n contextDir,\n rootDir: process.cwd(),\n port: studioPort,\n host: opts.host,\n });\n recompileAndBroadcast = rab;\n const studioUrl = `http://${opts.host === '0.0.0.0' ? 'localhost' : opts.host}:${studioPort}`;\n console.log(chalk.green(`\\n Studio running at ${chalk.bold(studioUrl)}\\n`));\n\n // Open browser safely using execFile (no shell injection)\n const { execFile } = await import('node:child_process');\n const openCmd = process.platform === 'darwin' ? 'open' : process.platform === 'win32' ? 'cmd' : 'xdg-open';\n const openArgs = process.platform === 'win32' ? ['/c', 'start', studioUrl] : [studioUrl];\n execFile(openCmd, openArgs, (err) => {\n if (err) console.log(chalk.gray(` Open ${studioUrl} in your browser`));\n });\n }\n\n // Dynamic import of chokidar for watch mode\n const { watch } = await import('chokidar');\n\n let debounceTimer: ReturnType<typeof setTimeout> | null = null;\n\n const watcher = watch(contextDir, {\n ignored: /(^|[/\\\\])\\../, // ignore dotfiles\n persistent: true,\n ignoreInitial: true,\n });\n\n watcher.on('all', (_event, _filePath) => {\n if (debounceTimer) clearTimeout(debounceTimer);\n debounceTimer = setTimeout(async () => {\n try {\n await runLint(contextDir, fix);\n if (recompileAndBroadcast) {\n await recompileAndBroadcast();\n }\n } catch (err) {\n console.error(\n chalk.red(`Lint error: ${(err as Error).message}`),\n );\n }\n }, 300);\n });\n } catch (err) {\n console.error(chalk.red(`Dev mode failed: ${(err as Error).message}`));\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport path from 'node:path';\nimport fs from 'node:fs';\nimport { formatSuccess, formatError } from '../formatters/pretty.js';\n\nconst EXAMPLE_OSI = `version: \"1.0\"\n\nsemantic_model:\n - name: example-model\n description: An example semantic model\n ai_context:\n instructions: \"Use this model for general analytics queries\"\n synonyms: [\"example\", \"sample model\"]\n\n datasets:\n - name: example_table\n source: warehouse.public.example_table\n primary_key: [id]\n description: \"Example table\"\n fields:\n - name: id\n expression:\n dialects:\n - dialect: ANSI_SQL\n expression: id\n description: \"Primary key\"\n type: number\n - name: name\n expression:\n dialects:\n - dialect: ANSI_SQL\n expression: name\n description: \"Name field\"\n type: string\n`;\n\nconst EXAMPLE_GOVERNANCE = `model: example-model\nowner: data-team\nclassification: internal\nsecurity:\n pii: false\n access_level: internal\ndatasets:\n example_table:\n grain: one row per example entity\n fields:\n id:\n description: \"Primary key\"\n name:\n description: \"Name field\"\n`;\n\nconst EXAMPLE_TERM = `glossary:\n - term: Example Term\n definition: A sample glossary term to demonstrate the format\n aliases: [\"sample term\"]\n owner: data-team\n`;\n\nconst EXAMPLE_OWNER = `team: data-team\nname: Data Team\nemail: data-team@example.com\nslack: \"#data-team\"\nmembers:\n - name: Jane Doe\n role: lead\n`;\n\nconst EXAMPLE_CONFIG = `context_dir: context\noutput_dir: dist\nminimum_tier: bronze\n`;\n\nexport const initCommand = new Command('init')\n .description('Scaffold a v0.2 ContextKit project structure')\n .option('--dir <path>', 'Root directory for the project', '.')\n .action(async (opts) => {\n try {\n const rootDir = path.resolve(opts.dir);\n const contextDir = path.join(rootDir, 'context');\n\n // Create directory structure\n const dirs = [\n path.join(contextDir, 'models'),\n path.join(contextDir, 'governance'),\n path.join(contextDir, 'glossary'),\n path.join(contextDir, 'owners'),\n ];\n\n for (const dir of dirs) {\n fs.mkdirSync(dir, { recursive: true });\n }\n\n // Write example files (only if they don't already exist)\n const files: Array<{ path: string; content: string }> = [\n {\n path: path.join(contextDir, 'models', 'example-model.osi.yaml'),\n content: EXAMPLE_OSI,\n },\n {\n path: path.join(\n contextDir,\n 'governance',\n 'example-model.governance.yaml',\n ),\n content: EXAMPLE_GOVERNANCE,\n },\n {\n path: path.join(contextDir, 'glossary', 'glossary.term.yaml'),\n content: EXAMPLE_TERM,\n },\n {\n path: path.join(contextDir, 'owners', 'data-team.owner.yaml'),\n content: EXAMPLE_OWNER,\n },\n {\n path: path.join(rootDir, 'contextkit.config.yaml'),\n content: EXAMPLE_CONFIG,\n },\n ];\n\n let created = 0;\n let skipped = 0;\n\n for (const file of files) {\n if (fs.existsSync(file.path)) {\n console.log(chalk.gray(` skip ${path.relative(rootDir, file.path)} (exists)`));\n skipped++;\n } else {\n fs.writeFileSync(file.path, file.content, 'utf-8');\n console.log(chalk.green(` create ${path.relative(rootDir, file.path)}`));\n created++;\n }\n }\n\n console.log('');\n console.log(\n formatSuccess(\n `Initialized ContextKit project: ${created} file(s) created, ${skipped} skipped.`,\n ),\n );\n console.log('');\n console.log(chalk.gray('Next steps:'));\n console.log(chalk.gray(' 1. Edit the example files in context/'));\n console.log(chalk.gray(' 2. Run: context lint'));\n console.log(chalk.gray(' 3. Run: context build'));\n } catch (err) {\n console.error(formatError((err as Error).message));\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport path from 'node:path';\nimport { compile, loadConfig, emitManifest } from '@runcontext/core';\nimport { formatError } from '../formatters/pretty.js';\n\nexport const siteCommand = new Command('site')\n .description('Build a static documentation site from compiled context')\n .option('--context-dir <path>', 'Path to context directory')\n .option('--output-dir <path>', 'Path to site output directory')\n .option('--astro', 'Use Astro-based site builder (default: EJS legacy)')\n .action(async (opts) => {\n try {\n const config = loadConfig(process.cwd());\n const contextDir = opts.contextDir\n ? path.resolve(opts.contextDir)\n : path.resolve(config.context_dir);\n\n // Compile the context graph\n const { graph } = await compile({ contextDir, config, rootDir: process.cwd() });\n const manifest = emitManifest(graph, config);\n\n // Try to import the site generator\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- dynamic import\n let builder: ((...args: any[]) => Promise<void>) | undefined;\n try {\n const siteModule = await import('@runcontext/site');\n builder = opts.astro ? siteModule.buildAstroSite : siteModule.buildSite;\n } catch {\n // @runcontext/site not yet implemented\n }\n\n if (!builder) {\n console.log(\n chalk.yellow(\n 'Site generator is not yet available. Install @runcontext/site to enable this command.',\n ),\n );\n process.exit(0);\n }\n\n const outputDir = opts.outputDir\n ? path.resolve(opts.outputDir)\n : path.resolve(config.site?.base_path ?? 'site');\n\n await builder(manifest, config, outputDir);\n console.log(chalk.green(`Site built to ${outputDir}${opts.astro ? ' (Astro)' : ''}`));\n } catch (err) {\n console.error(formatError((err as Error).message));\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { formatError } from '../formatters/pretty.js';\n\nexport const serveCommand = new Command('serve')\n .description('Start the MCP server (stdio or HTTP transport)')\n .option('--context-dir <path>', 'Path to context directory')\n .option('--http', 'Serve over HTTP instead of stdio')\n .option('--port <number>', 'HTTP port (default: 3000)', '3000')\n .option('--host <address>', 'HTTP host (default: 0.0.0.0)', '0.0.0.0')\n .action(async (opts) => {\n try {\n // Dynamic import — @runcontext/mcp is an optional peer\n let mcpModule: Record<string, unknown> | undefined;\n try {\n mcpModule = await import('@runcontext/mcp');\n } catch {\n // @runcontext/mcp not installed\n }\n\n if (!mcpModule) {\n console.log(\n chalk.yellow(\n 'MCP server is not available. Install @runcontext/mcp to enable this command.',\n ),\n );\n process.exit(1);\n }\n\n if (opts.http) {\n const startServerHttp = mcpModule.startServerHttp as (options?: {\n contextDir?: string;\n rootDir?: string;\n port?: number;\n host?: string;\n }) => Promise<void>;\n\n const port = parseInt(opts.port, 10);\n console.log(chalk.blue(`Starting MCP server (HTTP on port ${port})...`));\n await startServerHttp({\n contextDir: opts.contextDir,\n rootDir: process.cwd(),\n port,\n host: opts.host,\n });\n } else {\n const startServer = mcpModule.startServer as (options?: {\n contextDir?: string;\n rootDir?: string;\n }) => Promise<unknown>;\n\n console.log(chalk.blue('Starting MCP server (stdio transport)...'));\n await startServer({\n contextDir: opts.contextDir,\n rootDir: process.cwd(),\n });\n }\n } catch (err) {\n console.error(formatError((err as Error).message));\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport path from 'node:path';\nimport { parseFile, osiDocumentSchema } from '@runcontext/core';\nimport { formatJson } from '../formatters/json.js';\nimport { formatError, formatSuccess } from '../formatters/pretty.js';\n\nexport const validateOsiCommand = new Command('validate-osi')\n .description('Validate a single OSI file against the schema')\n .argument('<file>', 'Path to the OSI YAML file')\n .option('--format <type>', 'Output format: pretty or json', 'pretty')\n .action(async (file: string, opts) => {\n try {\n const filePath = path.resolve(file);\n\n // Parse the file\n const parsed = await parseFile(filePath, 'model');\n\n // Validate against the schema\n const result = osiDocumentSchema.safeParse(parsed.data);\n\n if (result.success) {\n if (opts.format === 'json') {\n console.log(\n formatJson({\n valid: true,\n file: filePath,\n data: result.data,\n }),\n );\n } else {\n console.log(formatSuccess(`${filePath} is valid.`));\n }\n } else {\n const issues = result.error.issues.map((issue) => ({\n path: issue.path.join('.'),\n message: issue.message,\n }));\n\n if (opts.format === 'json') {\n console.log(\n formatJson({\n valid: false,\n file: filePath,\n issues,\n }),\n );\n } else {\n console.error(chalk.red(`Validation failed for ${filePath}:`));\n for (const issue of issues) {\n console.error(chalk.red(` ${issue.path}: ${issue.message}`));\n }\n }\n process.exit(1);\n }\n } catch (err) {\n console.error(formatError((err as Error).message));\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport path from 'node:path';\nimport { readFileSync, writeFileSync, mkdirSync, existsSync, readdirSync } from 'node:fs';\nimport * as yaml from 'yaml';\nimport {\n compile,\n loadConfig,\n computeTier,\n createAdapter,\n suggestEnrichments,\n inferSemanticRole,\n inferAggregation,\n} from '@runcontext/core';\nimport type { DataSourceConfig } from '@runcontext/core';\nimport { parseDbUrl } from './introspect.js';\n\n/**\n * Recursively search a directory for a file matching a glob-like pattern.\n * Returns the first match or undefined.\n */\nfunction findFileRecursive(dir: string, suffix: string): string | undefined {\n if (!existsSync(dir)) return undefined;\n const entries = readdirSync(dir, { withFileTypes: true });\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n const found = findFileRecursive(fullPath, suffix);\n if (found) return found;\n } else if (entry.name.endsWith(suffix)) {\n return fullPath;\n }\n }\n return undefined;\n}\n\nexport const enrichCommand = new Command('enrich')\n .description('Suggest or apply metadata enrichments to reach a target tier')\n .option('--target <tier>', 'Target tier: silver or gold', 'silver')\n .option('--apply', 'Write suggestions to YAML files')\n .option('--source <name>', 'Data source for sample values')\n .option('--db <url>', 'Database URL for sample values')\n .option('--context-dir <path>', 'Path to context directory')\n .action(async (opts) => {\n try {\n const config = loadConfig(process.cwd());\n const contextDir = opts.contextDir\n ? path.resolve(opts.contextDir)\n : path.resolve(config.context_dir);\n const target = opts.target;\n\n if (!['silver', 'gold'].includes(target)) {\n console.error(chalk.red('--target must be \"silver\" or \"gold\"'));\n process.exit(1);\n }\n\n // Compile graph — follows the pattern from tier command\n const { graph } = await compile({ contextDir, config });\n\n for (const [modelName] of graph.models) {\n const tierScore = computeTier(modelName, graph);\n console.log(chalk.bold(`${modelName}: ${tierScore.tier.toUpperCase()}`));\n\n if (tierScore.tier === target || (target === 'silver' && tierScore.tier === 'gold')) {\n console.log(chalk.green(` Already at ${target} or above.\\n`));\n continue;\n }\n\n const model = graph.models.get(modelName)!;\n const datasetNames = model.datasets.map((d) => d.name);\n const suggestions = suggestEnrichments(target as 'silver' | 'gold', tierScore, datasetNames);\n\n if (\n !suggestions.governance &&\n !suggestions.lineage &&\n !suggestions.glossaryTerms &&\n !suggestions.needsRulesFile &&\n !suggestions.needsSampleValues &&\n !suggestions.needsSemanticRoles\n ) {\n console.log(chalk.green(' No suggestions needed.\\n'));\n continue;\n }\n\n // Report suggestions\n if (suggestions.governance?.trust) {\n console.log(chalk.yellow(` + Add trust: ${suggestions.governance.trust}`));\n }\n if (suggestions.governance?.tags) {\n console.log(chalk.yellow(` + Add tags: [${suggestions.governance.tags.join(', ')}]`));\n }\n if (suggestions.governance?.refreshAll) {\n console.log(chalk.yellow(` + Add refresh: ${suggestions.governance.refreshAll}`));\n }\n if (suggestions.lineage) {\n console.log(chalk.yellow(` + Add lineage with ${suggestions.lineage.upstream?.length ?? 0} upstream sources`));\n }\n if (suggestions.glossaryTerms) {\n console.log(chalk.yellow(` + Generate ${suggestions.glossaryTerms.length} glossary term(s)`));\n }\n if (suggestions.needsSampleValues) {\n console.log(chalk.yellow(' + Populate sample_values from database'));\n }\n if (suggestions.needsSemanticRoles) {\n console.log(chalk.yellow(' + Infer semantic_role for all fields'));\n }\n if (suggestions.needsRulesFile) {\n console.log(chalk.yellow(' + Generate rules file'));\n }\n\n if (!opts.apply) {\n console.log(chalk.cyan('\\n Run with --apply to write these changes.\\n'));\n continue;\n }\n\n // Apply suggestions to governance YAML\n const govFilePath = findFileRecursive(contextDir, `${modelName}.governance.yaml`);\n if (govFilePath) {\n const govContent = readFileSync(govFilePath, 'utf-8');\n const govDoc = yaml.parse(govContent) ?? {};\n\n if (suggestions.governance?.trust) {\n govDoc.trust = suggestions.governance.trust;\n }\n if (suggestions.governance?.tags) {\n govDoc.tags = suggestions.governance.tags;\n }\n if (suggestions.governance?.refreshAll) {\n for (const dsName of Object.keys(govDoc.datasets ?? {})) {\n govDoc.datasets[dsName].refresh = suggestions.governance.refreshAll;\n }\n }\n\n // Infer semantic roles if needed\n if (suggestions.needsSemanticRoles) {\n govDoc.fields = govDoc.fields ?? {};\n let adapter: any = null;\n const dsConfig: DataSourceConfig | undefined = opts.db\n ? parseDbUrl(opts.db)\n : config.data_sources?.[opts.source ?? Object.keys(config.data_sources ?? {})[0]];\n\n if (dsConfig) {\n adapter = await createAdapter(dsConfig);\n await adapter.connect();\n }\n\n for (const ds of model.datasets) {\n let columns: any[] = [];\n if (adapter) {\n const tableName = ds.source?.split('.').pop() ?? ds.name;\n try {\n columns = await adapter.listColumns(tableName);\n } catch {\n // Column introspection failed — fall back to name-based heuristics\n }\n }\n for (const field of ds.fields ?? []) {\n const fieldKey = `${ds.name}.${field.name}`;\n if (govDoc.fields[fieldKey]?.semantic_role) continue;\n const col = columns.find((c: any) => c.name === field.name);\n const isPK = col?.is_primary_key ?? field.name.endsWith('_id');\n const dataType = col?.data_type ?? 'VARCHAR';\n govDoc.fields[fieldKey] = govDoc.fields[fieldKey] ?? {};\n const role = inferSemanticRole(field.name, dataType, isPK);\n govDoc.fields[fieldKey].semantic_role = role;\n if (role === 'metric') {\n govDoc.fields[fieldKey].default_aggregation = inferAggregation(field.name);\n govDoc.fields[fieldKey].additive = govDoc.fields[fieldKey].default_aggregation === 'SUM';\n }\n }\n }\n\n if (adapter) await adapter.disconnect();\n }\n\n // Populate sample values if needed\n if (suggestions.needsSampleValues) {\n govDoc.fields = govDoc.fields ?? {};\n const dsConfig2: DataSourceConfig | undefined = opts.db\n ? parseDbUrl(opts.db)\n : config.data_sources?.[opts.source ?? Object.keys(config.data_sources ?? {})[0]];\n\n if (dsConfig2) {\n const adapter2 = await createAdapter(dsConfig2);\n await adapter2.connect();\n let count = 0;\n for (const ds of model.datasets) {\n if (count >= 2) break;\n const tableName = ds.source?.split('.').pop() ?? ds.name;\n for (const field of ds.fields ?? []) {\n if (count >= 2) break;\n const fieldKey = `${ds.name}.${field.name}`;\n if (govDoc.fields[fieldKey]?.sample_values?.length > 0) continue;\n try {\n const result = await adapter2.query(\n `SELECT DISTINCT CAST(\"${field.name}\" AS VARCHAR) AS val FROM \"${tableName}\" WHERE \"${field.name}\" IS NOT NULL LIMIT 5`,\n );\n if (result.rows.length > 0) {\n govDoc.fields[fieldKey] = govDoc.fields[fieldKey] ?? {};\n govDoc.fields[fieldKey].sample_values = result.rows.map((r: any) => String(r.val));\n count++;\n }\n } catch {\n // Query failed — skip this field\n }\n }\n }\n await adapter2.disconnect();\n }\n }\n\n writeFileSync(govFilePath, yaml.stringify(govDoc, { lineWidth: 120 }), 'utf-8');\n console.log(chalk.green(` Updated: ${path.relative(process.cwd(), govFilePath)}`));\n }\n\n // Write lineage file\n if (suggestions.lineage) {\n const lineageDir = path.join(contextDir, 'lineage');\n if (!existsSync(lineageDir)) mkdirSync(lineageDir, { recursive: true });\n const lineagePath = path.join(lineageDir, `${modelName}.lineage.yaml`);\n if (!existsSync(lineagePath)) {\n const lineageDoc = {\n model: modelName,\n upstream: suggestions.lineage.upstream,\n };\n writeFileSync(lineagePath, yaml.stringify(lineageDoc, { lineWidth: 120 }), 'utf-8');\n console.log(chalk.green(` Created: ${path.relative(process.cwd(), lineagePath)}`));\n }\n }\n\n // Write glossary terms\n if (suggestions.glossaryTerms) {\n const glossaryDir = path.join(contextDir, 'glossary');\n if (!existsSync(glossaryDir)) mkdirSync(glossaryDir, { recursive: true });\n for (const term of suggestions.glossaryTerms) {\n const termPath = path.join(glossaryDir, `${term.id}.term.yaml`);\n if (!existsSync(termPath)) {\n writeFileSync(termPath, yaml.stringify(term, { lineWidth: 120 }), 'utf-8');\n console.log(chalk.green(` Created: ${path.relative(process.cwd(), termPath)}`));\n }\n }\n }\n\n // Stub rules file\n if (suggestions.needsRulesFile) {\n const rulesDir = path.join(contextDir, 'rules');\n if (!existsSync(rulesDir)) mkdirSync(rulesDir, { recursive: true });\n const rulesPath = path.join(rulesDir, `${modelName}.rules.yaml`);\n if (!existsSync(rulesPath)) {\n const rulesDoc = {\n model: modelName,\n golden_queries: [\n { question: 'TODO: What is the total count?', sql: 'SELECT COUNT(*) FROM table_name' },\n { question: 'TODO: What are the top records?', sql: 'SELECT * FROM table_name LIMIT 10' },\n { question: 'TODO: What is the distribution?', sql: 'SELECT column, COUNT(*) FROM table_name GROUP BY column' },\n ],\n business_rules: [\n { name: 'TODO: rule-name', definition: 'TODO: describe the business rule' },\n ],\n guardrail_filters: [\n { name: 'TODO: filter-name', filter: 'column IS NOT NULL', reason: 'TODO: explain why' },\n ],\n hierarchies: [\n { name: 'TODO: hierarchy-name', levels: ['level1', 'level2'], dataset: datasetNames[0] ?? 'dataset' },\n ],\n };\n writeFileSync(rulesPath, yaml.stringify(rulesDoc, { lineWidth: 120 }), 'utf-8');\n console.log(chalk.green(` Created: ${path.relative(process.cwd(), rulesPath)} (with TODOs)`));\n }\n }\n\n console.log('');\n }\n } catch (err) {\n console.error(chalk.red(`Enrich failed: ${(err as Error).message}`));\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { ALL_RULES, type LintRule, type RuleTier } from '@runcontext/core';\nimport { formatJson } from '../formatters/json.js';\n\nfunction formatRuleTable(rules: LintRule[]): string {\n if (rules.length === 0) {\n return chalk.gray('No rules match the filters.');\n }\n\n const lines: string[] = [];\n\n // Header\n const header = `${'ID'.padEnd(40)} ${'Tier'.padEnd(8)} ${'Severity'.padEnd(10)} ${'Fix'.padEnd(5)} Description`;\n lines.push(chalk.bold(header));\n lines.push(chalk.gray('─'.repeat(100)));\n\n for (const rule of rules) {\n const tier = rule.tier ?? '—';\n const tierCol = colorTier(tier);\n const fixCol = rule.fixable ? chalk.green('yes') : chalk.gray('no');\n const sevCol =\n rule.defaultSeverity === 'error'\n ? chalk.red(rule.defaultSeverity)\n : chalk.yellow(rule.defaultSeverity);\n const deprecated = rule.deprecated ? chalk.gray(' (deprecated)') : '';\n\n lines.push(\n `${rule.id.padEnd(40)} ${tierCol.padEnd(8 + (tierCol.length - tier.length))} ${sevCol.padEnd(10 + (sevCol.length - rule.defaultSeverity.length))} ${fixCol.padEnd(5 + (fixCol.length - (rule.fixable ? 3 : 2)))} ${rule.description}${deprecated}`,\n );\n }\n\n lines.push('');\n lines.push(chalk.gray(`${rules.length} rule(s) total`));\n\n return lines.join('\\n');\n}\n\nfunction colorTier(tier: string): string {\n switch (tier) {\n case 'gold':\n return chalk.yellow(tier);\n case 'silver':\n return chalk.white(tier);\n case 'bronze':\n return chalk.hex('#CD7F32')(tier);\n default:\n return chalk.gray(tier);\n }\n}\n\nexport const rulesCommand = new Command('rules')\n .description('List all lint rules with metadata')\n .option('--tier <tier>', 'Filter by tier: bronze, silver, gold')\n .option('--fixable', 'Show only fixable rules')\n .option('--format <type>', 'Output format: pretty or json', 'pretty')\n .action((opts) => {\n let rules = [...ALL_RULES];\n\n // Filter by tier\n if (opts.tier) {\n const tier = opts.tier as RuleTier;\n rules = rules.filter((r) => r.tier === tier);\n }\n\n // Filter by fixable\n if (opts.fixable) {\n rules = rules.filter((r) => r.fixable);\n }\n\n if (opts.format === 'json') {\n const data = rules.map((r) => ({\n id: r.id,\n tier: r.tier ?? null,\n defaultSeverity: r.defaultSeverity,\n fixable: r.fixable,\n description: r.description,\n deprecated: r.deprecated ?? false,\n replacedBy: r.replacedBy ?? null,\n }));\n console.log(formatJson(data));\n } else {\n console.log(formatRuleTable(rules));\n }\n });\n","import { Command } from 'commander';\nimport * as p from '@clack/prompts';\nimport chalk from 'chalk';\nimport { runConnectStep } from '../setup/steps/connect.js';\nimport { runScaffoldStep } from '../setup/steps/scaffold.js';\nimport { runEnrichSilverStep } from '../setup/steps/enrich-silver.js';\nimport { runEnrichGoldStep } from '../setup/steps/enrich-gold.js';\nimport { runVerifyStep } from '../setup/steps/verify.js';\nimport { runAutofixStep } from '../setup/steps/autofix.js';\nimport { runAgentInstructionsStep } from '../setup/steps/claude-md.js';\nimport { displayTierScore } from '../setup/display.js';\n\nexport const setupCommand = new Command('setup')\n .description('Interactive wizard — detects databases, introspects schema, scaffolds metadata, enriches to Silver, generates agent instructions. Supports DuckDB, PostgreSQL, MySQL, SQL Server, SQLite, Snowflake, BigQuery, ClickHouse, and Databricks.')\n .action(async () => {\n p.intro(chalk.bgCyan(chalk.black(' ContextKit Setup ')));\n\n const ctx = await runConnectStep();\n if (!ctx) return;\n\n try {\n // Build step list based on target tier\n const steps: Array<{ name: string; fn: (ctx: any) => Promise<any> }> = [\n { name: 'Scaffold Bronze', fn: runScaffoldStep },\n ];\n\n if (ctx.targetTier === 'silver' || ctx.targetTier === 'gold') {\n steps.push({ name: 'Enrich to Silver', fn: runEnrichSilverStep });\n }\n if (ctx.targetTier === 'gold') {\n steps.push({ name: 'Enrich to Gold', fn: runEnrichGoldStep });\n }\n\n steps.push(\n { name: 'Verify data', fn: runVerifyStep },\n { name: 'Auto-fix', fn: runAutofixStep },\n { name: 'Generate agent instructions', fn: runAgentInstructionsStep },\n );\n\n // Run each step\n const results: Array<{ name: string; summary: string }> = [];\n for (let i = 0; i < steps.length; i++) {\n const step = steps[i]!;\n p.log.step(`${chalk.dim(`[${i + 1}/${steps.length}]`)} ${step.name}`);\n const result = await step.fn(ctx);\n results.push({ name: step.name, summary: result.summary });\n }\n\n // Final summary\n const summaryLines = results\n .map((r) => ` ${chalk.green('+')} ${r.name}: ${r.summary}`)\n .join('\\n');\n p.note(summaryLines, 'Summary');\n\n if (ctx.tierScore) {\n displayTierScore(ctx.tierScore);\n }\n\n // Show next steps based on current tier vs target\n const currentTier = ctx.tierScore?.tier ?? 'none';\n const reachedTarget =\n (ctx.targetTier === 'bronze' && ['bronze', 'silver', 'gold'].includes(currentTier)) ||\n (ctx.targetTier === 'silver' && ['silver', 'gold'].includes(currentTier)) ||\n (ctx.targetTier === 'gold' && currentTier === 'gold');\n\n if (reachedTarget) {\n p.outro(`Done! You're at ${chalk.bold(currentTier.toUpperCase())}. Run ${chalk.cyan('context tier')} anytime to check.`);\n } else if (ctx.targetTier === 'gold' && currentTier !== 'gold') {\n // Gold needs AI curation — show the handoff\n const nextSteps = [\n `Your metadata is at ${chalk.bold(currentTier.toUpperCase())} — Gold needs human curation.`,\n '',\n `${chalk.bold('If you\\'re an AI agent:')}`,\n ` Read ${chalk.cyan('context/AGENT_INSTRUCTIONS.md')} for the full curation guide.`,\n ` Run ${chalk.cyan('context tier')} → pick a failing check → query the database → fix it → repeat.`,\n ` Ask the user about ownership, metric intent, and business rules as you go.`,\n '',\n `${chalk.bold('If you\\'re a human:')}`,\n ` Tell your AI agent: \"Read context/AGENT_INSTRUCTIONS.md and get this project to Gold.\"`,\n ` The agent will go back and forth with you, asking about your data as it builds.`,\n ` Or use ${chalk.cyan('context dev --studio')} to edit metadata visually in the browser.`,\n ];\n p.note(nextSteps.join('\\n'), 'Next Steps');\n p.outro(`Run ${chalk.cyan('context tier')} to check your scorecard.`);\n } else {\n p.outro(`Run ${chalk.cyan('context tier')} to check your scorecard.`);\n }\n } finally {\n try {\n await ctx.adapter.disconnect();\n } catch {\n // ignore disconnect errors\n }\n }\n });\n","import * as p from '@clack/prompts';\nimport path from 'node:path';\nimport { existsSync, readFileSync, writeFileSync } from 'node:fs';\nimport { execFileSync } from 'node:child_process';\nimport * as yaml from 'yaml';\nimport { loadConfig, createAdapter, MissingDriverError } from '@runcontext/core';\nimport type { ColumnInfo, DataSourceConfig } from '@runcontext/core';\nimport { parseDbUrl } from '../../commands/introspect.js';\nimport { discoverDatabases, toDataSourceConfig } from '../mcp-discovery.js';\nimport type { SetupContext, TargetTier, UserIntent } from '../types.js';\n\ninterface DetectedDb {\n dsConfig: DataSourceConfig;\n label: string;\n}\n\n/** Try to auto-detect a single database from config, env vars, or MCP config. */\nfunction autoDetectDb(cwd: string): DetectedDb | undefined {\n // 1. contextkit.config.yaml\n try {\n const config = loadConfig(cwd);\n if (config.data_sources && Object.keys(config.data_sources).length > 0) {\n const name = Object.keys(config.data_sources)[0]!;\n const ds = config.data_sources[name]!;\n const loc = ds.path ?? ds.connection ?? name;\n return { dsConfig: ds, label: `${ds.adapter} — ${loc} (from contextkit.config.yaml)` };\n }\n } catch { /* no config */ }\n\n // 2. Environment variables\n if (process.env.DATABASE_URL) {\n try {\n const ds = parseDbUrl(process.env.DATABASE_URL);\n return { dsConfig: ds, label: `${ds.adapter} — $DATABASE_URL` };\n } catch { /* invalid */ }\n }\n if (process.env.DUCKDB_PATH && existsSync(process.env.DUCKDB_PATH)) {\n return {\n dsConfig: { adapter: 'duckdb', path: process.env.DUCKDB_PATH },\n label: `duckdb — $DUCKDB_PATH`,\n };\n }\n\n // 3. MCP config discovery (multiple files)\n try {\n const discovered = discoverDatabases(cwd);\n if (discovered.length > 0) {\n const first = discovered[0]!;\n const ds = toDataSourceConfig(first);\n if (ds) {\n return { dsConfig: ds, label: first.label };\n }\n }\n } catch { /* discovery failed */ }\n\n // 4. Legacy fallback: .claude/mcp.json duckdb server\n const mcpPath = path.join(cwd, '.claude', 'mcp.json');\n if (existsSync(mcpPath)) {\n try {\n const mcpConfig = JSON.parse(readFileSync(mcpPath, 'utf-8'));\n const duckdbServer = mcpConfig.mcpServers?.duckdb;\n if (duckdbServer?.args) {\n const args = duckdbServer.args as string[];\n const idx = args.indexOf('--db-path');\n if (idx >= 0 && args[idx + 1]) {\n const dbPath = args[idx + 1]!;\n if (existsSync(dbPath)) {\n return {\n dsConfig: { adapter: 'duckdb', path: dbPath },\n label: `duckdb — ${path.basename(dbPath)} (from .claude/mcp.json)`,\n };\n }\n }\n }\n } catch { /* malformed */ }\n }\n\n return undefined;\n}\n\n/** Discover all databases from MCP config files for the selection menu. */\nfunction discoverAllDatabases(cwd: string): DetectedDb[] {\n try {\n return discoverDatabases(cwd)\n .map((d) => {\n const dsConfig = toDataSourceConfig(d);\n if (!dsConfig) return null;\n return { dsConfig, label: d.label };\n })\n .filter((d): d is DetectedDb => d !== null);\n } catch {\n return [];\n }\n}\n\n/** Prompt for file path or env var (DuckDB / SQLite). */\nasync function promptForFileDb(\n adapter: 'duckdb' | 'sqlite',\n ext: string,\n envDefault: string,\n): Promise<DataSourceConfig | undefined> {\n const method = await p.select({\n message: 'How do you connect?',\n options: [\n { value: 'env', label: 'Environment variable', hint: `e.g. ${envDefault}` },\n { value: 'path', label: 'File path', hint: `e.g. ./warehouse${ext}` },\n ],\n });\n if (p.isCancel(method)) return undefined;\n\n if (method === 'env') {\n const envName = await p.text({\n message: 'Environment variable name',\n initialValue: envDefault,\n validate(value) {\n if (!value) return 'Required';\n const resolved = process.env[value];\n if (!resolved) return `$${value} is not set`;\n if (!existsSync(resolved)) return `$${value} points to \"${resolved}\" which does not exist`;\n },\n });\n if (p.isCancel(envName)) return undefined;\n return { adapter, path: process.env[envName as string]! } as DataSourceConfig;\n } else {\n const filePath = await p.text({\n message: `Path to ${ext} file`,\n placeholder: `./warehouse${ext}`,\n validate(value) {\n if (!value) return 'Required';\n if (!existsSync(value)) return `File not found: ${value}`;\n },\n });\n if (p.isCancel(filePath)) return undefined;\n return { adapter, path: path.resolve(filePath as string) } as DataSourceConfig;\n }\n}\n\n/** Prompt for connection-string based databases (Postgres, MySQL, MSSQL). */\nasync function promptForConnectionString(\n adapter: 'postgres' | 'mysql' | 'mssql',\n scheme: string,\n envDefault: string,\n): Promise<DataSourceConfig | undefined> {\n const method = await p.select({\n message: 'How do you connect?',\n options: [\n { value: 'env', label: 'Environment variable', hint: `e.g. ${envDefault}` },\n { value: 'url', label: 'Connection string', hint: `${scheme}://...` },\n ],\n });\n if (p.isCancel(method)) return undefined;\n\n if (method === 'env') {\n const envName = await p.text({\n message: 'Environment variable name',\n initialValue: envDefault,\n validate(value) {\n if (!value) return 'Required';\n const resolved = process.env[value];\n if (!resolved) return `$${value} is not set`;\n },\n });\n if (p.isCancel(envName)) return undefined;\n return { adapter, connection: process.env[envName as string]! } as DataSourceConfig;\n } else {\n const url = await p.text({\n message: 'Connection string',\n placeholder: `${scheme}://user:pass@host:5432/dbname`,\n validate(value) {\n if (!value) return 'Required';\n if (!value.startsWith(`${scheme}://`)) {\n return `Must start with ${scheme}://`;\n }\n },\n });\n if (p.isCancel(url)) return undefined;\n return { adapter, connection: url as string } as DataSourceConfig;\n }\n}\n\n/** Prompt for Snowflake credentials. */\nasync function promptForSnowflake(): Promise<DataSourceConfig | undefined> {\n const account = await p.text({\n message: 'Snowflake account identifier',\n placeholder: 'xy12345.us-east-1',\n validate(value) { if (!value) return 'Required'; },\n });\n if (p.isCancel(account)) return undefined;\n\n const username = await p.text({\n message: 'Username',\n validate(value) { if (!value) return 'Required'; },\n });\n if (p.isCancel(username)) return undefined;\n\n const password = await p.password({\n message: 'Password',\n validate(value) { if (!value) return 'Required'; },\n });\n if (p.isCancel(password)) return undefined;\n\n const warehouse = await p.text({\n message: 'Warehouse',\n placeholder: 'COMPUTE_WH',\n validate(value) { if (!value) return 'Required'; },\n });\n if (p.isCancel(warehouse)) return undefined;\n\n const database = await p.text({\n message: 'Database',\n validate(value) { if (!value) return 'Required'; },\n });\n if (p.isCancel(database)) return undefined;\n\n const schema = await p.text({\n message: 'Schema',\n initialValue: 'PUBLIC',\n validate(value) { if (!value) return 'Required'; },\n });\n if (p.isCancel(schema)) return undefined;\n\n return {\n adapter: 'snowflake',\n account: account as string,\n username: username as string,\n password: password as string,\n warehouse: warehouse as string,\n database: database as string,\n schema: schema as string,\n } as DataSourceConfig;\n}\n\n/** Prompt for BigQuery credentials. */\nasync function promptForBigQuery(): Promise<DataSourceConfig | undefined> {\n const project = await p.text({\n message: 'Google Cloud project ID',\n validate(value) { if (!value) return 'Required'; },\n });\n if (p.isCancel(project)) return undefined;\n\n const dataset = await p.text({\n message: 'Dataset',\n validate(value) { if (!value) return 'Required'; },\n });\n if (p.isCancel(dataset)) return undefined;\n\n const keyFilename = await p.text({\n message: 'Path to service account key file (JSON)',\n placeholder: './service-account.json',\n validate(value) {\n if (!value) return 'Required';\n if (!existsSync(value)) return `File not found: ${value}`;\n },\n });\n if (p.isCancel(keyFilename)) return undefined;\n\n return {\n adapter: 'bigquery',\n project: project as string,\n dataset: dataset as string,\n keyFilename: path.resolve(keyFilename as string),\n } as DataSourceConfig;\n}\n\n/** Prompt for ClickHouse credentials. */\nasync function promptForClickHouse(): Promise<DataSourceConfig | undefined> {\n const host = await p.text({\n message: 'Host',\n initialValue: 'localhost',\n validate(value) { if (!value) return 'Required'; },\n });\n if (p.isCancel(host)) return undefined;\n\n const port = await p.text({\n message: 'HTTP port',\n initialValue: '8123',\n validate(value) {\n if (!value) return 'Required';\n if (!/^\\d+$/.test(value)) return 'Must be a number';\n },\n });\n if (p.isCancel(port)) return undefined;\n\n const database = await p.text({\n message: 'Database',\n initialValue: 'default',\n validate(value) { if (!value) return 'Required'; },\n });\n if (p.isCancel(database)) return undefined;\n\n const username = await p.text({\n message: 'Username',\n initialValue: 'default',\n validate(value) { if (!value) return 'Required'; },\n });\n if (p.isCancel(username)) return undefined;\n\n const password = await p.password({\n message: 'Password (leave empty if none)',\n });\n if (p.isCancel(password)) return undefined;\n\n return {\n adapter: 'clickhouse',\n host: host as string,\n port: parseInt(port as string, 10),\n database: database as string,\n username: username as string,\n password: (password as string) || undefined,\n } as DataSourceConfig;\n}\n\n/** Prompt for Databricks credentials. */\nasync function promptForDatabricks(): Promise<DataSourceConfig | undefined> {\n const serverHostname = await p.text({\n message: 'Server hostname',\n placeholder: 'abc-12345678-wxyz.cloud.databricks.com',\n validate(value) { if (!value) return 'Required'; },\n });\n if (p.isCancel(serverHostname)) return undefined;\n\n const httpPath = await p.text({\n message: 'HTTP path',\n placeholder: '/sql/1.0/warehouses/abcdef1234567890',\n validate(value) { if (!value) return 'Required'; },\n });\n if (p.isCancel(httpPath)) return undefined;\n\n const token = await p.password({\n message: 'Personal access token',\n validate(value) { if (!value) return 'Required'; },\n });\n if (p.isCancel(token)) return undefined;\n\n return {\n adapter: 'databricks',\n serverHostname: serverHostname as string,\n httpPath: httpPath as string,\n token: token as string,\n } as DataSourceConfig;\n}\n\n/** Prompt user to select a connector and provide connection details. */\nasync function promptForConnection(): Promise<DataSourceConfig | undefined> {\n const cwd = process.cwd();\n const discovered = discoverAllDatabases(cwd);\n\n // Use string values for all options; discovered dbs use \"discovered:N\" keys\n const discoveredMap = new Map<string, DataSourceConfig>();\n const options: Array<{ value: string; label: string; hint?: string }> = [];\n\n for (let i = 0; i < discovered.length; i++) {\n const key = `discovered:${i}`;\n discoveredMap.set(key, discovered[i]!.dsConfig);\n options.push({ value: key, label: discovered[i]!.label });\n }\n\n if (discovered.length > 0) {\n options.push({ value: '__separator__', label: '\\u2500\\u2500\\u2500 Or connect manually \\u2500\\u2500\\u2500' });\n }\n\n options.push(\n { value: 'duckdb', label: 'DuckDB', hint: 'Local .duckdb file' },\n { value: 'postgres', label: 'PostgreSQL', hint: 'Connection string' },\n { value: 'mysql', label: 'MySQL / MariaDB', hint: 'Connection string' },\n { value: 'mssql', label: 'SQL Server', hint: 'Connection string' },\n { value: 'snowflake', label: 'Snowflake', hint: 'Account credentials' },\n { value: 'bigquery', label: 'BigQuery', hint: 'Google Cloud project' },\n { value: 'clickhouse', label: 'ClickHouse', hint: 'HTTP connection' },\n { value: 'databricks', label: 'Databricks', hint: 'Workspace connection' },\n { value: 'sqlite', label: 'SQLite', hint: 'Local .db file' },\n );\n\n const selection = await p.select({\n message: 'Select your database',\n options,\n });\n if (p.isCancel(selection)) return undefined;\n\n const connector = selection as string;\n\n // If user picked a discovered database, return its config directly\n if (discoveredMap.has(connector)) {\n return discoveredMap.get(connector)!;\n }\n\n // If user somehow picked the separator, re-prompt\n if (connector === '__separator__') return promptForConnection();\n\n switch (connector) {\n case 'duckdb':\n return promptForFileDb('duckdb', '.duckdb', 'DUCKDB_PATH');\n case 'sqlite':\n return promptForFileDb('sqlite', '.db', 'SQLITE_PATH');\n case 'postgres':\n return promptForConnectionString('postgres', 'postgres', 'DATABASE_URL');\n case 'mysql':\n return promptForConnectionString('mysql', 'mysql', 'MYSQL_URL');\n case 'mssql':\n return promptForConnectionString('mssql', 'mssql', 'MSSQL_URL');\n case 'snowflake':\n return promptForSnowflake();\n case 'bigquery':\n return promptForBigQuery();\n case 'clickhouse':\n return promptForClickHouse();\n case 'databricks':\n return promptForDatabricks();\n default:\n return undefined;\n }\n}\n\nexport async function runConnectStep(): Promise<SetupContext | undefined> {\n const cwd = process.cwd();\n let dsConfig: DataSourceConfig;\n\n // Auto-detect first\n const detected = autoDetectDb(cwd);\n\n if (detected) {\n p.log.info(`Detected: ${detected.label}`);\n const useDetected = await p.confirm({ message: 'Use this database?' });\n if (p.isCancel(useDetected)) {\n p.cancel('Setup cancelled.');\n return undefined;\n }\n if (useDetected) {\n dsConfig = detected.dsConfig;\n } else {\n const manual = await promptForConnection();\n if (!manual) { p.cancel('Setup cancelled.'); return undefined; }\n dsConfig = manual;\n }\n } else {\n const manual = await promptForConnection();\n if (!manual) { p.cancel('Setup cancelled.'); return undefined; }\n dsConfig = manual;\n }\n\n // Connect and discover\n const spin = p.spinner();\n spin.start('Connecting to database...');\n\n let adapter;\n try {\n adapter = await createAdapter(dsConfig);\n await adapter.connect();\n } catch (err) {\n spin.stop('Connection failed');\n\n if (err instanceof MissingDriverError) {\n p.log.warn(`The ${err.adapter} adapter requires the \"${err.driverPackage}\" npm package.`);\n const shouldInstall = await p.confirm({\n message: `Install \"${err.driverPackage}\" now?`,\n });\n\n if (!p.isCancel(shouldInstall) && shouldInstall) {\n const installSpin = p.spinner();\n installSpin.start(`Installing ${err.driverPackage}...`);\n try {\n // Use execFileSync to avoid shell injection — package name is from a hardcoded map\n execFileSync('npm', ['install', err.driverPackage], {\n stdio: 'pipe',\n cwd: process.cwd(),\n });\n installSpin.stop(`Installed ${err.driverPackage}`);\n\n // Retry connection\n spin.start('Retrying connection...');\n try {\n adapter = await createAdapter(dsConfig);\n await adapter.connect();\n spin.stop('Connected');\n } catch (retryErr) {\n spin.stop('Connection failed');\n p.log.error((retryErr as Error).message);\n p.cancel('Could not connect to database.');\n return undefined;\n }\n } catch {\n installSpin.stop('Installation failed');\n p.log.error(`Could not install ${err.driverPackage}. Try manually:\\n npm install ${err.driverPackage}`);\n p.cancel('Could not connect to database.');\n return undefined;\n }\n } else {\n p.log.info(`Install it manually with:\\n npm install ${err.driverPackage}`);\n p.cancel('Could not connect to database.');\n return undefined;\n }\n } else {\n p.log.error((err as Error).message);\n p.cancel('Could not connect to database.');\n return undefined;\n }\n }\n\n const allTables = await adapter.listTables();\n spin.stop(`Found ${allTables.length} tables`);\n\n // Let user select which tables to include\n let tables = allTables;\n if (allTables.length > 1) {\n const tableSelection = await p.multiselect({\n message: `Select tables to include (${allTables.length} found)`,\n options: allTables.map((t) => ({\n value: t.name,\n label: t.name,\n hint: `${t.row_count.toLocaleString()} rows`,\n })),\n initialValues: allTables.map((t) => t.name),\n required: true,\n });\n if (p.isCancel(tableSelection)) {\n p.cancel('Setup cancelled.');\n await adapter.disconnect();\n return undefined;\n }\n const selected = new Set(tableSelection as string[]);\n tables = allTables.filter((t) => selected.has(t.name));\n }\n\n // Introspect columns for selected tables\n const colSpin = p.spinner();\n colSpin.start(`Introspecting ${tables.length} tables...`);\n const columns: Record<string, ColumnInfo[]> = {};\n for (const table of tables) {\n columns[table.name] = await adapter.listColumns(table.name);\n }\n const totalCols = Object.values(columns).reduce((sum, c) => sum + c.length, 0);\n colSpin.stop(`${tables.length} tables, ${totalCols} columns`);\n\n // Show selected tables\n const tableLines = tables\n .map((t) => ` ${t.name.padEnd(30)} ${t.row_count.toLocaleString()} rows`)\n .join('\\n');\n p.note(tableLines, 'Selected Tables');\n\n // Model name\n const defaultModel = path.basename(cwd).replace(/[^a-z0-9-]/gi, '-').toLowerCase();\n const modelInput = await p.text({\n message: 'Model name',\n initialValue: defaultModel,\n validate(value) {\n if (!value) return 'Required';\n if (!/^[a-z0-9-]+$/.test(value)) return 'Use lowercase letters, numbers, and hyphens only';\n },\n });\n if (p.isCancel(modelInput)) {\n p.cancel('Setup cancelled.');\n await adapter.disconnect();\n return undefined;\n }\n\n // Target tier\n const tierInput = await p.select({\n message: 'Target metadata tier',\n options: [\n { value: 'bronze', label: 'Bronze', hint: 'Schema + ownership + grain' },\n { value: 'silver', label: 'Silver', hint: '+ trust, lineage, glossary, refresh, sample values' },\n { value: 'gold', label: 'Gold', hint: '+ semantic roles, rules, golden queries (needs curation)' },\n ],\n });\n if (p.isCancel(tierInput)) {\n p.cancel('Setup cancelled.');\n await adapter.disconnect();\n return undefined;\n }\n\n // Gather user intent for AI-guided curation\n let intent: UserIntent | undefined;\n\n const wantsIntent = await p.confirm({\n message: 'Describe what you\\'re building? (helps AI agents curate better metadata)',\n });\n\n if (!p.isCancel(wantsIntent) && wantsIntent) {\n const goalsInput = await p.text({\n message: 'What are you trying to accomplish with this data?',\n placeholder: 'e.g., Analyze coffee shop site selection using demographic and market signals',\n });\n if (p.isCancel(goalsInput)) {\n p.cancel('Setup cancelled.');\n await adapter.disconnect();\n return undefined;\n }\n\n const metricsInput = await p.text({\n message: 'What metrics or outcomes matter most? (optional)',\n placeholder: 'e.g., opportunity score, supply saturation, demand signals',\n });\n\n const audienceInput = await p.text({\n message: 'Who will consume this data? (optional)',\n placeholder: 'e.g., AI agents writing SQL, analysts building dashboards',\n });\n\n intent = {\n goals: goalsInput as string,\n metrics: p.isCancel(metricsInput) ? undefined : (metricsInput as string) || undefined,\n audience: p.isCancel(audienceInput) ? undefined : (audienceInput as string) || undefined,\n };\n }\n\n // Ensure config file\n const configPath = path.join(cwd, 'contextkit.config.yaml');\n let config;\n try {\n config = loadConfig(cwd);\n } catch {\n config = { context_dir: './context' };\n }\n\n if (!config.data_sources || Object.keys(config.data_sources).length === 0) {\n const newConfig = {\n context_dir: config.context_dir ?? './context',\n data_sources: { default: dsConfig },\n };\n writeFileSync(configPath, yaml.stringify(newConfig, { lineWidth: 120 }), 'utf-8');\n config = loadConfig(cwd);\n }\n\n const contextDir = path.resolve(cwd, config.context_dir ?? './context');\n\n return {\n cwd,\n contextDir,\n dsConfig,\n adapter,\n tables,\n columns,\n modelName: modelInput as string,\n targetTier: tierInput as TargetTier,\n intent,\n };\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport * as os from 'node:os';\nimport type { AdapterType, DataSourceConfig } from '@runcontext/core';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface McpConfigLocation {\n ide: string; // 'claude-code' | 'cursor' | 'vscode' | 'windsurf' | 'claude-desktop'\n scope: string; // 'user' | 'project' | 'managed'\n path: string; // resolved absolute path\n}\n\nexport interface DiscoveredDatabase {\n ide: string;\n scope: string;\n serverName: string;\n adapterType: AdapterType;\n connectionDetails: {\n path?: string;\n connection?: string;\n host?: string;\n port?: number;\n database?: string;\n command: string;\n args: string[];\n env?: Record<string, string>;\n };\n label: string;\n}\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\n/** Server-name substrings that hint at a database adapter type. */\nconst NAME_PATTERNS: Record<string, AdapterType> = {\n duckdb: 'duckdb',\n motherduck: 'duckdb',\n postgres: 'postgres',\n postgresql: 'postgres',\n neon: 'postgres',\n supabase: 'postgres',\n mysql: 'mysql',\n sqlite: 'sqlite',\n snowflake: 'snowflake',\n bigquery: 'bigquery',\n clickhouse: 'clickhouse',\n databricks: 'databricks',\n mssql: 'mssql',\n 'sql-server': 'mssql',\n redshift: 'postgres', // Redshift is Postgres-compatible\n};\n\n/** Known MCP package names mapped to adapter types. */\nconst PACKAGE_PATTERNS: Record<string, AdapterType> = {\n '@motherduck/mcp': 'duckdb',\n 'mcp-server-duckdb': 'duckdb',\n 'mcp-server-postgres': 'postgres',\n 'mcp-server-postgresql': 'postgres',\n '@neon/mcp': 'postgres',\n '@supabase/mcp': 'postgres',\n 'mcp-server-mysql': 'mysql',\n 'mcp-server-sqlite': 'sqlite',\n 'mcp-server-snowflake': 'snowflake',\n 'mcp-server-bigquery': 'bigquery',\n 'mcp-server-clickhouse': 'clickhouse',\n 'mcp-server-databricks': 'databricks',\n 'mcp-server-mssql': 'mssql',\n 'mcp-server-redshift': 'postgres',\n};\n\n/** Environment variable names that typically hold connection info. */\nconst CONNECTION_ENV_VARS = [\n 'DATABASE_URL',\n 'POSTGRES_URL',\n 'POSTGRESQL_URL',\n 'PG_CONNECTION_STRING',\n 'MYSQL_URL',\n 'MYSQL_CONNECTION_STRING',\n 'DUCKDB_PATH',\n 'SQLITE_PATH',\n 'SNOWFLAKE_ACCOUNT',\n 'BIGQUERY_PROJECT',\n 'CLICKHOUSE_URL',\n 'DATABRICKS_HOST',\n 'MSSQL_CONNECTION_STRING',\n 'REDSHIFT_URL',\n];\n\n/** CLI flag names that carry connection details. */\nconst CONNECTION_FLAGS = [\n '--db-path',\n '--database',\n '--connection-string',\n '--connection',\n '--host',\n '--port',\n '--db',\n '--dsn',\n];\n\n/** URI scheme prefixes for inline connection strings. */\nconst URI_SCHEMES: Record<string, AdapterType> = {\n 'postgres://': 'postgres',\n 'postgresql://': 'postgres',\n 'mysql://': 'mysql',\n 'clickhouse://': 'clickhouse',\n 'mssql://': 'mssql',\n 'jdbc:': 'postgres', // conservative fallback\n};\n\n// ---------------------------------------------------------------------------\n// Config location helpers\n// ---------------------------------------------------------------------------\n\nfunction getConfigLocations(cwd: string): McpConfigLocation[] {\n const home = os.homedir();\n const isMac = process.platform === 'darwin';\n\n const locations: McpConfigLocation[] = [\n // Claude Code\n { ide: 'claude-code', scope: 'user', path: path.join(home, '.claude.json') },\n { ide: 'claude-code', scope: 'project', path: path.join(cwd, '.mcp.json') },\n\n // Cursor\n { ide: 'cursor', scope: 'user', path: path.join(home, '.cursor', 'mcp.json') },\n { ide: 'cursor', scope: 'project', path: path.join(cwd, '.cursor', 'mcp.json') },\n\n // VS Code / Copilot\n { ide: 'vscode', scope: 'project', path: path.join(cwd, '.vscode', 'mcp.json') },\n\n // Windsurf\n { ide: 'windsurf', scope: 'user', path: path.join(home, '.codeium', 'windsurf', 'mcp_config.json') },\n ];\n\n if (isMac) {\n locations.push(\n {\n ide: 'claude-code',\n scope: 'managed',\n path: path.join('/', 'Library', 'Application Support', 'ClaudeCode', 'managed-mcp.json'),\n },\n {\n ide: 'claude-desktop',\n scope: 'user',\n path: path.join(home, 'Library', 'Application Support', 'Claude', 'claude_desktop_config.json'),\n },\n );\n }\n\n return locations;\n}\n\n// ---------------------------------------------------------------------------\n// JSON parsing helpers\n// ---------------------------------------------------------------------------\n\nfunction readJsonSafe(filePath: string): unknown | null {\n try {\n if (!fs.existsSync(filePath)) return null;\n const raw = fs.readFileSync(filePath, 'utf-8');\n return JSON.parse(raw);\n } catch {\n return null;\n }\n}\n\n/**\n * Extract the servers map from a parsed config.\n * VS Code uses `servers`, everything else uses `mcpServers`.\n */\nfunction extractServers(\n json: unknown,\n ide: string,\n): Record<string, McpServerEntry> | null {\n if (json === null || typeof json !== 'object') return null;\n const obj = json as Record<string, unknown>;\n\n // VS Code uses the `servers` key\n if (ide === 'vscode') {\n const servers = obj['servers'];\n if (servers && typeof servers === 'object') {\n return servers as Record<string, McpServerEntry>;\n }\n return null;\n }\n\n // Everything else: mcpServers\n const mcpServers = obj['mcpServers'];\n if (mcpServers && typeof mcpServers === 'object') {\n return mcpServers as Record<string, McpServerEntry>;\n }\n return null;\n}\n\ninterface McpServerEntry {\n command?: string;\n args?: string[];\n env?: Record<string, string>;\n [key: string]: unknown;\n}\n\n// ---------------------------------------------------------------------------\n// Environment variable expansion\n// ---------------------------------------------------------------------------\n\n/**\n * Expand `${VAR}` and `${VAR:-default}` patterns using process.env.\n */\nfunction expandEnvValue(value: string): string {\n return value.replace(/\\$\\{([^}]+)\\}/g, (_match, expr: string) => {\n const defaultSep = expr.indexOf(':-');\n if (defaultSep !== -1) {\n const varName = expr.slice(0, defaultSep);\n const defaultVal = expr.slice(defaultSep + 2);\n return process.env[varName] ?? defaultVal;\n }\n return process.env[expr] ?? '';\n });\n}\n\nfunction expandEnvMap(env: Record<string, string> | undefined): Record<string, string> | undefined {\n if (!env) return undefined;\n const expanded: Record<string, string> = {};\n for (const [key, value] of Object.entries(env)) {\n expanded[key] = expandEnvValue(String(value));\n }\n return expanded;\n}\n\n// ---------------------------------------------------------------------------\n// Adapter type detection\n// ---------------------------------------------------------------------------\n\nfunction detectAdapterType(\n serverName: string,\n entry: McpServerEntry,\n): AdapterType | null {\n const nameLower = serverName.toLowerCase();\n\n // 1. Match by server name substring\n for (const [pattern, adapter] of Object.entries(NAME_PATTERNS)) {\n if (nameLower.includes(pattern)) return adapter;\n }\n\n // 2. Match by known package in command or args\n const allTokens = [entry.command ?? '', ...(entry.args ?? [])].map((s) =>\n String(s).toLowerCase(),\n );\n for (const [pkg, adapter] of Object.entries(PACKAGE_PATTERNS)) {\n if (allTokens.some((t) => t.includes(pkg.toLowerCase()))) return adapter;\n }\n\n // 3. Match by database-related CLI flags in args\n const argsStr = (entry.args ?? []).join(' ').toLowerCase();\n for (const flag of CONNECTION_FLAGS) {\n if (argsStr.includes(flag)) {\n // Try to infer adapter from surrounding context\n return inferAdapterFromArgs(entry.args ?? []);\n }\n }\n\n // 4. Match by env var names\n if (entry.env) {\n for (const envVar of CONNECTION_ENV_VARS) {\n if (envVar in entry.env) {\n return inferAdapterFromEnvVar(envVar, entry.env[envVar] ?? '');\n }\n }\n }\n\n // 5. Match by URI scheme in args\n for (const arg of entry.args ?? []) {\n for (const [scheme, adapter] of Object.entries(URI_SCHEMES)) {\n if (String(arg).startsWith(scheme)) return adapter;\n }\n }\n\n return null;\n}\n\nfunction inferAdapterFromEnvVar(varName: string, value: string): AdapterType | null {\n const upper = varName.toUpperCase();\n if (upper.includes('POSTGRES') || upper.includes('PG_')) return 'postgres';\n if (upper.includes('MYSQL')) return 'mysql';\n if (upper.includes('DUCKDB')) return 'duckdb';\n if (upper.includes('SQLITE')) return 'sqlite';\n if (upper.includes('SNOWFLAKE')) return 'snowflake';\n if (upper.includes('BIGQUERY')) return 'bigquery';\n if (upper.includes('CLICKHOUSE')) return 'clickhouse';\n if (upper.includes('DATABRICKS')) return 'databricks';\n if (upper.includes('MSSQL')) return 'mssql';\n if (upper.includes('REDSHIFT')) return 'postgres';\n\n // Fall back to checking the value for URI schemes\n if (upper === 'DATABASE_URL') {\n for (const [scheme, adapter] of Object.entries(URI_SCHEMES)) {\n if (String(value).startsWith(scheme)) return adapter;\n }\n }\n\n return 'postgres'; // conservative default for DATABASE_URL-style vars\n}\n\nfunction inferAdapterFromArgs(args: string[]): AdapterType | null {\n const joined = args.join(' ').toLowerCase();\n for (const [scheme, adapter] of Object.entries(URI_SCHEMES)) {\n if (joined.includes(scheme)) return adapter;\n }\n // Check for file extensions that hint at the adapter\n if (joined.includes('.duckdb') || joined.includes('.db') || joined.includes('duckdb')) return 'duckdb';\n if (joined.includes('.sqlite') || joined.includes('.sqlite3')) return 'sqlite';\n return null;\n}\n\n// ---------------------------------------------------------------------------\n// Connection detail extraction\n// ---------------------------------------------------------------------------\n\nfunction extractConnectionDetails(\n entry: McpServerEntry,\n adapterType: AdapterType,\n): DiscoveredDatabase['connectionDetails'] {\n const args = (entry.args ?? []).map(String);\n const env = expandEnvMap(entry.env);\n const command = String(entry.command ?? '');\n\n const details: DiscoveredDatabase['connectionDetails'] = {\n command,\n args,\n env,\n };\n\n // Extract from CLI flags\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n const nextArg = i + 1 < args.length ? args[i + 1] : undefined;\n\n if ((arg === '--db-path' || arg === '--database' || arg === '--db') && nextArg) {\n if (adapterType === 'duckdb' || adapterType === 'sqlite') {\n details.path = nextArg;\n } else {\n details.database = nextArg;\n }\n }\n if ((arg === '--connection-string' || arg === '--connection' || arg === '--dsn') && nextArg) {\n details.connection = nextArg;\n }\n if (arg === '--host' && nextArg) {\n details.host = nextArg;\n }\n if (arg === '--port' && nextArg) {\n const port = parseInt(nextArg, 10);\n if (!isNaN(port)) details.port = port;\n }\n }\n\n // Extract inline connection strings from positional args\n if (!details.connection && !details.path) {\n for (const arg of args) {\n for (const scheme of Object.keys(URI_SCHEMES)) {\n if (arg.startsWith(scheme)) {\n details.connection = arg;\n break;\n }\n }\n if (details.connection) break;\n\n // Check for file paths that look like databases\n if (\n (adapterType === 'duckdb' || adapterType === 'sqlite') &&\n (arg.endsWith('.duckdb') || arg.endsWith('.db') || arg.endsWith('.sqlite') || arg.endsWith('.sqlite3'))\n ) {\n details.path = arg;\n break;\n }\n }\n }\n\n // Extract from environment variables\n if (env) {\n if (!details.connection) {\n for (const varName of CONNECTION_ENV_VARS) {\n if (env[varName]) {\n const val = env[varName];\n // URI-style connection strings\n for (const scheme of Object.keys(URI_SCHEMES)) {\n if (val.startsWith(scheme)) {\n details.connection = val;\n break;\n }\n }\n if (details.connection) break;\n\n // File path for duckdb/sqlite\n if (\n (adapterType === 'duckdb' || adapterType === 'sqlite') &&\n (varName.includes('PATH') || varName.includes('DATABASE'))\n ) {\n details.path = val;\n break;\n }\n }\n }\n }\n\n // Pick up host/port/database from common env vars\n if (!details.host && env['HOST']) details.host = env['HOST'];\n if (!details.host && env['DB_HOST']) details.host = env['DB_HOST'];\n if (!details.port && env['PORT']) {\n const p = parseInt(env['PORT'], 10);\n if (!isNaN(p)) details.port = p;\n }\n if (!details.port && env['DB_PORT']) {\n const p = parseInt(env['DB_PORT'], 10);\n if (!isNaN(p)) details.port = p;\n }\n if (!details.database && env['DB_NAME']) details.database = env['DB_NAME'];\n }\n\n return details;\n}\n\n// ---------------------------------------------------------------------------\n// Label building\n// ---------------------------------------------------------------------------\n\nconst IDE_LABELS: Record<string, string> = {\n 'claude-code': 'Claude Code',\n cursor: 'Cursor',\n vscode: 'VS Code',\n windsurf: 'Windsurf',\n 'claude-desktop': 'Claude Desktop',\n};\n\nconst ADAPTER_LABELS: Record<AdapterType, string> = {\n duckdb: 'DuckDB',\n postgres: 'PostgreSQL',\n mysql: 'MySQL',\n sqlite: 'SQLite',\n snowflake: 'Snowflake',\n bigquery: 'BigQuery',\n clickhouse: 'ClickHouse',\n databricks: 'Databricks',\n mssql: 'SQL Server',\n};\n\nfunction buildLabel(\n serverName: string,\n adapterType: AdapterType,\n details: DiscoveredDatabase['connectionDetails'],\n ide: string,\n): string {\n const adapterLabel = ADAPTER_LABELS[adapterType] ?? adapterType;\n const ideLabel = IDE_LABELS[ide] ?? ide;\n\n // Try to find a meaningful descriptor\n let descriptor = '';\n if (details.path) {\n descriptor = path.basename(details.path);\n } else if (details.database) {\n descriptor = details.database;\n } else if (details.connection) {\n // Extract database name from connection string\n try {\n const url = new URL(details.connection);\n const dbName = url.pathname.replace(/^\\//, '');\n if (dbName) descriptor = dbName;\n } catch {\n // Not a parseable URL; use host if available\n }\n }\n if (!descriptor && details.host) {\n descriptor = details.host;\n }\n\n if (descriptor) {\n return `${adapterLabel} \\u2014 ${descriptor} (from ${ideLabel})`;\n }\n return `${adapterLabel} \\u2014 ${serverName} (from ${ideLabel})`;\n}\n\n// ---------------------------------------------------------------------------\n// Deduplication\n// ---------------------------------------------------------------------------\n\nfunction deduplicationKey(db: DiscoveredDatabase): string {\n const parts: string[] = [db.adapterType];\n if (db.connectionDetails.path) parts.push(db.connectionDetails.path);\n if (db.connectionDetails.connection) parts.push(db.connectionDetails.connection);\n if (db.connectionDetails.host) parts.push(db.connectionDetails.host);\n if (db.connectionDetails.port) parts.push(String(db.connectionDetails.port));\n if (db.connectionDetails.database) parts.push(db.connectionDetails.database);\n // If no distinguishing details, use server name to avoid collapsing unrelated entries\n if (parts.length === 1) parts.push(db.serverName);\n return parts.join('|');\n}\n\n// ---------------------------------------------------------------------------\n// Main discovery\n// ---------------------------------------------------------------------------\n\n/**\n * Scans all known IDE MCP config files and discovers database connections\n * that the user already has configured.\n *\n * Never throws. Returns an empty array if nothing is found or on any error.\n */\nexport function discoverDatabases(cwd: string): DiscoveredDatabase[] {\n const results: DiscoveredDatabase[] = [];\n\n try {\n const locations = getConfigLocations(cwd);\n\n for (const loc of locations) {\n try {\n const json = readJsonSafe(loc.path);\n if (json === null) continue;\n\n const servers = extractServers(json, loc.ide);\n if (!servers) continue;\n\n for (const [serverName, entry] of Object.entries(servers)) {\n try {\n if (!entry || typeof entry !== 'object') continue;\n\n const adapterType = detectAdapterType(serverName, entry);\n if (!adapterType) continue;\n\n const connectionDetails = extractConnectionDetails(entry, adapterType);\n const label = buildLabel(serverName, adapterType, connectionDetails, loc.ide);\n\n results.push({\n ide: loc.ide,\n scope: loc.scope,\n serverName,\n adapterType,\n connectionDetails,\n label,\n });\n } catch {\n // Skip malformed server entry\n }\n }\n } catch {\n // Skip unreadable/malformed config file\n }\n }\n } catch {\n // Fatal-level error — return whatever we have\n }\n\n // Deduplicate: keep the first occurrence (project-scoped sorts first)\n const scopeOrder: Record<string, number> = { project: 0, user: 1, managed: 2 };\n results.sort((a, b) => {\n const sa = scopeOrder[a.scope] ?? 9;\n const sb = scopeOrder[b.scope] ?? 9;\n return sa - sb;\n });\n\n const seen = new Set<string>();\n const deduped: DiscoveredDatabase[] = [];\n for (const db of results) {\n const key = deduplicationKey(db);\n if (!seen.has(key)) {\n seen.add(key);\n deduped.push(db);\n }\n }\n\n return deduped;\n}\n\n// ---------------------------------------------------------------------------\n// Conversion to DataSourceConfig\n// ---------------------------------------------------------------------------\n\n/**\n * Converts a DiscoveredDatabase into a DataSourceConfig that can be written\n * into contextkit.config.yaml. Returns null if the connection details are\n * insufficient to create a usable config.\n */\nexport function toDataSourceConfig(discovered: DiscoveredDatabase): DataSourceConfig | null {\n const { adapterType, connectionDetails } = discovered;\n\n switch (adapterType) {\n case 'duckdb':\n case 'sqlite': {\n const filePath = connectionDetails.path;\n if (!filePath) return null;\n return { adapter: adapterType, path: filePath };\n }\n\n case 'postgres':\n case 'mysql':\n case 'mssql': {\n if (connectionDetails.connection) {\n return { adapter: adapterType, connection: connectionDetails.connection };\n }\n // Try to build from host/port/database\n if (connectionDetails.host) {\n const config: DataSourceConfig = {\n adapter: adapterType,\n host: connectionDetails.host,\n };\n if (connectionDetails.port) config.port = connectionDetails.port;\n if (connectionDetails.database) config.database = connectionDetails.database;\n return config;\n }\n return null;\n }\n\n case 'snowflake': {\n // Need at minimum an account\n if (connectionDetails.host) {\n return {\n adapter: 'snowflake',\n account: connectionDetails.host,\n database: connectionDetails.database,\n };\n }\n return null;\n }\n\n case 'bigquery': {\n if (connectionDetails.database) {\n return {\n adapter: 'bigquery',\n project: connectionDetails.database,\n };\n }\n return null;\n }\n\n case 'clickhouse': {\n if (connectionDetails.connection) {\n return { adapter: 'clickhouse', host: connectionDetails.connection };\n }\n if (connectionDetails.host) {\n const config: DataSourceConfig = {\n adapter: 'clickhouse',\n host: connectionDetails.host,\n };\n if (connectionDetails.port) config.port = connectionDetails.port;\n if (connectionDetails.database) config.database = connectionDetails.database;\n return config;\n }\n return null;\n }\n\n case 'databricks': {\n if (connectionDetails.host) {\n return {\n adapter: 'databricks',\n serverHostname: connectionDetails.host,\n };\n }\n return null;\n }\n\n default:\n return null;\n }\n}\n","import * as p from '@clack/prompts';\nimport path from 'node:path';\nimport { mkdirSync, writeFileSync, existsSync } from 'node:fs';\nimport { scaffoldFromSchema, compile, computeTier, loadConfig } from '@runcontext/core';\nimport type { SetupContext, StepResult } from '../types.js';\nimport { displayTierScore } from '../display.js';\n\nexport async function runScaffoldStep(ctx: SetupContext): Promise<StepResult> {\n const shouldRun = await p.confirm({\n message: 'Scaffold Bronze metadata from database schema?',\n });\n if (p.isCancel(shouldRun) || !shouldRun) {\n return { skipped: true, summary: 'Skipped' };\n }\n\n const spin = p.spinner();\n spin.start('Scaffolding Bronze metadata...');\n\n const result = scaffoldFromSchema({\n modelName: ctx.modelName,\n dataSourceName: 'default',\n tables: ctx.tables,\n columns: ctx.columns,\n });\n\n // Create directories\n for (const dir of ['models', 'governance', 'owners', 'reference']) {\n const dirPath = path.join(ctx.contextDir, dir);\n if (!existsSync(dirPath)) mkdirSync(dirPath, { recursive: true });\n }\n\n // Create reference README if it doesn't exist\n const refReadme = path.join(ctx.contextDir, 'reference', 'README.md');\n if (!existsSync(refReadme)) {\n writeFileSync(refReadme, `# Reference Documents\n\nDrop files here that help describe your data — the AI agent will read them when curating metadata.\n\nExamples of useful reference documents:\n- Data dictionaries (CSV, Excel, PDF)\n- Confluence or wiki exports\n- ERD diagrams or schema docs\n- Business glossaries from your organization\n- Dashboard screenshots or descriptions\n- Data pipeline documentation\n- Slack/email threads explaining metric definitions\n\nThe agent will use these as context when writing descriptions, defining metrics,\ncreating glossary terms, and building business context. The more context you\nprovide, the better the metadata quality.\n\nSupported formats: .md, .txt, .csv, .json, .yaml, .pdf\n`, 'utf-8');\n }\n\n // Write files\n const created: string[] = [];\n const files = [\n { rel: path.join('models', result.files.osi), content: result.osiYaml },\n { rel: path.join('governance', result.files.governance), content: result.governanceYaml },\n { rel: path.join('owners', result.files.owner), content: result.ownerYaml },\n ];\n\n for (const f of files) {\n const fullPath = path.join(ctx.contextDir, f.rel);\n writeFileSync(fullPath, f.content, 'utf-8');\n created.push(f.rel);\n }\n\n // Recompile and compute tier\n const config = loadConfig(ctx.cwd);\n const { graph } = await compile({ contextDir: ctx.contextDir, config, rootDir: ctx.cwd });\n ctx.graph = graph;\n ctx.tierScore = computeTier(ctx.modelName, graph);\n\n spin.stop(`Created ${created.length} files`);\n\n const fileList = created.map((f) => ` ${f}`).join('\\n');\n p.note(fileList, 'Files Created');\n displayTierScore(ctx.tierScore);\n\n return { skipped: false, summary: `${created.length} files → ${ctx.tierScore.tier.toUpperCase()}` };\n}\n","import * as p from '@clack/prompts';\nimport type { TierScore } from '@runcontext/core';\nimport { formatTierScore } from '../formatters/pretty.js';\n\nexport function displayTierScore(score: TierScore): void {\n p.note(formatTierScore(score), 'Tier Scorecard');\n}\n","import * as p from '@clack/prompts';\nimport path from 'node:path';\nimport { readFileSync, writeFileSync, mkdirSync, existsSync, readdirSync } from 'node:fs';\nimport * as yaml from 'yaml';\nimport {\n compile,\n computeTier,\n suggestEnrichments,\n loadConfig,\n createAdapter,\n} from '@runcontext/core';\nimport type { SetupContext, StepResult } from '../types.js';\nimport { displayTierScore } from '../display.js';\n\nfunction findFileRecursive(dir: string, suffix: string): string | undefined {\n if (!existsSync(dir)) return undefined;\n const entries = readdirSync(dir, { withFileTypes: true });\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n const found = findFileRecursive(fullPath, suffix);\n if (found) return found;\n } else if (entry.name.endsWith(suffix)) {\n return fullPath;\n }\n }\n return undefined;\n}\n\nexport async function runEnrichSilverStep(ctx: SetupContext): Promise<StepResult> {\n // Recompile to get fresh state\n const config = loadConfig(ctx.cwd);\n const { graph } = await compile({ contextDir: ctx.contextDir, config, rootDir: ctx.cwd });\n ctx.graph = graph;\n const tierScore = computeTier(ctx.modelName, graph);\n\n if (tierScore.silver.passed) {\n p.log.success('Already at Silver or above — skipping.');\n ctx.tierScore = tierScore;\n return { skipped: true, summary: 'Already Silver' };\n }\n\n const model = graph.models.get(ctx.modelName);\n if (!model) {\n p.log.error(`Model \"${ctx.modelName}\" not found in graph.`);\n return { skipped: true, summary: 'Model not found' };\n }\n\n const datasetNames = model.datasets.map((d) => d.name);\n const suggestions = suggestEnrichments('silver', tierScore, datasetNames);\n\n // Build preview of what will be added\n const preview: string[] = [];\n if (suggestions.governance?.trust) preview.push(`+ trust: ${suggestions.governance.trust}`);\n if (suggestions.governance?.tags) preview.push(`+ tags: [${suggestions.governance.tags.join(', ')}]`);\n if (suggestions.governance?.refreshAll) preview.push(`+ refresh: ${suggestions.governance.refreshAll} (all datasets)`);\n if (suggestions.lineage) preview.push(`+ ${suggestions.lineage.upstream?.length ?? 0} lineage upstream source(s)`);\n if (suggestions.glossaryTerms) preview.push(`+ ${suggestions.glossaryTerms.length} glossary term(s)`);\n if (suggestions.needsSampleValues) preview.push('+ sample_values from live data');\n\n if (preview.length > 0) {\n p.note(preview.join('\\n'), 'Silver Enrichments');\n }\n\n const shouldRun = await p.confirm({\n message: 'Apply Silver enrichments?',\n });\n if (p.isCancel(shouldRun) || !shouldRun) {\n return { skipped: true, summary: 'Skipped' };\n }\n\n const spin = p.spinner();\n spin.start('Enriching to Silver...');\n\n // Apply governance changes\n const govFilePath = findFileRecursive(ctx.contextDir, `${ctx.modelName}.governance.yaml`);\n if (govFilePath) {\n const govContent = readFileSync(govFilePath, 'utf-8');\n const govDoc = yaml.parse(govContent) ?? {};\n\n if (suggestions.governance?.trust) govDoc.trust = suggestions.governance.trust;\n if (suggestions.governance?.tags) govDoc.tags = suggestions.governance.tags;\n if (suggestions.governance?.refreshAll) {\n for (const dsName of Object.keys(govDoc.datasets ?? {})) {\n govDoc.datasets[dsName].refresh = suggestions.governance.refreshAll;\n }\n }\n\n // Populate sample values from DB\n if (suggestions.needsSampleValues) {\n govDoc.fields = govDoc.fields ?? {};\n try {\n let count = 0;\n for (const ds of model.datasets) {\n if (count >= 2) break;\n const tableName = ds.source?.split('.').pop() ?? ds.name;\n for (const field of ds.fields ?? []) {\n if (count >= 2) break;\n const fieldKey = `${ds.name}.${field.name}`;\n if (govDoc.fields[fieldKey]?.sample_values?.length > 0) continue;\n try {\n const result = await ctx.adapter.query(\n `SELECT DISTINCT CAST(\"${field.name}\" AS VARCHAR) AS val FROM \"${tableName}\" WHERE \"${field.name}\" IS NOT NULL LIMIT 5`,\n );\n if (result.rows.length > 0) {\n govDoc.fields[fieldKey] = govDoc.fields[fieldKey] ?? {};\n govDoc.fields[fieldKey].sample_values = result.rows.map((r: any) => String(r.val));\n count++;\n }\n } catch {\n // skip fields that can't be queried\n }\n }\n }\n } catch {\n // adapter query failed — skip sample values\n }\n }\n\n writeFileSync(govFilePath, yaml.stringify(govDoc, { lineWidth: 120 }), 'utf-8');\n }\n\n // Write lineage file\n if (suggestions.lineage) {\n const lineageDir = path.join(ctx.contextDir, 'lineage');\n if (!existsSync(lineageDir)) mkdirSync(lineageDir, { recursive: true });\n const lineagePath = path.join(lineageDir, `${ctx.modelName}.lineage.yaml`);\n if (!existsSync(lineagePath)) {\n const lineageDoc = { model: ctx.modelName, upstream: suggestions.lineage.upstream };\n writeFileSync(lineagePath, yaml.stringify(lineageDoc, { lineWidth: 120 }), 'utf-8');\n }\n }\n\n // Write glossary terms\n if (suggestions.glossaryTerms) {\n const glossaryDir = path.join(ctx.contextDir, 'glossary');\n if (!existsSync(glossaryDir)) mkdirSync(glossaryDir, { recursive: true });\n for (const term of suggestions.glossaryTerms) {\n const termPath = path.join(glossaryDir, `${term.id}.term.yaml`);\n if (!existsSync(termPath)) {\n writeFileSync(termPath, yaml.stringify(term, { lineWidth: 120 }), 'utf-8');\n }\n }\n }\n\n // Recompile and score\n const { graph: newGraph } = await compile({ contextDir: ctx.contextDir, config, rootDir: ctx.cwd });\n ctx.graph = newGraph;\n ctx.tierScore = computeTier(ctx.modelName, newGraph);\n\n spin.stop('Applied Silver enrichments');\n displayTierScore(ctx.tierScore);\n\n return { skipped: false, summary: ctx.tierScore.tier.toUpperCase() };\n}\n","import * as p from '@clack/prompts';\nimport path from 'node:path';\nimport { readFileSync, writeFileSync, mkdirSync, existsSync, readdirSync } from 'node:fs';\nimport * as yaml from 'yaml';\nimport {\n compile,\n computeTier,\n suggestEnrichments,\n inferSemanticRole,\n inferAggregation,\n loadConfig,\n} from '@runcontext/core';\nimport type { SetupContext, StepResult } from '../types.js';\nimport { displayTierScore } from '../display.js';\n\nfunction findFileRecursive(dir: string, suffix: string): string | undefined {\n if (!existsSync(dir)) return undefined;\n const entries = readdirSync(dir, { withFileTypes: true });\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n const found = findFileRecursive(fullPath, suffix);\n if (found) return found;\n } else if (entry.name.endsWith(suffix)) {\n return fullPath;\n }\n }\n return undefined;\n}\n\nexport async function runEnrichGoldStep(ctx: SetupContext): Promise<StepResult> {\n const config = loadConfig(ctx.cwd);\n const { graph } = await compile({ contextDir: ctx.contextDir, config, rootDir: ctx.cwd });\n ctx.graph = graph;\n const tierScore = computeTier(ctx.modelName, graph);\n\n if (tierScore.gold.passed) {\n p.log.success('Already at Gold — skipping.');\n ctx.tierScore = tierScore;\n return { skipped: true, summary: 'Already Gold' };\n }\n\n const model = graph.models.get(ctx.modelName);\n if (!model) {\n p.log.error(`Model \"${ctx.modelName}\" not found.`);\n return { skipped: true, summary: 'Model not found' };\n }\n\n const datasetNames = model.datasets.map((d) => d.name);\n const suggestions = suggestEnrichments('gold', tierScore, datasetNames);\n\n // Build preview\n const preview: string[] = [];\n if (suggestions.needsSemanticRoles) preview.push('+ Infer semantic_role for all fields');\n if (suggestions.needsRulesFile) preview.push('+ Generate rules file (golden queries, guardrails, hierarchies)');\n if (suggestions.governance?.trust) preview.push(`+ trust: ${suggestions.governance.trust}`);\n preview.push('+ Add version, business_context stubs to governance');\n preview.push('+ Add ai_context placeholder to model');\n preview.push('+ Infer relationships from column name patterns');\n\n if (preview.length > 0) {\n p.note(preview.join('\\n'), 'Gold Enrichments');\n }\n\n p.log.warning('Gold enrichments create TODO placeholders that need manual curation.');\n\n const shouldRun = await p.confirm({\n message: 'Apply Gold enrichments?',\n });\n if (p.isCancel(shouldRun) || !shouldRun) {\n return { skipped: true, summary: 'Skipped' };\n }\n\n const spin = p.spinner();\n spin.start('Enriching to Gold...');\n\n // Apply governance changes\n const govFilePath = findFileRecursive(ctx.contextDir, `${ctx.modelName}.governance.yaml`);\n if (govFilePath) {\n const govContent = readFileSync(govFilePath, 'utf-8');\n const govDoc = yaml.parse(govContent) ?? {};\n\n if (suggestions.governance?.trust) govDoc.trust = suggestions.governance.trust;\n\n // Infer semantic roles for all fields\n if (suggestions.needsSemanticRoles) {\n govDoc.fields = govDoc.fields ?? {};\n\n for (const ds of model.datasets) {\n const tableName = ds.source?.split('.').pop() ?? ds.name;\n let dbColumns: any[] = [];\n try {\n dbColumns = await ctx.adapter.listColumns(tableName);\n } catch {\n // fall back to name-based heuristics\n }\n\n for (const field of ds.fields ?? []) {\n const fieldKey = `${ds.name}.${field.name}`;\n if (govDoc.fields[fieldKey]?.semantic_role) continue;\n const col = dbColumns.find((c: any) => c.name === field.name);\n const isPK = col?.is_primary_key ?? field.name.endsWith('_id');\n const dataType = col?.data_type ?? 'VARCHAR';\n govDoc.fields[fieldKey] = govDoc.fields[fieldKey] ?? {};\n const role = inferSemanticRole(field.name, dataType, isPK);\n govDoc.fields[fieldKey].semantic_role = role;\n if (role === 'metric') {\n govDoc.fields[fieldKey].default_aggregation = inferAggregation(field.name);\n govDoc.fields[fieldKey].additive = govDoc.fields[fieldKey].default_aggregation === 'SUM';\n }\n }\n }\n }\n\n // Add version if missing\n if (!govDoc.version) {\n govDoc.version = '0.1.0';\n }\n\n // Add business_context stubs if missing\n if (!govDoc.business_context || govDoc.business_context.length === 0) {\n govDoc.business_context = [\n { name: 'TODO: Use Case Name', description: 'TODO: Describe the analytical use case and business value.' },\n ];\n }\n\n writeFileSync(govFilePath, yaml.stringify(govDoc, { lineWidth: 120 }), 'utf-8');\n }\n\n // Add ai_context to model if missing\n const modelFilePath = findFileRecursive(ctx.contextDir, `${ctx.modelName}.osi.yaml`);\n if (modelFilePath) {\n const modelContent = readFileSync(modelFilePath, 'utf-8');\n const modelDoc = yaml.parse(modelContent) ?? {};\n const semModels = modelDoc.semantic_model ?? [];\n let changed = false;\n\n for (const sm of semModels) {\n if (sm.name !== ctx.modelName) continue;\n\n // Add ai_context placeholder if missing\n if (!sm.ai_context) {\n sm.ai_context = 'TODO: Describe how an AI agent should use this model, common pitfalls, and important filters.';\n changed = true;\n }\n\n // Infer relationships from column name patterns (e.g., business_id → FK to yelp_business)\n if (!sm.relationships || sm.relationships.length === 0) {\n const datasets = sm.datasets ?? [];\n const dsNames = new Set(datasets.map((d: any) => d.name));\n const inferred: any[] = [];\n\n for (const ds of datasets) {\n for (const field of ds.fields ?? []) {\n const fname = field.name as string;\n // Match patterns like \"business_id\" → look for dataset \"business\" or similar\n const idMatch = fname.match(/^(.+)_id$/);\n if (idMatch && idMatch[1]) {\n const targetBase = idMatch[1];\n // Find a dataset that matches the target name\n for (const targetDs of datasets) {\n if (targetDs.name === ds.name) continue;\n const targetName = targetDs.name as string;\n // Match if target dataset name contains the base or vice versa\n if (targetName.includes(targetBase) || targetBase.includes(targetName)) {\n // Check target has a matching field\n const targetHasField = (targetDs.fields ?? []).some((f: any) => f.name === fname);\n if (targetHasField) {\n const relName = `${ds.name}-to-${targetName}`;\n if (!inferred.some((r: any) => r.name === relName)) {\n inferred.push({\n name: relName,\n from: ds.name,\n to: targetName,\n from_columns: [fname],\n to_columns: [fname],\n });\n }\n }\n }\n }\n }\n }\n }\n\n if (inferred.length > 0) {\n sm.relationships = inferred;\n changed = true;\n }\n }\n }\n\n if (changed) {\n writeFileSync(modelFilePath, yaml.stringify(modelDoc, { lineWidth: 120 }), 'utf-8');\n }\n }\n\n // Stub rules file\n if (suggestions.needsRulesFile) {\n const rulesDir = path.join(ctx.contextDir, 'rules');\n if (!existsSync(rulesDir)) mkdirSync(rulesDir, { recursive: true });\n const rulesPath = path.join(rulesDir, `${ctx.modelName}.rules.yaml`);\n if (!existsSync(rulesPath)) {\n const rulesDoc = {\n model: ctx.modelName,\n golden_queries: [\n { question: 'TODO: What is the total count?', sql: 'SELECT COUNT(*) FROM table_name' },\n { question: 'TODO: What are the top records?', sql: 'SELECT * FROM table_name LIMIT 10' },\n { question: 'TODO: What is the distribution?', sql: 'SELECT column, COUNT(*) FROM table_name GROUP BY column' },\n ],\n business_rules: [\n { name: 'TODO: rule-name', definition: 'TODO: describe the business rule' },\n ],\n guardrail_filters: [\n { name: 'TODO: filter-name', filter: 'column IS NOT NULL', reason: 'TODO: explain why' },\n ],\n hierarchies: [\n { name: 'TODO: hierarchy-name', levels: ['level1', 'level2'], dataset: datasetNames[0] ?? 'dataset' },\n ],\n };\n writeFileSync(rulesPath, yaml.stringify(rulesDoc, { lineWidth: 120 }), 'utf-8');\n }\n }\n\n // Recompile and score\n const { graph: newGraph } = await compile({ contextDir: ctx.contextDir, config, rootDir: ctx.cwd });\n ctx.graph = newGraph;\n ctx.tierScore = computeTier(ctx.modelName, newGraph);\n\n spin.stop('Applied Gold enrichments');\n\n const todos = suggestions.needsRulesFile\n ? '\\nThe rules file contains TODO placeholders — edit context/rules/ to complete Gold.'\n : '';\n if (todos) p.log.warning(todos);\n\n displayTierScore(ctx.tierScore);\n\n return { skipped: false, summary: `${ctx.tierScore.tier.toUpperCase()} (may need curation)` };\n}\n","import * as p from '@clack/prompts';\nimport {\n compile,\n LintEngine,\n ALL_RULES,\n computeTier,\n loadConfig,\n} from '@runcontext/core';\nimport { collectDataValidation } from '../../commands/verify.js';\nimport type { SetupContext, StepResult } from '../types.js';\nimport { displayTierScore } from '../display.js';\n\nexport async function runVerifyStep(ctx: SetupContext): Promise<StepResult> {\n const shouldRun = await p.confirm({\n message: 'Verify metadata against live data?',\n });\n if (p.isCancel(shouldRun) || !shouldRun) {\n return { skipped: true, summary: 'Skipped' };\n }\n\n const spin = p.spinner();\n spin.start('Verifying against database...');\n\n const config = loadConfig(ctx.cwd);\n const { graph } = await compile({ contextDir: ctx.contextDir, config, rootDir: ctx.cwd });\n\n graph.dataValidation = await collectDataValidation(ctx.adapter, graph);\n\n const engine = new LintEngine();\n for (const rule of ALL_RULES) {\n if (rule.id.startsWith('data/')) engine.register(rule);\n }\n const dataDiags = engine.run(graph);\n\n ctx.graph = graph;\n ctx.tierScore = computeTier(ctx.modelName, graph);\n\n const errors = dataDiags.filter((d) => d.severity === 'error').length;\n const warnings = dataDiags.filter((d) => d.severity === 'warning').length;\n\n if (dataDiags.length === 0) {\n spin.stop('All data validation checks passed');\n } else {\n spin.stop(`${errors} error(s), ${warnings} warning(s)`);\n const details = dataDiags\n .map((d) => ` ${d.severity === 'error' ? 'x' : '!'} ${d.message}`)\n .join('\\n');\n p.note(details, 'Data Validation Issues');\n }\n\n return {\n skipped: false,\n summary: dataDiags.length === 0 ? 'Clean' : `${errors} errors, ${warnings} warnings`,\n };\n}\n","import * as p from '@clack/prompts';\nimport fs from 'node:fs';\nimport {\n compile,\n LintEngine,\n ALL_RULES,\n applyFixes,\n computeTier,\n loadConfig,\n createAdapter,\n} from '@runcontext/core';\nimport { collectDataValidation } from '../../commands/verify.js';\nimport type { SetupContext, StepResult } from '../types.js';\nimport { displayTierScore } from '../display.js';\n\nexport async function runAutofixStep(ctx: SetupContext): Promise<StepResult> {\n const config = loadConfig(ctx.cwd);\n const { graph } = await compile({ contextDir: ctx.contextDir, config, rootDir: ctx.cwd });\n\n // Collect data validation for data-aware fixes\n graph.dataValidation = await collectDataValidation(ctx.adapter, graph);\n\n const engine = new LintEngine();\n for (const rule of ALL_RULES) engine.register(rule);\n const diagnostics = engine.run(graph);\n const fixable = diagnostics.filter((d) => d.fixable);\n\n if (fixable.length === 0) {\n p.log.success('No fixable issues found.');\n ctx.graph = graph;\n ctx.tierScore = computeTier(ctx.modelName, graph);\n return { skipped: true, summary: 'Nothing to fix' };\n }\n\n const shouldRun = await p.confirm({\n message: `Auto-fix ${fixable.length} issue(s)?`,\n });\n if (p.isCancel(shouldRun) || !shouldRun) {\n return { skipped: true, summary: 'Skipped' };\n }\n\n const spin = p.spinner();\n spin.start('Fixing...');\n\n const readFile = (filePath: string) => fs.readFileSync(filePath, 'utf-8');\n const fixedFiles = applyFixes(fixable, readFile);\n\n for (const [file, content] of fixedFiles) {\n fs.writeFileSync(file, content, 'utf-8');\n }\n\n // Recompile and score\n const { graph: newGraph } = await compile({ contextDir: ctx.contextDir, config, rootDir: ctx.cwd });\n ctx.graph = newGraph;\n ctx.tierScore = computeTier(ctx.modelName, newGraph);\n\n spin.stop(`Fixed ${fixable.length} issue(s) in ${fixedFiles.size} file(s)`);\n displayTierScore(ctx.tierScore);\n\n return { skipped: false, summary: `${fixable.length} issues fixed` };\n}\n","import * as p from '@clack/prompts';\nimport path from 'node:path';\nimport { existsSync, writeFileSync } from 'node:fs';\nimport type { SetupContext, StepResult } from '../types.js';\n\nfunction buildAgentInstructions(ctx: SetupContext): string {\n const modelName = ctx.modelName;\n const tier = ctx.tierScore?.tier?.toUpperCase() ?? 'UNKNOWN';\n const tableList = ctx.tables.map((t) => t.name).join(', ');\n const dbInfo = ctx.dsConfig.path ?? ctx.dsConfig.connection ?? 'configured';\n\n // Extract dataset info from graph\n const model = ctx.graph?.models.get(modelName);\n const datasets = model?.datasets ?? [];\n const datasetList = datasets.map((ds) => `- \\`${ds.name}\\` — ${ds.fields?.length ?? 0} fields`).join('\\n');\n\n // Extract failing checks\n const failingChecks: string[] = [];\n if (ctx.tierScore) {\n for (const check of ctx.tierScore.bronze.checks) {\n if (!check.passed) failingChecks.push(`- ${check.id}: ${check.detail ?? check.label}`);\n }\n for (const check of ctx.tierScore.silver.checks) {\n if (!check.passed) failingChecks.push(`- ${check.id}: ${check.detail ?? check.label}`);\n }\n for (const check of ctx.tierScore.gold.checks) {\n if (!check.passed) failingChecks.push(`- ${check.id}: ${check.detail ?? check.label}`);\n }\n }\n const failingSection =\n failingChecks.length > 0\n ? `### Failing Checks\\n\\n${failingChecks.join('\\n')}`\n : 'All checks passing.';\n\n // Build intent section if user provided goals\n const intentSection = ctx.intent\n ? `## Project Goals\n\n${ctx.intent.goals}\n${ctx.intent.metrics ? `\\n**Key metrics/outcomes:** ${ctx.intent.metrics}` : ''}\n${ctx.intent.audience ? `\\n**Audience:** ${ctx.intent.audience}` : ''}\n\nUse these goals to prioritize which datasets, fields, and metrics to curate first.\n\n`\n : '';\n\n return `# ContextKit Agent Instructions\n\nModel: **${modelName}** | Current Tier: **${tier}**\nDatabase: ${ctx.dsConfig.adapter} (${dbInfo})\nTables: ${tableList}\n\n${intentSection}## The Cardinal Rule: Never Fabricate Metadata\n\n**Every piece of metadata you write must be grounded in evidence from the actual data.**\n\n- NEVER invent owner names, emails, team names, or contact info\n- NEVER write a field description that is just the column name repeated\n- NEVER assign a semantic_role without first querying the column's actual values\n- NEVER mark a field as additive without understanding what summing it means\n- NEVER write lineage entries without knowing the actual data sources\n- NEVER write a business_context narrative you can't justify from the data\n- NEVER create a glossary definition that is just \"Definition for X\"\n\nIf you don't know something, **ask the user**. A honest \"I'm not sure — can you tell me what this field means?\" is infinitely better than fabricated metadata that looks plausible but is wrong.\n\n## Database Safety — MANDATORY\n\n**Your job is to READ the database to build metadata. You must NEVER modify the database.**\n\n### Hard Rules (no exceptions)\n\n- **READ-ONLY.** Never execute INSERT, UPDATE, DELETE, DROP, ALTER, CREATE, TRUNCATE, MERGE, REPLACE, or any DDL/DML statement\n- **LIMIT everything.** Every SELECT must include \\`LIMIT\\`. Use \\`LIMIT 20\\` for sample values, \\`LIMIT 100\\` max for golden query validation. Never run unlimited queries\n- **No full table scans.** Never \\`SELECT * FROM large_table\\` without a WHERE clause and LIMIT. For row counts, use \\`COUNT(*)\\` — never pull all rows to count them\n- **No expensive aggregations.** Avoid \\`GROUP BY\\` on high-cardinality columns across full tables. When checking distinct values, use \\`SELECT DISTINCT col FROM table LIMIT 20\\`, not \\`SELECT DISTINCT col FROM table\\`\n- **No cross joins or cartesian products.** Never join tables without a proper join condition\n- **No recursive or deeply nested queries.** Keep queries simple — you're sampling data, not building reports\n- **No EXPLAIN ANALYZE on cloud warehouses.** On Snowflake, BigQuery, Databricks, etc., even EXPLAIN can trigger computation. Use metadata queries (information_schema) instead when possible\n\n### Cost Awareness\n\nCloud data warehouses (Snowflake, BigQuery, Databricks, Redshift) charge per query based on data scanned. **Every query costs money.**\n\n- Prefer \\`information_schema\\` queries over scanning actual tables\n- Use \\`LIMIT\\` on every query — no exceptions\n- Sample a few rows to understand a column, don't scan the full table\n- For BigQuery: always qualify table names with dataset to avoid scanning wrong tables\n- For Snowflake: use \\`SAMPLE\\` clause when available instead of full table scans\n- If you need row counts, use table metadata or \\`COUNT(*)\\` — never \\`SELECT *\\`\n- Batch your questions: gather what you need to know, then write ONE efficient query instead of many small ones\n\n### What You ARE Allowed To Do\n\n\\`\\`\\`sql\n-- YES: Sample values (always with LIMIT)\nSELECT DISTINCT column_name FROM table_name LIMIT 20;\n\n-- YES: Basic stats for a column (single column, not full row)\nSELECT MIN(col), MAX(col), COUNT(DISTINCT col) FROM table_name;\n\n-- YES: Row count\nSELECT COUNT(*) FROM table_name;\n\n-- YES: Schema metadata (free or near-free on all platforms)\nSELECT column_name, data_type FROM information_schema.columns\nWHERE table_name = 'my_table';\n\n-- YES: Validate a golden query (with LIMIT)\nSELECT geoid, score FROM vw_rankings ORDER BY score DESC LIMIT 10;\n\\`\\`\\`\n\n### What You Must NEVER Do\n\n\\`\\`\\`sql\n-- NEVER: Modify data\nINSERT INTO / UPDATE / DELETE FROM / DROP TABLE / ALTER TABLE\n\n-- NEVER: Unlimited scans\nSELECT * FROM large_table;\nSELECT DISTINCT high_cardinality_col FROM big_table;\n\n-- NEVER: Expensive cross-table operations without LIMIT\nSELECT * FROM a JOIN b ON a.id = b.id JOIN c ON b.id = c.id;\n\n-- NEVER: Write to the database in any way\nCREATE TABLE / CREATE VIEW / CREATE INDEX\n\\`\\`\\`\n\nIf a query might be expensive and you're not sure, **ask the user first**. \"This table looks large — is it OK if I run a COUNT(*)?\" is always the right call.\n\n## Mandatory Task Checklist\n\n**You MUST complete every task in order. Do NOT skip any task. Do NOT proceed to the next task until the current one is done.**\n\nThis is the full workflow for building a semantic layer. Check off each task as you complete it.\n\n### Phase 1: Discovery (BEFORE touching any YAML)\n\n- [ ] **Task 1: Ask about the project goal.** Ask the user: \"What is this data for? What questions do you want to answer with it? Who will be using it?\" Do NOT proceed until the user answers.\n\n- [ ] **Task 2: Ask for reference documents.** Tell the user: \"Do you have any existing documentation about this data? Data dictionaries, wiki pages, ERDs, spreadsheets, Confluence exports, dashboard screenshots? Drop them in \\`context/reference/\\` and I'll use them to write much better metadata.\" Check \\`context/reference/\\` for any files already there. Read them if present.\n\n- [ ] **Task 3: Ask about ownership.** Ask: \"Who owns this data? What team maintains it? What's the best contact email?\" Do NOT invent owner info.\n\n- [ ] **Task 4: Ask about data sources.** Ask: \"Where does this data come from originally? What upstream systems feed into this database? (e.g., Salesforce, Stripe, internal APIs, CSV imports)\"\n\n- [ ] **Task 5: Run \\`context tier\\`.** Check the current tier score and report it to the user. Summarize which checks are failing.\n\n### Phase 2: Guided Curation (the conversation)\n\n- [ ] **Task 6: Walk through key fields WITH the user.** For each dataset, sample the data (with LIMIT), then ask the user about fields that are ambiguous:\n - \"I see a column called \\`stars\\` with values 1.0-5.0 — is this a rating that should be averaged, or something else?\"\n - \"Should \\`revenue\\` be summed or averaged? Is it additive across dimensions?\"\n - \"What does \\`status\\` mean in your business? What are the valid values?\"\n - Do NOT silently assign semantic roles without checking ambiguous cases.\n\n- [ ] **Task 7: Ask about metrics the user cares about.** Ask: \"What are the key metrics you track? What KPIs matter most to your team? (e.g., revenue, churn rate, conversion, average order value)\" — then build metrics around their answers, not just what you find in the data.\n\n- [ ] **Task 8: Ask about business rules and filters.** Ask: \"Are there any filters that should always be applied? For example: only active records, exclude test data, only completed orders?\"\n\n- [ ] **Task 9: Ask about glossary terms.** Ask: \"What business terms do people in your org use that a new analyst might not understand? (e.g., 'MRR', 'churn', 'qualified lead')\"\n\n- [ ] **Task 10: Curate to Gold.** Now iterate through failing checks:\n 1. Run \\`context tier\\` to see what's failing\n 2. Fix the highest-impact failing check\n 3. If you need user input to fix a check, ASK — don't guess\n 4. Run \\`context tier\\` again\n 5. Repeat until Gold or until you hit something that genuinely requires human input\n\n### Phase 3: Deliver\n\n- [ ] **Task 11: Build the AI Blueprint.** Run \\`context blueprint ${modelName}\\` to export the Gold-tier data product as a portable YAML file. Show the user where it was saved.\n\n- [ ] **Task 12: Serve the metadata site.** Run \\`context dev --studio\\` to start the interactive metadata browser. Tell the user: \"Your metadata catalog is now live — open the link above to browse your semantic layer in the browser.\"\n\n- [ ] **Task 13: Summary.** Give the user a final summary:\n - Current tier score\n - Number of datasets, fields, metrics, glossary terms, golden queries\n - What's complete and what still needs human input\n - Next steps they can take\n\n## Key Principles\n\n### This is a CONVERSATION, not a batch job\n\nThe single most important thing: **ask questions and wait for answers.** The user knows the business. You know the data. Together you build the semantic layer. If you silently curate everything without asking, the metadata will be plausible-looking but wrong.\n\n**Ask one question at a time.** Don't batch 10 questions into one message. Ask, wait, incorporate the answer, then ask the next question.\n\n### Reference Documents\n\nCheck \\`context/reference/\\` for any files the user has provided — data dictionaries, Confluence exports, ERDs, business glossaries, dashboard docs, etc. **Read these first** before querying the database. They contain domain knowledge that will dramatically improve your metadata quality.\n\n### What to Ask the User About\n\nYou know the data. The user knows the business. Ask them about:\n\n- **Ownership** — \"Who owns this data? What team maintains it?\"\n- **Metric intent** — \"Should revenue be summed or averaged? Is this an additive metric?\"\n- **Business rules** — \"Are there any filters that should always be applied? (e.g., only active records)\"\n- **Data lineage** — \"Where does this data come from originally? What upstream system?\"\n- **Use cases** — \"What questions do people ask this data? What dashboards use it?\"\n- **Glossary terms** — \"What does 'churn rate' mean in your organization?\"\n- **Data quality** — \"I see 15% null values in this column — is that expected?\"\n\nDon't batch all questions at once. Ask as you encounter each field or concept that needs clarification.\n\n### CLI Commands to Use\n\n\\`\\`\\`bash\n# Check where you are\ncontext tier # Show Bronze/Silver/Gold scorecard with failing checks\ncontext lint # Run all 40 lint rules\ncontext explain ${modelName} # Full model details — governance, rules, lineage, tier\n\n# Build and fix\ncontext enrich --target silver --apply --source default # Auto-enrich to Silver\ncontext fix --write # Auto-fix lint issues where possible\ncontext verify # Validate metadata against the live database\n\n# Serve to other agents\ncontext serve --stdio # Start MCP server (for Claude, Cursor, etc.)\ncontext dev --studio # Open visual editor in browser\n\\`\\`\\`\n\n### Do NOT Stop Until Gold (Task 10)\n\n1. Run \\`context tier\\` and collect every failing check\n2. For each failing check, query the database to gather evidence, then fix the metadata\n3. **If you need user input to fix a check — ASK.** Do not guess.\n4. Run \\`context tier\\` again\n5. If checks still fail, go back to step 2\n6. **Do NOT stop until every Gold check passes** or you hit something that genuinely requires human input\n7. For checks you cannot fix, ask the user or leave a clear TODO explaining what's needed\n\nYou must iterate — a single pass is never enough. Each \\`context tier\\` run may reveal new failures after earlier ones are fixed.\n\n### After Gold: Deliver (Tasks 11-13)\n\n**Do NOT skip these.** Once you reach Gold (or as close as possible):\n\n1. Run \\`context blueprint ${modelName}\\` — export the AI Blueprint\n2. Run \\`context dev --studio\\` — start the metadata browser for the user\n3. Give the user a summary of what was built and what needs human input\n\n## How to Curate Metadata (the right way)\n\n### Before writing ANY metadata, query the database first\n\nFor every field you're about to describe or classify (**always with LIMIT, always read-only**):\n\n\\`\\`\\`sql\n-- What type of values does this column contain?\nSELECT DISTINCT column_name FROM table LIMIT 20;\n\n-- For numeric columns: is this a metric or dimension?\nSELECT MIN(col), MAX(col), AVG(col), COUNT(DISTINCT col) FROM table LIMIT 1;\n\n-- For potential metrics: does SUM make sense?\n-- If SUM produces a meaningful business number → additive: true\n-- If SUM is meaningless (e.g., summing percentages, scores, ratings) → additive: false\n\n-- REMEMBER: Never run queries without LIMIT. Never modify data.\n\\`\\`\\`\n\n### Semantic Role Decision Tree\n\nQuery the column first, then apply this logic:\n\n1. **Is it a primary key or foreign key?** → \\`identifier\\`\n2. **Is it a date or timestamp?** → \\`date\\`\n3. **Is it numeric AND does aggregation make business sense?**\n - Does SUM make sense? (counts, amounts, quantities) → \\`metric\\`, \\`additive: true\\`\n - Does only AVG/MIN/MAX make sense? (rates, percentages, scores, ratings) → \\`metric\\`, \\`additive: false\\`\n4. **Everything else** → \\`dimension\\`\n\nCommon mistakes to avoid:\n- \\`stars\\` (ratings) → metric with AVG, NOT additive (summing star ratings is meaningless)\n- \\`_per_10k_people\\` (rates) → metric with AVG, NOT additive\n- \\`_score\\` (composite scores) → metric with AVG, NOT additive\n- \\`useful/funny/cool\\` (vote counts) → metric with SUM, additive\n- \\`_count\\` fields → metric with SUM, additive (usually)\n\n### Field Descriptions\n\nWrite descriptions that help someone who has never seen this database understand what the column contains. Include:\n- What the value represents\n- Units or scale (if applicable)\n- Where the data comes from (if known)\n- Any known quirks or caveats\n\nBad: \\`description: total_population\\`\nGood: \\`description: Total resident population of the census tract from American Community Survey 5-year estimates\\`\n\nBad: \\`description: stars\\`\nGood: \\`description: Average Yelp star rating (1.0-5.0 scale) based on all reviews for this business\\`\n\n### Lineage\n\nUpstream sources are the EXTERNAL systems that feed data into this warehouse. They are NOT the tables in the warehouse itself.\n\nAsk yourself: \"Where did this data originally come from before it was loaded here?\"\n\nBad lineage:\n\\`\\`\\`yaml\nupstream:\n - source: yelp_business # This is a table IN the warehouse, not an upstream source\n type: pipeline\n\\`\\`\\`\n\nGood lineage:\n\\`\\`\\`yaml\nupstream:\n - source: yelp-academic-dataset\n type: file\n notes: Yelp Open Dataset (academic use), loaded via CSV import\n\\`\\`\\`\n\n### Owner Files\n\nDo NOT create fake owner identities. If the real owner is unknown:\n- Keep the existing owner file as-is\n- Note in the file that contact info needs to be filled in by a real person\n- NEVER invent email addresses like \\`analytics@example.com\\`\n\n### Business Context\n\nWrite business_context entries that describe real analytical use cases you can verify from the data. Query the data to understand what questions it can answer before writing narratives.\n\n### Golden Queries\n\nEvery golden query MUST be tested against the actual database before you write it. Run the SQL, verify it returns sensible results, then document it.\n\n### Data Quality\n\nWhen you discover data quality issues (null values, broken joins, missing data), FLAG THEM — don't hide them. Add notes in governance or report them to the user.\n\n## This Project\n\n### Datasets\n\n${datasetList || '(none detected)'}\n\n${failingSection}\n\n## Serving to Other Agents via MCP\n\nOnce the semantic layer reaches Silver or Gold, serve it so other AI agents can use the curated metadata:\n\n\\`\\`\\`bash\n# Start MCP server (agents connect via stdio)\ncontext serve --stdio\n\n# Or via HTTP for remote/multi-agent setups\ncontext serve --http --port 3000\n\\`\\`\\`\n\nTo add ContextKit as an MCP server in another agent's config:\n\n\\`\\`\\`json\n{\n \"mcpServers\": {\n \"contextkit\": {\n \"command\": \"npx\",\n \"args\": [\"@runcontext/cli\", \"serve\", \"--stdio\"]\n }\n }\n}\n\\`\\`\\`\n\n### Exporting AI Blueprints\n\nExport the Gold-tier outcome as a portable YAML file:\n\n\\`\\`\\`bash\ncontext blueprint ${modelName}\n# → blueprints/${modelName}.data-product.osi.yaml\n\\`\\`\\`\n\nThis AI Blueprint contains the complete semantic specification — share it, serve it via MCP, or import it into any OSI-compliant tool.\n\n## MCP Tools (if using ContextKit as an MCP server)\n\n| Tool | Parameters | What it does |\n|------|-----------|-------------|\n| \\`context_search\\` | \\`query\\` | Find models, datasets, fields, terms by keyword |\n| \\`context_explain\\` | \\`model\\` | Full model details — governance, rules, lineage, tier |\n| \\`context_validate\\` | — | Run linter, get errors and warnings |\n| \\`context_tier\\` | \\`model\\` | Tier scorecard with all check results |\n| \\`context_golden_query\\` | \\`question\\` | Find pre-validated SQL for a question |\n| \\`context_guardrails\\` | \\`tables[]\\` | Get required WHERE clauses for tables |\n\n## Tier Checks Quick Reference\n\n**Bronze (7):** descriptions, owner, security, grain, table_type\n**Silver (+6):** trust, 2+ tags, glossary linked, lineage, refresh, 2+ sample_values\n**Gold (+24):** semantic_role on ALL fields, metric aggregation/additive, 1+ guardrail, 3+ golden queries, 1+ business rule, 1+ hierarchy, 1+ default_filter, trust=endorsed, contactable owner, 1+ relationship, description ≥50 chars, ai_context (no TODO), 1+ business_context, version, field descriptions not lazy, glossary definitions substantive, lineage references real sources, grain statements specific, ai_context filled in, 3+ relationships (models with 3+ datasets), 1+ computed metric, 3+ glossary terms (models with 5+ datasets)\n\n## How to Reach Gold: Curation Recipes\n\n### Metrics (gold/metrics-defined)\n\nInspect computed views in the database. Any calculated column is a candidate metric.\n\n\\`\\`\\`sql\n-- Find computed columns in views (information_schema queries are free/cheap)\nSELECT column_name, data_type\nFROM information_schema.columns\nWHERE table_name LIKE 'vw_%' AND data_type IN ('DOUBLE', 'FLOAT', 'INTEGER', 'BIGINT', 'DECIMAL')\nLIMIT 100;\n\\`\\`\\`\n\nFor each computed column (e.g., \\`opportunity_score\\`, \\`shops_per_10k\\`, \\`demand_signal_pct\\`):\n1. Query it to understand what it measures\n2. Add it to the model's \\`metrics[]\\` array in the OSI YAML\n3. Include the SQL expression, aggregation type (SUM/AVG), and a human description\n4. Mark whether it's additive (can be summed across dimensions)\n\nExample:\n\\`\\`\\`yaml\nmetrics:\n - name: opportunity_score\n expression:\n dialects:\n - dialect: DuckDB\n expression: \"(population/10000)*2 + (income/50000)*2 + (10-shops_per_10k)*3 + transit*1.5 + demand*0.5\"\n description: Composite score ranking census tracts for coffee shop viability\n aggregation: AVG\n additive: false\n\\`\\`\\`\n\n### Glossary Terms (gold/glossary-coverage)\n\nFor each key business concept your model measures, create a glossary term file.\n\nThink about the terms a new analyst would need defined:\n- What is \"supply saturation\"? (> 5.0 shops per 10k people)\n- What is a \"demand signal\"? (review mentioning wait/line/crowded/busy)\n- What is \"opportunity score\"? (composite ranking formula)\n\nFor each term, create \\`context/glossary/<term-name>.term.yaml\\`:\n\\`\\`\\`yaml\nterm: supply-saturation\ndefinition: >\n A measure of coffee shop density per census tract. Calculated as\n shops per 10,000 residents. Tracts with > 5.0 are considered saturated.\nowner: analytics-team\ntags: [coffee-analytics]\n\\`\\`\\`\n\nModels with 5+ datasets need at least 3 glossary terms linked by shared tags or owner.\n\n### Relationships (gold/relationships-coverage)\n\nFor each join in the SQL views, define a relationship in the OSI model.\n\n\\`\\`\\`sql\n-- Find joins by examining view definitions (metadata query, low cost)\n-- Look for patterns: ON table_a.col = table_b.col\n-- Or spatial joins: ABS(a.lat - b.lat) < threshold\n-- NEVER run the actual joins yourself to \"test\" them — just document the relationship\n\\`\\`\\`\n\nFor each join:\n\\`\\`\\`yaml\nrelationships:\n - name: business-to-tract\n left_dataset: yelp_business\n right_dataset: census_tract\n join_type: spatial\n cardinality: many-to-one\n description: Businesses assigned to nearest census tract within 0.02 degrees (~1 mile)\n\\`\\`\\`\n\nModels with 3+ datasets need at least 3 relationships.\n\n### Golden Queries\n\nWrite 3-5 SQL queries answering common business questions. **Test each query with LIMIT first!**\n\n\\`\\`\\`sql\n-- Validate with LIMIT (never run unbounded queries to \"test\"):\nSELECT geoid, tract_name, opportunity_score\nFROM vw_candidate_zones ORDER BY opportunity_score DESC LIMIT 10;\n\n-- The golden query YAML can document the full query, but when you TEST it, always use LIMIT\n\\`\\`\\`\n\n## YAML Formats\n\n**Governance** (\\`context/governance/*.governance.yaml\\`):\n\\`\\`\\`yaml\nmodel: my-model\nowner: team-name\nversion: \"1.0.0\"\ntrust: endorsed\nsecurity: internal\ntags: [domain-tag-1, domain-tag-2]\nbusiness_context:\n - name: Use Case Name\n description: What analytical question this data answers and for whom.\ndatasets:\n my_table:\n grain: \"One row per [entity] identified by [key]\"\n table_type: fact # fact | dimension | event | view\n refresh: daily\nfields:\n dataset.field:\n semantic_role: metric # metric | dimension | identifier | date\n default_aggregation: SUM # SUM | AVG | COUNT | COUNT_DISTINCT | MIN | MAX\n additive: true # can this metric be summed across dimensions?\n default_filter: \"is_open = 1\"\n sample_values: [\"val1\", \"val2\"]\n\\`\\`\\`\n\n**Rules** (\\`context/rules/*.rules.yaml\\`):\n\\`\\`\\`yaml\nmodel: my-model\ngolden_queries:\n - question: What are the top items by count?\n sql: SELECT name, count FROM my_table ORDER BY count DESC LIMIT 10\n intent: Identify top performers by volume\n caveats: Filters to active records only\nbusiness_rules:\n - name: valid-ratings\n definition: All ratings must be between 1 and 5\nguardrail_filters:\n - name: active-only\n filter: \"status = 'active'\"\n reason: Exclude inactive records from analytics\n tables: [my_table]\nhierarchies:\n - name: geography\n levels: [state, city, postal_code]\n dataset: my_table\n\\`\\`\\`\n\n## File Structure\n\n\\`\\`\\`\ncontext/\n models/*.osi.yaml # OSI semantic model (schema, relationships, metrics)\n governance/*.governance.yaml # Ownership, trust, security, semantic roles\n rules/*.rules.yaml # Golden queries, business rules, guardrails\n lineage/*.lineage.yaml # Upstream sources\n glossary/*.term.yaml # Business term definitions\n owners/*.owner.yaml # Team ownership records\n reference/ # User-provided docs (data dictionaries, wiki exports, etc.)\n AGENT_INSTRUCTIONS.md # This file\n\\`\\`\\`\n`;\n}\n\nexport async function runAgentInstructionsStep(ctx: SetupContext): Promise<StepResult> {\n const instructionsPath = path.join(ctx.contextDir, 'AGENT_INSTRUCTIONS.md');\n\n if (existsSync(instructionsPath)) {\n const shouldOverwrite = await p.confirm({\n message: 'context/AGENT_INSTRUCTIONS.md already exists. Overwrite with updated instructions?',\n });\n if (p.isCancel(shouldOverwrite) || !shouldOverwrite) {\n return { skipped: true, summary: 'context/AGENT_INSTRUCTIONS.md already exists, kept existing' };\n }\n }\n\n const content = buildAgentInstructions(ctx);\n writeFileSync(instructionsPath, content, 'utf-8');\n\n p.log.success('Generated context/AGENT_INSTRUCTIONS.md — the agent curation guide');\n\n return { skipped: false, summary: 'Generated context/AGENT_INSTRUCTIONS.md' };\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport path from 'node:path';\nimport fs from 'node:fs';\nimport { compile, loadConfig, emitManifest } from '@runcontext/core';\nimport type { Manifest, AIContext } from '@runcontext/core';\nimport { formatError, formatSuccess } from '../formatters/pretty.js';\n\nexport const blueprintCommand = new Command('blueprint')\n .description('Export AI Blueprints — portable, Gold-tier data product specs (OSI v1.0 YAML)')\n .argument('[model]', 'Model name to export (omit for all models)')\n .option('--context-dir <path>', 'Path to context directory')\n .option('--out <path>', 'Output directory for blueprint files', './blueprints')\n .option('--stdout', 'Print to stdout instead of writing files')\n .action(async (modelArg, opts) => {\n try {\n const config = loadConfig(process.cwd());\n const contextDir = opts.contextDir\n ? path.resolve(opts.contextDir)\n : path.resolve(config.context_dir);\n\n const { graph, diagnostics } = await compile({ contextDir, config, rootDir: process.cwd() });\n\n const errors = diagnostics.filter((d) => d.severity === 'error');\n if (errors.length > 0) {\n console.error(chalk.red(`Build failed with ${errors.length} error(s). Run \"context build\" to see details.`));\n process.exit(1);\n }\n\n const manifest = emitManifest(graph, config);\n const modelNames = modelArg\n ? [modelArg]\n : Object.keys(manifest.models);\n\n if (modelNames.length === 0) {\n console.error(chalk.yellow('No models found. Run \"context introspect\" first.'));\n process.exit(1);\n }\n\n // Validate requested model exists\n if (modelArg && !manifest.models[modelArg]) {\n const available = Object.keys(manifest.models).join(', ');\n console.error(formatError(`Model \"${modelArg}\" not found. Available: ${available}`));\n process.exit(1);\n }\n\n if (!opts.stdout) {\n const outDir = path.resolve(opts.out);\n fs.mkdirSync(outDir, { recursive: true });\n }\n\n for (const name of modelNames) {\n const yaml = emitBlueprint(name, manifest);\n\n if (opts.stdout) {\n if (modelNames.length > 1) {\n console.log(chalk.gray(`# ── ${name} ${'─'.repeat(60 - name.length)}`));\n }\n console.log(yaml);\n } else {\n const outDir = path.resolve(opts.out);\n const filePath = path.join(outDir, `${name}.data-product.osi.yaml`);\n fs.writeFileSync(filePath, yaml, 'utf-8');\n console.log(formatSuccess(`${filePath}`));\n }\n }\n\n if (!opts.stdout) {\n const outDir = path.resolve(opts.out);\n console.log(\n chalk.blue(`\\n${modelNames.length} AI Blueprint(s) written to ${outDir}/`),\n );\n console.log(chalk.gray('These portable YAML files contain the full semantic spec for each data product.'));\n console.log(chalk.gray('Share them, serve them via MCP, or import them into any OSI-compliant tool.'));\n }\n } catch (err) {\n console.error(formatError((err as Error).message));\n process.exit(1);\n }\n });\n\n/**\n * Emit a single model as a full OSI-compliant data product YAML.\n */\nexport function emitBlueprint(name: string, manifest: Manifest): string {\n const model = manifest.models[name];\n const governance = manifest.governance[name];\n const rules = manifest.rules[name];\n const tier = manifest.tiers[name];\n\n const lines: string[] = [];\n\n // Header\n lines.push(`# ${name}.data-product.osi.yaml`);\n lines.push(`# AI Blueprint — Open Semantic Interchange (OSI) v1.0`);\n lines.push(`# The complete semantic spec for this data product, ready for any AI agent`);\n lines.push(`# Generated by ContextKit (context blueprint)`);\n lines.push(``);\n lines.push(`osi_version: \"1.0\"`);\n lines.push(``);\n lines.push(`semantic_model:`);\n lines.push(` name: ${name}`);\n\n if (model?.description) {\n lines.push(` description: >`);\n wrapText(lines, model.description, 4);\n }\n\n // Governance header\n if (governance) {\n if (governance.owner) lines.push(` owner: ${governance.owner}`);\n if (governance.trust) lines.push(` trust_status: ${governance.trust}`);\n }\n if (tier) {\n lines.push(` tier: ${tier.tier ?? 'bronze'}`);\n }\n if (governance?.tags && governance.tags.length > 0) {\n lines.push(` tags:`);\n for (const tag of governance.tags) {\n lines.push(` - ${tag}`);\n }\n }\n\n // Glossary (terms that reference this model)\n const relatedTerms = Object.entries(manifest.terms).filter(([, term]) => {\n const maps = term.maps_to ?? [];\n return maps.some((m) => m.startsWith(`${name}.`));\n });\n if (relatedTerms.length > 0) {\n lines.push(``);\n lines.push(` # ── Glossary ────────────────────────────────────────────────`);\n lines.push(` glossary:`);\n for (const [, term] of relatedTerms) {\n lines.push(` - term: ${term.id}`);\n if (term.definition) {\n lines.push(` definition: >`);\n wrapText(lines, term.definition, 8);\n }\n if (term.synonyms && term.synonyms.length > 0) {\n lines.push(` synonyms:`);\n for (const s of term.synonyms) {\n lines.push(` - ${s}`);\n }\n }\n if (term.maps_to && term.maps_to.length > 0) {\n lines.push(` related_fields:`);\n for (const m of term.maps_to) {\n lines.push(` - ${m}`);\n }\n }\n }\n }\n\n // Datasets\n if (model?.datasets && model.datasets.length > 0) {\n lines.push(``);\n lines.push(` # ── Datasets ────────────────────────────────────────────────`);\n lines.push(` datasets:`);\n for (const ds of model.datasets) {\n lines.push(` - name: ${ds.name}`);\n if (ds.description) {\n lines.push(` description: ${yamlStr(ds.description)}`);\n }\n if (ds.source) lines.push(` source: ${ds.source}`);\n if (ds.primary_key && ds.primary_key.length > 0) {\n lines.push(` primary_key: [${ds.primary_key.join(', ')}]`);\n }\n\n // Dataset-level governance\n const dsGov = governance?.datasets?.[ds.name];\n if (dsGov) {\n if (dsGov.grain) lines.push(` grain: ${dsGov.grain}`);\n if (dsGov.table_type) lines.push(` table_type: ${dsGov.table_type}`);\n }\n\n if (ds.ai_context) {\n emitAiContext(lines, ds.ai_context, 6);\n }\n\n // Fields\n if (ds.fields && ds.fields.length > 0) {\n lines.push(` fields:`);\n for (const f of ds.fields) {\n lines.push(` - name: ${f.name}`);\n if (f.expression) {\n const expr = typeof f.expression === 'string' ? f.expression : JSON.stringify(f.expression);\n lines.push(` expression: ${expr}`);\n }\n if (f.description) {\n lines.push(` description: ${yamlStr(f.description)}`);\n }\n if (f.dimension) lines.push(` dimension: true`);\n if (f.label) lines.push(` label: true`);\n\n // Field-level governance\n const fGov = governance?.fields?.[`${ds.name}.${f.name}`] ?? governance?.fields?.[f.name];\n if (fGov) {\n if (fGov.semantic_role) lines.push(` semantic_role: ${fGov.semantic_role}`);\n if (fGov.default_aggregation) lines.push(` aggregation: ${fGov.default_aggregation}`);\n if (fGov.sample_values && fGov.sample_values.length > 0) {\n lines.push(` sample_values:`);\n for (const sv of fGov.sample_values) {\n lines.push(` - ${sv}`);\n }\n }\n if (fGov.default_filter) lines.push(` default_filter: ${yamlStr(fGov.default_filter)}`);\n }\n\n if (f.ai_context) {\n emitAiContext(lines, f.ai_context, 10);\n }\n }\n }\n }\n }\n\n // Relationships\n if (model?.relationships && model.relationships.length > 0) {\n lines.push(``);\n lines.push(` # ── Relationships ───────────────────────────────────────────`);\n lines.push(` relationships:`);\n for (const rel of model.relationships) {\n lines.push(` - name: ${rel.name}`);\n lines.push(` from:`);\n lines.push(` dataset: ${rel.from}`);\n lines.push(` columns: [${rel.from_columns.join(', ')}]`);\n lines.push(` to:`);\n lines.push(` dataset: ${rel.to}`);\n lines.push(` columns: [${rel.to_columns.join(', ')}]`);\n if (rel.cardinality) lines.push(` cardinality: ${rel.cardinality}`);\n }\n }\n\n // Metrics\n if (model?.metrics && model.metrics.length > 0) {\n lines.push(``);\n lines.push(` # ── Metrics ─────────────────────────────────────────────────`);\n lines.push(` metrics:`);\n for (const met of model.metrics) {\n lines.push(` - name: ${met.name}`);\n if (met.expression) {\n const expr = typeof met.expression === 'string' ? met.expression : JSON.stringify(met.expression);\n lines.push(` expression: ${expr}`);\n }\n if (met.description) {\n lines.push(` description: ${yamlStr(met.description)}`);\n }\n if (met.ai_context) {\n emitAiContext(lines, met.ai_context, 6);\n }\n }\n }\n\n // Business rules\n if (rules?.business_rules && rules.business_rules.length > 0) {\n lines.push(``);\n lines.push(` # ── Business Rules ──────────────────────────────────────────`);\n lines.push(` business_rules:`);\n for (const br of rules.business_rules) {\n lines.push(` - name: ${br.name}`);\n if (br.definition) lines.push(` definition: ${yamlStr(br.definition)}`);\n if (br.enforcement && br.enforcement.length > 0) {\n lines.push(` enforcement:`);\n for (const e of br.enforcement) {\n lines.push(` - ${yamlStr(e)}`);\n }\n }\n if (br.avoid && br.avoid.length > 0) {\n lines.push(` avoid:`);\n for (const a of br.avoid) {\n lines.push(` - ${yamlStr(a)}`);\n }\n }\n if (br.applied_always) lines.push(` applied_always: true`);\n }\n }\n\n // Guardrail filters\n if (rules?.guardrail_filters && rules.guardrail_filters.length > 0) {\n lines.push(``);\n lines.push(` # ── Guardrails ──────────────────────────────────────────────`);\n lines.push(` guardrail_filters:`);\n for (const gf of rules.guardrail_filters) {\n lines.push(` - name: ${gf.name}`);\n if (gf.reason) lines.push(` reason: ${yamlStr(gf.reason)}`);\n if (gf.filter) lines.push(` filter: ${yamlStr(gf.filter)}`);\n if (gf.tables && gf.tables.length > 0) {\n lines.push(` tables: [${gf.tables.join(', ')}]`);\n }\n }\n }\n\n // Golden queries\n if (rules?.golden_queries && rules.golden_queries.length > 0) {\n lines.push(``);\n lines.push(` # ── Golden Queries ──────────────────────────────────────────`);\n lines.push(` golden_queries:`);\n for (const gq of rules.golden_queries) {\n lines.push(` - question: ${yamlStr(gq.question)}`);\n if (gq.intent) lines.push(` intent: ${yamlStr(gq.intent)}`);\n if (gq.sql) {\n lines.push(` sql: |`);\n for (const sqlLine of gq.sql.split('\\n')) {\n lines.push(` ${sqlLine}`);\n }\n }\n if (gq.dialect) lines.push(` dialect: ${gq.dialect}`);\n if (gq.caveats) lines.push(` caveats: ${yamlStr(gq.caveats)}`);\n }\n }\n\n lines.push(``);\n return lines.join('\\n');\n}\n\n/** Emit ai_context as YAML (string or AIContext object format). */\nfunction emitAiContext(lines: string[], ctx: string | AIContext, indent: number): void {\n const pad = ' '.repeat(indent);\n if (typeof ctx === 'string') {\n lines.push(`${pad}ai_context: ${yamlStr(ctx)}`);\n } else {\n lines.push(`${pad}ai_context:`);\n if (ctx.instructions) {\n lines.push(`${pad} instructions: >`);\n wrapText(lines, ctx.instructions, indent + 4);\n }\n if (ctx.synonyms && ctx.synonyms.length > 0) {\n lines.push(`${pad} synonyms:`);\n for (const s of ctx.synonyms) {\n lines.push(`${pad} - ${s}`);\n }\n }\n if (ctx.examples && ctx.examples.length > 0) {\n lines.push(`${pad} examples:`);\n for (const e of ctx.examples) {\n lines.push(`${pad} - ${yamlStr(e)}`);\n }\n }\n }\n}\n\n/** Quote a string for safe YAML output. */\nfunction yamlStr(s: string): string {\n if (s.includes('\\n') || s.includes(': ') || s.includes('#') || s.includes('\"') || s.includes(\"'\")) {\n return JSON.stringify(s);\n }\n return s;\n}\n\n/** Wrap long text into indented lines. */\nfunction wrapText(lines: string[], text: string, indent: number): void {\n const pad = ' '.repeat(indent);\n const words = text.replace(/\\n/g, ' ').split(/\\s+/);\n let line = '';\n for (const word of words) {\n if (line.length + word.length + 1 > 76) {\n lines.push(`${pad}${line.trim()}`);\n line = '';\n }\n line += word + ' ';\n }\n if (line.trim()) {\n lines.push(`${pad}${line.trim()}`);\n }\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport path from 'node:path';\nimport fs from 'node:fs';\nimport * as yaml from 'yaml';\nimport { loadConfig } from '@runcontext/core';\nimport { formatSuccess, formatError } from '../formatters/pretty.js';\n\nconst STARTER_OSI = (name: string, dataSource?: string) => {\n const doc: Record<string, unknown> = {\n version: '1.0',\n semantic_model: [\n {\n name,\n description: `Data product: ${name}`,\n ...(dataSource ? { data_source: dataSource } : {}),\n datasets: [],\n },\n ],\n };\n return yaml.stringify(doc, { lineWidth: 120 });\n};\n\nconst STARTER_GOVERNANCE = (name: string) => {\n const doc = {\n model: name,\n owner: 'default-team',\n security: 'internal',\n datasets: {},\n };\n return yaml.stringify(doc, { lineWidth: 120 });\n};\n\nconst STARTER_RULES = (name: string) => {\n const doc = {\n model: name,\n business_rules: [],\n guardrail_filters: [],\n golden_queries: [],\n };\n return yaml.stringify(doc, { lineWidth: 120 });\n};\n\nconst STARTER_OWNER = () => {\n const doc = {\n id: 'default-team',\n display_name: 'Default Team',\n };\n return yaml.stringify(doc, { lineWidth: 120 });\n};\n\nexport const newCommand = new Command('new')\n .description('Scaffold a new data product inside your context directory')\n .argument('<name>', 'Name for the data product (e.g. sales-analytics)')\n .option('--source <name>', 'Bind to a named data source from contextkit.config.yaml')\n .option('--context-dir <path>', 'Path to context directory')\n .action(async (name: string, opts) => {\n try {\n const config = loadConfig(process.cwd());\n const contextDir = opts.contextDir\n ? path.resolve(opts.contextDir)\n : path.resolve(config.context_dir);\n\n // Validate data source exists if specified\n if (opts.source && config.data_sources) {\n const sources = config.data_sources as Record<string, unknown>;\n if (!sources[opts.source]) {\n const available = Object.keys(sources).join(', ');\n console.error(formatError(\n `Data source \"${opts.source}\" not found in contextkit.config.yaml. Available: ${available || '(none)'}`,\n ));\n process.exit(1);\n }\n }\n\n // Create data product directories\n const dirs = [\n path.join(contextDir, 'models'),\n path.join(contextDir, 'governance'),\n path.join(contextDir, 'owners'),\n path.join(contextDir, 'reference'),\n ];\n\n for (const dir of dirs) {\n if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });\n }\n\n // Write starter files (skip if they already exist)\n const files = [\n {\n rel: path.join('models', `${name}.osi.yaml`),\n content: STARTER_OSI(name, opts.source),\n },\n {\n rel: path.join('governance', `${name}.governance.yaml`),\n content: STARTER_GOVERNANCE(name),\n },\n {\n rel: path.join('governance', `${name}.rules.yaml`),\n content: STARTER_RULES(name),\n },\n {\n rel: path.join('owners', 'default-team.owner.yaml'),\n content: STARTER_OWNER(),\n },\n ];\n\n const created: string[] = [];\n const skipped: string[] = [];\n\n for (const f of files) {\n const fullPath = path.join(contextDir, f.rel);\n if (fs.existsSync(fullPath)) {\n skipped.push(f.rel);\n } else {\n fs.writeFileSync(fullPath, f.content, 'utf-8');\n created.push(f.rel);\n }\n }\n\n // Summary\n console.log('');\n if (created.length > 0) {\n console.log(formatSuccess(`Data product \"${name}\" scaffolded`));\n console.log('');\n for (const f of created) {\n console.log(chalk.green(` + ${f}`));\n }\n }\n if (skipped.length > 0) {\n for (const f of skipped) {\n console.log(chalk.gray(` ~ ${f} (exists)`));\n }\n }\n\n console.log('');\n console.log(chalk.gray('Next steps:'));\n console.log(chalk.gray(` 1. Run ${chalk.cyan(`context introspect --db <url>`)} to populate from a database`));\n console.log(chalk.gray(` 2. Run ${chalk.cyan(`context enrich --target silver --apply`)} to auto-fill descriptions`));\n console.log(chalk.gray(` 3. Run ${chalk.cyan(`context tier`)} to check progress toward Gold`));\n console.log(chalk.gray(` 4. Run ${chalk.cyan(`context blueprint ${name}`)} to export the AI Blueprint`));\n } catch (err) {\n console.error(formatError((err as Error).message));\n process.exit(1);\n }\n });\n"],"mappings":"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AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qEAwHsD,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBA0C5D,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,6BA4BE,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA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","names":["Command","chalk","output","hasErrors","chalk","warnCount","Command","chalk","path","compile","Command","path","compile","chalk","Command","chalk","path","compile","loadConfig","Command","loadConfig","path","compile","chalk","Command","chalk","path","compile","loadConfig","Command","loadConfig","path","compile","chalk","Command","chalk","path","fs","compile","loadConfig","LintEngine","ALL_RULES","applyFixes","createAdapter","Command","chalk","path","writeFileSync","readFileSync","loadConfig","Command","chalk","path","compile","loadConfig","LintEngine","ALL_RULES","createAdapter","Command","loadConfig","path","compile","chalk","createAdapter","LintEngine","ALL_RULES","Command","loadConfig","path","compile","createAdapter","LintEngine","ALL_RULES","chalk","fs","applyFixes","Command","chalk","path","readFileSync","writeFileSync","compile","loadConfig","LintEngine","ALL_RULES","filterByDirectives","applyFixes","loadConfig","compile","LintEngine","ALL_RULES","filterByDirectives","applyFixes","readFileSync","writeFileSync","chalk","Command","path","Command","chalk","path","fs","Command","path","fs","chalk","Command","chalk","path","compile","loadConfig","emitManifest","Command","loadConfig","path","compile","emitManifest","chalk","Command","chalk","Command","chalk","Command","chalk","path","Command","path","chalk","Command","chalk","path","readFileSync","writeFileSync","mkdirSync","existsSync","compile","loadConfig","computeTier","createAdapter","existsSync","path","Command","loadConfig","chalk","compile","computeTier","readFileSync","createAdapter","writeFileSync","mkdirSync","Command","chalk","ALL_RULES","chalk","Command","ALL_RULES","Command","p","chalk","p","path","existsSync","readFileSync","writeFileSync","yaml","loadConfig","createAdapter","MissingDriverError","fs","path","p","loadConfig","existsSync","path","readFileSync","password","createAdapter","MissingDriverError","writeFileSync","p","path","mkdirSync","writeFileSync","existsSync","scaffoldFromSchema","compile","computeTier","loadConfig","p","scaffoldFromSchema","path","existsSync","mkdirSync","writeFileSync","loadConfig","compile","computeTier","p","path","readFileSync","writeFileSync","mkdirSync","existsSync","readdirSync","yaml","compile","computeTier","suggestEnrichments","loadConfig","findFileRecursive","existsSync","readdirSync","path","loadConfig","compile","computeTier","suggestEnrichments","readFileSync","writeFileSync","mkdirSync","p","path","readFileSync","writeFileSync","mkdirSync","existsSync","readdirSync","yaml","compile","computeTier","suggestEnrichments","inferSemanticRole","inferAggregation","loadConfig","findFileRecursive","existsSync","readdirSync","path","loadConfig","compile","computeTier","suggestEnrichments","readFileSync","inferSemanticRole","inferAggregation","writeFileSync","mkdirSync","p","compile","LintEngine","ALL_RULES","computeTier","loadConfig","loadConfig","compile","LintEngine","ALL_RULES","computeTier","p","fs","compile","LintEngine","ALL_RULES","applyFixes","computeTier","loadConfig","loadConfig","compile","LintEngine","ALL_RULES","computeTier","fs","applyFixes","p","path","existsSync","writeFileSync","Command","chalk","Command","chalk","path","fs","compile","loadConfig","emitManifest","Command","loadConfig","path","compile","chalk","emitManifest","fs","yaml","text","Command","chalk","path","fs","yaml","loadConfig","Command","loadConfig","path","fs","chalk","Command"]}