import { join, relative } from "node:path"; import { summarizeDiagnostics } from "@arconym/core"; import type { CommandExecutionOptions } from "../cli/run-cli.js"; import { createRuntimeFromOptions, emitJson } from "./shared.js"; import { CliError } from "../cli/errors.js"; import { printDiagnostics } from "../utils/diagnostics.js"; import { printArtifactSummary } from "../utils/artifacts.js"; import { colors } from "../utils/colors.js"; import { writeGeneratedArtifacts } from "../utils/codegen.js"; export async function runGenCommand(options: CommandExecutionOptions): Promise { const runtime = await createRuntimeFromOptions(options); const artifacts = await runtime.build(); if (options.json) { emitJson({ command: "gen", artifacts, cacheDir: runtime.cacheDir }); return; } console.log(colors.cyan("▶ arconym gen")); printArtifactSummary(artifacts); printDiagnostics(artifacts.diagnostics); const summary = summarizeDiagnostics(artifacts.diagnostics); if (summary.hasErrors) { throw new CliError("Generation failed due to diagnostics."); } const outputDir = join(runtime.cacheDir, "codegen"); const writtenFiles = await writeGeneratedArtifacts({ artifacts, outputDir }); if (writtenFiles.length === 0) { console.log(colors.yellow("⚠ No artifacts were generated.")); } else { console.log(colors.dim("Generated artifacts:")); for (const file of writtenFiles) { const relativePath = relative(runtime.cwd, file.filePath); console.log(` ${file.stage}/${file.plugin} → ${relativePath}`); } } console.log(colors.green("✔ Code generation completed.")); }