@runcontext/cli 0.2.1 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/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/commands/build.ts","../src/commands/tier.ts","../src/commands/explain.ts","../src/commands/fix.ts","../src/commands/dev.ts","../src/commands/init.ts","../src/commands/site.ts","../src/commands/serve.ts","../src/commands/validate-osi.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';\n\nconst program = new Command();\n\nprogram\n .name('context')\n .description('ContextKit — AI-ready metadata governance over OSI')\n .version('0.2.0');\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);\n\nprogram.parse();\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 type Diagnostic,\n type Severity,\n type MetadataTier,\n} from '@runcontext/core';\nimport { formatDiagnostics } from '../formatters/pretty.js';\nimport { formatJson } from '../formatters/json.js';\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: 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 // Run lint engine\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\n // Merge compile diagnostics with lint diagnostics\n const allDiags: Diagnostic[] = [...compileDiags, ...lintDiags];\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 // Output results\n if (opts.format === 'json') {\n console.log(formatJson(allDiags));\n } else {\n console.log(formatDiagnostics(allDiags));\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 { 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 });\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 });\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 });\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 type Severity,\n} from '@runcontext/core';\nimport { formatSuccess, formatError } from '../formatters/pretty.js';\nimport { formatJson } from '../formatters/json.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 .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 });\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 {\n compile,\n loadConfig,\n LintEngine,\n ALL_RULES,\n type Severity,\n} from '@runcontext/core';\nimport { formatDiagnostics } from '../formatters/pretty.js';\n\nasync function runLint(contextDir: string): Promise<void> {\n const config = loadConfig(process.cwd());\n\n const { graph, diagnostics: compileDiags } = await compile({\n contextDir,\n config,\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 const allDiags = [...compileDiags, ...lintDiags];\n\n console.clear();\n console.log(chalk.gray(`[${new Date().toLocaleTimeString()}] Linting...`));\n console.log(formatDiagnostics(allDiags));\n console.log('');\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 .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 console.log(chalk.blue(`Watching ${contextDir} for changes...`));\n console.log(chalk.gray('Press Ctrl+C to stop.\\n'));\n\n // Initial lint run\n await runLint(contextDir);\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);\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 });\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 transport)')\n .option('--context-dir <path>', 'Path to context directory')\n .action(async (opts) => {\n try {\n // Dynamic import — @runcontext/mcp is an optional peer\n let startServer: ((options?: { contextDir?: string; rootDir?: string }) => Promise<unknown>) | undefined;\n try {\n const mcpModule = await import('@runcontext/mcp');\n startServer = mcpModule.startServer;\n } catch {\n // @runcontext/mcp not installed\n }\n\n if (!startServer) {\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 console.log(chalk.blue('Starting MCP server (stdio transport)...'));\n await startServer({\n contextDir: opts.contextDir,\n rootDir: process.cwd(),\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"],"mappings":"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","names":["Command","chalk","chalk","Command","chalk","path","compile","loadConfig","Command","loadConfig","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","Command","loadConfig","path","compile","LintEngine","ALL_RULES","chalk","fs","Command","chalk","path","compile","loadConfig","LintEngine","ALL_RULES","loadConfig","compile","LintEngine","ALL_RULES","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"]}
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"],"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';\n\nconst program = new Command();\n\nprogram\n .name('context')\n .description('ContextKit — AI-ready metadata governance over OSI')\n .version('0.3.1');\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);\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.2.1',\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 } from 'node:fs';\nimport {\n loadConfig,\n createAdapter,\n scaffoldFromSchema,\n} from '@runcontext/core';\nimport type { DataSourceConfig } from '@runcontext/core';\n\nexport function parseDbUrl(db: string): DataSourceConfig {\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.endsWith('.duckdb') || db.endsWith('.db')) {\n return { adapter: 'duckdb', path: db };\n }\n throw new Error(\n `Cannot determine adapter from \"${db}\". Use duckdb:// or postgres:// prefix.`,\n );\n}\n\nexport const introspectCommand = new Command('introspect')\n .description('Introspect a database and scaffold Bronze-level OSI metadata')\n .option(\n '--db <url>',\n 'Database URL (e.g., duckdb://path.duckdb or postgres://...)',\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(\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 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 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 console.error(\n chalk.red(`Introspect failed: ${(err as Error).message}`),\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 .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 // 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 } 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 transport)')\n .option('--context-dir <path>', 'Path to context directory')\n .action(async (opts) => {\n try {\n // Dynamic import — @runcontext/mcp is an optional peer\n let startServer: ((options?: { contextDir?: string; rootDir?: string }) => Promise<unknown>) | undefined;\n try {\n const mcpModule = await import('@runcontext/mcp');\n startServer = mcpModule.startServer;\n } catch {\n // @runcontext/mcp not installed\n }\n\n if (!startServer) {\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 console.log(chalk.blue('Starting MCP server (stdio transport)...'));\n await startServer({\n contextDir: opts.contextDir,\n rootDir: process.cwd(),\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"],"mappings":"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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","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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@runcontext/cli",
3
- "version": "0.2.1",
3
+ "version": "0.3.1",
4
4
  "description": "CLI for ContextKit — lint, build, fix, and serve institutional context",
5
5
  "license": "MIT",
6
6
  "author": "Eric Kittelson",
@@ -10,37 +10,29 @@
10
10
  "url": "https://github.com/erickittelson/ContextKit.git",
11
11
  "directory": "packages/cli"
12
12
  },
13
- "keywords": [
14
- "contextkit",
15
- "cli",
16
- "lint",
17
- "build",
18
- "yaml",
19
- "mcp"
20
- ],
13
+ "keywords": ["contextkit", "cli", "lint", "build", "yaml", "mcp"],
21
14
  "type": "module",
22
15
  "bin": {
23
16
  "context": "./dist/index.js"
24
17
  },
25
- "files": [
26
- "dist"
27
- ],
18
+ "files": ["dist"],
19
+ "scripts": {
20
+ "build": "tsup",
21
+ "clean": "rm -rf dist"
22
+ },
28
23
  "dependencies": {
24
+ "@runcontext/core": "^0.3.1",
25
+ "@runcontext/mcp": "^0.3.1",
26
+ "@runcontext/site": "^0.3.1",
29
27
  "chalk": "^5.4.0",
30
28
  "chokidar": "^4.0.0",
31
29
  "commander": "^14.0.0",
32
- "@runcontext/core": "^0.2.1",
33
- "@runcontext/mcp": "^0.2.1",
34
- "@runcontext/site": "^0.2.1"
30
+ "yaml": "^2.7.0"
35
31
  },
36
32
  "devDependencies": {
37
33
  "@types/node": "^25.3.3",
38
34
  "tsup": "^8.4.0",
39
35
  "typescript": "^5.7.0",
40
36
  "vitest": "^3.2.0"
41
- },
42
- "scripts": {
43
- "build": "tsup",
44
- "clean": "rm -rf dist"
45
37
  }
46
- }
38
+ }
package/LICENSE DELETED
@@ -1,21 +0,0 @@
1
- MIT License
2
-
3
- Copyright (c) 2026 Eric Kittelson
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.