sverka 0.2.12 → 0.2.13

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.d.mts CHANGED
@@ -30,7 +30,7 @@ export declare const ExitCode: {
30
30
  };
31
31
  export type ExitCode = (typeof ExitCode)[keyof typeof ExitCode];
32
32
  /** CLI error codes. */
33
- export type CliErrorCode = "UNKNOWN_COMMAND" | "MISSING_ARG" | "INVALID_FLAG" | "CONFIG_EXISTS" | "RUNTIME_NOT_AVAILABLE" | "SDK_ERROR" | "PACKAGE_ERROR";
33
+ export type CliErrorCode = "UNKNOWN_COMMAND" | "MISSING_ARG" | "INVALID_FLAG" | "CONFIG_EXISTS" | "RUNTIME_NOT_AVAILABLE" | "REPORT_PATH_ESCAPE" | "SDK_ERROR" | "PACKAGE_ERROR";
34
34
  /** Error thrown when CLI argument parsing or command execution fails. */
35
35
  export declare class CliError extends Error {
36
36
  readonly code: CliErrorCode;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../src/types.ts","../src/main.ts","../src/output.ts"],"mappings":";;iBAGiB;;EAEf;;EAEA;;EAEA;;EAEA;;EAEA;;;iBAIe;EACf,MAAM;EACN,UAAU;EACV,MAAM;EACN,UAAU;;EAEV,MAAM;;;qBAIK;;;;;;YAOD,mBAAmB,uBAAuB;;YAG1C;;qBAUC,iBAAiB;WACnB,MAAM;WACN,UAAU;WACD;EAEhB,YAAA,iBACA,MAAM,cACN,UAAU,UACV;;;;;UC/Ba;EACf,SAAS;;;;;;;wBAgZW,KAAK,gBAAgB,OAAO,WAAW;;;;KCtajD,aAAa;;;;;;qBAOZ,+BAA+B;;EAM9B,YAAA,KAAK,WAAW,KAAK,WAAW,iBAAe;EAO3D,MAAM;EAKN,UAAU;EAKV,MAAM;EAIN,UAAU;;EAKV,MAAM;;;;;;wBAwDQ,mBACd,QAAQ,aACR,KAAK,WACL,KAAK,YACJ;;;;;wBAYa,iBACd,QAAQ,aACR,MAAM,eACL"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../src/types.ts","../src/main.ts","../src/output.ts"],"mappings":";;iBAGiB;;EAEf;;EAEA;;EAEA;;EAEA;;EAEA;;;iBAIe;EACf,MAAM;EACN,UAAU;EACV,MAAM;EACN,UAAU;;EAEV,MAAM;;;qBAIK;;;;;;YAOD,mBAAmB,uBAAuB;;YAG1C;;qBAWC,iBAAiB;WACnB,MAAM;WACN,UAAU;WACD;EAEhB,YAAA,iBACA,MAAM,cACN,UAAU,UACV;;;;;UChCa;EACf,SAAS;;;;;;;wBAgZW,KAAK,gBAAgB,OAAO,WAAW;;;;KCtajD,aAAa;;;;;;qBAOZ,+BAA+B;;EAM9B,YAAA,KAAK,WAAW,KAAK,WAAW,iBAAe;EAO3D,MAAM;EAKN,UAAU;EAKV,MAAM;EAIN,UAAU;;EAKV,MAAM;;;;;;wBAwDQ,mBACd,QAAQ,aACR,KAAK,WACL,KAAK,YACJ;;;;;wBAYa,iBACd,QAAQ,aACR,MAAM,eACL"}
package/dist/index.mjs CHANGED
@@ -3,7 +3,7 @@ import * as nodeModule from "node:module";
3
3
  import { register } from "node:module";
4
4
  import process$1 from "node:process";
5
5
  import yargs from "yargs";
6
- import { constants, existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
6
+ import { constants, existsSync, mkdirSync, readFileSync, realpathSync, writeFileSync } from "node:fs";
7
7
  import { dirname, isAbsolute, join, relative, resolve, sep } from "node:path";
8
8
  import { fileURLToPath, pathToFileURL } from "node:url";
9
9
  import { mkdir, open, readFile, realpath, writeFile } from "node:fs/promises";
@@ -919,10 +919,7 @@ async function runCommand(args, global, output, start) {
919
919
  validateRunFlags(args);
920
920
  if (args.watch === true) return runWatch(args, global, output);
921
921
  const executor = args.executor ?? "host";
922
- const isSarif = global.format === "sarif";
923
- const isWeb = global.format === "web";
924
- const isHtml = global.format === "html" || args.output !== void 0 && !isSarif && !isWeb;
925
- const evaluate = args.evaluate || isHtml || isSarif || isWeb;
922
+ const fmt = resolveFormats(args, global);
926
923
  output.debug(`run: root=${global.root} executor=${executor} entry=${args.entryId ?? "(first)"} format=${global.format}`);
927
924
  assertExecutorAvailable(executor);
928
925
  const { graph, warnings } = await loadProjectGraph(global);
@@ -932,36 +929,107 @@ async function runCommand(args, global, output, start) {
932
929
  graph,
933
930
  entryId
934
931
  });
935
- const workspace = global.root;
936
932
  const artifactDir = join(global.root, ".sverka", "artifacts");
937
933
  const { events, runStatus, renderer } = await consumeEvents(createEngine({
938
934
  drivers: buildDrivers(executor),
939
935
  maxConcurrent: args.jobs ?? 4
940
936
  }), plan, {
941
- workspace,
937
+ workspace: global.root,
942
938
  artifactDir
943
939
  }, global, output, graph, args);
944
940
  const durationMs = Date.now() - start;
945
- let policyExitCode = 0;
946
- let evalResult = null;
947
- let collectionFailed = false;
948
- if (evaluate) {
949
- const result = await runEvaluation(artifactDir, global, output, events, renderer, args);
950
- policyExitCode = result.exitCode;
951
- evalResult = result.summary;
952
- collectionFailed = result.summary === null && result.exitCode === ExitCode.RuntimeError;
953
- }
941
+ const evaluation = await evaluateRun(fmt.evaluate, artifactDir, global, output, events, renderer, args, start);
954
942
  renderer?.flush();
955
- if (isHtml && renderer) {
943
+ const report = await writeReportSafe({
944
+ root: global.root,
945
+ planId: plan.id,
946
+ runStatus,
947
+ durationMs,
948
+ evalResult: evaluation.summary,
949
+ artifactDir,
950
+ sinceMs: start
951
+ }, events, output);
952
+ if (fmt.isHtml && renderer) {
956
953
  const reportPath = args.output ?? join(global.root, ".sverka", "report.html");
957
954
  output.writeLine(`Wrote HTML report to ${reportPath}`);
958
955
  }
959
956
  if (renderer && "waitUntilExit" in renderer) await renderer.waitUntilExit();
960
- if (collectionFailed) return policyExitCode;
961
- writeRunOutput(plan.id, runStatus, events, durationMs, global, output, evalResult);
962
- if (evaluate && policyExitCode !== 0) return policyExitCode;
957
+ if (evaluation.collectionFailed) return evaluation.exitCode;
958
+ writeRunOutput({
959
+ planId: plan.id,
960
+ runStatus,
961
+ events,
962
+ durationMs,
963
+ global,
964
+ output,
965
+ evalResult: evaluation.summary,
966
+ report
967
+ });
968
+ if (report !== void 0 && global.format === "text") output.writeLine(` report: ${report.html ?? report.json}`);
969
+ if (evaluation.exitCode !== 0) return evaluation.exitCode;
963
970
  return exitCodeForStatus(runStatus);
964
971
  }
972
+ /** Derive output modes — `--format html`, or `--output` without
973
+ * sarif/web, implies HTML; evaluation runs for any structured format. */
974
+ function resolveFormats(args, global) {
975
+ const isSarif = global.format === "sarif";
976
+ const isWeb = global.format === "web";
977
+ const isHtml = global.format === "html" || args.output !== void 0 && !isSarif && !isWeb;
978
+ return {
979
+ isSarif,
980
+ isWeb,
981
+ isHtml,
982
+ evaluate: args.evaluate || isHtml || isSarif || isWeb
983
+ };
984
+ }
985
+ /** Run findings collection + policy gate when requested; a no-op
986
+ * success outcome otherwise. */
987
+ async function evaluateRun(evaluate, artifactDir, global, output, events, renderer, args, start) {
988
+ if (!evaluate) return {
989
+ exitCode: 0,
990
+ summary: null,
991
+ collectionFailed: false
992
+ };
993
+ const result = await runEvaluation(artifactDir, global, output, events, renderer, args, start);
994
+ return {
995
+ exitCode: result.exitCode,
996
+ summary: result.summary,
997
+ collectionFailed: result.summary === null && result.exitCode === ExitCode.RuntimeError
998
+ };
999
+ }
1000
+ /** Locate the run id — prefer the completion event, fall back to the
1001
+ * start event (a run that failed mid-flight still reports). */
1002
+ function findRunId(events) {
1003
+ return events.find((e) => e.type === "run-completed")?.runId ?? events.find((e) => e.type === "run-started")?.runId;
1004
+ }
1005
+ /** Write .sverka/runs/<runId>/report.{json,html} — best-effort: ordinary
1006
+ * FS failures degrade to a warning; REPORT_PATH_ESCAPE (a CliError)
1007
+ * stays a hard failure. */
1008
+ async function writeReportSafe(ctx, events, output) {
1009
+ const runId = findRunId(events);
1010
+ if (runId === void 0) return void 0;
1011
+ try {
1012
+ const artifacts = await writeRunArtifacts({
1013
+ root: ctx.root,
1014
+ runId,
1015
+ planId: ctx.planId,
1016
+ runStatus: ctx.runStatus,
1017
+ events,
1018
+ durationMs: ctx.durationMs,
1019
+ evalResult: ctx.evalResult,
1020
+ artifactDir: ctx.artifactDir,
1021
+ sinceMs: ctx.sinceMs
1022
+ });
1023
+ return {
1024
+ html: artifacts.htmlPath,
1025
+ json: join(artifacts.dir, "report.json")
1026
+ };
1027
+ } catch (err) {
1028
+ if (err instanceof CliError) throw err;
1029
+ output.errorLine(`warning: run report not written: ${err instanceof Error ? err.message : String(err)}`);
1030
+ return;
1031
+ }
1032
+ }
965
1033
  /**
966
1034
  * Watch mode (Spec 53): delegate to the supervisor, which re-invokes
967
1035
  * runCommand per change — each cycle re-plans, so sverka.config.ts edits
@@ -1073,11 +1141,14 @@ async function consumeEvents(engine, plan, ctx, global, output, graph, args) {
1073
1141
  renderer
1074
1142
  };
1075
1143
  }
1076
- async function runEvaluation(artifactDir, global, output, _events, renderer, args) {
1144
+ async function runEvaluation(artifactDir, global, output, _events, renderer, args, sinceMs) {
1077
1145
  const { collectFindings, evaluateGate, ReporterError } = await import("@sverka/reporter");
1078
1146
  let rows;
1079
1147
  try {
1080
- rows = await collectFindings({ artifactDir });
1148
+ rows = await collectFindings({
1149
+ artifactDir,
1150
+ sinceMs
1151
+ });
1081
1152
  } catch (e) {
1082
1153
  if (e instanceof ReporterError) {
1083
1154
  if (global.format === "json") output.writeLine(JSON.stringify({
@@ -1177,7 +1248,9 @@ function capturedOutputFields(event) {
1177
1248
  ...event.exitCode !== void 0 ? { exitCode: event.exitCode } : {}
1178
1249
  };
1179
1250
  }
1180
- function writeRunOutput(planId, runStatus, events, durationMs, global, output, evalResult) {
1251
+ function writeRunOutput(opts) {
1252
+ const { planId, runStatus, events, durationMs, global, output } = opts;
1253
+ const { evalResult, report } = opts;
1181
1254
  if (global.format === "json") {
1182
1255
  const steps = summarizeSteps(events);
1183
1256
  output.writeLine(JSON.stringify({
@@ -1190,12 +1263,125 @@ function writeRunOutput(planId, runStatus, events, durationMs, global, output, e
1190
1263
  findings: evalResult.findings.length,
1191
1264
  verdict: evalResult.verdict,
1192
1265
  summary: evalResult.summary
1193
- } : {}
1266
+ } : {},
1267
+ ...report !== void 0 ? { report: {
1268
+ json: report.json,
1269
+ ...report.html !== null ? { html: report.html } : {}
1270
+ } } : {}
1194
1271
  },
1195
1272
  durationMs
1196
1273
  }));
1197
1274
  }
1198
1275
  }
1276
+ /** Cap captured step output in the durable report — verbatim stdout/stderr
1277
+ * persists whatever scrolled by, including secrets. The live payload keeps
1278
+ * full output; the on-disk report keeps the last 4 KiB per stream, counted
1279
+ * in UTF-8 bytes so a multibyte stream can't overrun the stated limit. */
1280
+ const REPORT_OUTPUT_CAP = 4096;
1281
+ function boundStepOutput(steps) {
1282
+ return steps.map((step) => {
1283
+ const bound = (text) => {
1284
+ if (text === void 0) return void 0;
1285
+ const buf = Buffer.from(text, "utf8");
1286
+ if (buf.length <= REPORT_OUTPUT_CAP) return text;
1287
+ let cut = buf.length - REPORT_OUTPUT_CAP;
1288
+ while (cut < buf.length && (buf.at(cut) & 192) === 128) cut++;
1289
+ return buf.subarray(cut).toString("utf8");
1290
+ };
1291
+ const stdout = bound(step.stdout);
1292
+ const stderr = bound(step.stderr);
1293
+ if (stdout === step.stdout && stderr === step.stderr) return step;
1294
+ return {
1295
+ ...step,
1296
+ ...stdout !== void 0 ? { stdout } : {},
1297
+ ...stderr !== void 0 ? { stderr } : {},
1298
+ truncated: true
1299
+ };
1300
+ });
1301
+ }
1302
+ /** Refuse to write through a path whose real location escapes the project
1303
+ * root — a symlinked `.sverka/…` component is exactly that escape. */
1304
+ function assertWithinRoot(real, realRoot, dir) {
1305
+ const prefix = realRoot.endsWith(sep) ? realRoot : `${realRoot}${sep}`;
1306
+ if (real === realRoot || real.startsWith(prefix)) return;
1307
+ throw new CliError(`refusing to write run report through symlinked path: ${dir}`, "REPORT_PATH_ESCAPE", ExitCode.RuntimeError);
1308
+ }
1309
+ /** Resolve the per-run report dir, checking the nearest existing ancestor
1310
+ * BEFORE mkdir — mkdir through a symlink is itself the escape. */
1311
+ function reportDir(root, runId) {
1312
+ const dir = join(root, ".sverka", "runs", runId);
1313
+ const realRoot = realpathSync(root);
1314
+ let ancestor = dir;
1315
+ while (!existsSync(ancestor)) {
1316
+ const parent = dirname(ancestor);
1317
+ if (parent === ancestor) break;
1318
+ ancestor = parent;
1319
+ }
1320
+ assertWithinRoot(realpathSync(ancestor), realRoot, dir);
1321
+ mkdirSync(dir, { recursive: true });
1322
+ assertWithinRoot(realpathSync(dir), realRoot, dir);
1323
+ return dir;
1324
+ }
1325
+ /** Findings for the report — the eval result when present, else a
1326
+ * collection pass over the artifact dir scoped to this run so a
1327
+ * zero-finding run does not pick up stale SARIF from prior runs. */
1328
+ async function collectRunFindings(opts, warnings) {
1329
+ const fromEval = opts.evalResult?.findings ?? [];
1330
+ if (fromEval.length > 0) return fromEval;
1331
+ try {
1332
+ const { collectFindings } = await import("@sverka/reporter");
1333
+ return (await collectFindings({
1334
+ artifactDir: opts.artifactDir,
1335
+ sinceMs: opts.sinceMs
1336
+ })).map((r) => r.finding);
1337
+ } catch (e) {
1338
+ warnings.push(`findings collection failed: ${e instanceof Error ? e.message : String(e)}`);
1339
+ return [];
1340
+ }
1341
+ }
1342
+ /** Best-effort report.html — a render failure never fails the run; it is
1343
+ * recorded in the report's `warnings` instead of being dropped silently. */
1344
+ async function writeReportHtml(dir, findings, warnings) {
1345
+ try {
1346
+ const { generateSarifHtml } = await import("@sverka/sarif-viewer-web");
1347
+ const candidate = join(dir, "report.html");
1348
+ writeFileSync(candidate, generateSarifHtml(findings), "utf-8");
1349
+ return candidate;
1350
+ } catch (e) {
1351
+ warnings.push(`report.html generation failed: ${e instanceof Error ? e.message : String(e)}`);
1352
+ return null;
1353
+ }
1354
+ }
1355
+ function runReportPayload(opts, warnings) {
1356
+ return {
1357
+ schema: "sverka.run/v1",
1358
+ data: {
1359
+ planId: opts.planId,
1360
+ status: opts.runStatus,
1361
+ steps: boundStepOutput(summarizeSteps(opts.events)),
1362
+ ...opts.evalResult ? {
1363
+ findings: opts.evalResult.findings.length,
1364
+ verdict: opts.evalResult.verdict,
1365
+ summary: opts.evalResult.summary
1366
+ } : {},
1367
+ ...warnings.length > 0 ? { warnings } : {}
1368
+ },
1369
+ durationMs: opts.durationMs
1370
+ };
1371
+ }
1372
+ /** Write the per-run report artifacts (Spec 53): report.json carries the
1373
+ * sverka.run/v1 payload; report.html renders whatever findings the run
1374
+ * produced (an empty-findings report is still a report). */
1375
+ async function writeRunArtifacts(opts) {
1376
+ const dir = reportDir(opts.root, opts.runId);
1377
+ const warnings = [];
1378
+ const htmlPath = await writeReportHtml(dir, await collectRunFindings(opts, warnings), warnings);
1379
+ writeFileSync(join(dir, "report.json"), JSON.stringify(runReportPayload(opts, warnings), null, 2), "utf-8");
1380
+ return {
1381
+ dir,
1382
+ htmlPath
1383
+ };
1384
+ }
1199
1385
  function exitCodeForStatus(runStatus) {
1200
1386
  if (runStatus === "success") return ExitCode.Success;
1201
1387
  if (runStatus === "failure") return ExitCode.PolicyFail;
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["resolveConfigPath","detectPackageManager","detectPackageManager","detectPackageManager","process","process","process","process"],"sources":["../src/types.ts","../src/output.ts","../src/internal/version.ts","../src/internal/paths.ts","../src/internal/config.ts","../src/internal/detect.ts","../src/commands/init.ts","../src/commands/validate.ts","../src/internal/graph.ts","../src/commands/plan.ts","../src/commands/graph.ts","../src/internal/runtime-check.ts","../src/internal/report-context.ts","../src/internal/watch.ts","../src/commands/run.ts","../src/commands/discover.ts","../src/commands/check.ts","../src/commands/policy.ts","../src/internal/ci-setup.ts","../src/commands/compile.ts","../src/commands/synth.ts","../src/internal/buffering-writer.ts","../src/internal/mcp-tools.ts","../src/commands/mcp-server.ts","../src/commands/doctor.ts","../src/commands/view.ts","../src/commands/ui.ts","../src/main.ts"],"sourcesContent":["// sverka — public types\n\n/** Global flags parsed from the command line. */\nexport interface GlobalFlags {\n /** Output format. Defaults to \"text\". */\n format: \"text\" | \"json\" | \"html\" | \"sarif\" | \"web\";\n /** Path to sverka.config.ts. */\n config: string | null;\n /** Root directory. Defaults to process.cwd(). */\n root: string;\n /** Suppress non-error output. */\n quiet: boolean;\n /** Enable verbose output with debug information. */\n verbose: boolean;\n}\n\n/** Output writer abstraction for testability. */\nexport interface OutputWriter {\n write(text: string): void;\n writeLine(text: string): void;\n error(text: string): void;\n errorLine(text: string): void;\n /** Write a debug line, only visible when --verbose is set. */\n debug(text: string): void;\n}\n\n/** Exit codes used by the CLI. */\nexport const ExitCode = {\n Success: 0,\n PolicyFail: 1,\n UsageError: 2,\n RuntimeError: 3,\n} as const;\n\nexport type ExitCode = (typeof ExitCode)[keyof typeof ExitCode];\n\n/** CLI error codes. */\nexport type CliErrorCode =\n | \"UNKNOWN_COMMAND\"\n | \"MISSING_ARG\"\n | \"INVALID_FLAG\"\n | \"CONFIG_EXISTS\"\n | \"RUNTIME_NOT_AVAILABLE\"\n | \"SDK_ERROR\"\n | \"PACKAGE_ERROR\";\n\n/** Error thrown when CLI argument parsing or command execution fails. */\nexport class CliError extends Error {\n readonly code: CliErrorCode;\n readonly exitCode: ExitCode;\n override readonly cause: unknown;\n constructor(\n message: string,\n code: CliErrorCode,\n exitCode: ExitCode,\n cause?: unknown,\n ) {\n super(message);\n this.name = \"CliError\";\n this.code = code;\n this.exitCode = exitCode;\n this.cause = cause;\n }\n}\n","import type { GlobalFlags, OutputWriter } from \"./types.js\";\n\n/** A sink that receives a string. */\nexport type WriteSink = (text: string) => void;\n\n/**\n * OutputWriter that writes to caller-provided sinks (stdout/stderr).\n * In production, the sinks write to process.stdout/process.stderr.\n * In tests, the sinks capture into arrays.\n */\nexport class ConsoleOutputWriter implements OutputWriter {\n readonly #out: WriteSink;\n readonly #err: WriteSink;\n readonly #quiet: boolean;\n readonly #verbose: boolean;\n\n constructor(out: WriteSink, err: WriteSink, quiet = false, verbose = false) {\n this.#out = out;\n this.#err = err;\n this.#quiet = quiet;\n this.#verbose = verbose;\n }\n\n write(text: string): void {\n if (this.#quiet) return;\n this.#out(text);\n }\n\n writeLine(text: string): void {\n if (this.#quiet) return;\n this.#out(text + \"\\n\");\n }\n\n error(text: string): void {\n this.#err(text);\n }\n\n errorLine(text: string): void {\n this.#err(text + \"\\n\");\n }\n\n /** Write a debug line to stderr, only when --verbose is set. */\n debug(text: string): void {\n if (this.#verbose) {\n this.#err(text + \"\\n\");\n }\n }\n}\n\n/**\n * Wrapper that applies --quiet / --verbose / --format semantics to any\n * underlying OutputWriter. Used to make injected test writers respect the\n * same suppression rules as the production writer.\n *\n * - `--quiet` (text format) suppresses stdout writes; JSON stdout is kept.\n * - `--verbose` routes `debug()` to the underlying `errorLine()`.\n * - stderr is never suppressed.\n */\nexport class FlagAwareWriter implements OutputWriter {\n readonly #base: OutputWriter;\n readonly #quiet: boolean;\n readonly #verbose: boolean;\n\n constructor(base: OutputWriter, quiet: boolean, verbose: boolean) {\n this.#base = base;\n this.#quiet = quiet;\n this.#verbose = verbose;\n }\n\n write(text: string): void {\n if (this.#quiet) return;\n this.#base.write(text);\n }\n\n writeLine(text: string): void {\n if (this.#quiet) return;\n this.#base.writeLine(text);\n }\n\n error(text: string): void {\n this.#base.error(text);\n }\n\n errorLine(text: string): void {\n this.#base.errorLine(text);\n }\n\n debug(text: string): void {\n if (this.#verbose) {\n this.#base.errorLine(text);\n }\n }\n}\n\n/**\n * Create an OutputWriter from global flags. In JSON format, stdout is NOT\n * suppressed by --quiet (the JSON result is the data and must be emitted).\n */\nexport function createOutputWriter(\n global: GlobalFlags,\n out: WriteSink,\n err: WriteSink,\n): ConsoleOutputWriter {\n // In JSON format, quiet does not suppress the result stdout — only\n // text-format non-essential output. We model this by disabling quiet\n // suppression for json.\n const effectiveQuiet = global.quiet && global.format === \"text\";\n return new ConsoleOutputWriter(out, err, effectiveQuiet, global.verbose);\n}\n\n/**\n * Wrap any OutputWriter with --quiet / --verbose semantics from global flags.\n * Use for injected test writers so they respect the same suppression rules.\n */\nexport function wrapOutputWriter(\n global: GlobalFlags,\n base: OutputWriter,\n): OutputWriter {\n const effectiveQuiet = global.quiet && global.format === \"text\";\n return new FlagAwareWriter(base, effectiveQuiet, global.verbose);\n}\n","import { readFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\n/**\n * Resolve the sverka CLI version from its own package.json.\n * Walks up from this module so it works from src/ (dev) and bundled\n * dist/ alike, and never picks up the consumer's cwd package.json\n * (which is what yargs' default --version resolution does).\n */\nexport function cliVersion(): string {\n let dir = dirname(fileURLToPath(import.meta.url));\n while (true) {\n try {\n const pkg = JSON.parse(\n readFileSync(join(dir, \"package.json\"), \"utf8\"),\n ) as {\n name?: string;\n version?: string;\n };\n if (pkg.name === \"sverka\" && pkg.version) return pkg.version;\n } catch {\n // no readable package.json at this level — keep walking\n }\n const parent = dirname(dir);\n if (parent === dir) return \"0.0.0\";\n dir = parent;\n }\n}\n","import { isAbsolute, join } from \"node:path\";\n\n/**\n * Resolve a path against a root directory. Absolute paths are returned\n * unchanged; relative paths are joined under `root` so that `--root` governs\n * path resolution regardless of the process working directory.\n */\nexport function resolveUnderRoot(root: string, path: string): string {\n return isAbsolute(path) ? path : join(root, path);\n}\n","// Config loading — loads a sverka.config.ts file and returns the Project.\n// Spec 17 — §30.\n\nimport { readFile, writeFile } from \"node:fs/promises\";\nimport { readFileSync, existsSync } from \"node:fs\";\nimport { register } from \"node:module\";\nimport * as nodeModule from \"node:module\";\nimport { pathToFileURL, fileURLToPath } from \"node:url\";\nimport { join, resolve, isAbsolute, dirname, sep } from \"node:path\";\nimport type { Pipeline, Project } from \"@sverka/workflow\";\nimport { synthesize, collectConstructWarnings } from \"@sverka/workflow\";\nimport type { DefinitionGraph } from \"@sverka/workflow\";\nimport { resolveUnderRoot } from \"./paths.js\";\nimport { CliError, ExitCode } from \"../types.js\";\n\nlet hooksRegistered = false;\n\nfunction findHooksFile(): string | null {\n for (const rel of [\"./config-hooks.mjs\", \"./internal/config-hooks.mjs\"]) {\n try {\n const candidate = fileURLToPath(new URL(rel, import.meta.url));\n if (existsSync(candidate)) return candidate;\n } catch {\n // ignore\n }\n }\n return null;\n}\n\n/**\n * Register ESM resolve hooks so a config file that cannot resolve @sverka/*\n * packages from its own location falls back to the copies bundled with the\n * CLI. This makes a globally-installed `sverka` self-contained.\n */\nasync function registerConfigHooks(): Promise<void> {\n if (hooksRegistered) return;\n const hooksFile = findHooksFile();\n if (hooksFile === null) return;\n const href = pathToFileURL(hooksFile).href;\n try {\n // Prefer registerHooks (in-thread) when available: module.register is\n // deprecated (DEP0205) on Node 24.5+ and prints a warning per call.\n const registerHooks = (nodeModule as { registerHooks?: unknown })\n .registerHooks;\n if (typeof registerHooks === \"function\") {\n const hooks = (await import(href)) as { resolve?: unknown };\n if (typeof hooks.resolve === \"function\") {\n registerHooks.call(nodeModule, {\n resolve: hooks.resolve,\n });\n hooksRegistered = true;\n return;\n }\n }\n register(href);\n hooksRegistered = true;\n } catch {\n // hook registration unavailable — fall back to normal resolution\n }\n}\n\n/** Package-manager names supported by `init` templates. */\nexport type PmName = \"npm\" | \"pnpm\" | \"yarn\" | \"bun\";\n\n/**\n * Find a sverka.config.ts or sverka.config.js file in the given root.\n * Returns the absolute path or null if not found.\n */\nexport async function findConfig(root: string): Promise<string | null> {\n const candidates = [\n \"sverka.config.ts\",\n \"sverka.config.js\",\n \"sverka.config.mjs\",\n ];\n for (const candidate of candidates) {\n const path = join(root, candidate);\n if (existsSync(path)) return path;\n }\n return null;\n}\n\n/**\n * Resolve the effective config path from global flags.\n * Throws a usage error when no config can be found.\n */\nexport async function resolveConfigPath(global: {\n root: string;\n config: string | null;\n}): Promise<string> {\n let configPath: string | null = global.config\n ? resolveUnderRoot(global.root, global.config)\n : null;\n if (!configPath) {\n configPath = await findConfig(global.root);\n }\n if (!configPath) {\n throw new CliError(\n \"no config found (use --config to specify a path)\",\n \"MISSING_ARG\",\n ExitCode.UsageError,\n );\n }\n return configPath;\n}\n\n/**\n * Structural check that avoids `instanceof` across package boundaries.\n * A construct-like object (Project or bare Pipeline — single-pipeline\n * configs may skip the Project) has a `node` with an `id` string and a\n * `children` array.\n */\nfunction notConstructError(): CliError {\n return new CliError(\n \"config must export a Project or Pipeline instance (default or named 'project')\",\n \"SDK_ERROR\",\n ExitCode.RuntimeError,\n );\n}\n\nfunction assertConstructLike(\n value: unknown,\n): asserts value is Project | Pipeline {\n if (value === null || typeof value !== \"object\") {\n throw notConstructError();\n }\n const node = (value as { node?: unknown }).node;\n if (\n typeof node !== \"object\" ||\n node === null ||\n typeof (node as { id?: unknown }).id !== \"string\" ||\n !Array.isArray((node as { children?: unknown }).children) ||\n typeof (node as { findAll?: unknown }).findAll !== \"function\"\n ) {\n throw notConstructError();\n }\n}\n\n/**\n * Load a sverka config file and return the Project construct.\n * The config file must export a `default` Project-like instance or a named\n * `project` Project-like instance.\n *\n * @throws CliError if the config cannot be loaded or doesn't export a Project.\n */\nexport async function loadConfig(\n configPath: string,\n): Promise<Project | Pipeline> {\n const absPath = isAbsolute(configPath)\n ? configPath\n : resolve(process.cwd(), configPath);\n\n if (!existsSync(absPath)) {\n throw new CliError(\n `config not found: ${absPath}`,\n \"MISSING_ARG\",\n ExitCode.UsageError,\n );\n }\n\n let mod: Record<string, unknown>;\n try {\n await registerConfigHooks();\n mod = await import(pathToFileURL(absPath).href);\n } catch (e) {\n throw new CliError(\n `failed to load config: ${e instanceof Error ? e.message : String(e)}`,\n \"SDK_ERROR\",\n ExitCode.RuntimeError,\n e,\n );\n }\n\n // Prefer the named `project` export, then fall back to `default`.\n // This avoids selecting an unrelated default export when a valid\n // named `project` export exists.\n const construct = mod.project ?? mod.default;\n assertConstructLike(construct);\n\n return construct;\n}\n\n/**\n * Resolve, load, and synthesize the config for commands that need a graph.\n */\nexport async function loadProjectGraph(global: {\n root: string;\n config: string | null;\n}): Promise<{\n configPath: string;\n project: Project | Pipeline;\n graph: DefinitionGraph;\n warnings: string[];\n}> {\n const configPath = await resolveConfigPath(global);\n const project = await loadConfig(configPath);\n const warnings = collectConstructWarnings(project);\n const graph = synthesize(project);\n return { configPath, project, graph, warnings };\n}\n\n/**\n * Detect the package manager used by the project at `root`.\n * Falls back to `npm` when no lockfile or packageManager field is found.\n */\nexport function detectPackageManager(root: string): PmName {\n const fromLockfile = detectFromLockfile(root);\n if (fromLockfile) return fromLockfile;\n\n const fromPkg = detectFromPackageJson(root);\n if (fromPkg) return fromPkg;\n\n return \"npm\";\n}\n\nfunction detectFromLockfile(root: string): PmName | undefined {\n if (\n existsSync(join(root, \"bun.lockb\")) ||\n existsSync(join(root, \"bun.lock\"))\n ) {\n return \"bun\";\n }\n if (existsSync(join(root, \"pnpm-lock.yaml\"))) {\n return \"pnpm\";\n }\n if (existsSync(join(root, \"yarn.lock\"))) {\n return \"yarn\";\n }\n if (existsSync(join(root, \"package-lock.json\"))) {\n return \"npm\";\n }\n return undefined;\n}\n\nfunction detectFromPackageJson(root: string): PmName | undefined {\n const pkgPath = join(root, \"package.json\");\n if (!existsSync(pkgPath)) return undefined;\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, \"utf8\")) as {\n packageManager?: string;\n };\n if (typeof pkg.packageManager === \"string\") {\n return pmFromPackageManagerField(pkg.packageManager);\n }\n } catch {\n // ignore malformed package.json\n }\n return undefined;\n}\n\nfunction pmFromPackageManagerField(packageManager: string): PmName | undefined {\n if (packageManager.startsWith(\"npm\")) return \"npm\";\n if (packageManager.startsWith(\"pnpm\")) return \"pnpm\";\n if (packageManager.startsWith(\"yarn\")) return \"yarn\";\n if (packageManager.startsWith(\"bun\")) return \"bun\";\n return undefined;\n}\n\n/**\n * Ensure `@sverka/workflow` is declared as a devDependency of the target\n * project. Creates a minimal package.json when one does not exist.\n */\nexport async function ensureConstructsDependency(\n root: string,\n): Promise<string | null> {\n const pkgPath = join(root, \"package.json\");\n const base = await loadPackageBase(pkgPath);\n\n const pkg: Record<string, unknown> = {\n name: base.name ?? \"sverka-project\",\n version: base.version ?? \"0.0.0\",\n ...base,\n };\n\n const declared = ensureConstructsDeclared(pkg, root);\n\n await writeFile(pkgPath, JSON.stringify(pkg, null, 2) + \"\\n\", \"utf8\");\n return declared;\n}\n\nasync function loadPackageBase(\n pkgPath: string,\n): Promise<Record<string, unknown>> {\n try {\n return JSON.parse(await readFile(pkgPath, \"utf8\")) as Record<\n string,\n unknown\n >;\n } catch (e) {\n if ((e as NodeJS.ErrnoException).code === \"ENOENT\") {\n return { name: \"sverka-project\", version: \"0.0.0\" };\n }\n const reason = e instanceof Error ? e.message : String(e);\n throw new CliError(\n `failed to read package.json: ${reason}`,\n \"PACKAGE_ERROR\",\n ExitCode.RuntimeError,\n e,\n );\n }\n}\n\n/** Dependency names that were renamed to @sverka/workflow. */\nconst LEGACY_DEP_NAMES = [\"@sverka/constructs\", \"@sverka/cdk\"] as const;\n\n/** Drop renamed legacy package entries from dependencies/devDependencies. */\nfunction removeLegacyDeps(pkg: Record<string, unknown>): void {\n for (const key of [\"dependencies\", \"devDependencies\"] as const) {\n const deps = pkg[key] as Record<string, unknown> | undefined;\n if (deps === undefined) continue;\n for (const name of LEGACY_DEP_NAMES) delete deps[name];\n if (Object.keys(deps).length === 0) delete pkg[key];\n }\n}\n\nfunction ensureConstructsDeclared(\n pkg: Record<string, unknown>,\n root: string,\n): string | null {\n removeLegacyDeps(pkg);\n\n const deps = (pkg.dependencies as Record<string, unknown> | undefined) ?? {};\n const devDeps =\n (pkg.devDependencies as Record<string, unknown> | undefined) ?? {};\n\n const existing = deps[\"@sverka/workflow\"] ?? devDeps[\"@sverka/workflow\"];\n if (typeof existing === \"string\") return existing;\n if (existing !== undefined) {\n // Malformed non-string value — unusable to any package manager.\n // Replace it with a proper spec rather than leaving it in place.\n delete deps[\"@sverka/workflow\"];\n delete devDeps[\"@sverka/workflow\"];\n }\n\n const spec = constructsDepSpec(root);\n if (spec === null) return null;\n pkg.devDependencies = { ...devDeps, \"@sverka/workflow\": spec };\n return spec;\n}\n\n/**\n * Dependency spec for @sverka/workflow in the target project.\n *\n * - `workspace:*` inside the sverka monorepo itself.\n * - `^<version>` when the package resolves from a node_modules tree (a real\n * registry install).\n * - `link:<dir>` (or `file:<dir>` for npm, which rejects the `link:`\n * protocol) when it resolves to a bare checkout — a semver spec would\n * fail to install when the version was never published.\n * - null when the package cannot be resolved at all — nothing is declared,\n * the caller warns instead of writing an uninstallable spec.\n */\nfunction constructsDepSpec(root: string): string | null {\n if (isLocalWorkspace(root)) return \"workspace:*\";\n const resolved = resolveConstructsPackage();\n if (resolved === null) return null;\n if (resolved.dir.includes(`${sep}node_modules${sep}`)) {\n return `^${resolved.version}`;\n }\n const protocol = detectPackageManager(root) === \"npm\" ? \"file:\" : \"link:\";\n return `${protocol}${resolved.dir}`;\n}\n\n/** Resolve the @sverka/workflow package directory and version from the CLI's context. */\nfunction resolveConstructsPackage(): { dir: string; version: string } | null {\n let entry: string;\n try {\n entry = fileURLToPath(import.meta.resolve(\"@sverka/workflow\"));\n } catch {\n return null;\n }\n let dir = dirname(entry);\n while (true) {\n const pkgPath = join(dir, \"package.json\");\n if (existsSync(pkgPath)) {\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, \"utf8\")) as {\n name?: string;\n version?: string;\n };\n if (pkg.name === \"@sverka/workflow\") {\n return { dir, version: pkg.version ?? \"0.0.0\" };\n }\n } catch {\n // keep walking up\n }\n }\n const parent = dirname(dir);\n if (parent === dir) return null;\n dir = parent;\n }\n}\n\nfunction isLocalWorkspace(root: string): boolean {\n const rootPkg = join(root, \"package.json\");\n const constructsPkg = join(root, \"packages\", \"workflow\", \"package.json\");\n\n try {\n const rootData = JSON.parse(readFileSync(rootPkg, \"utf8\")) as {\n workspaces?: string[] | { packages?: string[] };\n };\n const constructs = JSON.parse(readFileSync(constructsPkg, \"utf8\")) as {\n name?: string;\n };\n if (constructs.name !== \"@sverka/workflow\") return false;\n const patterns = Array.isArray(rootData.workspaces)\n ? rootData.workspaces\n : (rootData.workspaces?.packages ?? []);\n return patterns.some((pattern) => pattern.startsWith(\"packages\"));\n } catch {\n return false;\n }\n}\n","// Shared project-check detection for `init --detect` and `sverka check`.\n//\n// Combines two sources:\n// - planner discovery (ecosystem-aware: cargo, go, ruff, package managers) —\n// requires a git repository, degrades gracefully when unavailable\n// - package.json script scanning — ground truth for JS/TS projects\n//\n// Planner-proposed `<pm> run <script>` steps are filtered against the\n// scripts that actually exist so generated configs never reference\n// missing scripts.\n\nimport { readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { createPlanner } from \"@sverka/sdk\";\nimport {\n createBuiltinResolver,\n synthesizeCheckSteps,\n} from \"@sverka/verification\";\nimport { detectPackageManager } from \"./config.js\";\n\n/** A detected check ready to become a ShellStep. */\nexport interface DetectedCheck {\n /** Step id, e.g. \"lint\". */\n checkId: string;\n /** Shell command, e.g. \"bun run lint\". */\n command: string;\n /** SARIF artifact path when the check emits SARIF on stdout. */\n sarifOutput?: string;\n /** Where the check came from. */\n source: \"planner\" | \"script\";\n}\n\n/** package.json script names that map to pipeline steps. */\nconst DETECT_SCRIPT_CHECKS = [\n \"lint\",\n \"typecheck\",\n \"test\",\n \"build\",\n \"format\",\n \"check\",\n] as const;\n\n/**\n * Read package.json scripts under root. Returns an empty map when absent or\n * malformed. Ground truth for JS/TS projects.\n */\nfunction readPackageScripts(root: string): Record<string, string> {\n try {\n const pkg = JSON.parse(\n readFileSync(join(root, \"package.json\"), \"utf8\"),\n ) as {\n scripts?: Record<string, unknown>;\n };\n const scripts = pkg.scripts ?? {};\n const out: Record<string, string> = {};\n for (const [name, value] of Object.entries(scripts)) {\n if (typeof value === \"string\" && value.length > 0) out[name] = value;\n }\n return out;\n } catch {\n return {};\n }\n}\n\n/**\n * True when a command is a package-manager script invocation\n * (`<pm> run <script>`) whose script does not exist — a phantom step that\n * would fail with \"Missing script\" on first run.\n */\nfunction isPhantomScriptStep(\n command: string,\n scripts: Record<string, string>,\n): boolean {\n const m = /^(?:bun|npm|pnpm|yarn|deno)\\s+run\\s+([A-Za-z0-9:_-]+)/.exec(\n command.trim(),\n );\n if (m === null) return false;\n return !(m[1]! in scripts);\n}\n\n/**\n * Detect checks for the project at `root`: planner proposals (filtered to\n * real scripts) plus any known check scripts the planner did not cover.\n */\nexport async function detectProjectChecks(\n root: string,\n): Promise<DetectedCheck[]> {\n const pm = detectPackageManager(root);\n const scripts = readPackageScripts(root);\n const checks: DetectedCheck[] = [];\n\n // Planner-based detection covers non-npm ecosystems (cargo, go, ruff).\n // It requires a git repository — degrade gracefully when unavailable.\n try {\n const planner = createPlanner();\n // Scope detection to `root`: generated ShellSteps run with cwd=root,\n // so proposals driven by manifests outside the subtree would fail.\n const ctx = await planner.discover({ root, scopeToRoot: true });\n const proposal = await planner.plan(ctx);\n if (proposal.checks.length > 0) {\n const resolver = createBuiltinResolver();\n const resolved = synthesizeCheckSteps(proposal.checks, ctx, resolver);\n for (const r of resolved) {\n const shellOp = r.step.operations.find((o) => o.kind === \"shell\");\n const command = shellOp?.kind === \"shell\" ? shellOp.command : \"\";\n // Planner proposes checks by ecosystem, not by package.json\n // scripts — drop `<pm> run <script>` steps for missing scripts.\n if (isPhantomScriptStep(command, scripts)) continue;\n const sarifOut = r.outputs.find((o) => o.format === \"sarif\");\n checks.push({\n checkId: r.checkId,\n command,\n ...(sarifOut !== undefined ? { sarifOutput: sarifOut.path } : {}),\n source: \"planner\",\n });\n }\n }\n } catch {\n // discovery unavailable (e.g. not a git repo) — script checks still apply\n }\n\n // Emit a check for every known script present in package.json that\n // detection did not already cover.\n for (const name of DETECT_SCRIPT_CHECKS) {\n if (!(name in scripts)) continue;\n if (checks.some((c) => c.checkId === name)) continue;\n checks.push({\n checkId: name,\n command: `${pm} run ${name}`,\n source: \"script\",\n });\n }\n\n return checks;\n}\n","import { existsSync } from \"node:fs\";\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport { dirname, isAbsolute, join } from \"node:path\";\nimport type { GlobalFlags, OutputWriter } from \"../types.js\";\nimport { CliError, ExitCode } from \"../types.js\";\nimport type { WriteFileOptions } from \"node:fs\";\nimport {\n detectPackageManager,\n ensureConstructsDependency,\n} from \"../internal/config.js\";\nimport type { PmName } from \"../internal/config.js\";\nimport { detectProjectChecks } from \"../internal/detect.js\";\n\n/** Args parsed for the init command. */\nexport interface InitArgs {\n template?: string | undefined;\n force?: boolean;\n detect?: boolean;\n}\n\nfunction buildMinimalTemplate(pm: PmName): string {\n return [\n 'import { Project, Pipeline, ShellStep, Entry } from \"@sverka/workflow\";',\n \"\",\n 'const proj = new Project(\"verify\");',\n 'const ci = new Pipeline(proj, \"ci\");',\n `new ShellStep(ci, \"lint\", { command: \"${pm} run lint\" });`,\n `new ShellStep(ci, \"typecheck\", { command: \"${pm} run typecheck\" });`,\n `new ShellStep(ci, \"test\", { command: \"${pm} run test\" });`,\n 'new Entry(ci, \"on-push\", { trigger: { kind: \"push\" }, roots: [\"lint\", \"typecheck\", \"test\"] });',\n \"\",\n \"export default proj;\",\n \"\",\n ].join(\"\\n\");\n}\n\nfunction buildFullTemplate(pm: PmName): string {\n return [\n 'import { Project, Pipeline, ShellStep, Entry } from \"@sverka/workflow\";',\n \"\",\n 'const proj = new Project(\"verify\");',\n 'const ci = new Pipeline(proj, \"ci\");',\n `new ShellStep(ci, \"lint\", { command: \"${pm} run lint\" });`,\n `new ShellStep(ci, \"typecheck\", { command: \"${pm} run typecheck\" });`,\n `new ShellStep(ci, \"test\", { command: \"${pm} run test\" });`,\n `new ShellStep(ci, \"build\", { command: \"${pm} run build\" });`,\n 'new Entry(ci, \"on-push\", { trigger: { kind: \"push\" }, roots: [\"lint\", \"typecheck\", \"test\", \"build\"] });',\n \"\",\n \"export default proj;\",\n \"\",\n ].join(\"\\n\");\n}\n\n/** Build a config from detected checks (planner + package.json scripts). */\nasync function buildDetectedTemplate(root: string): Promise<string | null> {\n const checks = await detectProjectChecks(root);\n if (checks.length === 0) return null;\n\n const stepLines = checks.map((c) => {\n const id = JSON.stringify(c.checkId);\n const cmd = JSON.stringify(c.command);\n if (c.sarifOutput !== undefined) {\n const outputsDecl =\n \"{ \" +\n JSON.stringify(c.sarifOutput) +\n ': { type: \"artifact\", fromStdout: true } }';\n return `new ShellStep(ci, ${id}, { command: ${cmd}, outputs: ${outputsDecl} });`;\n }\n return `new ShellStep(ci, ${id}, { command: ${cmd} });`;\n });\n const rootList = checks.map((c) => JSON.stringify(c.checkId)).join(\", \");\n\n return [\n 'import { Project, Pipeline, ShellStep, Entry, push } from \"@sverka/workflow\";',\n \"\",\n 'const proj = new Project(\"verify\");',\n 'const ci = new Pipeline(proj, \"ci\");',\n ...stepLines,\n `new Entry(ci, \"on-push\", { trigger: push(), roots: [${rootList}] });`,\n \"\",\n \"export default proj;\",\n \"\",\n ].join(\"\\n\");\n}\n\n/** Resolve and validate the template name, returning its file content. */\nfunction resolveTemplateContent(template: string, pm: PmName): string {\n if (template !== \"minimal\" && template !== \"full\") {\n throw new CliError(\n `invalid template: ${template} (expected minimal|full)`,\n \"INVALID_FLAG\",\n ExitCode.UsageError,\n );\n }\n return template === \"full\" ? buildFullTemplate(pm) : buildMinimalTemplate(pm);\n}\n\n/** Write the config file, creating parent directories and using exclusive create when not forcing. */\nasync function writeConfig(\n configPath: string,\n content: string,\n force: boolean,\n): Promise<void> {\n if (existsSync(configPath) && !force) {\n throw new CliError(\n `config already exists: ${configPath} (use --force to overwrite)`,\n \"CONFIG_EXISTS\",\n ExitCode.UsageError,\n );\n }\n // Use exclusive create (wx) when not forcing to close the TOCTOU race\n // between existsSync and writeFile. With --force, use standard write.\n const flags: WriteFileOptions = force\n ? \"utf8\"\n : { encoding: \"utf8\", flag: \"wx\" };\n try {\n await mkdir(dirname(configPath), { recursive: true });\n await writeFile(configPath, content, flags);\n } catch (e) {\n if (\n e instanceof Error &&\n \"code\" in e &&\n (e as { code: string }).code === \"EEXIST\"\n ) {\n throw new CliError(\n `config already exists: ${configPath} (use --force to overwrite)`,\n \"CONFIG_EXISTS\",\n ExitCode.UsageError,\n e,\n );\n }\n throw e;\n }\n}\n\n/** Emit the init result in the requested output format. */\nfunction emitInitResult(\n output: OutputWriter,\n format: GlobalFlags[\"format\"],\n configPath: string,\n template: string,\n start: number,\n): void {\n if (format === \"json\") {\n output.writeLine(\n JSON.stringify({\n command: \"init\",\n data: { path: configPath, template },\n durationMs: Date.now() - start,\n }),\n );\n } else {\n output.writeLine(`Created ${configPath} (template: ${template})`);\n }\n}\n\n/** Resolve the config path relative to root, honoring an explicit --config. */\nfunction resolveConfigPath(root: string, config: string | null): string {\n const defaultPath = \"sverka.config.ts\";\n const selected = config ?? defaultPath;\n return isAbsolute(selected) ? selected : join(root, selected);\n}\n\n/**\n * Create a sverka.config.ts in the root directory.\n */\nexport async function initCommand(\n args: InitArgs,\n global: GlobalFlags,\n output: OutputWriter,\n start: number,\n): Promise<number> {\n const configPath = resolveConfigPath(global.root, global.config);\n\n // Fail fast if the config already exists and --force is not set before any\n // persistent side effects (e.g. mutating package.json) are applied.\n if (existsSync(configPath) && !args.force) {\n throw new CliError(\n `config already exists: ${configPath} (use --force to overwrite)`,\n \"CONFIG_EXISTS\",\n ExitCode.UsageError,\n );\n }\n\n let content: string;\n let template: string;\n\n if (args.detect) {\n // The scaffold root may not exist yet (e.g. a create-* style target\n // directory) — create it before detection reads from it.\n await mkdir(global.root, { recursive: true });\n output.debug(\n `init: root=${global.root} detect=true force=${Boolean(args.force)}`,\n );\n const detected = await buildDetectedTemplate(global.root);\n if (detected !== null) {\n content = detected;\n template = \"detect\";\n } else {\n output.debug(\n \"init: detection found no checks, falling back to minimal template\",\n );\n const pm = detectPackageManager(global.root);\n content = buildMinimalTemplate(pm);\n template = \"minimal\";\n }\n } else {\n template = args.template ?? \"minimal\";\n const pm = detectPackageManager(global.root);\n output.debug(\n `init: root=${global.root} template=${template} pm=${pm} force=${Boolean(args.force)}`,\n );\n // Resolve (and validate) the template before the root mkdir so an\n // invalid --template leaves no directory behind.\n content = resolveTemplateContent(template, pm);\n await mkdir(global.root, { recursive: true });\n }\n\n const declared = await ensureConstructsDependency(global.root);\n if (declared === null) {\n output.errorLine(\n \"note: could not resolve @sverka/workflow — the generated config imports it; install it (e.g. bun add -d @sverka/workflow) before running sverka\",\n );\n }\n await writeConfig(configPath, content, Boolean(args.force));\n emitInitResult(output, global.format, configPath, template, start);\n return ExitCode.Success;\n}\n","// validate command — synthesize Definition Graph, run validators.\n// Spec 17 — §30.\n\nimport { validateGraph } from \"@sverka/workflow\";\nimport type { GlobalFlags, OutputWriter } from \"../types.js\";\nimport { CliError, ExitCode } from \"../types.js\";\nimport { loadProjectGraph } from \"../internal/config.js\";\n\n/**\n * Validate a sverka config: synthesize the Definition Graph and run validators.\n * Exit 0 if valid, 2 if missing config, 3 if load/synthesis fails.\n */\nexport async function validateCommand(\n global: GlobalFlags,\n output: OutputWriter,\n start: number,\n): Promise<number> {\n output.debug(\n `validate: root=${global.root} config=${global.config ?? \"(auto)\"}`,\n );\n\n const { configPath, graph, warnings } = await loadProjectGraph(global);\n validateGraph(graph);\n\n const durationMs = Date.now() - start;\n if (global.format === \"json\") {\n output.writeLine(\n JSON.stringify({\n command: \"validate\",\n data: {\n path: configPath,\n valid: true,\n pipelines: graph.project.pipelines.length,\n warnings,\n },\n durationMs,\n }),\n );\n } else {\n for (const warning of warnings) {\n output.errorLine(`warning: ${warning}`);\n }\n output.writeLine(`Config valid: ${configPath}`);\n output.writeLine(` pipelines: ${graph.project.pipelines.length}`);\n for (const pipeline of graph.project.pipelines) {\n output.writeLine(\n ` ${pipeline.id}: ${pipeline.steps.length} steps, ${pipeline.entries.length} entries`,\n );\n }\n }\n\n return ExitCode.Success;\n}\n","// Graph helpers used by CLI commands.\n// Spec 17 — §30.\n\nimport type { DefinitionGraph } from \"@sverka/workflow\";\n\n/**\n * Return the id of the first entry found across all pipelines.\n * Returns `undefined` when the graph contains no entries.\n */\nexport function resolveDefaultEntryId(\n graph: DefinitionGraph,\n): string | undefined {\n for (const pipeline of graph.project.pipelines) {\n const entry = pipeline.entries[0];\n if (entry) return entry.id;\n }\n return undefined;\n}\n\n/**\n * Return whether an entry with the given id exists in the graph.\n */\nexport function entryExists(graph: DefinitionGraph, entryId: string): boolean {\n for (const pipeline of graph.project.pipelines) {\n for (const entry of pipeline.entries) {\n if (entry.id === entryId) return true;\n }\n }\n return false;\n}\n","// plan command — bind Entry + inputs → Run Plan, display steps.\n// Spec 17 — §30.\n\nimport { bindRunPlan } from \"@sverka/sdk\";\nimport type { GlobalFlags, OutputWriter } from \"../types.js\";\nimport { CliError, ExitCode } from \"../types.js\";\nimport { loadProjectGraph } from \"../internal/config.js\";\nimport { resolveDefaultEntryId, entryExists } from \"../internal/graph.js\";\n\nexport interface PlanArgs {\n entryId?: string;\n}\n\n/**\n * Bind an Entry and Inputs into a Run Plan and display it.\n */\nexport async function planCommand(\n args: PlanArgs,\n global: GlobalFlags,\n output: OutputWriter,\n start: number,\n): Promise<number> {\n output.debug(`plan: root=${global.root} entry=${args.entryId ?? \"(first)\"}`);\n\n const { graph } = await loadProjectGraph(global);\n\n const entryId = args.entryId ?? resolveDefaultEntryId(graph);\n if (!entryId) {\n throw new CliError(\n \"no entries in graph\",\n \"MISSING_ARG\",\n ExitCode.UsageError,\n );\n }\n if (!entryExists(graph, entryId)) {\n throw new CliError(\n `entry \"${entryId}\" not found in graph`,\n \"MISSING_ARG\",\n ExitCode.UsageError,\n );\n }\n\n const plan = bindRunPlan({ graph, entryId });\n\n const durationMs = Date.now() - start;\n if (global.format === \"json\") {\n output.writeLine(\n JSON.stringify({\n command: \"plan\",\n data: {\n id: plan.id,\n graphId: plan.graphId,\n entry: plan.entry,\n steps: plan.steps.map((s) => s.id),\n inputs: plan.inputs,\n },\n durationMs,\n }),\n );\n } else {\n output.writeLine(`Run Plan: ${plan.id}`);\n output.writeLine(` entry: ${plan.entry.id}`);\n output.writeLine(` steps: ${plan.steps.length}`);\n for (const step of plan.steps) {\n const deps =\n step.dependencies.length > 0\n ? ` (depends: ${step.dependencies.map((d) => d.producer).join(\", \")})`\n : \"\";\n output.writeLine(` - ${step.id}${deps}`);\n }\n }\n\n return ExitCode.Success;\n}\n","// graph command — display Definition Graph structure.\n// Spec 17 — §30.\n\nimport type { GlobalFlags, OutputWriter } from \"../types.js\";\nimport { ExitCode } from \"../types.js\";\nimport { loadProjectGraph } from \"../internal/config.js\";\n\n/**\n * Display the Definition Graph: pipelines, entries, steps, and dependencies.\n */\nexport async function graphCommand(\n global: GlobalFlags,\n output: OutputWriter,\n start: number,\n): Promise<number> {\n output.debug(`graph: root=${global.root}`);\n\n const { graph } = await loadProjectGraph(global);\n\n const durationMs = Date.now() - start;\n if (global.format === \"json\") {\n output.writeLine(\n JSON.stringify({\n command: \"graph\",\n data: graph,\n durationMs,\n }),\n );\n } else {\n output.writeLine(`Definition Graph: ${graph.project.id}`);\n for (const pipeline of graph.project.pipelines) {\n output.writeLine(` Pipeline: ${pipeline.id}`);\n output.writeLine(` entries:`);\n for (const entry of pipeline.entries) {\n output.writeLine(\n ` ${entry.id} (trigger: ${entry.trigger.kind}, roots: ${entry.roots.join(\", \")})`,\n );\n }\n output.writeLine(` steps:`);\n for (const step of pipeline.steps) {\n const deps =\n step.dependencies.length > 0\n ? ` → [${step.dependencies.map((d) => `${d.kind}:${d.producer}`).join(\", \")}]`\n : \"\";\n output.writeLine(` ${step.id}${deps}`);\n }\n }\n }\n\n return ExitCode.Success;\n}\n","import { spawnSync } from \"node:child_process\";\n\n/**\n * Check if a binary is available on PATH by spawning `<binary> --version`.\n * Returns true if the binary exists and exits 0, false otherwise.\n */\nexport function isBinaryAvailable(binary: string): boolean {\n const result = spawnSync(binary, [\"--version\"], {\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n encoding: \"utf8\",\n timeout: 5000,\n });\n return result.status === 0 && result.error === undefined;\n}\n","// Assemble ReportContext for the HTML report — git facts, CI links.\n// Everything is best-effort: missing git/CI info simply produces\n// fewer rows, never a failure.\n\nimport { spawnSync } from \"node:child_process\";\nimport process from \"node:process\";\nimport type { ReportContext } from \"@sverka/reporter\";\n\nfunction git(root: string, ...args: string[]): string | undefined {\n const res = spawnSync(\n \"git\", // NOSONAR — argv form, no shell; fixed binary name\n args,\n {\n cwd: root,\n encoding: \"utf-8\",\n // Best-effort context — a slow/blocked git must not stall the run.\n timeout: 2000,\n },\n );\n const out = res.status === 0 ? res.stdout?.trim() : undefined;\n return out || undefined;\n}\n\n/** Normalize a git remote URL (ssh or https) to a clickable web URL.\n * Credentials embedded in https remotes (user:token@host) are stripped. */\nfunction repoWebUrl(remote?: string): string | undefined {\n if (!remote) return undefined;\n const ssh = /^git@([^:]+):(.+?)(\\.git)?$/.exec(remote);\n if (ssh) return `https://${ssh[1]}/${ssh[2]}`;\n try {\n const url = new URL(remote);\n if (url.protocol !== \"http:\" && url.protocol !== \"https:\") {\n return undefined;\n }\n url.username = \"\";\n url.password = \"\";\n url.pathname = url.pathname.replace(/\\.git$/, \"\");\n return url.toString().replace(/\\/$/, \"\");\n } catch {\n return undefined;\n }\n}\n\nfunction collectLinks(\n repo: string | undefined,\n commit: string | undefined,\n): { label: string; url: string }[] {\n const links: { label: string; url: string }[] = [];\n if (repo) links.push({ label: \"Repo\", url: repo });\n if (repo && commit)\n links.push({ label: \"Commit\", url: `${repo}/commit/${commit}` });\n if (repo && process.env.GITHUB_RUN_ID)\n links.push({\n label: \"CI run\",\n url: `${repo}/actions/runs/${process.env.GITHUB_RUN_ID}`,\n });\n return links;\n}\n\nexport function collectReportContext(\n root: string,\n command: string,\n): ReportContext {\n const env = process.env;\n const ghRepo =\n env.GITHUB_SERVER_URL && env.GITHUB_REPOSITORY\n ? `${env.GITHUB_SERVER_URL}/${env.GITHUB_REPOSITORY}`\n : undefined;\n const repo = ghRepo ?? repoWebUrl(git(root, \"remote\", \"get-url\", \"origin\"));\n const commit = env.GITHUB_SHA ?? git(root, \"rev-parse\", \"HEAD\");\n const branch =\n env.GITHUB_REF_NAME ?? git(root, \"rev-parse\", \"--abbrev-ref\", \"HEAD\");\n\n const meta: { label: string; value: string }[] = [\n ...(branch ? [{ label: \"Branch\", value: branch }] : []),\n { label: \"Directory\", value: root },\n ];\n\n return {\n generatedAt: new Date().toISOString(),\n command,\n meta,\n links: collectLinks(repo, commit),\n };\n}\n","// Watch supervisor for `sverka run --watch` (Spec 53).\n// Re-runs on file change — debounced, coalesced, resilient: a failing run\n// is a result, not a crash. Only a config-load or synth error is reported\n// the same way; the loop keeps watching either way.\n\nimport { watch } from \"chokidar\";\nimport { CliError } from \"../types.js\";\nimport type { OutputWriter } from \"../types.js\";\n\nconst DEFAULT_IGNORED = [\n /(^|[/\\\\])\\.git([/\\\\]|$)/,\n /(^|[/\\\\])\\.sverka([/\\\\]|$)/,\n /(^|[/\\\\])node_modules([/\\\\]|$)/,\n /(^|[/\\\\])dist([/\\\\]|$)/,\n /(^|[/\\\\])coverage([/\\\\]|$)/,\n];\n\nexport interface WatchLoopOptions {\n /** Directory to watch (project root). */\n readonly root: string;\n /** Extra files/dirs to watch (e.g. a --config path outside root). */\n readonly extraPaths?: readonly string[];\n /** One run invocation. Re-invoked per change; may re-plan internally. */\n readonly run: () => Promise<number>;\n readonly output: OutputWriter;\n /** Debounce window in ms (Spec 53: 300). */\n readonly debounceMs?: number;\n /** Abort the loop — resolves with the last run's exit code. */\n readonly signal?: AbortSignal;\n /** Extra ignore patterns (appended to the built-in set). */\n readonly ignored?: readonly (string | RegExp)[];\n}\n\nexport interface WatchLoopHandle {\n /** Resolves once chokidar finished its initial scan — events before this\n * may be swallowed as scan noise. Tests should await it before writing. */\n readonly ready: Promise<void>;\n /** Resolves when `signal` aborts and any in-flight run settles — carries\n * the last run's exit code. */\n readonly done: Promise<number>;\n}\n\n/**\n * Watch `root` and re-run `run()` on changes. Never rejects on a run\n * failure — the failure is a result the user sees; the loop continues.\n * `done` resolves when `signal` aborts and the in-flight run (if any)\n * finished, so Ctrl+C never leaves a run printing after exit.\n */\nexport function watchLoop(opts: WatchLoopOptions): WatchLoopHandle {\n const debounceMs = opts.debounceMs ?? 300;\n const { output } = opts;\n\n let running = false;\n let pending = false;\n let stopped = false;\n let doneSettled = false;\n let lastCode = 0;\n let timer: ReturnType<typeof setTimeout> | undefined;\n let runCount = 0;\n let resolveDone: ((code: number) => void) | undefined;\n const done = new Promise<number>((resolve) => {\n resolveDone = resolve;\n });\n\n const clearTimer = (): void => {\n if (timer !== undefined) clearTimeout(timer);\n timer = undefined;\n };\n\n const settleDone = (code: number): void => {\n if (doneSettled) return;\n doneSettled = true;\n resolveDone?.(code);\n };\n\n const invoke = async (): Promise<void> => {\n if (running) {\n // Change while a run is in flight — coalesce into ONE follow-up run.\n pending = true;\n return;\n }\n running = true;\n pending = false;\n // A run now covers every change seen so far — a timer armed by those\n // same changes would launch a redundant follow-up.\n clearTimer();\n runCount++;\n // stderr: stdout stays clean for --format json consumers.\n output.errorLine(`watch: run #${runCount}`);\n try {\n lastCode = await opts.run();\n } catch (e) {\n // A failing run is a result, not a crash — keep watching.\n output.errorLine(\n `watch: run failed: ${e instanceof Error ? e.message : String(e)}`,\n );\n lastCode = e instanceof CliError ? e.exitCode : 1;\n }\n running = false;\n if (stopped) {\n settleDone(lastCode);\n return;\n }\n if (pending) await invoke();\n };\n\n const schedule = (): void => {\n if (stopped) return;\n clearTimer();\n timer = setTimeout(() => {\n timer = undefined;\n void invoke();\n }, debounceMs);\n };\n\n const watcher = watch([opts.root, ...(opts.extraPaths ?? [])], {\n ignoreInitial: true,\n ignored: [...DEFAULT_IGNORED, ...(opts.ignored ?? [])],\n });\n let resolveReady: (() => void) | undefined;\n const ready = new Promise<void>((resolve) => {\n resolveReady = resolve;\n });\n watcher.on(\"ready\", () => resolveReady?.());\n watcher.on(\"all\", schedule);\n watcher.on(\"error\", (e) => {\n output.errorLine(\n `watch: watcher error: ${e instanceof Error ? e.message : String(e)}`,\n );\n });\n\n const stop = async (): Promise<void> => {\n if (stopped) return;\n stopped = true;\n clearTimer();\n await watcher.close();\n // If a run is in flight, invoke() settles `done` when it finishes so\n // its output isn't cut mid-flight.\n if (!running) settleDone(lastCode);\n };\n // An already-aborted signal never fires \"abort\" again — honor it\n // up-front instead of starting a run whose `done` would never resolve.\n if (opts.signal?.aborted === true) {\n stopped = true;\n void watcher.close();\n settleDone(lastCode);\n return { ready, done };\n }\n opts.signal?.addEventListener(\"abort\", () => void stop(), { once: true });\n\n // First run happens immediately — the watcher's job is re-runs.\n void invoke();\n\n return { ready, done };\n}\n","// run command — execute Run Plan through native engine.\n// Spec 17 — §30.\n\nimport process from \"node:process\";\nimport { join, dirname, resolve } from \"node:path\";\nimport { writeFileSync, mkdirSync } from \"node:fs\";\nimport type { DefinitionGraph } from \"@sverka/workflow\";\nimport type { RuntimeDriver } from \"@sverka/runtime\";\nimport { createEngine } from \"@sverka/runtime\";\nimport type { RunEvent } from \"@sverka/runtime\";\nimport { createHostDriver } from \"@sverka/runtime\";\nimport type { CommandAllowlist } from \"@sverka/runtime\";\nimport { createDockerDriver } from \"@sverka/runtime\";\nimport { bindRunPlan } from \"@sverka/sdk\";\nimport type { Renderer, FindingRow } from \"@sverka/reporter\";\nimport type { Finding } from \"@sverka/verification\";\nimport { serializeSarif } from \"@sverka/verification\";\nimport type { GlobalFlags, OutputWriter } from \"../types.js\";\nimport { CliError, ExitCode } from \"../types.js\";\nimport { loadProjectGraph } from \"../internal/config.js\";\nimport { resolveDefaultEntryId, entryExists } from \"../internal/graph.js\";\nimport { isBinaryAvailable } from \"../internal/runtime-check.js\";\nimport { collectReportContext } from \"../internal/report-context.js\";\nimport { watchLoop } from \"../internal/watch.js\";\n\nexport interface RunArgs {\n entryId?: string;\n executor?: \"host\" | \"docker\";\n evaluate?: boolean;\n output?: string;\n /** Enable the interactive TUI (opt-in; default output is plain text). */\n tui?: boolean;\n /** Re-run on file changes (Spec 53: debounced, keeps watching on failure). */\n watch?: boolean;\n /** Max steps running concurrently (--jobs). */\n jobs?: number;\n /** Captured stdout/stderr tail lines printed per step (0 disables). */\n stepOutputLines?: number;\n}\n\n/** Pure-argument guards — an invalid flag fails fast instead of surfacing\n * as a recurring run failure inside the watch supervisor. */\nfunction validateRunFlags(args: RunArgs): void {\n if (\n args.jobs !== undefined &&\n (!Number.isInteger(args.jobs) || args.jobs < 1 || args.jobs > 64)\n ) {\n throw new CliError(\n \"--jobs must be an integer in [1, 64]\",\n \"INVALID_FLAG\",\n ExitCode.UsageError,\n );\n }\n if (\n args.stepOutputLines !== undefined &&\n (!Number.isInteger(args.stepOutputLines) || args.stepOutputLines < 0)\n ) {\n throw new CliError(\n \"--step-output-lines must be a non-negative integer\",\n \"INVALID_FLAG\",\n ExitCode.UsageError,\n );\n }\n}\n\n/**\n * Execute a Run Plan through the native engine and print events.\n */\nexport async function runCommand(\n args: RunArgs,\n global: GlobalFlags,\n output: OutputWriter,\n start: number,\n): Promise<number> {\n validateRunFlags(args);\n if (args.watch === true) {\n // Dispatch before any graph load: an invalid config is a run result,\n // not a reason to kill the watcher.\n return runWatch(args, global, output);\n }\n const executor = args.executor ?? \"host\";\n // --format html or --output (without sarif/web) implies HTML format\n const isSarif = global.format === \"sarif\";\n const isWeb = global.format === \"web\";\n const isHtml =\n global.format === \"html\" ||\n (args.output !== undefined && !isSarif && !isWeb);\n const evaluate = args.evaluate || isHtml || isSarif || isWeb;\n output.debug(\n `run: root=${global.root} executor=${executor} entry=${args.entryId ?? \"(first)\"} format=${global.format}`,\n );\n\n assertExecutorAvailable(executor);\n\n const { graph, warnings } = await loadProjectGraph(global);\n for (const warning of warnings) {\n output.errorLine(`warning: ${warning}`);\n }\n const entryId = resolveEntryId(graph, args.entryId);\n\n const plan = bindRunPlan({ graph, entryId });\n\n // Use the project root as the engine workspace so executed commands run\n // against the checked-out project. The engine places per-step scratch\n // directories under .sverka/workspace inside the root.\n const workspace = global.root;\n const artifactDir = join(global.root, \".sverka\", \"artifacts\");\n\n const engine = createEngine({\n drivers: buildDrivers(executor),\n maxConcurrent: args.jobs ?? 4,\n });\n\n const { events, runStatus, renderer } = await consumeEvents(\n engine,\n plan,\n { workspace, artifactDir },\n global,\n output,\n graph,\n args,\n );\n\n const durationMs = Date.now() - start;\n\n // If --evaluate (or --format html), collect findings and run policy gate\n let policyExitCode = 0;\n let evalResult: {\n findings: readonly Finding[];\n verdict: string;\n summary: string;\n } | null = null;\n let collectionFailed = false;\n if (evaluate) {\n const result = await runEvaluation(\n artifactDir,\n global,\n output,\n events,\n renderer,\n args,\n );\n policyExitCode = result.exitCode;\n evalResult = result.summary;\n collectionFailed =\n result.summary === null && result.exitCode === ExitCode.RuntimeError;\n }\n\n // Flush the renderer (HtmlRenderer writes the file on flush)\n renderer?.flush();\n\n // Tell the user where the HTML report went (sarif/web print their own).\n if (isHtml && renderer) {\n const reportPath =\n args.output ?? join(global.root, \".sverka\", \"report.html\");\n output.writeLine(`Wrote HTML report to ${reportPath}`);\n }\n\n // Interactive renderers stay mounted until the user quits (q / Ctrl+C).\n if (renderer && \"waitUntilExit\" in renderer) {\n await (renderer as { waitUntilExit(): Promise<void> }).waitUntilExit();\n }\n\n // When --evaluate fails with a collection error, the error was already\n // written in the requested format — skip normal output and return.\n if (collectionFailed) {\n return policyExitCode;\n }\n\n writeRunOutput(\n plan.id,\n runStatus,\n events,\n durationMs,\n global,\n output,\n evalResult,\n );\n\n // When --evaluate is set, policy exit code takes precedence\n if (evaluate && policyExitCode !== 0) {\n return policyExitCode;\n }\n\n return exitCodeForStatus(runStatus);\n}\n\n/**\n * Watch mode (Spec 53): delegate to the supervisor, which re-invokes\n * runCommand per change — each cycle re-plans, so sverka.config.ts edits\n * are picked up too. Ctrl+C aborts the watcher and exits cleanly.\n */\nasync function runWatch(\n args: RunArgs,\n global: GlobalFlags,\n output: OutputWriter,\n): Promise<number> {\n if (args.tui === true) {\n throw new CliError(\n \"--watch is incompatible with --tui (the TUI owns the terminal until exit)\",\n \"INVALID_FLAG\",\n ExitCode.UsageError,\n );\n }\n const ac = new AbortController();\n let forced = false;\n const onSigint = () => {\n // First Ctrl+C asks the watcher to stop gracefully — the in-flight\n // run settles and its code wins. A second Ctrl+C means the user wants\n // out now: a hung run must not pin the terminal.\n if (forced) process.exit(130);\n forced = true;\n ac.abort();\n };\n process.on(\"SIGINT\", onSigint);\n try {\n // An explicit --config outside the watched root would otherwise never\n // retrigger a re-plan. Resolve against the root, same as the loader.\n const configPath =\n global.config === null ? null : resolve(global.root, global.config);\n const extraPaths =\n configPath !== null && !configPath.startsWith(`${resolve(global.root)}/`)\n ? [configPath]\n : [];\n // An in-root --output file is rewritten by every run — watching it\n // would make the run's own artifact retrigger the loop forever.\n const ignored: string[] = [];\n if (args.output !== undefined) {\n const out = resolve(global.root, args.output);\n if (out.startsWith(`${resolve(global.root)}/`)) ignored.push(out);\n }\n const watcher = watchLoop({\n root: global.root,\n extraPaths,\n ignored,\n output,\n signal: ac.signal,\n run: () =>\n runCommand({ ...args, watch: false }, global, output, Date.now()),\n });\n return await watcher.done;\n } finally {\n process.removeListener(\"SIGINT\", onSigint);\n }\n}\n\nfunction assertExecutorAvailable(executor: \"host\" | \"docker\"): void {\n if (executor === \"docker\" && !isBinaryAvailable(\"docker\")) {\n throw new CliError(\n \"docker executor not available (docker not found on PATH)\",\n \"RUNTIME_NOT_AVAILABLE\",\n ExitCode.RuntimeError,\n );\n }\n}\n\nfunction resolveEntryId(graph: DefinitionGraph, entryId?: string): string {\n const resolved = entryId ?? resolveDefaultEntryId(graph);\n if (!resolved) {\n throw new CliError(\n \"no entries in graph\",\n \"MISSING_ARG\",\n ExitCode.UsageError,\n );\n }\n if (!entryExists(graph, resolved)) {\n throw new CliError(\n `entry \"${resolved}\" not found in graph`,\n \"MISSING_ARG\",\n ExitCode.UsageError,\n );\n }\n return resolved;\n}\n\nfunction buildDrivers(executor: \"host\" | \"docker\"): RuntimeDriver[] {\n // Permissive allowlist: the CLI trusts the user's config.\n // The allowlist is a security boundary for untrusted input; the CLI\n // runs the user's own workflow definition.\n const permissiveAllowlist: CommandAllowlist = {\n entries: [],\n isAllowed: () => true,\n };\n\n const hostDriver = createHostDriver({\n enabled: true,\n allowlist: permissiveAllowlist,\n envAllowlist: [\n \"PATH\",\n \"HOME\",\n \"USER\",\n \"SHELL\",\n \"TMPDIR\",\n \"XDG_CONFIG_HOME\",\n \"XDG_CACHE_HOME\",\n \"XDG_DATA_HOME\",\n \"XDG_STATE_HOME\",\n \"XDG_RUNTIME_DIR\",\n ],\n });\n\n const drivers: RuntimeDriver[] = [hostDriver];\n if (executor === \"docker\") {\n drivers.push(createDockerDriver({}));\n }\n return drivers;\n}\n\ninterface RunContext {\n workspace: string;\n artifactDir: string;\n}\n\nasync function consumeEvents(\n engine: ReturnType<typeof createEngine>,\n plan: ReturnType<typeof bindRunPlan>,\n ctx: RunContext,\n global: GlobalFlags,\n output: OutputWriter,\n graph: DefinitionGraph,\n args: RunArgs,\n): Promise<{\n events: RunEvent[];\n runStatus: string;\n renderer: Renderer | null;\n}> {\n const events: RunEvent[] = [];\n let runStatus = \"failure\";\n\n // Lazy-import the reporter (~700ms via ink/react) — only paid on `run`.\n const { createTextRenderer, createHtmlRenderer, createInkRenderer } =\n await import(\"@sverka/reporter\");\n let renderer: Renderer | null = null;\n\n // --output flag implies HTML format (unless sarif/web format is explicit)\n const isSarif = global.format === \"sarif\";\n const isWeb = global.format === \"web\";\n const isHtml =\n global.format === \"html\" ||\n (args.output !== undefined && !isSarif && !isWeb);\n\n // TUI is strictly opt-in via --tui: `sverka run` prints plain text on\n // every stream, TTY included. Any non-text --format wins over --tui,\n // and --quiet suppresses the TUI (Ink writes to stdout, bypassing the\n // quiet-filtered writer).\n const tuiWanted =\n args.tui === true &&\n !global.quiet &&\n !isHtml &&\n !isSarif &&\n !isWeb &&\n global.format === \"text\";\n\n // ANSI colors only on a real terminal that hasn't opted out.\n const color =\n process.stdout.isTTY === true &&\n process.env.NO_COLOR === undefined &&\n process.env.TERM !== \"dumb\";\n const textRenderer = () =>\n createTextRenderer({\n writer: output,\n color,\n ...(args.stepOutputLines !== undefined\n ? { stepOutputLines: args.stepOutputLines }\n : {}),\n });\n\n if (tuiWanted) {\n try {\n renderer = createInkRenderer({ graph });\n } catch {\n renderer = textRenderer();\n }\n } else if (global.format === \"text\" && !isHtml) {\n renderer = textRenderer();\n } else if (isHtml) {\n const outputPath =\n args.output ?? join(global.root, \".sverka\", \"report.html\");\n renderer = createHtmlRenderer({\n outputPath,\n graph,\n context: collectReportContext(\n global.root,\n `sverka ${process.argv.slice(2).join(\" \")}`,\n ),\n });\n }\n\n for await (const event of engine.run({\n plan,\n workspace: ctx.workspace,\n artifactDir: ctx.artifactDir,\n })) {\n events.push(event);\n renderer?.onEvent(event);\n if ((event as { type: string }).type === \"run-completed\") {\n runStatus = (event as { status: string }).status;\n }\n }\n\n return { events, runStatus, renderer };\n}\n\nasync function runEvaluation(\n artifactDir: string,\n global: GlobalFlags,\n output: OutputWriter,\n _events: readonly RunEvent[],\n renderer: Renderer | null,\n args: RunArgs,\n): Promise<{\n exitCode: number;\n summary: {\n findings: readonly Finding[];\n verdict: string;\n summary: string;\n } | null;\n}> {\n const { collectFindings, evaluateGate, ReporterError } =\n await import(\"@sverka/reporter\");\n let rows: readonly FindingRow[];\n try {\n rows = await collectFindings({ artifactDir });\n } catch (e) {\n if (e instanceof ReporterError) {\n if (global.format === \"json\") {\n output.writeLine(\n JSON.stringify({\n command: \"run\",\n error: \"COLLECTION_FAILED\",\n message: e.message,\n }),\n );\n } else {\n output.writeLine(`Collection failed: ${e.message}`);\n }\n return {\n exitCode: ExitCode.RuntimeError,\n summary: null,\n };\n }\n throw e;\n }\n const findings = rows.map((r) => r.finding);\n\n const { result, exitCode } = evaluateGate({ findings });\n\n // Pass findings and verdict to the existing renderer (no replay)\n if (renderer) {\n renderer.onFindings(findings);\n renderer.onVerdict(result);\n renderer.flush();\n }\n\n // --format sarif: serialize findings to SARIF and write to file\n if (global.format === \"sarif\") {\n const sarifPath =\n args.output ?? join(global.root, \".sverka\", \"findings.sarif\");\n const sarifLog = serializeSarif(findings);\n mkdirSync(dirname(sarifPath), { recursive: true });\n writeFileSync(sarifPath, JSON.stringify(sarifLog, null, 2), \"utf-8\");\n output.writeLine(`Wrote SARIF to ${sarifPath}`);\n }\n\n // --format web: generate HTML report using @sverka/sarif-viewer-web\n if (global.format === \"web\") {\n const webPath = args.output ?? join(global.root, \".sverka\", \"report.html\");\n try {\n const { generateSarifHtml } = await import(\"@sverka/sarif-viewer-web\");\n const html = generateSarifHtml(findings);\n mkdirSync(dirname(webPath), { recursive: true });\n writeFileSync(webPath, html, \"utf-8\");\n output.writeLine(`Wrote HTML report to ${webPath}`);\n } catch (e) {\n output.errorLine(\n `sverka run: failed to generate web report: ${e instanceof Error ? e.message : String(e)}`,\n );\n return {\n exitCode: 1,\n summary: { findings, verdict: result.verdict, summary: result.summary },\n };\n }\n }\n\n return {\n exitCode,\n summary: { findings, verdict: result.verdict, summary: result.summary },\n };\n}\n\nconst SIMPLE_STEP_STATUSES: Readonly<Record<string, StepSummary[\"status\"]>> = {\n \"step-skipped\": \"skipped\",\n \"step-cancelled\": \"cancelled\",\n \"step-suspended\": \"suspended\",\n};\n\n/** Extract per-step results from the event stream for JSON output. */\nfunction summarizeSteps(events: readonly RunEvent[]): readonly StepSummary[] {\n const steps: StepSummary[] = [];\n for (const event of events) {\n const step = summarizeStep(event);\n if (step !== undefined) steps.push(step);\n }\n return steps;\n}\n\nfunction summarizeStep(event: RunEvent): StepSummary | undefined {\n if (event.type === \"step-succeeded\" || event.type === \"step-failed\") {\n return {\n stepId: event.stepId,\n status: event.type === \"step-succeeded\" ? \"succeeded\" : \"failed\",\n durationMs: event.durationMs,\n ...(event.type === \"step-failed\" ? { error: event.error } : {}),\n ...capturedOutputFields(event),\n };\n }\n if (event.type === \"step-cache-hit\") {\n return { stepId: event.stepId, status: \"cache-hit\", cacheKey: event.key };\n }\n const status = SIMPLE_STEP_STATUSES[event.type];\n if (status === undefined || !(\"stepId\" in event)) return undefined;\n return { stepId: event.stepId, status };\n}\n\nfunction capturedOutputFields(event: {\n stdout?: string;\n stderr?: string;\n exitCode?: number;\n}): Pick<StepSummary, \"stdout\" | \"stderr\" | \"exitCode\"> {\n return {\n ...(event.stdout !== undefined ? { stdout: event.stdout } : {}),\n ...(event.stderr !== undefined ? { stderr: event.stderr } : {}),\n ...(event.exitCode !== undefined ? { exitCode: event.exitCode } : {}),\n };\n}\n\ninterface StepSummary {\n readonly stepId: string;\n readonly status:\n | \"succeeded\"\n | \"failed\"\n | \"skipped\"\n | \"cancelled\"\n | \"suspended\"\n | \"cache-hit\";\n readonly durationMs?: number;\n readonly error?: string;\n readonly cacheKey?: string;\n readonly stdout?: string;\n readonly stderr?: string;\n readonly exitCode?: number;\n}\n\nfunction writeRunOutput(\n planId: string,\n runStatus: string,\n events: readonly RunEvent[],\n durationMs: number,\n global: GlobalFlags,\n output: OutputWriter,\n evalResult: {\n findings: readonly Finding[];\n verdict: string;\n summary: string;\n } | null,\n): void {\n if (global.format === \"json\") {\n const steps = summarizeSteps(events);\n output.writeLine(\n JSON.stringify({\n command: \"run\",\n data: {\n planId,\n status: runStatus,\n steps,\n ...(evalResult\n ? {\n findings: evalResult.findings.length,\n verdict: evalResult.verdict,\n summary: evalResult.summary,\n }\n : {}),\n },\n durationMs,\n }),\n );\n }\n // Text format: renderer already printed all output including run-completed line.\n // No additional summary needed.\n}\n\nfunction exitCodeForStatus(runStatus: string): ExitCode {\n if (runStatus === \"success\") return ExitCode.Success;\n if (runStatus === \"failure\") return ExitCode.PolicyFail;\n return ExitCode.RuntimeError;\n}\n","// discover command — run planner discovery, show project context.\n// Spec 17 — §30.\n\nimport { createPlanner } from \"@sverka/sdk\";\nimport type { GlobalFlags, OutputWriter } from \"../types.js\";\nimport { ExitCode } from \"../types.js\";\n\n/**\n * Discover project context and display it.\n */\nexport async function discoverCommand(\n global: GlobalFlags,\n output: OutputWriter,\n start: number,\n): Promise<number> {\n output.debug(`discover: root=${global.root}`);\n\n const planner = createPlanner();\n const ctx = await planner.discover({ root: global.root });\n\n const durationMs = Date.now() - start;\n if (global.format === \"json\") {\n output.writeLine(\n JSON.stringify({\n command: \"discover\",\n data: {\n root: ctx.root,\n commit: ctx.commit,\n dirty: ctx.dirty,\n languages: ctx.languages,\n packageManagers: ctx.packageManagers,\n hasContainerBuild: ctx.hasContainerBuild,\n hasCiDefinition: ctx.hasCiDefinition,\n monorepo: ctx.monorepo,\n changedFiles: ctx.changedFiles.length,\n },\n durationMs,\n }),\n );\n } else {\n output.writeLine(`Project: ${ctx.root}`);\n output.writeLine(` commit: ${ctx.commit || \"(none)\"}`);\n output.writeLine(` dirty: ${ctx.dirty}`);\n output.writeLine(\n ` languages: ${ctx.languages.map((l: { name: string }) => l.name).join(\", \") || \"(none)\"}`,\n );\n output.writeLine(\n ` package managers: ${ctx.packageManagers.map((p: { name: string }) => p.name).join(\", \") || \"(none)\"}`,\n );\n output.writeLine(` container build: ${ctx.hasContainerBuild}`);\n output.writeLine(` CI definition: ${ctx.hasCiDefinition}`);\n if (ctx.monorepo) {\n output.writeLine(\n ` monorepo: ${ctx.monorepo.tool} (${ctx.monorepo.workspaces.length} workspaces)`,\n );\n }\n output.writeLine(` changed files: ${ctx.changedFiles.length}`);\n }\n\n return ExitCode.Success;\n}\n","// check command — detect project checks and show proposed steps.\n// Spec 17 — §30.\n\nimport type { GlobalFlags, OutputWriter } from \"../types.js\";\nimport { ExitCode } from \"../types.js\";\nimport { detectProjectChecks } from \"../internal/detect.js\";\n\n/**\n * Discover project checks (planner + package.json scripts) and display the\n * steps they would become — the same detection `init --detect` uses.\n */\nexport async function checkCommand(\n global: GlobalFlags,\n output: OutputWriter,\n start: number,\n): Promise<number> {\n output.debug(`check: root=${global.root}`);\n\n const checks = await detectProjectChecks(global.root);\n\n const durationMs = Date.now() - start;\n if (global.format === \"json\") {\n output.writeLine(\n JSON.stringify({\n command: \"check\",\n data: {\n proposed: checks.map((c) => c.checkId),\n resolved: checks.map((c) => ({ id: c.checkId, command: c.command })),\n },\n durationMs,\n }),\n );\n } else {\n output.writeLine(`Proposed checks: ${checks.length}`);\n for (const c of checks) {\n output.writeLine(` - ${c.checkId} (${c.source}): ${c.command}`);\n }\n }\n\n return ExitCode.Success;\n}\n","// policy command — evaluate findings against policy.\n// Spec 17 — §30.\n\nimport { existsSync } from \"node:fs\";\nimport { readFile } from \"node:fs/promises\";\nimport { DEFAULT_POLICY, evaluatePolicy } from \"@sverka/verification\";\nimport { loadBaseline, normalizeSarif } from \"@sverka/verification\";\nimport type { Finding, NormalizeContext, SarifLog } from \"@sverka/verification\";\nimport type { GlobalFlags, OutputWriter } from \"../types.js\";\nimport { CliError, ExitCode } from \"../types.js\";\nimport { resolveUnderRoot } from \"../internal/paths.js\";\n\nexport interface PolicyArgs {\n findings: string;\n baseline?: string;\n}\n\n/**\n * Evaluate findings against the default policy.\n * In v0, this is a placeholder — findings come from a baseline file\n * or are empty (no execution output to extract from yet).\n */\nexport async function policyCommand(\n args: PolicyArgs,\n global: GlobalFlags,\n output: OutputWriter,\n start: number,\n): Promise<number> {\n output.debug(\n `policy: root=${global.root} findings=${args.findings} baseline=${args.baseline ?? \"(none)\"}`,\n );\n\n const findingsPath = resolveUnderRoot(global.root, args.findings);\n const raw = await loadFindingsFile(findingsPath);\n\n const ctx: NormalizeContext = {\n root: global.root,\n checkIdPrefix: \"\",\n defaultConfidence: 0.5,\n };\n const findings = normalizeFindings(raw, ctx);\n const baselineFingerprints = await loadBaselineFingerprints(\n global.root,\n args.baseline,\n );\n\n const result = evaluatePolicy(findings, DEFAULT_POLICY, [\n ...baselineFingerprints,\n ]);\n\n const durationMs = Date.now() - start;\n writePolicyOutput(result, global, output, durationMs);\n\n return result.verdict === \"pass\" ? ExitCode.Success : ExitCode.PolicyFail;\n}\n\nasync function loadFindingsFile(findingsPath: string): Promise<unknown> {\n if (!existsSync(findingsPath)) {\n throw new CliError(\n `findings file not found: ${findingsPath}`,\n \"MISSING_ARG\",\n ExitCode.UsageError,\n );\n }\n try {\n return JSON.parse(await readFile(findingsPath, \"utf8\"));\n } catch (e) {\n throw new CliError(\n `failed to parse findings file: ${e instanceof Error ? e.message : String(e)}`,\n \"SDK_ERROR\",\n ExitCode.RuntimeError,\n e,\n );\n }\n}\n\nfunction normalizeFindings(\n raw: unknown,\n ctx: NormalizeContext,\n): readonly Finding[] {\n try {\n return normalizeSarif(raw as SarifLog, ctx);\n } catch (e) {\n throw new CliError(\n `failed to normalize findings: ${e instanceof Error ? e.message : String(e)}`,\n \"SDK_ERROR\",\n ExitCode.RuntimeError,\n e,\n );\n }\n}\n\nasync function loadBaselineFingerprints(\n root: string,\n baseline?: string,\n): Promise<readonly string[]> {\n if (!baseline) return [];\n const baselinePath = resolveUnderRoot(root, baseline);\n try {\n const loaded = await loadBaseline(baselinePath);\n return loaded.fingerprints;\n } catch (e) {\n throw new CliError(\n `failed to load baseline: ${e instanceof Error ? e.message : String(e)}`,\n \"SDK_ERROR\",\n ExitCode.RuntimeError,\n e,\n );\n }\n}\n\nfunction writePolicyOutput(\n result: ReturnType<typeof evaluatePolicy>,\n global: GlobalFlags,\n output: OutputWriter,\n durationMs: number,\n): void {\n if (global.format === \"json\") {\n output.writeLine(\n JSON.stringify({\n command: \"policy\",\n data: {\n verdict: result.verdict,\n summary: result.summary,\n triggered: result.triggered.length,\n },\n durationMs,\n }),\n );\n } else {\n output.writeLine(`Policy: ${result.verdict}`);\n output.writeLine(` ${result.summary}`);\n }\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { GithubStep, GithubTargetConfig } from \"@sverka/compiler\";\n\n/**\n * Detect the toolchain setup a generated GitHub workflow needs on a clean\n * runner: the package-manager action + dependency install, and recursive\n * submodule checkout when the repo has .gitmodules.\n *\n * The declared `packageManager` version is honored where the toolchain\n * supports it: `bun-version` for bun, Corepack for pnpm/yarn (both read the\n * `packageManager` field), and an explicit global install for npm.\n *\n * Always emits `checkoutWith` with `persist-credentials: false` —\n * generated YAML never persists the GITHUB_TOKEN, even when nothing else\n * was detected.\n */\nexport function detectCiSetup(root: string): GithubTargetConfig {\n const setup = detectPackageManagerSetup(root);\n // Least privilege on every generated workflow — persisted checkout\n // credentials leave the GITHUB_TOKEN readable by later steps.\n const checkoutWith = existsSync(join(root, \".gitmodules\"))\n ? { \"persist-credentials\": false, submodules: \"recursive\" }\n : { \"persist-credentials\": false };\n return {\n ...(setup.length > 0 ? { setup } : {}),\n checkoutWith,\n };\n}\n\nfunction detectPackageManagerSetup(root: string): GithubStep[] {\n const { name, version } = detectPackageManager(root);\n if (name === \"bun\") return bunSteps(version);\n if (name === undefined) return [];\n const node = setupNodeStep(root);\n switch (name) {\n case \"pnpm\":\n return pnpmSteps(version, node);\n case \"yarn\":\n return yarnSteps(version, node);\n case \"npm\":\n return npmSteps(root, version, node);\n default:\n return [];\n }\n}\n\n/** setup-node step — pins Node from engines.node (a semver range), else lts. */\nfunction setupNodeStep(root: string): GithubStep {\n return {\n name: \"Setup Node\",\n uses: \"actions/setup-node@v7\",\n with: { \"node-version\": nodeVersion(root) },\n };\n}\n\nfunction nodeVersion(root: string): string {\n try {\n const raw = readFileSync(join(root, \"package.json\"), \"utf8\");\n const engines = (JSON.parse(raw) as { engines?: { node?: unknown } })\n .engines?.node;\n if (typeof engines === \"string\" && engines.trim() !== \"\") return engines;\n } catch {\n // fall through to lts\n }\n return \"lts/*\";\n}\n\nfunction bunSteps(version?: string): GithubStep[] {\n return [\n {\n name: \"Setup Bun\",\n uses: \"oven-sh/setup-bun@v2\",\n ...(version ? { with: { \"bun-version\": version } } : {}),\n },\n {\n name: \"Install dependencies\",\n run: \"bun install --frozen-lockfile --ignore-scripts\",\n },\n ];\n}\n\nfunction pnpmSteps(\n version: string | undefined,\n node: GithubStep,\n): GithubStep[] {\n // pnpm/action-setup reads the version from the packageManager field;\n // the version input is required when the field is absent.\n return [\n {\n name: \"Setup pnpm\",\n uses: \"pnpm/action-setup@v4\",\n ...(version ? {} : { with: { version: \"latest\" } }),\n },\n node,\n {\n name: \"Install dependencies\",\n run: \"pnpm install --frozen-lockfile --ignore-scripts\",\n },\n ];\n}\n\nfunction yarnSteps(\n version: string | undefined,\n node: GithubStep,\n): GithubStep[] {\n // Corepack activates the yarn version declared in packageManager.\n return [\n node,\n ...(version\n ? [{ name: \"Enable Corepack\", run: \"corepack enable\" } as GithubStep]\n : []),\n { name: \"Install dependencies\", run: \"yarn install\" },\n ];\n}\n\nfunction npmSteps(\n root: string,\n version: string | undefined,\n node: GithubStep,\n): GithubStep[] {\n return [\n node,\n ...(version\n ? [\n {\n name: \"Pin npm\",\n run: `npm install -g \"npm@${version}\"`,\n } as GithubStep,\n ]\n : []),\n {\n name: \"Install dependencies\",\n run: existsSync(join(root, \"package-lock.json\"))\n ? \"npm ci --ignore-scripts\"\n : \"npm install --ignore-scripts\",\n },\n ];\n}\n\ninterface DetectedPm {\n name: \"bun\" | \"pnpm\" | \"yarn\" | \"npm\";\n version?: string;\n}\n\nfunction detectPackageManager(root: string): Partial<DetectedPm> {\n const declared = packageManagerField(root);\n if (declared) return declared;\n if (\n existsSync(join(root, \"bun.lock\")) ||\n existsSync(join(root, \"bun.lockb\"))\n ) {\n return { name: \"bun\" };\n }\n if (existsSync(join(root, \"pnpm-lock.yaml\"))) return { name: \"pnpm\" };\n if (existsSync(join(root, \"yarn.lock\"))) return { name: \"yarn\" };\n if (existsSync(join(root, \"package-lock.json\"))) return { name: \"npm\" };\n if (existsSync(join(root, \"package.json\"))) return { name: \"npm\" };\n return {};\n}\n\nfunction packageManagerField(root: string): DetectedPm | undefined {\n try {\n const raw = readFileSync(join(root, \"package.json\"), \"utf8\");\n const pm = (JSON.parse(raw) as { packageManager?: unknown }).packageManager;\n if (typeof pm !== \"string\") return undefined;\n const [name, version] = pm.split(\"@\");\n if (\n name === \"bun\" ||\n name === \"pnpm\" ||\n name === \"yarn\" ||\n name === \"npm\"\n ) {\n return version !== undefined ? { name, version } : { name };\n }\n } catch {\n // no readable package.json — fall through to lockfile detection\n }\n return undefined;\n}\n","import { constants } from \"node:fs\";\nimport {\n mkdir,\n open,\n realpath,\n writeFile,\n type FileHandle,\n} from \"node:fs/promises\";\nimport { dirname, isAbsolute, join, relative, resolve } from \"node:path\";\nimport { compileGithub, compileGitlab } from \"@sverka/compiler\";\nimport type { CompilationResult } from \"@sverka/compiler\";\nimport type { GlobalFlags, OutputWriter } from \"../types.js\";\nimport { CliError, ExitCode } from \"../types.js\";\nimport { loadProjectGraph } from \"../internal/config.js\";\nimport { detectCiSetup } from \"../internal/ci-setup.js\";\n\n/** Args parsed for the compile command. */\nexport interface CompileArgs {\n target: string;\n output?: string | undefined;\n /**\n * Write each artifact to `<outputDir>/<artifact path>` instead of\n * gluing all artifacts into one stdout/file. Mutually exclusive with\n * `output`; required once a project defines more than one pipeline.\n */\n outputDir?: string | undefined;\n /** Pin GitHub action refs to commit SHAs (github target only). */\n pin?: boolean;\n}\n\n/** Compile the Definition Graph to a target CI YAML. */\nexport async function compileCommand(\n args: CompileArgs,\n global: GlobalFlags,\n output: OutputWriter,\n start: number,\n): Promise<number> {\n const target = args.target;\n if (target !== \"github\" && target !== \"gitlab\") {\n throw new CliError(\n `invalid compile target: ${target} (expected github or gitlab)`,\n \"INVALID_FLAG\",\n ExitCode.UsageError,\n );\n }\n if (args.output && args.outputDir) {\n throw new CliError(\n \"--output and --output-dir are mutually exclusive\",\n \"INVALID_FLAG\",\n ExitCode.UsageError,\n );\n }\n\n output.debug(\n `compile: root=${global.root} target=${target} output=${args.output ?? \"stdout\"}`,\n );\n\n const { graph } = await loadProjectGraph(global);\n\n // GitHub runners start empty — inject detected toolchain setup (bun/npm/…\n // install) and submodule checkout so the generated YAML actually runs.\n const result: CompilationResult =\n target === \"github\"\n ? compileGithub(graph, {\n ...detectCiSetup(global.root),\n ...(args.pin ? { pinning: { mode: \"strict\" } } : {}),\n })\n : compileGitlab(graph);\n\n // Surface diagnostics on stderr — stdout must stay clean YAML for pipes\n // (e.g. `compile --pin | diff - workflow.yml`). Error-severity findings\n // (e.g. unpinned actions in --pin mode) fail the command.\n let hasError = false;\n for (const d of result.diagnostics) {\n output.errorLine(`[${d.severity}] ${d.capability}: ${d.message}`);\n if (d.severity === \"error\") hasError = true;\n }\n\n const yaml = result.artifacts.map((a) => a.content).join(\"\\n---\\n\");\n\n // A glued single file/stream cannot represent multiple pipelines —\n // hard-fail --output, warn on stdout (back-compat for drift diffs).\n if (result.artifacts.length > 1 && !args.outputDir) {\n if (args.output) {\n throw new CliError(\n `--output cannot represent ${result.artifacts.length} artifacts; use --output-dir`,\n \"INVALID_FLAG\",\n ExitCode.UsageError,\n );\n }\n output.errorLine(\n `[warning] ${result.artifacts.length} artifacts glued into one stream; use --output-dir to write separate files`,\n );\n }\n\n if (args.outputDir) {\n const outDir = resolve(global.root, args.outputDir);\n await mkdir(outDir, { recursive: true });\n const realOutDir = await realpath(outDir);\n const contained = (base: string, p: string) => {\n const rel = relative(base, p);\n return rel !== \"\" && !rel.startsWith(\"..\") && !isAbsolute(rel);\n };\n const written: string[] = [];\n for (const a of result.artifacts) {\n const outPath = resolve(outDir, a.path);\n const escapes = () =>\n new CliError(\n `artifact path escapes output dir: ${a.path}`,\n \"INVALID_FLAG\",\n ExitCode.UsageError,\n );\n if (!contained(outDir, outPath)) throw escapes();\n // Lexical containment alone isn't enough: a symlink planted inside\n // outDir would redirect the write. Walk up to the deepest existing\n // ancestor, realpath it, and re-check before touching the fs.\n for (let ancestor = dirname(outPath); ;) {\n try {\n const realAncestor = await realpath(ancestor);\n const realTarget = join(realAncestor, relative(ancestor, outPath));\n if (!contained(realOutDir, realTarget)) throw escapes();\n break;\n } catch (e) {\n if (e instanceof CliError) throw e;\n if ((e as NodeJS.ErrnoException).code !== \"ENOENT\") throw e;\n const up = dirname(ancestor);\n if (up === ancestor) break;\n ancestor = up;\n }\n }\n await mkdir(dirname(outPath), { recursive: true });\n // O_NOFOLLOW fails atomically on a symlinked leaf — no\n // check-then-write race on the final path component.\n const flags =\n constants.O_WRONLY |\n constants.O_CREAT |\n constants.O_TRUNC |\n constants.O_NOFOLLOW;\n let fh: FileHandle;\n try {\n fh = await open(outPath, flags);\n } catch (e) {\n if ((e as NodeJS.ErrnoException).code === \"ELOOP\") throw escapes();\n throw e;\n }\n try {\n await fh.writeFile(a.content);\n } finally {\n await fh.close();\n }\n written.push(outPath);\n }\n\n if (global.format === \"json\") {\n output.writeLine(\n JSON.stringify({\n command: \"compile\",\n data: { target, paths: written },\n durationMs: Date.now() - start,\n }),\n );\n } else {\n for (const p of written) {\n output.writeLine(`Compiled ${target} workflow to ${p}`);\n }\n }\n } else if (args.output) {\n const outPath = resolve(global.root, args.output);\n await mkdir(dirname(outPath), { recursive: true });\n await writeFile(outPath, yaml, \"utf8\");\n\n if (global.format === \"json\") {\n output.writeLine(\n JSON.stringify({\n command: \"compile\",\n data: { target, path: outPath },\n durationMs: Date.now() - start,\n }),\n );\n } else {\n output.writeLine(`Compiled ${target} workflow to ${outPath}`);\n }\n } else {\n if (global.format === \"json\") {\n output.writeLine(\n JSON.stringify({\n command: \"compile\",\n data: { target, yaml },\n durationMs: Date.now() - start,\n }),\n );\n } else {\n output.write(yaml);\n }\n }\n\n return hasError ? ExitCode.RuntimeError : ExitCode.Success;\n}\n","// synth command — alias for compile.\n// Delegates to compileCommand for backwards compatibility.\n\nimport type { GlobalFlags, OutputWriter } from \"../types.js\";\nimport { compileCommand, type CompileArgs } from \"./compile.js\";\n\nexport type SynthArgs = CompileArgs;\n\n/**\n * Alias for `compile`. Delegates to compileCommand.\n */\nexport async function synthCommand(\n args: SynthArgs,\n global: GlobalFlags,\n output: OutputWriter,\n start: number,\n): Promise<number> {\n return compileCommand(args, global, output, start);\n}\n","// BufferingOutputWriter — captures stdout output for JSON parsing,\n// routes errors/debug to stderr (NOT stdout — stdout is the MCP transport).\n\nimport process from \"node:process\";\nimport type { OutputWriter } from \"../types.js\";\n\n/**\n * OutputWriter for MCP tool execution: captures structured stdout output\n * (command handlers emit JSON when format=\"json\") and routes all error/debug\n * output to stderr. stdout is reserved for MCP JSON-RPC transport.\n */\nexport class BufferingOutputWriter implements OutputWriter {\n #buffer = \"\";\n\n write(text: string): void {\n this.#buffer += text;\n }\n\n writeLine(text: string): void {\n this.#buffer += text + \"\\n\";\n }\n\n error(text: string): void {\n process.stderr.write(text);\n }\n\n errorLine(text: string): void {\n process.stderr.write(text + \"\\n\");\n }\n\n debug(text: string): void {\n process.stderr.write(text + \"\\n\");\n }\n\n /** The captured stdout content (JSON string from the command handler). */\n get captured(): string {\n return this.#buffer;\n }\n}\n","// MCP tool definitions — 5 Sverka operations exposed as MCP tools.\n// Spec 28 — sverka mcp-server.\n\nimport { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { GlobalFlags, OutputWriter } from \"../types.js\";\nimport { ExitCode } from \"../types.js\";\nimport { validateCommand } from \"../commands/validate.js\";\nimport { planCommand } from \"../commands/plan.js\";\nimport { graphCommand } from \"../commands/graph.js\";\nimport { runCommand } from \"../commands/run.js\";\nimport { compileGithub, compileGitlab } from \"@sverka/compiler\";\nimport type { CompilationResult } from \"@sverka/compiler\";\nimport { loadProjectGraph } from \"./config.js\";\nimport { BufferingOutputWriter } from \"./buffering-writer.js\";\n\n/** MCP CallToolResult shape (kept loose to avoid deep SDK type coupling). */\ninterface ToolResult {\n [x: string]: unknown;\n content: { type: \"text\"; text: string }[];\n isError?: boolean;\n}\n\n/** Build GlobalFlags for JSON-format command execution. */\nfunction jsonFlags(root: string): GlobalFlags {\n return { format: \"json\", config: null, root, quiet: false, verbose: false };\n}\n\n/** Safely parse JSON, returning null on failure. */\nfunction safeJsonParse(text: string): unknown | null {\n try {\n return JSON.parse(text);\n } catch {\n return null;\n }\n}\n\n/**\n * Run a CLI command handler with a buffering writer and return an MCP\n * CallToolResult. On success (exit 0), the captured JSON `data` field is\n * returned as text content. On failure, isError is set with the error message.\n */\nexport async function runCommandAsTool(\n fn: (\n writer: OutputWriter,\n global: GlobalFlags,\n start: number,\n ) => Promise<number>,\n root: string,\n): Promise<ToolResult> {\n const writer = new BufferingOutputWriter();\n const global = jsonFlags(root);\n const start = Date.now();\n try {\n const exitCode = await fn(writer, global, start);\n const text = writer.captured.trim();\n if (exitCode === ExitCode.Success) {\n const parsed = text ? safeJsonParse(text) : null;\n const data =\n parsed && typeof parsed === \"object\" && \"data\" in parsed\n ? (parsed as { data: unknown }).data\n : (parsed ?? {});\n return { content: [{ type: \"text\", text: JSON.stringify(data) }] };\n }\n const parsed = text ? safeJsonParse(text) : null;\n const msg = parsed\n ? JSON.stringify(parsed)\n : text || `exit code ${exitCode}`;\n return { content: [{ type: \"text\", text: msg }], isError: true };\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n return { content: [{ type: \"text\", text: msg }], isError: true };\n }\n}\n\n/** Tool metadata for testing and introspection. */\nexport interface SverkaToolDef {\n readonly name: string;\n readonly description: string;\n readonly inputSchema: Record<string, unknown>;\n}\n\n/** The 5 Sverka MCP tool definitions (name, description, zod schema shape). */\nexport const SVERKA_TOOLS: readonly SverkaToolDef[] = [\n {\n name: \"sverka.validate\",\n description:\n \"Validate a sverka config: synthesize the Definition Graph and run validators.\",\n inputSchema: { root: z.string().optional() },\n },\n {\n name: \"sverka.plan\",\n description:\n \"Bind an Entry and inputs into a Run Plan and return the step list.\",\n inputSchema: {\n root: z.string().optional(),\n entryId: z.string().optional(),\n },\n },\n {\n name: \"sverka.graph\",\n description:\n \"Display the Definition Graph: pipelines, entries, steps, and dependencies.\",\n inputSchema: { root: z.string().optional() },\n },\n {\n name: \"sverka.run\",\n description:\n \"Execute the workflow locally through the native engine and return the run status.\",\n inputSchema: {\n root: z.string().optional(),\n entryId: z.string().optional(),\n executor: z.enum([\"host\", \"docker\"]).optional(),\n },\n },\n {\n name: \"sverka.synth\",\n description: \"Compile the workflow to a target CI YAML (github or gitlab).\",\n inputSchema: {\n root: z.string().optional(),\n target: z.enum([\"github\", \"gitlab\"]),\n },\n },\n] as const;\n\n/**\n * Register all 5 Sverka MCP tools on the given McpServer.\n * Each tool maps to the corresponding CLI command handler.\n */\nexport function registerSverkaTools(\n server: McpServer,\n defaultRoot: string,\n): void {\n server.tool(\n \"sverka.validate\",\n \"Validate a sverka config: synthesize the Definition Graph and run validators.\",\n { root: z.string().optional() },\n async (args) => {\n return runCommandAsTool(\n (w, g, s) => validateCommand(g, w, s),\n args.root ?? defaultRoot,\n );\n },\n );\n\n server.tool(\n \"sverka.plan\",\n \"Bind an Entry and inputs into a Run Plan and return the step list.\",\n { root: z.string().optional(), entryId: z.string().optional() },\n async (args) => {\n return runCommandAsTool(\n (w, g, s) =>\n planCommand(\n { ...(args.entryId !== undefined && { entryId: args.entryId }) },\n g,\n w,\n s,\n ),\n args.root ?? defaultRoot,\n );\n },\n );\n\n server.tool(\n \"sverka.graph\",\n \"Display the Definition Graph: pipelines, entries, steps, and dependencies.\",\n { root: z.string().optional() },\n async (args) => {\n return runCommandAsTool(\n (w, g, s) => graphCommand(g, w, s),\n args.root ?? defaultRoot,\n );\n },\n );\n\n server.tool(\n \"sverka.run\",\n \"Execute the workflow locally through the native engine and return the run status.\",\n {\n root: z.string().optional(),\n entryId: z.string().optional(),\n executor: z.enum([\"host\", \"docker\"]).optional(),\n },\n async (args) => {\n return runCommandAsTool(\n (w, g, s) =>\n runCommand(\n {\n ...(args.entryId !== undefined && { entryId: args.entryId }),\n ...(args.executor !== undefined && { executor: args.executor }),\n },\n g,\n w,\n s,\n ),\n args.root ?? defaultRoot,\n );\n },\n );\n\n server.tool(\n \"sverka.synth\",\n \"Compile the workflow to a target CI YAML (github or gitlab).\",\n { root: z.string().optional(), target: z.enum([\"github\", \"gitlab\"]) },\n async (args) => {\n return synthTool(args.root ?? defaultRoot, args.target);\n },\n );\n}\n\n/** Run the synth tool: load graph, compile to target, return artifacts. */\nasync function synthTool(\n root: string,\n target: \"github\" | \"gitlab\",\n): Promise<ToolResult> {\n try {\n const { graph } = await loadProjectGraph({ root, config: null });\n const result: CompilationResult =\n target === \"github\" ? compileGithub(graph) : compileGitlab(graph);\n const data = {\n target,\n artifacts: result.artifacts.map((a) => ({\n path: a.path,\n content: a.content,\n })),\n diagnostics: result.diagnostics,\n };\n return { content: [{ type: \"text\", text: JSON.stringify(data) }] };\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n return { content: [{ type: \"text\", text: msg }], isError: true };\n }\n}\n","// mcp-server command — expose Sverka operations as MCP tools over stdio.\n// Spec 28 — sverka mcp-server.\n\nimport process from \"node:process\";\nimport type { GlobalFlags, OutputWriter } from \"../types.js\";\nimport { ExitCode } from \"../types.js\";\nimport { registerSverkaTools } from \"../internal/mcp-tools.js\";\nimport { cliVersion } from \"../internal/version.js\";\n\n/** Args for the mcp-server command (none in v1 — stdio transport, all tools exposed). */\nexport interface McpServerArgs {}\n\n/**\n * Start an MCP server over stdio that exposes Sverka operations as tools.\n * External AI agents can invoke sverka.validate, sverka.plan, sverka.graph,\n * sverka.run, and sverka.synth via the Model Context Protocol.\n *\n * The server runs until stdin closes or SIGTERM is received. stdout is\n * reserved for MCP JSON-RPC transport — all logs go to stderr.\n *\n * @param shutdownSignal Optional promise that resolves to signal shutdown\n * (for testing). In production, the server waits for stdin close / SIGTERM.\n */\nexport async function mcpServerCommand(\n _args: McpServerArgs,\n global: GlobalFlags,\n output: OutputWriter,\n _start: number,\n shutdownSignal?: Promise<void>,\n): Promise<number> {\n output.debug(`mcp-server: root=${global.root}`);\n\n // Lazy-import the MCP SDK (~250ms) — only paid when serving MCP.\n const { McpServer } = await import(\"@modelcontextprotocol/sdk/server/mcp.js\");\n const { StdioServerTransport } =\n await import(\"@modelcontextprotocol/sdk/server/stdio.js\");\n const server = new McpServer({ name: \"sverka\", version: cliVersion() });\n registerSverkaTools(server, global.root);\n\n const transport = new StdioServerTransport();\n\n try {\n await server.connect(transport);\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n output.errorLine(`mcp-server: failed to start: ${msg}`);\n return ExitCode.RuntimeError;\n }\n\n // Wait for shutdown signal (stdin close / SIGTERM in production,\n // or an injected promise in tests).\n await (shutdownSignal ?? waitForStdinClose());\n\n await server.close();\n return ExitCode.Success;\n}\n\n/** Wait for stdin close or SIGTERM. */\nfunction waitForStdinClose(): Promise<void> {\n return new Promise<void>((resolve) => {\n const cleanup = (): void => {\n process.stdin.off(\"end\", cleanup);\n process.stdin.off(\"close\", cleanup);\n process.off(\"SIGTERM\", cleanup);\n resolve();\n };\n process.stdin.on(\"end\", cleanup);\n process.stdin.on(\"close\", cleanup);\n process.on(\"SIGTERM\", cleanup);\n });\n}\n","import { spawnSync } from \"node:child_process\";\nimport type { GlobalFlags, OutputWriter } from \"../types.js\";\nimport { ExitCode } from \"../types.js\";\n\ninterface DoctorCheck {\n name: string;\n status: \"ok\" | \"missing\";\n version: string | null;\n required: boolean;\n}\n\n/**\n * Check the environment: Node.js, Bun, git. Reports status of each.\n * Exit 0 when all pass, 3 when a required tool is missing.\n */\nexport async function doctorCommand(\n global: GlobalFlags,\n output: OutputWriter,\n start: number,\n): Promise<number> {\n output.debug(`doctor: root=${global.root}`);\n const checks: DoctorCheck[] = [\n runCheck(\"node\", \"node\", true),\n runCheck(\"bun\", \"bun\", false),\n runCheck(\"git\", \"git\", true),\n ];\n\n const allOk = checks.every((c) => !c.required || c.status === \"ok\");\n const exitCode = allOk ? ExitCode.Success : ExitCode.RuntimeError;\n\n const durationMs = Date.now() - start;\n if (global.format === \"json\") {\n output.writeLine(\n JSON.stringify({\n command: \"doctor\",\n data: { checks, allOk },\n durationMs,\n }),\n );\n } else {\n output.writeLine(\"Environment diagnostics:\");\n for (const check of checks) {\n const version = check.version ? `v${check.version}` : \"NOT FOUND\";\n output.writeLine(` ${check.name}: ${version}`);\n }\n output.writeLine(allOk ? \"All checks passed.\" : \"Some checks failed.\");\n }\n\n return exitCode;\n}\n\nfunction runCheck(\n name: string,\n binary: string,\n required: boolean,\n): DoctorCheck {\n try {\n const result = spawnSync(binary, [\"--version\"], {\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n encoding: \"utf8\",\n // Bound the check so a hung shim (broken PATH entry, blocking prompt,\n // etc.) cannot hang the CLI indefinitely. A timeout throws and is\n // treated the same as a missing tool.\n timeout: 5000,\n });\n if (result.status !== 0 || result.error) {\n return { name, status: \"missing\", version: null, required };\n }\n const out = result.stdout.trim();\n // Extract the first x.y.z version token so output like \"git version 2.43.0\"\n // or \"node v22.0.0\" is normalized to \"2.43.0\" / \"22.0.0\".\n const match = out.match(/(\\d+\\.\\d+\\.\\d+[^\\s]*)/);\n const version = match?.[1] ?? out;\n return { name, status: \"ok\", version, required };\n } catch {\n return { name, status: \"missing\", version: null, required };\n }\n}\n","// view command — view SARIF findings in TUI or generate HTML report.\n\nimport process from \"node:process\";\nimport { readFileSync } from \"node:fs\";\nimport type { GlobalFlags, OutputWriter } from \"../types.js\";\nimport { CliError, ExitCode } from \"../types.js\";\n\nexport interface ViewArgs {\n /** Path to a .sarif file. Reads from stdin if undefined. */\n file?: string;\n /** View format: \"tui\" (terminal) or \"web\" (HTML report). */\n format: \"tui\" | \"web\";\n /** Output HTML file path (for --format web). */\n output?: string;\n}\n\n/**\n * View SARIF findings in the terminal TUI or generate an HTML report.\n */\nexport async function viewCommand(\n args: ViewArgs,\n global: GlobalFlags,\n output: OutputWriter,\n start: number,\n): Promise<number> {\n // Read SARIF input.\n let sarifJson: string;\n if (args.file) {\n try {\n sarifJson = readFileSync(args.file, \"utf8\");\n } catch (e) {\n throw new CliError(\n `failed to read SARIF file: ${e instanceof Error ? e.message : String(e)}`,\n \"MISSING_ARG\",\n ExitCode.RuntimeError,\n );\n }\n } else if (!process.stdin.isTTY) {\n sarifJson = readFileSync(0, \"utf8\");\n if (sarifJson.trim() === \"\") {\n output.errorLine(\"sverka view: stdin is empty.\");\n return ExitCode.RuntimeError;\n }\n } else {\n output.errorLine(\n \"sverka view: no input. Provide a SARIF file argument or pipe SARIF via stdin.\",\n );\n return ExitCode.UsageError;\n }\n\n let sarif: unknown;\n try {\n sarif = JSON.parse(sarifJson);\n } catch (e) {\n output.errorLine(\n `sverka view: invalid JSON: ${e instanceof Error ? e.message : String(e)}`,\n );\n return ExitCode.RuntimeError;\n }\n\n if (args.format === \"web\") {\n return renderWeb(sarif, args, output);\n }\n\n return renderTui(sarif, output);\n}\n\n/** Launch the TUI viewer using @sverka/sarif-viewer-tui. */\nasync function renderTui(\n sarif: unknown,\n output: OutputWriter,\n): Promise<number> {\n try {\n const { renderSarifTui } = await import(\"@sverka/sarif-viewer-tui\");\n await renderSarifTui({ sarif: sarif as never });\n return ExitCode.Success;\n } catch (e) {\n output.errorLine(\n `sverka view: ${e instanceof Error ? e.message : String(e)}`,\n );\n return ExitCode.RuntimeError;\n }\n}\n\n/** Generate an HTML report using @sverka/sarif-viewer-web. */\nasync function renderWeb(\n sarif: unknown,\n args: ViewArgs,\n output: OutputWriter,\n): Promise<number> {\n try {\n const { renderSarifWeb } = await import(\"@sverka/sarif-viewer-web\");\n const outputPath = args.output ?? \"sarif-report.html\";\n renderSarifWeb({ sarif: sarif as never, outputPath });\n output.writeLine(`Wrote ${outputPath}`);\n return ExitCode.Success;\n } catch (e) {\n output.errorLine(\n `sverka view: ${e instanceof Error ? e.message : String(e)}`,\n );\n return ExitCode.RuntimeError;\n }\n}\n","// ui command — start local web dashboard server.\n\nimport process from \"node:process\";\nimport { join } from \"node:path\";\nimport type { GlobalFlags, OutputWriter } from \"../types.js\";\nimport { ExitCode } from \"../types.js\";\n\nexport interface UiArgs {\n /** Port to listen on (default: 3000). */\n port?: number;\n /** Host to bind (default: localhost). */\n host?: string;\n}\n\n/**\n * Start a local web dashboard server that lists SARIF files\n * and renders individual findings reports.\n */\nexport async function uiCommand(\n args: UiArgs,\n global: GlobalFlags,\n output: OutputWriter,\n _start: number,\n): Promise<number> {\n const artifactsDir = join(global.root, \".sverka\", \"artifacts\");\n const port = args.port ?? 3000;\n const host = args.host ?? \"localhost\";\n\n try {\n const { startUiServer } = await import(\"@sverka/ui\");\n const server = await startUiServer({ artifactsDir, port, host });\n output.writeLine(`Sverka UI running at ${server.url}`);\n output.writeLine(`Artifacts: ${artifactsDir}`);\n output.writeLine(\"Press Ctrl+C to stop.\");\n\n // Keep the process alive until interrupted.\n // Use `once` to prevent handler accumulation if uiCommand is called\n // multiple times in the same process.\n process.once(\"SIGINT\", () => {\n server.close();\n process.exit(ExitCode.Success);\n });\n\n // Return a promise that never resolves — the process exits via SIGINT.\n return new Promise<number>(() => {});\n } catch (e) {\n output.errorLine(\n `sverka ui: ${e instanceof Error ? e.message : String(e)}`,\n );\n return ExitCode.RuntimeError;\n }\n}\n","import process from \"node:process\";\nimport yargs, { type Arguments, type Argv } from \"yargs\";\n\nimport type { GlobalFlags, OutputWriter } from \"./types.js\";\nimport { CliError, ExitCode } from \"./types.js\";\nimport { createOutputWriter, wrapOutputWriter } from \"./output.js\";\nimport { missingBuildHint } from \"./internal/errors.js\";\nimport { cliVersion } from \"./internal/version.js\";\nimport { initCommand } from \"./commands/init.js\";\nimport { validateCommand } from \"./commands/validate.js\";\nimport { planCommand, type PlanArgs } from \"./commands/plan.js\";\nimport { graphCommand } from \"./commands/graph.js\";\nimport { runCommand, type RunArgs } from \"./commands/run.js\";\nimport { discoverCommand } from \"./commands/discover.js\";\nimport { checkCommand } from \"./commands/check.js\";\nimport { policyCommand, type PolicyArgs } from \"./commands/policy.js\";\nimport { synthCommand, type SynthArgs } from \"./commands/synth.js\";\nimport { compileCommand, type CompileArgs } from \"./commands/compile.js\";\nimport { mcpServerCommand } from \"./commands/mcp-server.js\";\nimport { doctorCommand } from \"./commands/doctor.js\";\nimport { viewCommand, type ViewArgs } from \"./commands/view.js\";\nimport { uiCommand, type UiArgs } from \"./commands/ui.js\";\n\n/** Optional dependencies for main (testability seam). */\nexport interface MainDeps {\n output?: OutputWriter;\n}\n\n/** Build GlobalFlags from parsed yargs options. */\nfunction buildGlobalFlags(parsed: Arguments): GlobalFlags {\n const format = resolveFormat(parsed.format);\n return {\n format,\n config: typeof parsed.config === \"string\" ? parsed.config : null,\n root: typeof parsed.root === \"string\" ? parsed.root : process.cwd(),\n quiet: Boolean(parsed.quiet),\n verbose: Boolean(parsed.verbose),\n };\n}\n\n/** Resolve the format string from parsed yargs. */\nfunction resolveFormat(\n format: unknown,\n): \"text\" | \"json\" | \"html\" | \"sarif\" | \"web\" {\n if (format === \"json\") return \"json\";\n if (format === \"html\") return \"html\";\n if (format === \"sarif\") return \"sarif\";\n if (format === \"web\") return \"web\";\n return \"text\";\n}\n\n/** Resolve the real output writer, wrapping injected writers with flag semantics. */\nfunction resolveOutputWriter(\n global: GlobalFlags,\n deps?: MainDeps,\n): OutputWriter {\n if (deps?.output) {\n return wrapOutputWriter(global, deps.output);\n }\n return createOutputWriter(\n global,\n (s) => process.stdout.write(s),\n (s) => process.stderr.write(s),\n );\n}\n\n/** Configure the init subcommand options. */\nfunction addInitCommand(y: Argv): Argv {\n return y\n .option(\"template\", {\n type: \"string\",\n default: \"minimal\",\n choices: [\"minimal\", \"full\"],\n })\n .option(\"force\", { type: \"boolean\", default: false })\n .option(\"detect\", {\n type: \"boolean\",\n default: false,\n describe:\n \"Generate config from detected project checks (overrides --template)\",\n });\n}\n\n/** Configure the run subcommand options. */\nfunction addRunCommand(y: Argv): Argv {\n return y\n .option(\"entry\", { type: \"string\" })\n .option(\"executor\", {\n type: \"string\",\n default: \"host\",\n choices: [\"host\", \"docker\"],\n })\n .option(\"evaluate\", { type: \"boolean\", default: false })\n .option(\"output\", {\n type: \"string\",\n alias: \"o\",\n describe: \"Output file path for HTML report (implies --format html)\",\n })\n .option(\"tui\", {\n type: \"boolean\",\n describe: \"Interactive terminal UI (off by default; opt-in only)\",\n })\n .option(\"jobs\", {\n type: \"number\",\n alias: \"j\",\n describe: \"Max steps running concurrently (default: 4)\",\n })\n .option(\"step-output-lines\", {\n type: \"number\",\n describe:\n \"Captured stdout/stderr tail lines printed per step (0 disables; default 20)\",\n })\n .option(\"watch\", {\n type: \"boolean\",\n alias: \"w\",\n describe: \"Re-run on file changes (debounced 300ms)\",\n });\n}\n\n/** Configure the plan subcommand options. */\nfunction addPlanCommand(y: Argv): Argv {\n return y.option(\"entry\", { type: \"string\" });\n}\n\n/** Configure the policy subcommand options. */\nfunction addPolicyCommand(y: Argv): Argv {\n return y\n .option(\"findings\", { type: \"string\", demandOption: true })\n .option(\"baseline\", { type: \"string\" });\n}\n\n/** Configure the synth subcommand options. */\nfunction addSynthCommand(y: Argv): Argv {\n return y.option(\"target\", {\n type: \"string\",\n demandOption: true,\n choices: [\"github\", \"gitlab\"],\n });\n}\n\n/** Configure the compile subcommand options. */\nfunction addCompileCommand(y: Argv): Argv {\n return y\n .option(\"target\", {\n type: \"string\",\n demandOption: true,\n choices: [\"github\", \"gitlab\"],\n })\n .option(\"output\", {\n type: \"string\",\n alias: \"o\",\n describe: \"Write YAML to a file instead of stdout\",\n })\n .option(\"output-dir\", {\n type: \"string\",\n describe: \"Write each artifact to <dir>/<artifact path> (multi-pipeline)\",\n })\n .option(\"pin\", {\n type: \"boolean\",\n default: false,\n describe: \"Pin GitHub action refs to commit SHAs (github target)\",\n });\n}\n\n/** Configure the view subcommand options. */\nfunction addViewCommand(y: Argv): Argv {\n return y\n .positional(\"file\", {\n type: \"string\",\n describe: \"Path to a .sarif file (reads from stdin if omitted)\",\n })\n .option(\"format\", {\n type: \"string\",\n alias: \"f\",\n choices: [\"tui\", \"web\", \"html\"],\n default: \"tui\",\n describe: \"View format: tui (terminal), web/html (HTML report)\",\n })\n .option(\"output\", {\n type: \"string\",\n alias: \"o\",\n describe:\n \"Output HTML file path (for --format web, default: sarif-report.html)\",\n });\n}\n\n/** Configure the ui subcommand options. */\nfunction addUiCommand(y: Argv): Argv {\n return y\n .option(\"port\", {\n type: \"number\",\n default: 3000,\n describe: \"Port to listen on\",\n })\n .option(\"host\", {\n type: \"string\",\n default: \"localhost\",\n describe: \"Host to bind\",\n });\n}\n\nfunction buildParser(): Argv {\n return yargs([])\n .scriptName(\"sverka\")\n .version(cliVersion())\n .option(\"format\", {\n type: \"string\",\n alias: \"f\",\n choices: [\"text\", \"json\", \"html\", \"sarif\", \"web\"],\n })\n .option(\"config\", { type: \"string\", alias: \"c\" })\n .option(\"root\", { type: \"string\", alias: \"r\", default: process.cwd() })\n .option(\"quiet\", { type: \"boolean\", alias: \"q\", default: false })\n .option(\"verbose\", { type: \"boolean\", alias: \"v\", default: false })\n .command(\"init\", \"Create a sverka.config.ts\", addInitCommand)\n .command(\"validate\", \"Validate a sverka config\")\n .command(\"plan\", \"Bind Entry + inputs → Run Plan\", addPlanCommand)\n .command(\"graph\", \"Display the Definition Graph\")\n .command(\"run\", \"Execute the workflow locally\", addRunCommand)\n .command(\"discover\", \"Discover and display project context\")\n .command(\"check\", \"Resolve proposed checks → StepDefinitions\")\n .command(\"policy\", \"Evaluate findings against policy\", addPolicyCommand)\n .command(\n \"synth\",\n \"Alias for compile — compile to a target CI YAML\",\n addSynthCommand,\n )\n .command(\"compile\", \"Compile to a target CI YAML\", addCompileCommand)\n .command(\"mcp-server\", \"Expose Sverka as an MCP server (stdio)\")\n .command(\"doctor\", \"Diagnose environment and dependencies\")\n .command(\n \"view [file]\",\n \"View SARIF findings in TUI or generate HTML report\",\n addViewCommand,\n )\n .command(\"ui\", \"Start local web dashboard server\", addUiCommand)\n .demandCommand(1, \"No command given\")\n .strict()\n .fail((msg, err) => {\n if (err) throw err;\n throw new CliError(msg, \"UNKNOWN_COMMAND\", ExitCode.UsageError);\n });\n}\n\n/** Dispatch a single command to its handler. */\nasync function dispatch(\n command: string,\n parsed: Arguments,\n global: GlobalFlags,\n output: OutputWriter,\n start: number,\n): Promise<number> {\n switch (command) {\n case \"init\":\n return dispatchInit(parsed, global, output, start);\n case \"validate\":\n return validateCommand(global, output, start);\n case \"plan\":\n return dispatchPlan(parsed, global, output, start);\n case \"graph\":\n return graphCommand(global, output, start);\n case \"run\":\n return dispatchRun(parsed, global, output, start);\n case \"discover\":\n return discoverCommand(global, output, start);\n case \"check\":\n return checkCommand(global, output, start);\n case \"policy\":\n return dispatchPolicy(parsed, global, output, start);\n case \"synth\":\n return dispatchSynth(parsed, global, output, start);\n case \"compile\":\n return dispatchCompile(parsed, global, output, start);\n case \"mcp-server\":\n return mcpServerCommand({}, global, output, start);\n case \"doctor\":\n return doctorCommand(global, output, start);\n case \"view\":\n return dispatchView(parsed, global, output, start);\n case \"ui\":\n return dispatchUi(parsed, global, output, start);\n default:\n throw new CliError(\n `unknown command: ${command}`,\n \"UNKNOWN_COMMAND\",\n ExitCode.UsageError,\n );\n }\n}\n\nfunction dispatchInit(\n parsed: Arguments,\n global: GlobalFlags,\n output: OutputWriter,\n start: number,\n): Promise<number> {\n return initCommand(\n {\n template:\n typeof parsed.template === \"string\" ? parsed.template : undefined,\n force: Boolean(parsed.force),\n detect: Boolean(parsed.detect),\n },\n global,\n output,\n start,\n );\n}\n\nfunction dispatchPlan(\n parsed: Arguments,\n global: GlobalFlags,\n output: OutputWriter,\n start: number,\n): Promise<number> {\n const args: PlanArgs = {};\n if (typeof parsed.entry === \"string\") args.entryId = parsed.entry;\n return planCommand(args, global, output, start);\n}\n\nfunction dispatchRun(\n parsed: Arguments,\n global: GlobalFlags,\n output: OutputWriter,\n start: number,\n): Promise<number> {\n const args: RunArgs = {\n executor: parsed.executor === \"docker\" ? \"docker\" : \"host\",\n evaluate: Boolean(parsed.evaluate),\n };\n if (parsed.jobs !== undefined) {\n const jobs = Number(parsed.jobs);\n if (!Number.isInteger(jobs) || jobs < 1 || jobs > 64)\n throw new CliError(\n \"--jobs must be an integer in [1, 64]\",\n \"INVALID_FLAG\",\n ExitCode.UsageError,\n );\n args.jobs = jobs;\n }\n if (parsed.stepOutputLines !== undefined) {\n const lines = Number(parsed.stepOutputLines);\n if (!Number.isInteger(lines) || lines < 0)\n throw new CliError(\n \"--step-output-lines must be a non-negative integer\",\n \"INVALID_FLAG\",\n ExitCode.UsageError,\n );\n args.stepOutputLines = lines;\n }\n if (typeof parsed.entry === \"string\") args.entryId = parsed.entry;\n if (typeof parsed.output === \"string\") args.output = parsed.output;\n if (parsed.tui === true) args.tui = true;\n if (parsed.tui === false) args.tui = false;\n if (parsed.watch === true) args.watch = true;\n return runCommand(args, global, output, start);\n}\n\nfunction dispatchPolicy(\n parsed: Arguments,\n global: GlobalFlags,\n output: OutputWriter,\n start: number,\n): Promise<number> {\n const args: PolicyArgs = { findings: String(parsed.findings) };\n if (typeof parsed.baseline === \"string\") args.baseline = parsed.baseline;\n return policyCommand(args, global, output, start);\n}\n\nfunction dispatchSynth(\n parsed: Arguments,\n global: GlobalFlags,\n output: OutputWriter,\n start: number,\n): Promise<number> {\n const target = parsed.target === \"gitlab\" ? \"gitlab\" : \"github\";\n const args: SynthArgs = { target };\n return synthCommand(args, global, output, start);\n}\n\nfunction dispatchCompile(\n parsed: Arguments,\n global: GlobalFlags,\n output: OutputWriter,\n start: number,\n): Promise<number> {\n const target = parsed.target === \"gitlab\" ? \"gitlab\" : \"github\";\n const args: CompileArgs = { target };\n if (typeof parsed.output === \"string\") args.output = parsed.output;\n if (typeof parsed.outputDir === \"string\") args.outputDir = parsed.outputDir;\n if (parsed.pin === true) args.pin = true;\n return compileCommand(args, global, output, start);\n}\n\nfunction dispatchView(\n parsed: Arguments,\n global: GlobalFlags,\n output: OutputWriter,\n start: number,\n): Promise<number> {\n const args: ViewArgs = {\n format: parsed.format === \"web\" || parsed.format === \"html\" ? \"web\" : \"tui\",\n };\n if (typeof parsed.file === \"string\") args.file = parsed.file;\n if (typeof parsed.output === \"string\") args.output = parsed.output;\n return viewCommand(args, global, output, start);\n}\n\nfunction dispatchUi(\n parsed: Arguments,\n global: GlobalFlags,\n output: OutputWriter,\n start: number,\n): Promise<number> {\n const args: UiArgs = {};\n if (typeof parsed.port === \"number\") args.port = parsed.port;\n if (typeof parsed.host === \"string\") args.host = parsed.host;\n return uiCommand(args, global, output, start);\n}\n\n/**\n * The main CLI entry point.\n * @param argv Command-line arguments (excluding node and script path).\n * @returns Exit code (0 = success, 1 = policy fail, 2 = usage error, 3 = runtime error).\n */\nexport async function main(argv: string[], deps?: MainDeps): Promise<number> {\n const start = Date.now();\n\n const output =\n deps?.output ??\n createOutputWriter(\n {\n format: \"text\",\n config: null,\n root: process.cwd(),\n quiet: false,\n verbose: false,\n },\n (s) => process.stdout.write(s),\n (s) => process.stderr.write(s),\n );\n\n let parsed: Arguments;\n try {\n parsed = await buildParser().parseAsync(argv);\n } catch (e) {\n return handleError(e, output, start);\n }\n\n const global = buildGlobalFlags(parsed);\n const realOutput = resolveOutputWriter(global, deps);\n const command = String(parsed._[0] ?? \"\");\n\n realOutput.debug(\n `sverka: command=${command} root=${global.root} format=${global.format}`,\n );\n\n try {\n return await dispatch(command, parsed, global, realOutput, start);\n } catch (e) {\n return handleError(e, realOutput, start);\n }\n}\n\nfunction handleError(e: unknown, output: OutputWriter, _start: number): number {\n const hint = missingBuildHint(e);\n if (e instanceof CliError) {\n output.errorLine(`error: ${e.message}`);\n if (hint !== null) output.errorLine(`hint: ${hint}`);\n return e.exitCode;\n }\n const msg = e instanceof Error ? e.message : String(e);\n output.errorLine(`error: ${msg}`);\n if (hint !== null) output.errorLine(`hint: ${hint}`);\n return ExitCode.RuntimeError;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":["resolveConfigPath","detectPackageManager","detectPackageManager","detectPackageManager","process","process","process","process"],"sources":["../src/types.ts","../src/output.ts","../src/internal/version.ts","../src/internal/paths.ts","../src/internal/config.ts","../src/internal/detect.ts","../src/commands/init.ts","../src/commands/validate.ts","../src/internal/graph.ts","../src/commands/plan.ts","../src/commands/graph.ts","../src/internal/runtime-check.ts","../src/internal/report-context.ts","../src/internal/watch.ts","../src/commands/run.ts","../src/commands/discover.ts","../src/commands/check.ts","../src/commands/policy.ts","../src/internal/ci-setup.ts","../src/commands/compile.ts","../src/commands/synth.ts","../src/internal/buffering-writer.ts","../src/internal/mcp-tools.ts","../src/commands/mcp-server.ts","../src/commands/doctor.ts","../src/commands/view.ts","../src/commands/ui.ts","../src/main.ts"],"sourcesContent":["// sverka — public types\n\n/** Global flags parsed from the command line. */\nexport interface GlobalFlags {\n /** Output format. Defaults to \"text\". */\n format: \"text\" | \"json\" | \"html\" | \"sarif\" | \"web\";\n /** Path to sverka.config.ts. */\n config: string | null;\n /** Root directory. Defaults to process.cwd(). */\n root: string;\n /** Suppress non-error output. */\n quiet: boolean;\n /** Enable verbose output with debug information. */\n verbose: boolean;\n}\n\n/** Output writer abstraction for testability. */\nexport interface OutputWriter {\n write(text: string): void;\n writeLine(text: string): void;\n error(text: string): void;\n errorLine(text: string): void;\n /** Write a debug line, only visible when --verbose is set. */\n debug(text: string): void;\n}\n\n/** Exit codes used by the CLI. */\nexport const ExitCode = {\n Success: 0,\n PolicyFail: 1,\n UsageError: 2,\n RuntimeError: 3,\n} as const;\n\nexport type ExitCode = (typeof ExitCode)[keyof typeof ExitCode];\n\n/** CLI error codes. */\nexport type CliErrorCode =\n | \"UNKNOWN_COMMAND\"\n | \"MISSING_ARG\"\n | \"INVALID_FLAG\"\n | \"CONFIG_EXISTS\"\n | \"RUNTIME_NOT_AVAILABLE\"\n | \"REPORT_PATH_ESCAPE\"\n | \"SDK_ERROR\"\n | \"PACKAGE_ERROR\";\n\n/** Error thrown when CLI argument parsing or command execution fails. */\nexport class CliError extends Error {\n readonly code: CliErrorCode;\n readonly exitCode: ExitCode;\n override readonly cause: unknown;\n constructor(\n message: string,\n code: CliErrorCode,\n exitCode: ExitCode,\n cause?: unknown,\n ) {\n super(message);\n this.name = \"CliError\";\n this.code = code;\n this.exitCode = exitCode;\n this.cause = cause;\n }\n}\n","import type { GlobalFlags, OutputWriter } from \"./types.js\";\n\n/** A sink that receives a string. */\nexport type WriteSink = (text: string) => void;\n\n/**\n * OutputWriter that writes to caller-provided sinks (stdout/stderr).\n * In production, the sinks write to process.stdout/process.stderr.\n * In tests, the sinks capture into arrays.\n */\nexport class ConsoleOutputWriter implements OutputWriter {\n readonly #out: WriteSink;\n readonly #err: WriteSink;\n readonly #quiet: boolean;\n readonly #verbose: boolean;\n\n constructor(out: WriteSink, err: WriteSink, quiet = false, verbose = false) {\n this.#out = out;\n this.#err = err;\n this.#quiet = quiet;\n this.#verbose = verbose;\n }\n\n write(text: string): void {\n if (this.#quiet) return;\n this.#out(text);\n }\n\n writeLine(text: string): void {\n if (this.#quiet) return;\n this.#out(text + \"\\n\");\n }\n\n error(text: string): void {\n this.#err(text);\n }\n\n errorLine(text: string): void {\n this.#err(text + \"\\n\");\n }\n\n /** Write a debug line to stderr, only when --verbose is set. */\n debug(text: string): void {\n if (this.#verbose) {\n this.#err(text + \"\\n\");\n }\n }\n}\n\n/**\n * Wrapper that applies --quiet / --verbose / --format semantics to any\n * underlying OutputWriter. Used to make injected test writers respect the\n * same suppression rules as the production writer.\n *\n * - `--quiet` (text format) suppresses stdout writes; JSON stdout is kept.\n * - `--verbose` routes `debug()` to the underlying `errorLine()`.\n * - stderr is never suppressed.\n */\nexport class FlagAwareWriter implements OutputWriter {\n readonly #base: OutputWriter;\n readonly #quiet: boolean;\n readonly #verbose: boolean;\n\n constructor(base: OutputWriter, quiet: boolean, verbose: boolean) {\n this.#base = base;\n this.#quiet = quiet;\n this.#verbose = verbose;\n }\n\n write(text: string): void {\n if (this.#quiet) return;\n this.#base.write(text);\n }\n\n writeLine(text: string): void {\n if (this.#quiet) return;\n this.#base.writeLine(text);\n }\n\n error(text: string): void {\n this.#base.error(text);\n }\n\n errorLine(text: string): void {\n this.#base.errorLine(text);\n }\n\n debug(text: string): void {\n if (this.#verbose) {\n this.#base.errorLine(text);\n }\n }\n}\n\n/**\n * Create an OutputWriter from global flags. In JSON format, stdout is NOT\n * suppressed by --quiet (the JSON result is the data and must be emitted).\n */\nexport function createOutputWriter(\n global: GlobalFlags,\n out: WriteSink,\n err: WriteSink,\n): ConsoleOutputWriter {\n // In JSON format, quiet does not suppress the result stdout — only\n // text-format non-essential output. We model this by disabling quiet\n // suppression for json.\n const effectiveQuiet = global.quiet && global.format === \"text\";\n return new ConsoleOutputWriter(out, err, effectiveQuiet, global.verbose);\n}\n\n/**\n * Wrap any OutputWriter with --quiet / --verbose semantics from global flags.\n * Use for injected test writers so they respect the same suppression rules.\n */\nexport function wrapOutputWriter(\n global: GlobalFlags,\n base: OutputWriter,\n): OutputWriter {\n const effectiveQuiet = global.quiet && global.format === \"text\";\n return new FlagAwareWriter(base, effectiveQuiet, global.verbose);\n}\n","import { readFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\n/**\n * Resolve the sverka CLI version from its own package.json.\n * Walks up from this module so it works from src/ (dev) and bundled\n * dist/ alike, and never picks up the consumer's cwd package.json\n * (which is what yargs' default --version resolution does).\n */\nexport function cliVersion(): string {\n let dir = dirname(fileURLToPath(import.meta.url));\n while (true) {\n try {\n const pkg = JSON.parse(\n readFileSync(join(dir, \"package.json\"), \"utf8\"),\n ) as {\n name?: string;\n version?: string;\n };\n if (pkg.name === \"sverka\" && pkg.version) return pkg.version;\n } catch {\n // no readable package.json at this level — keep walking\n }\n const parent = dirname(dir);\n if (parent === dir) return \"0.0.0\";\n dir = parent;\n }\n}\n","import { isAbsolute, join } from \"node:path\";\n\n/**\n * Resolve a path against a root directory. Absolute paths are returned\n * unchanged; relative paths are joined under `root` so that `--root` governs\n * path resolution regardless of the process working directory.\n */\nexport function resolveUnderRoot(root: string, path: string): string {\n return isAbsolute(path) ? path : join(root, path);\n}\n","// Config loading — loads a sverka.config.ts file and returns the Project.\n// Spec 17 — §30.\n\nimport { readFile, writeFile } from \"node:fs/promises\";\nimport { readFileSync, existsSync } from \"node:fs\";\nimport { register } from \"node:module\";\nimport * as nodeModule from \"node:module\";\nimport { pathToFileURL, fileURLToPath } from \"node:url\";\nimport { join, resolve, isAbsolute, dirname, sep } from \"node:path\";\nimport type { Pipeline, Project } from \"@sverka/workflow\";\nimport { synthesize, collectConstructWarnings } from \"@sverka/workflow\";\nimport type { DefinitionGraph } from \"@sverka/workflow\";\nimport { resolveUnderRoot } from \"./paths.js\";\nimport { CliError, ExitCode } from \"../types.js\";\n\nlet hooksRegistered = false;\n\nfunction findHooksFile(): string | null {\n for (const rel of [\"./config-hooks.mjs\", \"./internal/config-hooks.mjs\"]) {\n try {\n const candidate = fileURLToPath(new URL(rel, import.meta.url));\n if (existsSync(candidate)) return candidate;\n } catch {\n // ignore\n }\n }\n return null;\n}\n\n/**\n * Register ESM resolve hooks so a config file that cannot resolve @sverka/*\n * packages from its own location falls back to the copies bundled with the\n * CLI. This makes a globally-installed `sverka` self-contained.\n */\nasync function registerConfigHooks(): Promise<void> {\n if (hooksRegistered) return;\n const hooksFile = findHooksFile();\n if (hooksFile === null) return;\n const href = pathToFileURL(hooksFile).href;\n try {\n // Prefer registerHooks (in-thread) when available: module.register is\n // deprecated (DEP0205) on Node 24.5+ and prints a warning per call.\n const registerHooks = (nodeModule as { registerHooks?: unknown })\n .registerHooks;\n if (typeof registerHooks === \"function\") {\n const hooks = (await import(href)) as { resolve?: unknown };\n if (typeof hooks.resolve === \"function\") {\n registerHooks.call(nodeModule, {\n resolve: hooks.resolve,\n });\n hooksRegistered = true;\n return;\n }\n }\n register(href);\n hooksRegistered = true;\n } catch {\n // hook registration unavailable — fall back to normal resolution\n }\n}\n\n/** Package-manager names supported by `init` templates. */\nexport type PmName = \"npm\" | \"pnpm\" | \"yarn\" | \"bun\";\n\n/**\n * Find a sverka.config.ts or sverka.config.js file in the given root.\n * Returns the absolute path or null if not found.\n */\nexport async function findConfig(root: string): Promise<string | null> {\n const candidates = [\n \"sverka.config.ts\",\n \"sverka.config.js\",\n \"sverka.config.mjs\",\n ];\n for (const candidate of candidates) {\n const path = join(root, candidate);\n if (existsSync(path)) return path;\n }\n return null;\n}\n\n/**\n * Resolve the effective config path from global flags.\n * Throws a usage error when no config can be found.\n */\nexport async function resolveConfigPath(global: {\n root: string;\n config: string | null;\n}): Promise<string> {\n let configPath: string | null = global.config\n ? resolveUnderRoot(global.root, global.config)\n : null;\n if (!configPath) {\n configPath = await findConfig(global.root);\n }\n if (!configPath) {\n throw new CliError(\n \"no config found (use --config to specify a path)\",\n \"MISSING_ARG\",\n ExitCode.UsageError,\n );\n }\n return configPath;\n}\n\n/**\n * Structural check that avoids `instanceof` across package boundaries.\n * A construct-like object (Project or bare Pipeline — single-pipeline\n * configs may skip the Project) has a `node` with an `id` string and a\n * `children` array.\n */\nfunction notConstructError(): CliError {\n return new CliError(\n \"config must export a Project or Pipeline instance (default or named 'project')\",\n \"SDK_ERROR\",\n ExitCode.RuntimeError,\n );\n}\n\nfunction assertConstructLike(\n value: unknown,\n): asserts value is Project | Pipeline {\n if (value === null || typeof value !== \"object\") {\n throw notConstructError();\n }\n const node = (value as { node?: unknown }).node;\n if (\n typeof node !== \"object\" ||\n node === null ||\n typeof (node as { id?: unknown }).id !== \"string\" ||\n !Array.isArray((node as { children?: unknown }).children) ||\n typeof (node as { findAll?: unknown }).findAll !== \"function\"\n ) {\n throw notConstructError();\n }\n}\n\n/**\n * Load a sverka config file and return the Project construct.\n * The config file must export a `default` Project-like instance or a named\n * `project` Project-like instance.\n *\n * @throws CliError if the config cannot be loaded or doesn't export a Project.\n */\nexport async function loadConfig(\n configPath: string,\n): Promise<Project | Pipeline> {\n const absPath = isAbsolute(configPath)\n ? configPath\n : resolve(process.cwd(), configPath);\n\n if (!existsSync(absPath)) {\n throw new CliError(\n `config not found: ${absPath}`,\n \"MISSING_ARG\",\n ExitCode.UsageError,\n );\n }\n\n let mod: Record<string, unknown>;\n try {\n await registerConfigHooks();\n mod = await import(pathToFileURL(absPath).href);\n } catch (e) {\n throw new CliError(\n `failed to load config: ${e instanceof Error ? e.message : String(e)}`,\n \"SDK_ERROR\",\n ExitCode.RuntimeError,\n e,\n );\n }\n\n // Prefer the named `project` export, then fall back to `default`.\n // This avoids selecting an unrelated default export when a valid\n // named `project` export exists.\n const construct = mod.project ?? mod.default;\n assertConstructLike(construct);\n\n return construct;\n}\n\n/**\n * Resolve, load, and synthesize the config for commands that need a graph.\n */\nexport async function loadProjectGraph(global: {\n root: string;\n config: string | null;\n}): Promise<{\n configPath: string;\n project: Project | Pipeline;\n graph: DefinitionGraph;\n warnings: string[];\n}> {\n const configPath = await resolveConfigPath(global);\n const project = await loadConfig(configPath);\n const warnings = collectConstructWarnings(project);\n const graph = synthesize(project);\n return { configPath, project, graph, warnings };\n}\n\n/**\n * Detect the package manager used by the project at `root`.\n * Falls back to `npm` when no lockfile or packageManager field is found.\n */\nexport function detectPackageManager(root: string): PmName {\n const fromLockfile = detectFromLockfile(root);\n if (fromLockfile) return fromLockfile;\n\n const fromPkg = detectFromPackageJson(root);\n if (fromPkg) return fromPkg;\n\n return \"npm\";\n}\n\nfunction detectFromLockfile(root: string): PmName | undefined {\n if (\n existsSync(join(root, \"bun.lockb\")) ||\n existsSync(join(root, \"bun.lock\"))\n ) {\n return \"bun\";\n }\n if (existsSync(join(root, \"pnpm-lock.yaml\"))) {\n return \"pnpm\";\n }\n if (existsSync(join(root, \"yarn.lock\"))) {\n return \"yarn\";\n }\n if (existsSync(join(root, \"package-lock.json\"))) {\n return \"npm\";\n }\n return undefined;\n}\n\nfunction detectFromPackageJson(root: string): PmName | undefined {\n const pkgPath = join(root, \"package.json\");\n if (!existsSync(pkgPath)) return undefined;\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, \"utf8\")) as {\n packageManager?: string;\n };\n if (typeof pkg.packageManager === \"string\") {\n return pmFromPackageManagerField(pkg.packageManager);\n }\n } catch {\n // ignore malformed package.json\n }\n return undefined;\n}\n\nfunction pmFromPackageManagerField(packageManager: string): PmName | undefined {\n if (packageManager.startsWith(\"npm\")) return \"npm\";\n if (packageManager.startsWith(\"pnpm\")) return \"pnpm\";\n if (packageManager.startsWith(\"yarn\")) return \"yarn\";\n if (packageManager.startsWith(\"bun\")) return \"bun\";\n return undefined;\n}\n\n/**\n * Ensure `@sverka/workflow` is declared as a devDependency of the target\n * project. Creates a minimal package.json when one does not exist.\n */\nexport async function ensureConstructsDependency(\n root: string,\n): Promise<string | null> {\n const pkgPath = join(root, \"package.json\");\n const base = await loadPackageBase(pkgPath);\n\n const pkg: Record<string, unknown> = {\n name: base.name ?? \"sverka-project\",\n version: base.version ?? \"0.0.0\",\n ...base,\n };\n\n const declared = ensureConstructsDeclared(pkg, root);\n\n await writeFile(pkgPath, JSON.stringify(pkg, null, 2) + \"\\n\", \"utf8\");\n return declared;\n}\n\nasync function loadPackageBase(\n pkgPath: string,\n): Promise<Record<string, unknown>> {\n try {\n return JSON.parse(await readFile(pkgPath, \"utf8\")) as Record<\n string,\n unknown\n >;\n } catch (e) {\n if ((e as NodeJS.ErrnoException).code === \"ENOENT\") {\n return { name: \"sverka-project\", version: \"0.0.0\" };\n }\n const reason = e instanceof Error ? e.message : String(e);\n throw new CliError(\n `failed to read package.json: ${reason}`,\n \"PACKAGE_ERROR\",\n ExitCode.RuntimeError,\n e,\n );\n }\n}\n\n/** Dependency names that were renamed to @sverka/workflow. */\nconst LEGACY_DEP_NAMES = [\"@sverka/constructs\", \"@sverka/cdk\"] as const;\n\n/** Drop renamed legacy package entries from dependencies/devDependencies. */\nfunction removeLegacyDeps(pkg: Record<string, unknown>): void {\n for (const key of [\"dependencies\", \"devDependencies\"] as const) {\n const deps = pkg[key] as Record<string, unknown> | undefined;\n if (deps === undefined) continue;\n for (const name of LEGACY_DEP_NAMES) delete deps[name];\n if (Object.keys(deps).length === 0) delete pkg[key];\n }\n}\n\nfunction ensureConstructsDeclared(\n pkg: Record<string, unknown>,\n root: string,\n): string | null {\n removeLegacyDeps(pkg);\n\n const deps = (pkg.dependencies as Record<string, unknown> | undefined) ?? {};\n const devDeps =\n (pkg.devDependencies as Record<string, unknown> | undefined) ?? {};\n\n const existing = deps[\"@sverka/workflow\"] ?? devDeps[\"@sverka/workflow\"];\n if (typeof existing === \"string\") return existing;\n if (existing !== undefined) {\n // Malformed non-string value — unusable to any package manager.\n // Replace it with a proper spec rather than leaving it in place.\n delete deps[\"@sverka/workflow\"];\n delete devDeps[\"@sverka/workflow\"];\n }\n\n const spec = constructsDepSpec(root);\n if (spec === null) return null;\n pkg.devDependencies = { ...devDeps, \"@sverka/workflow\": spec };\n return spec;\n}\n\n/**\n * Dependency spec for @sverka/workflow in the target project.\n *\n * - `workspace:*` inside the sverka monorepo itself.\n * - `^<version>` when the package resolves from a node_modules tree (a real\n * registry install).\n * - `link:<dir>` (or `file:<dir>` for npm, which rejects the `link:`\n * protocol) when it resolves to a bare checkout — a semver spec would\n * fail to install when the version was never published.\n * - null when the package cannot be resolved at all — nothing is declared,\n * the caller warns instead of writing an uninstallable spec.\n */\nfunction constructsDepSpec(root: string): string | null {\n if (isLocalWorkspace(root)) return \"workspace:*\";\n const resolved = resolveConstructsPackage();\n if (resolved === null) return null;\n if (resolved.dir.includes(`${sep}node_modules${sep}`)) {\n return `^${resolved.version}`;\n }\n const protocol = detectPackageManager(root) === \"npm\" ? \"file:\" : \"link:\";\n return `${protocol}${resolved.dir}`;\n}\n\n/** Resolve the @sverka/workflow package directory and version from the CLI's context. */\nfunction resolveConstructsPackage(): { dir: string; version: string } | null {\n let entry: string;\n try {\n entry = fileURLToPath(import.meta.resolve(\"@sverka/workflow\"));\n } catch {\n return null;\n }\n let dir = dirname(entry);\n while (true) {\n const pkgPath = join(dir, \"package.json\");\n if (existsSync(pkgPath)) {\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, \"utf8\")) as {\n name?: string;\n version?: string;\n };\n if (pkg.name === \"@sverka/workflow\") {\n return { dir, version: pkg.version ?? \"0.0.0\" };\n }\n } catch {\n // keep walking up\n }\n }\n const parent = dirname(dir);\n if (parent === dir) return null;\n dir = parent;\n }\n}\n\nfunction isLocalWorkspace(root: string): boolean {\n const rootPkg = join(root, \"package.json\");\n const constructsPkg = join(root, \"packages\", \"workflow\", \"package.json\");\n\n try {\n const rootData = JSON.parse(readFileSync(rootPkg, \"utf8\")) as {\n workspaces?: string[] | { packages?: string[] };\n };\n const constructs = JSON.parse(readFileSync(constructsPkg, \"utf8\")) as {\n name?: string;\n };\n if (constructs.name !== \"@sverka/workflow\") return false;\n const patterns = Array.isArray(rootData.workspaces)\n ? rootData.workspaces\n : (rootData.workspaces?.packages ?? []);\n return patterns.some((pattern) => pattern.startsWith(\"packages\"));\n } catch {\n return false;\n }\n}\n","// Shared project-check detection for `init --detect` and `sverka check`.\n//\n// Combines two sources:\n// - planner discovery (ecosystem-aware: cargo, go, ruff, package managers) —\n// requires a git repository, degrades gracefully when unavailable\n// - package.json script scanning — ground truth for JS/TS projects\n//\n// Planner-proposed `<pm> run <script>` steps are filtered against the\n// scripts that actually exist so generated configs never reference\n// missing scripts.\n\nimport { readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { createPlanner } from \"@sverka/sdk\";\nimport {\n createBuiltinResolver,\n synthesizeCheckSteps,\n} from \"@sverka/verification\";\nimport { detectPackageManager } from \"./config.js\";\n\n/** A detected check ready to become a ShellStep. */\nexport interface DetectedCheck {\n /** Step id, e.g. \"lint\". */\n checkId: string;\n /** Shell command, e.g. \"bun run lint\". */\n command: string;\n /** SARIF artifact path when the check emits SARIF on stdout. */\n sarifOutput?: string;\n /** Where the check came from. */\n source: \"planner\" | \"script\";\n}\n\n/** package.json script names that map to pipeline steps. */\nconst DETECT_SCRIPT_CHECKS = [\n \"lint\",\n \"typecheck\",\n \"test\",\n \"build\",\n \"format\",\n \"check\",\n] as const;\n\n/**\n * Read package.json scripts under root. Returns an empty map when absent or\n * malformed. Ground truth for JS/TS projects.\n */\nfunction readPackageScripts(root: string): Record<string, string> {\n try {\n const pkg = JSON.parse(\n readFileSync(join(root, \"package.json\"), \"utf8\"),\n ) as {\n scripts?: Record<string, unknown>;\n };\n const scripts = pkg.scripts ?? {};\n const out: Record<string, string> = {};\n for (const [name, value] of Object.entries(scripts)) {\n if (typeof value === \"string\" && value.length > 0) out[name] = value;\n }\n return out;\n } catch {\n return {};\n }\n}\n\n/**\n * True when a command is a package-manager script invocation\n * (`<pm> run <script>`) whose script does not exist — a phantom step that\n * would fail with \"Missing script\" on first run.\n */\nfunction isPhantomScriptStep(\n command: string,\n scripts: Record<string, string>,\n): boolean {\n const m = /^(?:bun|npm|pnpm|yarn|deno)\\s+run\\s+([A-Za-z0-9:_-]+)/.exec(\n command.trim(),\n );\n if (m === null) return false;\n return !(m[1]! in scripts);\n}\n\n/**\n * Detect checks for the project at `root`: planner proposals (filtered to\n * real scripts) plus any known check scripts the planner did not cover.\n */\nexport async function detectProjectChecks(\n root: string,\n): Promise<DetectedCheck[]> {\n const pm = detectPackageManager(root);\n const scripts = readPackageScripts(root);\n const checks: DetectedCheck[] = [];\n\n // Planner-based detection covers non-npm ecosystems (cargo, go, ruff).\n // It requires a git repository — degrade gracefully when unavailable.\n try {\n const planner = createPlanner();\n // Scope detection to `root`: generated ShellSteps run with cwd=root,\n // so proposals driven by manifests outside the subtree would fail.\n const ctx = await planner.discover({ root, scopeToRoot: true });\n const proposal = await planner.plan(ctx);\n if (proposal.checks.length > 0) {\n const resolver = createBuiltinResolver();\n const resolved = synthesizeCheckSteps(proposal.checks, ctx, resolver);\n for (const r of resolved) {\n const shellOp = r.step.operations.find((o) => o.kind === \"shell\");\n const command = shellOp?.kind === \"shell\" ? shellOp.command : \"\";\n // Planner proposes checks by ecosystem, not by package.json\n // scripts — drop `<pm> run <script>` steps for missing scripts.\n if (isPhantomScriptStep(command, scripts)) continue;\n const sarifOut = r.outputs.find((o) => o.format === \"sarif\");\n checks.push({\n checkId: r.checkId,\n command,\n ...(sarifOut !== undefined ? { sarifOutput: sarifOut.path } : {}),\n source: \"planner\",\n });\n }\n }\n } catch {\n // discovery unavailable (e.g. not a git repo) — script checks still apply\n }\n\n // Emit a check for every known script present in package.json that\n // detection did not already cover.\n for (const name of DETECT_SCRIPT_CHECKS) {\n if (!(name in scripts)) continue;\n if (checks.some((c) => c.checkId === name)) continue;\n checks.push({\n checkId: name,\n command: `${pm} run ${name}`,\n source: \"script\",\n });\n }\n\n return checks;\n}\n","import { existsSync } from \"node:fs\";\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport { dirname, isAbsolute, join } from \"node:path\";\nimport type { GlobalFlags, OutputWriter } from \"../types.js\";\nimport { CliError, ExitCode } from \"../types.js\";\nimport type { WriteFileOptions } from \"node:fs\";\nimport {\n detectPackageManager,\n ensureConstructsDependency,\n} from \"../internal/config.js\";\nimport type { PmName } from \"../internal/config.js\";\nimport { detectProjectChecks } from \"../internal/detect.js\";\n\n/** Args parsed for the init command. */\nexport interface InitArgs {\n template?: string | undefined;\n force?: boolean;\n detect?: boolean;\n}\n\nfunction buildMinimalTemplate(pm: PmName): string {\n return [\n 'import { Project, Pipeline, ShellStep, Entry } from \"@sverka/workflow\";',\n \"\",\n 'const proj = new Project(\"verify\");',\n 'const ci = new Pipeline(proj, \"ci\");',\n `new ShellStep(ci, \"lint\", { command: \"${pm} run lint\" });`,\n `new ShellStep(ci, \"typecheck\", { command: \"${pm} run typecheck\" });`,\n `new ShellStep(ci, \"test\", { command: \"${pm} run test\" });`,\n 'new Entry(ci, \"on-push\", { trigger: { kind: \"push\" }, roots: [\"lint\", \"typecheck\", \"test\"] });',\n \"\",\n \"export default proj;\",\n \"\",\n ].join(\"\\n\");\n}\n\nfunction buildFullTemplate(pm: PmName): string {\n return [\n 'import { Project, Pipeline, ShellStep, Entry } from \"@sverka/workflow\";',\n \"\",\n 'const proj = new Project(\"verify\");',\n 'const ci = new Pipeline(proj, \"ci\");',\n `new ShellStep(ci, \"lint\", { command: \"${pm} run lint\" });`,\n `new ShellStep(ci, \"typecheck\", { command: \"${pm} run typecheck\" });`,\n `new ShellStep(ci, \"test\", { command: \"${pm} run test\" });`,\n `new ShellStep(ci, \"build\", { command: \"${pm} run build\" });`,\n 'new Entry(ci, \"on-push\", { trigger: { kind: \"push\" }, roots: [\"lint\", \"typecheck\", \"test\", \"build\"] });',\n \"\",\n \"export default proj;\",\n \"\",\n ].join(\"\\n\");\n}\n\n/** Build a config from detected checks (planner + package.json scripts). */\nasync function buildDetectedTemplate(root: string): Promise<string | null> {\n const checks = await detectProjectChecks(root);\n if (checks.length === 0) return null;\n\n const stepLines = checks.map((c) => {\n const id = JSON.stringify(c.checkId);\n const cmd = JSON.stringify(c.command);\n if (c.sarifOutput !== undefined) {\n const outputsDecl =\n \"{ \" +\n JSON.stringify(c.sarifOutput) +\n ': { type: \"artifact\", fromStdout: true } }';\n return `new ShellStep(ci, ${id}, { command: ${cmd}, outputs: ${outputsDecl} });`;\n }\n return `new ShellStep(ci, ${id}, { command: ${cmd} });`;\n });\n const rootList = checks.map((c) => JSON.stringify(c.checkId)).join(\", \");\n\n return [\n 'import { Project, Pipeline, ShellStep, Entry, push } from \"@sverka/workflow\";',\n \"\",\n 'const proj = new Project(\"verify\");',\n 'const ci = new Pipeline(proj, \"ci\");',\n ...stepLines,\n `new Entry(ci, \"on-push\", { trigger: push(), roots: [${rootList}] });`,\n \"\",\n \"export default proj;\",\n \"\",\n ].join(\"\\n\");\n}\n\n/** Resolve and validate the template name, returning its file content. */\nfunction resolveTemplateContent(template: string, pm: PmName): string {\n if (template !== \"minimal\" && template !== \"full\") {\n throw new CliError(\n `invalid template: ${template} (expected minimal|full)`,\n \"INVALID_FLAG\",\n ExitCode.UsageError,\n );\n }\n return template === \"full\" ? buildFullTemplate(pm) : buildMinimalTemplate(pm);\n}\n\n/** Write the config file, creating parent directories and using exclusive create when not forcing. */\nasync function writeConfig(\n configPath: string,\n content: string,\n force: boolean,\n): Promise<void> {\n if (existsSync(configPath) && !force) {\n throw new CliError(\n `config already exists: ${configPath} (use --force to overwrite)`,\n \"CONFIG_EXISTS\",\n ExitCode.UsageError,\n );\n }\n // Use exclusive create (wx) when not forcing to close the TOCTOU race\n // between existsSync and writeFile. With --force, use standard write.\n const flags: WriteFileOptions = force\n ? \"utf8\"\n : { encoding: \"utf8\", flag: \"wx\" };\n try {\n await mkdir(dirname(configPath), { recursive: true });\n await writeFile(configPath, content, flags);\n } catch (e) {\n if (\n e instanceof Error &&\n \"code\" in e &&\n (e as { code: string }).code === \"EEXIST\"\n ) {\n throw new CliError(\n `config already exists: ${configPath} (use --force to overwrite)`,\n \"CONFIG_EXISTS\",\n ExitCode.UsageError,\n e,\n );\n }\n throw e;\n }\n}\n\n/** Emit the init result in the requested output format. */\nfunction emitInitResult(\n output: OutputWriter,\n format: GlobalFlags[\"format\"],\n configPath: string,\n template: string,\n start: number,\n): void {\n if (format === \"json\") {\n output.writeLine(\n JSON.stringify({\n command: \"init\",\n data: { path: configPath, template },\n durationMs: Date.now() - start,\n }),\n );\n } else {\n output.writeLine(`Created ${configPath} (template: ${template})`);\n }\n}\n\n/** Resolve the config path relative to root, honoring an explicit --config. */\nfunction resolveConfigPath(root: string, config: string | null): string {\n const defaultPath = \"sverka.config.ts\";\n const selected = config ?? defaultPath;\n return isAbsolute(selected) ? selected : join(root, selected);\n}\n\n/**\n * Create a sverka.config.ts in the root directory.\n */\nexport async function initCommand(\n args: InitArgs,\n global: GlobalFlags,\n output: OutputWriter,\n start: number,\n): Promise<number> {\n const configPath = resolveConfigPath(global.root, global.config);\n\n // Fail fast if the config already exists and --force is not set before any\n // persistent side effects (e.g. mutating package.json) are applied.\n if (existsSync(configPath) && !args.force) {\n throw new CliError(\n `config already exists: ${configPath} (use --force to overwrite)`,\n \"CONFIG_EXISTS\",\n ExitCode.UsageError,\n );\n }\n\n let content: string;\n let template: string;\n\n if (args.detect) {\n // The scaffold root may not exist yet (e.g. a create-* style target\n // directory) — create it before detection reads from it.\n await mkdir(global.root, { recursive: true });\n output.debug(\n `init: root=${global.root} detect=true force=${Boolean(args.force)}`,\n );\n const detected = await buildDetectedTemplate(global.root);\n if (detected !== null) {\n content = detected;\n template = \"detect\";\n } else {\n output.debug(\n \"init: detection found no checks, falling back to minimal template\",\n );\n const pm = detectPackageManager(global.root);\n content = buildMinimalTemplate(pm);\n template = \"minimal\";\n }\n } else {\n template = args.template ?? \"minimal\";\n const pm = detectPackageManager(global.root);\n output.debug(\n `init: root=${global.root} template=${template} pm=${pm} force=${Boolean(args.force)}`,\n );\n // Resolve (and validate) the template before the root mkdir so an\n // invalid --template leaves no directory behind.\n content = resolveTemplateContent(template, pm);\n await mkdir(global.root, { recursive: true });\n }\n\n const declared = await ensureConstructsDependency(global.root);\n if (declared === null) {\n output.errorLine(\n \"note: could not resolve @sverka/workflow — the generated config imports it; install it (e.g. bun add -d @sverka/workflow) before running sverka\",\n );\n }\n await writeConfig(configPath, content, Boolean(args.force));\n emitInitResult(output, global.format, configPath, template, start);\n return ExitCode.Success;\n}\n","// validate command — synthesize Definition Graph, run validators.\n// Spec 17 — §30.\n\nimport { validateGraph } from \"@sverka/workflow\";\nimport type { GlobalFlags, OutputWriter } from \"../types.js\";\nimport { CliError, ExitCode } from \"../types.js\";\nimport { loadProjectGraph } from \"../internal/config.js\";\n\n/**\n * Validate a sverka config: synthesize the Definition Graph and run validators.\n * Exit 0 if valid, 2 if missing config, 3 if load/synthesis fails.\n */\nexport async function validateCommand(\n global: GlobalFlags,\n output: OutputWriter,\n start: number,\n): Promise<number> {\n output.debug(\n `validate: root=${global.root} config=${global.config ?? \"(auto)\"}`,\n );\n\n const { configPath, graph, warnings } = await loadProjectGraph(global);\n validateGraph(graph);\n\n const durationMs = Date.now() - start;\n if (global.format === \"json\") {\n output.writeLine(\n JSON.stringify({\n command: \"validate\",\n data: {\n path: configPath,\n valid: true,\n pipelines: graph.project.pipelines.length,\n warnings,\n },\n durationMs,\n }),\n );\n } else {\n for (const warning of warnings) {\n output.errorLine(`warning: ${warning}`);\n }\n output.writeLine(`Config valid: ${configPath}`);\n output.writeLine(` pipelines: ${graph.project.pipelines.length}`);\n for (const pipeline of graph.project.pipelines) {\n output.writeLine(\n ` ${pipeline.id}: ${pipeline.steps.length} steps, ${pipeline.entries.length} entries`,\n );\n }\n }\n\n return ExitCode.Success;\n}\n","// Graph helpers used by CLI commands.\n// Spec 17 — §30.\n\nimport type { DefinitionGraph } from \"@sverka/workflow\";\n\n/**\n * Return the id of the first entry found across all pipelines.\n * Returns `undefined` when the graph contains no entries.\n */\nexport function resolveDefaultEntryId(\n graph: DefinitionGraph,\n): string | undefined {\n for (const pipeline of graph.project.pipelines) {\n const entry = pipeline.entries[0];\n if (entry) return entry.id;\n }\n return undefined;\n}\n\n/**\n * Return whether an entry with the given id exists in the graph.\n */\nexport function entryExists(graph: DefinitionGraph, entryId: string): boolean {\n for (const pipeline of graph.project.pipelines) {\n for (const entry of pipeline.entries) {\n if (entry.id === entryId) return true;\n }\n }\n return false;\n}\n","// plan command — bind Entry + inputs → Run Plan, display steps.\n// Spec 17 — §30.\n\nimport { bindRunPlan } from \"@sverka/sdk\";\nimport type { GlobalFlags, OutputWriter } from \"../types.js\";\nimport { CliError, ExitCode } from \"../types.js\";\nimport { loadProjectGraph } from \"../internal/config.js\";\nimport { resolveDefaultEntryId, entryExists } from \"../internal/graph.js\";\n\nexport interface PlanArgs {\n entryId?: string;\n}\n\n/**\n * Bind an Entry and Inputs into a Run Plan and display it.\n */\nexport async function planCommand(\n args: PlanArgs,\n global: GlobalFlags,\n output: OutputWriter,\n start: number,\n): Promise<number> {\n output.debug(`plan: root=${global.root} entry=${args.entryId ?? \"(first)\"}`);\n\n const { graph } = await loadProjectGraph(global);\n\n const entryId = args.entryId ?? resolveDefaultEntryId(graph);\n if (!entryId) {\n throw new CliError(\n \"no entries in graph\",\n \"MISSING_ARG\",\n ExitCode.UsageError,\n );\n }\n if (!entryExists(graph, entryId)) {\n throw new CliError(\n `entry \"${entryId}\" not found in graph`,\n \"MISSING_ARG\",\n ExitCode.UsageError,\n );\n }\n\n const plan = bindRunPlan({ graph, entryId });\n\n const durationMs = Date.now() - start;\n if (global.format === \"json\") {\n output.writeLine(\n JSON.stringify({\n command: \"plan\",\n data: {\n id: plan.id,\n graphId: plan.graphId,\n entry: plan.entry,\n steps: plan.steps.map((s) => s.id),\n inputs: plan.inputs,\n },\n durationMs,\n }),\n );\n } else {\n output.writeLine(`Run Plan: ${plan.id}`);\n output.writeLine(` entry: ${plan.entry.id}`);\n output.writeLine(` steps: ${plan.steps.length}`);\n for (const step of plan.steps) {\n const deps =\n step.dependencies.length > 0\n ? ` (depends: ${step.dependencies.map((d) => d.producer).join(\", \")})`\n : \"\";\n output.writeLine(` - ${step.id}${deps}`);\n }\n }\n\n return ExitCode.Success;\n}\n","// graph command — display Definition Graph structure.\n// Spec 17 — §30.\n\nimport type { GlobalFlags, OutputWriter } from \"../types.js\";\nimport { ExitCode } from \"../types.js\";\nimport { loadProjectGraph } from \"../internal/config.js\";\n\n/**\n * Display the Definition Graph: pipelines, entries, steps, and dependencies.\n */\nexport async function graphCommand(\n global: GlobalFlags,\n output: OutputWriter,\n start: number,\n): Promise<number> {\n output.debug(`graph: root=${global.root}`);\n\n const { graph } = await loadProjectGraph(global);\n\n const durationMs = Date.now() - start;\n if (global.format === \"json\") {\n output.writeLine(\n JSON.stringify({\n command: \"graph\",\n data: graph,\n durationMs,\n }),\n );\n } else {\n output.writeLine(`Definition Graph: ${graph.project.id}`);\n for (const pipeline of graph.project.pipelines) {\n output.writeLine(` Pipeline: ${pipeline.id}`);\n output.writeLine(` entries:`);\n for (const entry of pipeline.entries) {\n output.writeLine(\n ` ${entry.id} (trigger: ${entry.trigger.kind}, roots: ${entry.roots.join(\", \")})`,\n );\n }\n output.writeLine(` steps:`);\n for (const step of pipeline.steps) {\n const deps =\n step.dependencies.length > 0\n ? ` → [${step.dependencies.map((d) => `${d.kind}:${d.producer}`).join(\", \")}]`\n : \"\";\n output.writeLine(` ${step.id}${deps}`);\n }\n }\n }\n\n return ExitCode.Success;\n}\n","import { spawnSync } from \"node:child_process\";\n\n/**\n * Check if a binary is available on PATH by spawning `<binary> --version`.\n * Returns true if the binary exists and exits 0, false otherwise.\n */\nexport function isBinaryAvailable(binary: string): boolean {\n const result = spawnSync(binary, [\"--version\"], {\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n encoding: \"utf8\",\n timeout: 5000,\n });\n return result.status === 0 && result.error === undefined;\n}\n","// Assemble ReportContext for the HTML report — git facts, CI links.\n// Everything is best-effort: missing git/CI info simply produces\n// fewer rows, never a failure.\n\nimport { spawnSync } from \"node:child_process\";\nimport process from \"node:process\";\nimport type { ReportContext } from \"@sverka/reporter\";\n\nfunction git(root: string, ...args: string[]): string | undefined {\n const res = spawnSync(\n \"git\", // NOSONAR — argv form, no shell; fixed binary name\n args,\n {\n cwd: root,\n encoding: \"utf-8\",\n // Best-effort context — a slow/blocked git must not stall the run.\n timeout: 2000,\n },\n );\n const out = res.status === 0 ? res.stdout?.trim() : undefined;\n return out || undefined;\n}\n\n/** Normalize a git remote URL (ssh or https) to a clickable web URL.\n * Credentials embedded in https remotes (user:token@host) are stripped. */\nfunction repoWebUrl(remote?: string): string | undefined {\n if (!remote) return undefined;\n const ssh = /^git@([^:]+):(.+?)(\\.git)?$/.exec(remote);\n if (ssh) return `https://${ssh[1]}/${ssh[2]}`;\n try {\n const url = new URL(remote);\n if (url.protocol !== \"http:\" && url.protocol !== \"https:\") {\n return undefined;\n }\n url.username = \"\";\n url.password = \"\";\n url.pathname = url.pathname.replace(/\\.git$/, \"\");\n return url.toString().replace(/\\/$/, \"\");\n } catch {\n return undefined;\n }\n}\n\nfunction collectLinks(\n repo: string | undefined,\n commit: string | undefined,\n): { label: string; url: string }[] {\n const links: { label: string; url: string }[] = [];\n if (repo) links.push({ label: \"Repo\", url: repo });\n if (repo && commit)\n links.push({ label: \"Commit\", url: `${repo}/commit/${commit}` });\n if (repo && process.env.GITHUB_RUN_ID)\n links.push({\n label: \"CI run\",\n url: `${repo}/actions/runs/${process.env.GITHUB_RUN_ID}`,\n });\n return links;\n}\n\nexport function collectReportContext(\n root: string,\n command: string,\n): ReportContext {\n const env = process.env;\n const ghRepo =\n env.GITHUB_SERVER_URL && env.GITHUB_REPOSITORY\n ? `${env.GITHUB_SERVER_URL}/${env.GITHUB_REPOSITORY}`\n : undefined;\n const repo = ghRepo ?? repoWebUrl(git(root, \"remote\", \"get-url\", \"origin\"));\n const commit = env.GITHUB_SHA ?? git(root, \"rev-parse\", \"HEAD\");\n const branch =\n env.GITHUB_REF_NAME ?? git(root, \"rev-parse\", \"--abbrev-ref\", \"HEAD\");\n\n const meta: { label: string; value: string }[] = [\n ...(branch ? [{ label: \"Branch\", value: branch }] : []),\n { label: \"Directory\", value: root },\n ];\n\n return {\n generatedAt: new Date().toISOString(),\n command,\n meta,\n links: collectLinks(repo, commit),\n };\n}\n","// Watch supervisor for `sverka run --watch` (Spec 53).\n// Re-runs on file change — debounced, coalesced, resilient: a failing run\n// is a result, not a crash. Only a config-load or synth error is reported\n// the same way; the loop keeps watching either way.\n\nimport { watch } from \"chokidar\";\nimport { CliError } from \"../types.js\";\nimport type { OutputWriter } from \"../types.js\";\n\nconst DEFAULT_IGNORED = [\n /(^|[/\\\\])\\.git([/\\\\]|$)/,\n /(^|[/\\\\])\\.sverka([/\\\\]|$)/,\n /(^|[/\\\\])node_modules([/\\\\]|$)/,\n /(^|[/\\\\])dist([/\\\\]|$)/,\n /(^|[/\\\\])coverage([/\\\\]|$)/,\n];\n\nexport interface WatchLoopOptions {\n /** Directory to watch (project root). */\n readonly root: string;\n /** Extra files/dirs to watch (e.g. a --config path outside root). */\n readonly extraPaths?: readonly string[];\n /** One run invocation. Re-invoked per change; may re-plan internally. */\n readonly run: () => Promise<number>;\n readonly output: OutputWriter;\n /** Debounce window in ms (Spec 53: 300). */\n readonly debounceMs?: number;\n /** Abort the loop — resolves with the last run's exit code. */\n readonly signal?: AbortSignal;\n /** Extra ignore patterns (appended to the built-in set). */\n readonly ignored?: readonly (string | RegExp)[];\n}\n\nexport interface WatchLoopHandle {\n /** Resolves once chokidar finished its initial scan — events before this\n * may be swallowed as scan noise. Tests should await it before writing. */\n readonly ready: Promise<void>;\n /** Resolves when `signal` aborts and any in-flight run settles — carries\n * the last run's exit code. */\n readonly done: Promise<number>;\n}\n\n/**\n * Watch `root` and re-run `run()` on changes. Never rejects on a run\n * failure — the failure is a result the user sees; the loop continues.\n * `done` resolves when `signal` aborts and the in-flight run (if any)\n * finished, so Ctrl+C never leaves a run printing after exit.\n */\nexport function watchLoop(opts: WatchLoopOptions): WatchLoopHandle {\n const debounceMs = opts.debounceMs ?? 300;\n const { output } = opts;\n\n let running = false;\n let pending = false;\n let stopped = false;\n let doneSettled = false;\n let lastCode = 0;\n let timer: ReturnType<typeof setTimeout> | undefined;\n let runCount = 0;\n let resolveDone: ((code: number) => void) | undefined;\n const done = new Promise<number>((resolve) => {\n resolveDone = resolve;\n });\n\n const clearTimer = (): void => {\n if (timer !== undefined) clearTimeout(timer);\n timer = undefined;\n };\n\n const settleDone = (code: number): void => {\n if (doneSettled) return;\n doneSettled = true;\n resolveDone?.(code);\n };\n\n const invoke = async (): Promise<void> => {\n if (running) {\n // Change while a run is in flight — coalesce into ONE follow-up run.\n pending = true;\n return;\n }\n running = true;\n pending = false;\n // A run now covers every change seen so far — a timer armed by those\n // same changes would launch a redundant follow-up.\n clearTimer();\n runCount++;\n // stderr: stdout stays clean for --format json consumers.\n output.errorLine(`watch: run #${runCount}`);\n try {\n lastCode = await opts.run();\n } catch (e) {\n // A failing run is a result, not a crash — keep watching.\n output.errorLine(\n `watch: run failed: ${e instanceof Error ? e.message : String(e)}`,\n );\n lastCode = e instanceof CliError ? e.exitCode : 1;\n }\n running = false;\n if (stopped) {\n settleDone(lastCode);\n return;\n }\n if (pending) await invoke();\n };\n\n const schedule = (): void => {\n if (stopped) return;\n clearTimer();\n timer = setTimeout(() => {\n timer = undefined;\n void invoke();\n }, debounceMs);\n };\n\n const watcher = watch([opts.root, ...(opts.extraPaths ?? [])], {\n ignoreInitial: true,\n ignored: [...DEFAULT_IGNORED, ...(opts.ignored ?? [])],\n });\n let resolveReady: (() => void) | undefined;\n const ready = new Promise<void>((resolve) => {\n resolveReady = resolve;\n });\n watcher.on(\"ready\", () => resolveReady?.());\n watcher.on(\"all\", schedule);\n watcher.on(\"error\", (e) => {\n output.errorLine(\n `watch: watcher error: ${e instanceof Error ? e.message : String(e)}`,\n );\n });\n\n const stop = async (): Promise<void> => {\n if (stopped) return;\n stopped = true;\n clearTimer();\n await watcher.close();\n // If a run is in flight, invoke() settles `done` when it finishes so\n // its output isn't cut mid-flight.\n if (!running) settleDone(lastCode);\n };\n // An already-aborted signal never fires \"abort\" again — honor it\n // up-front instead of starting a run whose `done` would never resolve.\n if (opts.signal?.aborted === true) {\n stopped = true;\n void watcher.close();\n settleDone(lastCode);\n return { ready, done };\n }\n opts.signal?.addEventListener(\"abort\", () => void stop(), { once: true });\n\n // First run happens immediately — the watcher's job is re-runs.\n void invoke();\n\n return { ready, done };\n}\n","// run command — execute Run Plan through native engine.\n// Spec 17 — §30.\n\nimport process from \"node:process\";\nimport { join, dirname, resolve, sep } from \"node:path\";\nimport { writeFileSync, mkdirSync, realpathSync, existsSync } from \"node:fs\";\nimport type { DefinitionGraph } from \"@sverka/workflow\";\nimport type { RuntimeDriver } from \"@sverka/runtime\";\nimport { createEngine } from \"@sverka/runtime\";\nimport type { RunEvent } from \"@sverka/runtime\";\nimport { createHostDriver } from \"@sverka/runtime\";\nimport type { CommandAllowlist } from \"@sverka/runtime\";\nimport { createDockerDriver } from \"@sverka/runtime\";\nimport { bindRunPlan } from \"@sverka/sdk\";\nimport type { Renderer, FindingRow } from \"@sverka/reporter\";\nimport type { Finding } from \"@sverka/verification\";\nimport { serializeSarif } from \"@sverka/verification\";\nimport type { GlobalFlags, OutputWriter } from \"../types.js\";\nimport { CliError, ExitCode } from \"../types.js\";\nimport { loadProjectGraph } from \"../internal/config.js\";\nimport { resolveDefaultEntryId, entryExists } from \"../internal/graph.js\";\nimport { isBinaryAvailable } from \"../internal/runtime-check.js\";\nimport { collectReportContext } from \"../internal/report-context.js\";\nimport { watchLoop } from \"../internal/watch.js\";\n\nexport interface RunArgs {\n entryId?: string;\n executor?: \"host\" | \"docker\";\n evaluate?: boolean;\n output?: string;\n /** Enable the interactive TUI (opt-in; default output is plain text). */\n tui?: boolean;\n /** Re-run on file changes (Spec 53: debounced, keeps watching on failure). */\n watch?: boolean;\n /** Max steps running concurrently (--jobs). */\n jobs?: number;\n /** Captured stdout/stderr tail lines printed per step (0 disables). */\n stepOutputLines?: number;\n}\n\n/** Pure-argument guards — an invalid flag fails fast instead of surfacing\n * as a recurring run failure inside the watch supervisor. */\nfunction validateRunFlags(args: RunArgs): void {\n if (\n args.jobs !== undefined &&\n (!Number.isInteger(args.jobs) || args.jobs < 1 || args.jobs > 64)\n ) {\n throw new CliError(\n \"--jobs must be an integer in [1, 64]\",\n \"INVALID_FLAG\",\n ExitCode.UsageError,\n );\n }\n if (\n args.stepOutputLines !== undefined &&\n (!Number.isInteger(args.stepOutputLines) || args.stepOutputLines < 0)\n ) {\n throw new CliError(\n \"--step-output-lines must be a non-negative integer\",\n \"INVALID_FLAG\",\n ExitCode.UsageError,\n );\n }\n}\n\n/**\n * Execute a Run Plan through the native engine and print events.\n */\nexport async function runCommand(\n args: RunArgs,\n global: GlobalFlags,\n output: OutputWriter,\n start: number,\n): Promise<number> {\n validateRunFlags(args);\n if (args.watch === true) {\n // Dispatch before any graph load: an invalid config is a run result,\n // not a reason to kill the watcher.\n return runWatch(args, global, output);\n }\n const executor = args.executor ?? \"host\";\n const fmt = resolveFormats(args, global);\n output.debug(\n `run: root=${global.root} executor=${executor} entry=${args.entryId ?? \"(first)\"} format=${global.format}`,\n );\n\n assertExecutorAvailable(executor);\n\n const { graph, warnings } = await loadProjectGraph(global);\n for (const warning of warnings) {\n output.errorLine(`warning: ${warning}`);\n }\n const entryId = resolveEntryId(graph, args.entryId);\n\n const plan = bindRunPlan({ graph, entryId });\n\n // Use the project root as the engine workspace so executed commands run\n // against the checked-out project. The engine places per-step scratch\n // directories under .sverka/workspace inside the root.\n const artifactDir = join(global.root, \".sverka\", \"artifacts\");\n\n const engine = createEngine({\n drivers: buildDrivers(executor),\n maxConcurrent: args.jobs ?? 4,\n });\n\n const { events, runStatus, renderer } = await consumeEvents(\n engine,\n plan,\n { workspace: global.root, artifactDir },\n global,\n output,\n graph,\n args,\n );\n\n const durationMs = Date.now() - start;\n\n // If --evaluate (or --format html), collect findings and run policy gate\n const evaluation = await evaluateRun(\n fmt.evaluate,\n artifactDir,\n global,\n output,\n events,\n renderer,\n args,\n start,\n );\n\n // Flush the renderer (HtmlRenderer writes the file on flush)\n renderer?.flush();\n\n // Per-run report artifacts (Spec 53): .sverka/runs/<runId>/report.{json,html}\n const report = await writeReportSafe(\n {\n root: global.root,\n planId: plan.id,\n runStatus,\n durationMs,\n evalResult: evaluation.summary,\n artifactDir,\n sinceMs: start,\n },\n events,\n output,\n );\n\n // Tell the user where the HTML report went (sarif/web print their own).\n if (fmt.isHtml && renderer) {\n const reportPath =\n args.output ?? join(global.root, \".sverka\", \"report.html\");\n output.writeLine(`Wrote HTML report to ${reportPath}`);\n }\n\n // Interactive renderers stay mounted until the user quits (q / Ctrl+C).\n if (renderer && \"waitUntilExit\" in renderer) {\n await (renderer as { waitUntilExit(): Promise<void> }).waitUntilExit();\n }\n\n // When --evaluate fails with a collection error, the error was already\n // written in the requested format — skip normal output and return.\n if (evaluation.collectionFailed) {\n return evaluation.exitCode;\n }\n\n writeRunOutput({\n planId: plan.id,\n runStatus,\n events,\n durationMs,\n global,\n output,\n evalResult: evaluation.summary,\n report,\n });\n\n // Human-mode tail (Spec 53): the report is discoverable, not hidden.\n if (report !== undefined && global.format === \"text\") {\n output.writeLine(` report: ${report.html ?? report.json}`);\n }\n\n // When --evaluate is set, policy exit code takes precedence\n if (evaluation.exitCode !== 0) {\n return evaluation.exitCode;\n }\n\n return exitCodeForStatus(runStatus);\n}\n\ninterface RunFormats {\n isSarif: boolean;\n isWeb: boolean;\n isHtml: boolean;\n evaluate: boolean;\n}\n\n/** Derive output modes — `--format html`, or `--output` without\n * sarif/web, implies HTML; evaluation runs for any structured format. */\nfunction resolveFormats(args: RunArgs, global: GlobalFlags): RunFormats {\n const isSarif = global.format === \"sarif\";\n const isWeb = global.format === \"web\";\n const isHtml =\n global.format === \"html\" ||\n (args.output !== undefined && !isSarif && !isWeb);\n return {\n isSarif,\n isWeb,\n isHtml,\n evaluate: args.evaluate || isHtml || isSarif || isWeb,\n };\n}\n\ninterface EvaluationOutcome {\n exitCode: number;\n summary: {\n findings: readonly Finding[];\n verdict: string;\n summary: string;\n } | null;\n collectionFailed: boolean;\n}\n\n/** Run findings collection + policy gate when requested; a no-op\n * success outcome otherwise. */\nasync function evaluateRun(\n evaluate: boolean,\n artifactDir: string,\n global: GlobalFlags,\n output: OutputWriter,\n events: readonly RunEvent[],\n renderer: Renderer | null,\n args: RunArgs,\n start: number,\n): Promise<EvaluationOutcome> {\n if (!evaluate) {\n return { exitCode: 0, summary: null, collectionFailed: false };\n }\n const result = await runEvaluation(\n artifactDir,\n global,\n output,\n events,\n renderer,\n args,\n start,\n );\n return {\n exitCode: result.exitCode,\n summary: result.summary,\n collectionFailed:\n result.summary === null && result.exitCode === ExitCode.RuntimeError,\n };\n}\n\ninterface ReportContext {\n root: string;\n planId: string;\n runStatus: string;\n durationMs: number;\n evalResult: EvaluationOutcome[\"summary\"];\n artifactDir: string;\n sinceMs: number;\n}\n\n/** Locate the run id — prefer the completion event, fall back to the\n * start event (a run that failed mid-flight still reports). */\nfunction findRunId(events: readonly RunEvent[]): string | undefined {\n return (\n events.find(\n (e): e is Extract<RunEvent, { type: \"run-completed\" }> =>\n e.type === \"run-completed\",\n )?.runId ??\n events.find(\n (e): e is Extract<RunEvent, { type: \"run-started\" }> =>\n e.type === \"run-started\",\n )?.runId\n );\n}\n\n/** Write .sverka/runs/<runId>/report.{json,html} — best-effort: ordinary\n * FS failures degrade to a warning; REPORT_PATH_ESCAPE (a CliError)\n * stays a hard failure. */\nasync function writeReportSafe(\n ctx: ReportContext,\n events: readonly RunEvent[],\n output: OutputWriter,\n): Promise<{ html: string | null; json: string } | undefined> {\n const runId = findRunId(events);\n if (runId === undefined) return undefined;\n try {\n const artifacts = await writeRunArtifacts({\n root: ctx.root,\n runId,\n planId: ctx.planId,\n runStatus: ctx.runStatus,\n events,\n durationMs: ctx.durationMs,\n evalResult: ctx.evalResult,\n artifactDir: ctx.artifactDir,\n sinceMs: ctx.sinceMs,\n });\n return {\n html: artifacts.htmlPath,\n json: join(artifacts.dir, \"report.json\"),\n };\n } catch (err) {\n // REPORT_PATH_ESCAPE is the deliberate security failure — propagate.\n // Anything else (ENOSPC, EACCES) must not turn a successful run into\n // a runtime error: report output is best-effort, warn and move on.\n if (err instanceof CliError) throw err;\n output.errorLine(\n `warning: run report not written: ${err instanceof Error ? err.message : String(err)}`,\n );\n return undefined;\n }\n}\n\n/**\n * Watch mode (Spec 53): delegate to the supervisor, which re-invokes\n * runCommand per change — each cycle re-plans, so sverka.config.ts edits\n * are picked up too. Ctrl+C aborts the watcher and exits cleanly.\n */\nasync function runWatch(\n args: RunArgs,\n global: GlobalFlags,\n output: OutputWriter,\n): Promise<number> {\n if (args.tui === true) {\n throw new CliError(\n \"--watch is incompatible with --tui (the TUI owns the terminal until exit)\",\n \"INVALID_FLAG\",\n ExitCode.UsageError,\n );\n }\n const ac = new AbortController();\n let forced = false;\n const onSigint = () => {\n // First Ctrl+C asks the watcher to stop gracefully — the in-flight\n // run settles and its code wins. A second Ctrl+C means the user wants\n // out now: a hung run must not pin the terminal.\n if (forced) process.exit(130);\n forced = true;\n ac.abort();\n };\n process.on(\"SIGINT\", onSigint);\n try {\n // An explicit --config outside the watched root would otherwise never\n // retrigger a re-plan. Resolve against the root, same as the loader.\n const configPath =\n global.config === null ? null : resolve(global.root, global.config);\n const extraPaths =\n configPath !== null && !configPath.startsWith(`${resolve(global.root)}/`)\n ? [configPath]\n : [];\n // An in-root --output file is rewritten by every run — watching it\n // would make the run's own artifact retrigger the loop forever.\n const ignored: string[] = [];\n if (args.output !== undefined) {\n const out = resolve(global.root, args.output);\n if (out.startsWith(`${resolve(global.root)}/`)) ignored.push(out);\n }\n const watcher = watchLoop({\n root: global.root,\n extraPaths,\n ignored,\n output,\n signal: ac.signal,\n run: () =>\n runCommand({ ...args, watch: false }, global, output, Date.now()),\n });\n return await watcher.done;\n } finally {\n process.removeListener(\"SIGINT\", onSigint);\n }\n}\n\nfunction assertExecutorAvailable(executor: \"host\" | \"docker\"): void {\n if (executor === \"docker\" && !isBinaryAvailable(\"docker\")) {\n throw new CliError(\n \"docker executor not available (docker not found on PATH)\",\n \"RUNTIME_NOT_AVAILABLE\",\n ExitCode.RuntimeError,\n );\n }\n}\n\nfunction resolveEntryId(graph: DefinitionGraph, entryId?: string): string {\n const resolved = entryId ?? resolveDefaultEntryId(graph);\n if (!resolved) {\n throw new CliError(\n \"no entries in graph\",\n \"MISSING_ARG\",\n ExitCode.UsageError,\n );\n }\n if (!entryExists(graph, resolved)) {\n throw new CliError(\n `entry \"${resolved}\" not found in graph`,\n \"MISSING_ARG\",\n ExitCode.UsageError,\n );\n }\n return resolved;\n}\n\nfunction buildDrivers(executor: \"host\" | \"docker\"): RuntimeDriver[] {\n // Permissive allowlist: the CLI trusts the user's config.\n // The allowlist is a security boundary for untrusted input; the CLI\n // runs the user's own workflow definition.\n const permissiveAllowlist: CommandAllowlist = {\n entries: [],\n isAllowed: () => true,\n };\n\n const hostDriver = createHostDriver({\n enabled: true,\n allowlist: permissiveAllowlist,\n envAllowlist: [\n \"PATH\",\n \"HOME\",\n \"USER\",\n \"SHELL\",\n \"TMPDIR\",\n \"XDG_CONFIG_HOME\",\n \"XDG_CACHE_HOME\",\n \"XDG_DATA_HOME\",\n \"XDG_STATE_HOME\",\n \"XDG_RUNTIME_DIR\",\n ],\n });\n\n const drivers: RuntimeDriver[] = [hostDriver];\n if (executor === \"docker\") {\n drivers.push(createDockerDriver({}));\n }\n return drivers;\n}\n\ninterface RunContext {\n workspace: string;\n artifactDir: string;\n}\n\nasync function consumeEvents(\n engine: ReturnType<typeof createEngine>,\n plan: ReturnType<typeof bindRunPlan>,\n ctx: RunContext,\n global: GlobalFlags,\n output: OutputWriter,\n graph: DefinitionGraph,\n args: RunArgs,\n): Promise<{\n events: RunEvent[];\n runStatus: string;\n renderer: Renderer | null;\n}> {\n const events: RunEvent[] = [];\n let runStatus = \"failure\";\n\n // Lazy-import the reporter (~700ms via ink/react) — only paid on `run`.\n const { createTextRenderer, createHtmlRenderer, createInkRenderer } =\n await import(\"@sverka/reporter\");\n let renderer: Renderer | null = null;\n\n // --output flag implies HTML format (unless sarif/web format is explicit)\n const isSarif = global.format === \"sarif\";\n const isWeb = global.format === \"web\";\n const isHtml =\n global.format === \"html\" ||\n (args.output !== undefined && !isSarif && !isWeb);\n\n // TUI is strictly opt-in via --tui: `sverka run` prints plain text on\n // every stream, TTY included. Any non-text --format wins over --tui,\n // and --quiet suppresses the TUI (Ink writes to stdout, bypassing the\n // quiet-filtered writer).\n const tuiWanted =\n args.tui === true &&\n !global.quiet &&\n !isHtml &&\n !isSarif &&\n !isWeb &&\n global.format === \"text\";\n\n // ANSI colors only on a real terminal that hasn't opted out.\n const color =\n process.stdout.isTTY === true &&\n process.env.NO_COLOR === undefined &&\n process.env.TERM !== \"dumb\";\n const textRenderer = () =>\n createTextRenderer({\n writer: output,\n color,\n ...(args.stepOutputLines !== undefined\n ? { stepOutputLines: args.stepOutputLines }\n : {}),\n });\n\n if (tuiWanted) {\n try {\n renderer = createInkRenderer({ graph });\n } catch {\n renderer = textRenderer();\n }\n } else if (global.format === \"text\" && !isHtml) {\n renderer = textRenderer();\n } else if (isHtml) {\n const outputPath =\n args.output ?? join(global.root, \".sverka\", \"report.html\");\n renderer = createHtmlRenderer({\n outputPath,\n graph,\n context: collectReportContext(\n global.root,\n `sverka ${process.argv.slice(2).join(\" \")}`,\n ),\n });\n }\n\n for await (const event of engine.run({\n plan,\n workspace: ctx.workspace,\n artifactDir: ctx.artifactDir,\n })) {\n events.push(event);\n renderer?.onEvent(event);\n if ((event as { type: string }).type === \"run-completed\") {\n runStatus = (event as { status: string }).status;\n }\n }\n\n return { events, runStatus, renderer };\n}\n\nasync function runEvaluation(\n artifactDir: string,\n global: GlobalFlags,\n output: OutputWriter,\n _events: readonly RunEvent[],\n renderer: Renderer | null,\n args: RunArgs,\n /** Run start — scopes collection so stale SARIF from earlier runs\n * (same shared artifactDir) can't leak into this run's gate. */\n sinceMs: number,\n): Promise<{\n exitCode: number;\n summary: {\n findings: readonly Finding[];\n verdict: string;\n summary: string;\n } | null;\n}> {\n const { collectFindings, evaluateGate, ReporterError } =\n await import(\"@sverka/reporter\");\n let rows: readonly FindingRow[];\n try {\n rows = await collectFindings({ artifactDir, sinceMs });\n } catch (e) {\n if (e instanceof ReporterError) {\n if (global.format === \"json\") {\n output.writeLine(\n JSON.stringify({\n command: \"run\",\n error: \"COLLECTION_FAILED\",\n message: e.message,\n }),\n );\n } else {\n output.writeLine(`Collection failed: ${e.message}`);\n }\n return {\n exitCode: ExitCode.RuntimeError,\n summary: null,\n };\n }\n throw e;\n }\n const findings = rows.map((r) => r.finding);\n\n const { result, exitCode } = evaluateGate({ findings });\n\n // Pass findings and verdict to the existing renderer (no replay)\n if (renderer) {\n renderer.onFindings(findings);\n renderer.onVerdict(result);\n renderer.flush();\n }\n\n // --format sarif: serialize findings to SARIF and write to file\n if (global.format === \"sarif\") {\n const sarifPath =\n args.output ?? join(global.root, \".sverka\", \"findings.sarif\");\n const sarifLog = serializeSarif(findings);\n mkdirSync(dirname(sarifPath), { recursive: true });\n writeFileSync(sarifPath, JSON.stringify(sarifLog, null, 2), \"utf-8\");\n output.writeLine(`Wrote SARIF to ${sarifPath}`);\n }\n\n // --format web: generate HTML report using @sverka/sarif-viewer-web\n if (global.format === \"web\") {\n const webPath = args.output ?? join(global.root, \".sverka\", \"report.html\");\n try {\n const { generateSarifHtml } = await import(\"@sverka/sarif-viewer-web\");\n const html = generateSarifHtml(findings);\n mkdirSync(dirname(webPath), { recursive: true });\n writeFileSync(webPath, html, \"utf-8\");\n output.writeLine(`Wrote HTML report to ${webPath}`);\n } catch (e) {\n output.errorLine(\n `sverka run: failed to generate web report: ${e instanceof Error ? e.message : String(e)}`,\n );\n return {\n exitCode: 1,\n summary: { findings, verdict: result.verdict, summary: result.summary },\n };\n }\n }\n\n return {\n exitCode,\n summary: { findings, verdict: result.verdict, summary: result.summary },\n };\n}\n\nconst SIMPLE_STEP_STATUSES: Readonly<Record<string, StepSummary[\"status\"]>> = {\n \"step-skipped\": \"skipped\",\n \"step-cancelled\": \"cancelled\",\n \"step-suspended\": \"suspended\",\n};\n\n/** Extract per-step results from the event stream for JSON output. */\nfunction summarizeSteps(events: readonly RunEvent[]): readonly StepSummary[] {\n const steps: StepSummary[] = [];\n for (const event of events) {\n const step = summarizeStep(event);\n if (step !== undefined) steps.push(step);\n }\n return steps;\n}\n\nfunction summarizeStep(event: RunEvent): StepSummary | undefined {\n if (event.type === \"step-succeeded\" || event.type === \"step-failed\") {\n return {\n stepId: event.stepId,\n status: event.type === \"step-succeeded\" ? \"succeeded\" : \"failed\",\n durationMs: event.durationMs,\n ...(event.type === \"step-failed\" ? { error: event.error } : {}),\n ...capturedOutputFields(event),\n };\n }\n if (event.type === \"step-cache-hit\") {\n return { stepId: event.stepId, status: \"cache-hit\", cacheKey: event.key };\n }\n const status = SIMPLE_STEP_STATUSES[event.type];\n if (status === undefined || !(\"stepId\" in event)) return undefined;\n return { stepId: event.stepId, status };\n}\n\nfunction capturedOutputFields(event: {\n stdout?: string;\n stderr?: string;\n exitCode?: number;\n}): Pick<StepSummary, \"stdout\" | \"stderr\" | \"exitCode\"> {\n return {\n ...(event.stdout !== undefined ? { stdout: event.stdout } : {}),\n ...(event.stderr !== undefined ? { stderr: event.stderr } : {}),\n ...(event.exitCode !== undefined ? { exitCode: event.exitCode } : {}),\n };\n}\n\ninterface StepSummary {\n readonly stepId: string;\n readonly status:\n | \"succeeded\"\n | \"failed\"\n | \"skipped\"\n | \"cancelled\"\n | \"suspended\"\n | \"cache-hit\";\n readonly durationMs?: number;\n readonly error?: string;\n readonly cacheKey?: string;\n readonly stdout?: string;\n readonly stderr?: string;\n readonly exitCode?: number;\n readonly truncated?: boolean;\n}\n\ninterface WriteRunOutputArgs {\n planId: string;\n runStatus: string;\n events: readonly RunEvent[];\n durationMs: number;\n global: GlobalFlags;\n output: OutputWriter;\n evalResult: {\n findings: readonly Finding[];\n verdict: string;\n summary: string;\n } | null;\n report: { html: string | null; json: string } | undefined;\n}\n\nfunction writeRunOutput(opts: WriteRunOutputArgs): void {\n const { planId, runStatus, events, durationMs, global, output } = opts;\n const { evalResult, report } = opts;\n if (global.format === \"json\") {\n const steps = summarizeSteps(events);\n output.writeLine(\n JSON.stringify({\n command: \"run\",\n data: {\n planId,\n status: runStatus,\n steps,\n ...(evalResult\n ? {\n findings: evalResult.findings.length,\n verdict: evalResult.verdict,\n summary: evalResult.summary,\n }\n : {}),\n // sverka.run/v1 is append-only — new fields land, never rename.\n // html is exposed only when the file was actually written.\n ...(report !== undefined\n ? {\n report: {\n json: report.json,\n ...(report.html !== null ? { html: report.html } : {}),\n },\n }\n : {}),\n },\n durationMs,\n }),\n );\n }\n // Text format: renderer already printed all output including run-completed line.\n // No additional summary needed.\n}\n\n/** Cap captured step output in the durable report — verbatim stdout/stderr\n * persists whatever scrolled by, including secrets. The live payload keeps\n * full output; the on-disk report keeps the last 4 KiB per stream, counted\n * in UTF-8 bytes so a multibyte stream can't overrun the stated limit. */\nconst REPORT_OUTPUT_CAP = 4096;\n\nfunction boundStepOutput(steps: readonly StepSummary[]): StepSummary[] {\n return steps.map((step) => {\n const bound = (text: string | undefined): string | undefined => {\n if (text === undefined) return undefined;\n const buf = Buffer.from(text, \"utf8\");\n if (buf.length <= REPORT_OUTPUT_CAP) return text;\n // Tail cut in bytes — advance past a split UTF-8 continuation so\n // the kept text never starts mid-character and never exceeds the\n // stated byte limit once re-encoded.\n let cut = buf.length - REPORT_OUTPUT_CAP;\n // .at() not buf[cut] — a JSON.stringify source anywhere in this file\n // plus a bracket-index sink trips semgrep's no-stringify-keys taint.\n while (cut < buf.length && (buf.at(cut)! & 0xc0) === 0x80) cut++;\n return buf.subarray(cut).toString(\"utf8\");\n };\n const stdout = bound(step.stdout);\n const stderr = bound(step.stderr);\n if (stdout === step.stdout && stderr === step.stderr) return step;\n return {\n ...step,\n ...(stdout !== undefined ? { stdout } : {}),\n ...(stderr !== undefined ? { stderr } : {}),\n truncated: true,\n };\n });\n}\n\n/** Refuse to write through a path whose real location escapes the project\n * root — a symlinked `.sverka/…` component is exactly that escape. */\nfunction assertWithinRoot(real: string, realRoot: string, dir: string): void {\n // `--root /` already ends in the separator — a naive `${root}${sep}`\n // prefix would be `//` and reject every in-root path.\n const prefix = realRoot.endsWith(sep) ? realRoot : `${realRoot}${sep}`;\n if (real === realRoot || real.startsWith(prefix)) return;\n throw new CliError(\n `refusing to write run report through symlinked path: ${dir}`,\n \"REPORT_PATH_ESCAPE\",\n ExitCode.RuntimeError,\n );\n}\n\n/** Resolve the per-run report dir, checking the nearest existing ancestor\n * BEFORE mkdir — mkdir through a symlink is itself the escape. */\nfunction reportDir(root: string, runId: string): string {\n const dir = join(root, \".sverka\", \"runs\", runId);\n const realRoot = realpathSync(root);\n let ancestor = dir;\n while (!existsSync(ancestor)) {\n const parent = dirname(ancestor);\n if (parent === ancestor) break; // reached fs root\n ancestor = parent;\n }\n assertWithinRoot(realpathSync(ancestor), realRoot, dir);\n mkdirSync(dir, { recursive: true });\n assertWithinRoot(realpathSync(dir), realRoot, dir);\n return dir;\n}\n\n/** Findings for the report — the eval result when present, else a\n * collection pass over the artifact dir scoped to this run so a\n * zero-finding run does not pick up stale SARIF from prior runs. */\nasync function collectRunFindings(\n opts: {\n evalResult: { findings: readonly Finding[] } | null;\n artifactDir: string;\n sinceMs: number;\n },\n warnings: string[],\n): Promise<readonly Finding[]> {\n const fromEval = opts.evalResult?.findings ?? [];\n if (fromEval.length > 0) return fromEval;\n try {\n const { collectFindings } = await import(\"@sverka/reporter\");\n return (\n await collectFindings({\n artifactDir: opts.artifactDir,\n sinceMs: opts.sinceMs,\n })\n ).map((r) => r.finding);\n } catch (e) {\n warnings.push(\n `findings collection failed: ${e instanceof Error ? e.message : String(e)}`,\n );\n return [];\n }\n}\n\n/** Best-effort report.html — a render failure never fails the run; it is\n * recorded in the report's `warnings` instead of being dropped silently. */\nasync function writeReportHtml(\n dir: string,\n findings: readonly Finding[],\n warnings: string[],\n): Promise<string | null> {\n try {\n const { generateSarifHtml } = await import(\"@sverka/sarif-viewer-web\");\n const candidate = join(dir, \"report.html\");\n writeFileSync(candidate, generateSarifHtml(findings), \"utf-8\");\n return candidate;\n } catch (e) {\n warnings.push(\n `report.html generation failed: ${e instanceof Error ? e.message : String(e)}`,\n );\n return null;\n }\n}\n\ninterface WriteArtifactsOpts {\n root: string;\n runId: string;\n planId: string;\n runStatus: string;\n events: readonly RunEvent[];\n durationMs: number;\n evalResult: {\n findings: readonly Finding[];\n verdict: string;\n summary: string;\n } | null;\n artifactDir: string;\n /** Run start timestamp — scopes artifact collection to this run so a\n * zero-finding run does not pick up stale SARIF from prior runs. */\n sinceMs: number;\n}\n\nfunction runReportPayload(\n opts: WriteArtifactsOpts,\n warnings: readonly string[],\n): Record<string, unknown> {\n return {\n schema: \"sverka.run/v1\",\n data: {\n planId: opts.planId,\n status: opts.runStatus,\n steps: boundStepOutput(summarizeSteps(opts.events)),\n ...(opts.evalResult\n ? {\n findings: opts.evalResult.findings.length,\n verdict: opts.evalResult.verdict,\n summary: opts.evalResult.summary,\n }\n : {}),\n ...(warnings.length > 0 ? { warnings } : {}),\n },\n durationMs: opts.durationMs,\n };\n}\n\n/** Write the per-run report artifacts (Spec 53): report.json carries the\n * sverka.run/v1 payload; report.html renders whatever findings the run\n * produced (an empty-findings report is still a report). */\nasync function writeRunArtifacts(\n opts: WriteArtifactsOpts,\n): Promise<{ dir: string; htmlPath: string | null }> {\n const dir = reportDir(opts.root, opts.runId);\n const warnings: string[] = [];\n const findings = await collectRunFindings(opts, warnings);\n const htmlPath = await writeReportHtml(dir, findings, warnings);\n writeFileSync(\n join(dir, \"report.json\"),\n JSON.stringify(runReportPayload(opts, warnings), null, 2),\n \"utf-8\",\n );\n return { dir, htmlPath };\n}\n\nfunction exitCodeForStatus(runStatus: string): ExitCode {\n if (runStatus === \"success\") return ExitCode.Success;\n if (runStatus === \"failure\") return ExitCode.PolicyFail;\n return ExitCode.RuntimeError;\n}\n","// discover command — run planner discovery, show project context.\n// Spec 17 — §30.\n\nimport { createPlanner } from \"@sverka/sdk\";\nimport type { GlobalFlags, OutputWriter } from \"../types.js\";\nimport { ExitCode } from \"../types.js\";\n\n/**\n * Discover project context and display it.\n */\nexport async function discoverCommand(\n global: GlobalFlags,\n output: OutputWriter,\n start: number,\n): Promise<number> {\n output.debug(`discover: root=${global.root}`);\n\n const planner = createPlanner();\n const ctx = await planner.discover({ root: global.root });\n\n const durationMs = Date.now() - start;\n if (global.format === \"json\") {\n output.writeLine(\n JSON.stringify({\n command: \"discover\",\n data: {\n root: ctx.root,\n commit: ctx.commit,\n dirty: ctx.dirty,\n languages: ctx.languages,\n packageManagers: ctx.packageManagers,\n hasContainerBuild: ctx.hasContainerBuild,\n hasCiDefinition: ctx.hasCiDefinition,\n monorepo: ctx.monorepo,\n changedFiles: ctx.changedFiles.length,\n },\n durationMs,\n }),\n );\n } else {\n output.writeLine(`Project: ${ctx.root}`);\n output.writeLine(` commit: ${ctx.commit || \"(none)\"}`);\n output.writeLine(` dirty: ${ctx.dirty}`);\n output.writeLine(\n ` languages: ${ctx.languages.map((l: { name: string }) => l.name).join(\", \") || \"(none)\"}`,\n );\n output.writeLine(\n ` package managers: ${ctx.packageManagers.map((p: { name: string }) => p.name).join(\", \") || \"(none)\"}`,\n );\n output.writeLine(` container build: ${ctx.hasContainerBuild}`);\n output.writeLine(` CI definition: ${ctx.hasCiDefinition}`);\n if (ctx.monorepo) {\n output.writeLine(\n ` monorepo: ${ctx.monorepo.tool} (${ctx.monorepo.workspaces.length} workspaces)`,\n );\n }\n output.writeLine(` changed files: ${ctx.changedFiles.length}`);\n }\n\n return ExitCode.Success;\n}\n","// check command — detect project checks and show proposed steps.\n// Spec 17 — §30.\n\nimport type { GlobalFlags, OutputWriter } from \"../types.js\";\nimport { ExitCode } from \"../types.js\";\nimport { detectProjectChecks } from \"../internal/detect.js\";\n\n/**\n * Discover project checks (planner + package.json scripts) and display the\n * steps they would become — the same detection `init --detect` uses.\n */\nexport async function checkCommand(\n global: GlobalFlags,\n output: OutputWriter,\n start: number,\n): Promise<number> {\n output.debug(`check: root=${global.root}`);\n\n const checks = await detectProjectChecks(global.root);\n\n const durationMs = Date.now() - start;\n if (global.format === \"json\") {\n output.writeLine(\n JSON.stringify({\n command: \"check\",\n data: {\n proposed: checks.map((c) => c.checkId),\n resolved: checks.map((c) => ({ id: c.checkId, command: c.command })),\n },\n durationMs,\n }),\n );\n } else {\n output.writeLine(`Proposed checks: ${checks.length}`);\n for (const c of checks) {\n output.writeLine(` - ${c.checkId} (${c.source}): ${c.command}`);\n }\n }\n\n return ExitCode.Success;\n}\n","// policy command — evaluate findings against policy.\n// Spec 17 — §30.\n\nimport { existsSync } from \"node:fs\";\nimport { readFile } from \"node:fs/promises\";\nimport { DEFAULT_POLICY, evaluatePolicy } from \"@sverka/verification\";\nimport { loadBaseline, normalizeSarif } from \"@sverka/verification\";\nimport type { Finding, NormalizeContext, SarifLog } from \"@sverka/verification\";\nimport type { GlobalFlags, OutputWriter } from \"../types.js\";\nimport { CliError, ExitCode } from \"../types.js\";\nimport { resolveUnderRoot } from \"../internal/paths.js\";\n\nexport interface PolicyArgs {\n findings: string;\n baseline?: string;\n}\n\n/**\n * Evaluate findings against the default policy.\n * In v0, this is a placeholder — findings come from a baseline file\n * or are empty (no execution output to extract from yet).\n */\nexport async function policyCommand(\n args: PolicyArgs,\n global: GlobalFlags,\n output: OutputWriter,\n start: number,\n): Promise<number> {\n output.debug(\n `policy: root=${global.root} findings=${args.findings} baseline=${args.baseline ?? \"(none)\"}`,\n );\n\n const findingsPath = resolveUnderRoot(global.root, args.findings);\n const raw = await loadFindingsFile(findingsPath);\n\n const ctx: NormalizeContext = {\n root: global.root,\n checkIdPrefix: \"\",\n defaultConfidence: 0.5,\n };\n const findings = normalizeFindings(raw, ctx);\n const baselineFingerprints = await loadBaselineFingerprints(\n global.root,\n args.baseline,\n );\n\n const result = evaluatePolicy(findings, DEFAULT_POLICY, [\n ...baselineFingerprints,\n ]);\n\n const durationMs = Date.now() - start;\n writePolicyOutput(result, global, output, durationMs);\n\n return result.verdict === \"pass\" ? ExitCode.Success : ExitCode.PolicyFail;\n}\n\nasync function loadFindingsFile(findingsPath: string): Promise<unknown> {\n if (!existsSync(findingsPath)) {\n throw new CliError(\n `findings file not found: ${findingsPath}`,\n \"MISSING_ARG\",\n ExitCode.UsageError,\n );\n }\n try {\n return JSON.parse(await readFile(findingsPath, \"utf8\"));\n } catch (e) {\n throw new CliError(\n `failed to parse findings file: ${e instanceof Error ? e.message : String(e)}`,\n \"SDK_ERROR\",\n ExitCode.RuntimeError,\n e,\n );\n }\n}\n\nfunction normalizeFindings(\n raw: unknown,\n ctx: NormalizeContext,\n): readonly Finding[] {\n try {\n return normalizeSarif(raw as SarifLog, ctx);\n } catch (e) {\n throw new CliError(\n `failed to normalize findings: ${e instanceof Error ? e.message : String(e)}`,\n \"SDK_ERROR\",\n ExitCode.RuntimeError,\n e,\n );\n }\n}\n\nasync function loadBaselineFingerprints(\n root: string,\n baseline?: string,\n): Promise<readonly string[]> {\n if (!baseline) return [];\n const baselinePath = resolveUnderRoot(root, baseline);\n try {\n const loaded = await loadBaseline(baselinePath);\n return loaded.fingerprints;\n } catch (e) {\n throw new CliError(\n `failed to load baseline: ${e instanceof Error ? e.message : String(e)}`,\n \"SDK_ERROR\",\n ExitCode.RuntimeError,\n e,\n );\n }\n}\n\nfunction writePolicyOutput(\n result: ReturnType<typeof evaluatePolicy>,\n global: GlobalFlags,\n output: OutputWriter,\n durationMs: number,\n): void {\n if (global.format === \"json\") {\n output.writeLine(\n JSON.stringify({\n command: \"policy\",\n data: {\n verdict: result.verdict,\n summary: result.summary,\n triggered: result.triggered.length,\n },\n durationMs,\n }),\n );\n } else {\n output.writeLine(`Policy: ${result.verdict}`);\n output.writeLine(` ${result.summary}`);\n }\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { GithubStep, GithubTargetConfig } from \"@sverka/compiler\";\n\n/**\n * Detect the toolchain setup a generated GitHub workflow needs on a clean\n * runner: the package-manager action + dependency install, and recursive\n * submodule checkout when the repo has .gitmodules.\n *\n * The declared `packageManager` version is honored where the toolchain\n * supports it: `bun-version` for bun, Corepack for pnpm/yarn (both read the\n * `packageManager` field), and an explicit global install for npm.\n *\n * Always emits `checkoutWith` with `persist-credentials: false` —\n * generated YAML never persists the GITHUB_TOKEN, even when nothing else\n * was detected.\n */\nexport function detectCiSetup(root: string): GithubTargetConfig {\n const setup = detectPackageManagerSetup(root);\n // Least privilege on every generated workflow — persisted checkout\n // credentials leave the GITHUB_TOKEN readable by later steps.\n const checkoutWith = existsSync(join(root, \".gitmodules\"))\n ? { \"persist-credentials\": false, submodules: \"recursive\" }\n : { \"persist-credentials\": false };\n return {\n ...(setup.length > 0 ? { setup } : {}),\n checkoutWith,\n };\n}\n\nfunction detectPackageManagerSetup(root: string): GithubStep[] {\n const { name, version } = detectPackageManager(root);\n if (name === \"bun\") return bunSteps(version);\n if (name === undefined) return [];\n const node = setupNodeStep(root);\n switch (name) {\n case \"pnpm\":\n return pnpmSteps(version, node);\n case \"yarn\":\n return yarnSteps(version, node);\n case \"npm\":\n return npmSteps(root, version, node);\n default:\n return [];\n }\n}\n\n/** setup-node step — pins Node from engines.node (a semver range), else lts. */\nfunction setupNodeStep(root: string): GithubStep {\n return {\n name: \"Setup Node\",\n uses: \"actions/setup-node@v7\",\n with: { \"node-version\": nodeVersion(root) },\n };\n}\n\nfunction nodeVersion(root: string): string {\n try {\n const raw = readFileSync(join(root, \"package.json\"), \"utf8\");\n const engines = (JSON.parse(raw) as { engines?: { node?: unknown } })\n .engines?.node;\n if (typeof engines === \"string\" && engines.trim() !== \"\") return engines;\n } catch {\n // fall through to lts\n }\n return \"lts/*\";\n}\n\nfunction bunSteps(version?: string): GithubStep[] {\n return [\n {\n name: \"Setup Bun\",\n uses: \"oven-sh/setup-bun@v2\",\n ...(version ? { with: { \"bun-version\": version } } : {}),\n },\n {\n name: \"Install dependencies\",\n run: \"bun install --frozen-lockfile --ignore-scripts\",\n },\n ];\n}\n\nfunction pnpmSteps(\n version: string | undefined,\n node: GithubStep,\n): GithubStep[] {\n // pnpm/action-setup reads the version from the packageManager field;\n // the version input is required when the field is absent.\n return [\n {\n name: \"Setup pnpm\",\n uses: \"pnpm/action-setup@v4\",\n ...(version ? {} : { with: { version: \"latest\" } }),\n },\n node,\n {\n name: \"Install dependencies\",\n run: \"pnpm install --frozen-lockfile --ignore-scripts\",\n },\n ];\n}\n\nfunction yarnSteps(\n version: string | undefined,\n node: GithubStep,\n): GithubStep[] {\n // Corepack activates the yarn version declared in packageManager.\n return [\n node,\n ...(version\n ? [{ name: \"Enable Corepack\", run: \"corepack enable\" } as GithubStep]\n : []),\n { name: \"Install dependencies\", run: \"yarn install\" },\n ];\n}\n\nfunction npmSteps(\n root: string,\n version: string | undefined,\n node: GithubStep,\n): GithubStep[] {\n return [\n node,\n ...(version\n ? [\n {\n name: \"Pin npm\",\n run: `npm install -g \"npm@${version}\"`,\n } as GithubStep,\n ]\n : []),\n {\n name: \"Install dependencies\",\n run: existsSync(join(root, \"package-lock.json\"))\n ? \"npm ci --ignore-scripts\"\n : \"npm install --ignore-scripts\",\n },\n ];\n}\n\ninterface DetectedPm {\n name: \"bun\" | \"pnpm\" | \"yarn\" | \"npm\";\n version?: string;\n}\n\nfunction detectPackageManager(root: string): Partial<DetectedPm> {\n const declared = packageManagerField(root);\n if (declared) return declared;\n if (\n existsSync(join(root, \"bun.lock\")) ||\n existsSync(join(root, \"bun.lockb\"))\n ) {\n return { name: \"bun\" };\n }\n if (existsSync(join(root, \"pnpm-lock.yaml\"))) return { name: \"pnpm\" };\n if (existsSync(join(root, \"yarn.lock\"))) return { name: \"yarn\" };\n if (existsSync(join(root, \"package-lock.json\"))) return { name: \"npm\" };\n if (existsSync(join(root, \"package.json\"))) return { name: \"npm\" };\n return {};\n}\n\nfunction packageManagerField(root: string): DetectedPm | undefined {\n try {\n const raw = readFileSync(join(root, \"package.json\"), \"utf8\");\n const pm = (JSON.parse(raw) as { packageManager?: unknown }).packageManager;\n if (typeof pm !== \"string\") return undefined;\n const [name, version] = pm.split(\"@\");\n if (\n name === \"bun\" ||\n name === \"pnpm\" ||\n name === \"yarn\" ||\n name === \"npm\"\n ) {\n return version !== undefined ? { name, version } : { name };\n }\n } catch {\n // no readable package.json — fall through to lockfile detection\n }\n return undefined;\n}\n","import { constants } from \"node:fs\";\nimport {\n mkdir,\n open,\n realpath,\n writeFile,\n type FileHandle,\n} from \"node:fs/promises\";\nimport { dirname, isAbsolute, join, relative, resolve } from \"node:path\";\nimport { compileGithub, compileGitlab } from \"@sverka/compiler\";\nimport type { CompilationResult } from \"@sverka/compiler\";\nimport type { GlobalFlags, OutputWriter } from \"../types.js\";\nimport { CliError, ExitCode } from \"../types.js\";\nimport { loadProjectGraph } from \"../internal/config.js\";\nimport { detectCiSetup } from \"../internal/ci-setup.js\";\n\n/** Args parsed for the compile command. */\nexport interface CompileArgs {\n target: string;\n output?: string | undefined;\n /**\n * Write each artifact to `<outputDir>/<artifact path>` instead of\n * gluing all artifacts into one stdout/file. Mutually exclusive with\n * `output`; required once a project defines more than one pipeline.\n */\n outputDir?: string | undefined;\n /** Pin GitHub action refs to commit SHAs (github target only). */\n pin?: boolean;\n}\n\n/** Compile the Definition Graph to a target CI YAML. */\nexport async function compileCommand(\n args: CompileArgs,\n global: GlobalFlags,\n output: OutputWriter,\n start: number,\n): Promise<number> {\n const target = args.target;\n if (target !== \"github\" && target !== \"gitlab\") {\n throw new CliError(\n `invalid compile target: ${target} (expected github or gitlab)`,\n \"INVALID_FLAG\",\n ExitCode.UsageError,\n );\n }\n if (args.output && args.outputDir) {\n throw new CliError(\n \"--output and --output-dir are mutually exclusive\",\n \"INVALID_FLAG\",\n ExitCode.UsageError,\n );\n }\n\n output.debug(\n `compile: root=${global.root} target=${target} output=${args.output ?? \"stdout\"}`,\n );\n\n const { graph } = await loadProjectGraph(global);\n\n // GitHub runners start empty — inject detected toolchain setup (bun/npm/…\n // install) and submodule checkout so the generated YAML actually runs.\n const result: CompilationResult =\n target === \"github\"\n ? compileGithub(graph, {\n ...detectCiSetup(global.root),\n ...(args.pin ? { pinning: { mode: \"strict\" } } : {}),\n })\n : compileGitlab(graph);\n\n // Surface diagnostics on stderr — stdout must stay clean YAML for pipes\n // (e.g. `compile --pin | diff - workflow.yml`). Error-severity findings\n // (e.g. unpinned actions in --pin mode) fail the command.\n let hasError = false;\n for (const d of result.diagnostics) {\n output.errorLine(`[${d.severity}] ${d.capability}: ${d.message}`);\n if (d.severity === \"error\") hasError = true;\n }\n\n const yaml = result.artifacts.map((a) => a.content).join(\"\\n---\\n\");\n\n // A glued single file/stream cannot represent multiple pipelines —\n // hard-fail --output, warn on stdout (back-compat for drift diffs).\n if (result.artifacts.length > 1 && !args.outputDir) {\n if (args.output) {\n throw new CliError(\n `--output cannot represent ${result.artifacts.length} artifacts; use --output-dir`,\n \"INVALID_FLAG\",\n ExitCode.UsageError,\n );\n }\n output.errorLine(\n `[warning] ${result.artifacts.length} artifacts glued into one stream; use --output-dir to write separate files`,\n );\n }\n\n if (args.outputDir) {\n const outDir = resolve(global.root, args.outputDir);\n await mkdir(outDir, { recursive: true });\n const realOutDir = await realpath(outDir);\n const contained = (base: string, p: string) => {\n const rel = relative(base, p);\n return rel !== \"\" && !rel.startsWith(\"..\") && !isAbsolute(rel);\n };\n const written: string[] = [];\n for (const a of result.artifacts) {\n const outPath = resolve(outDir, a.path);\n const escapes = () =>\n new CliError(\n `artifact path escapes output dir: ${a.path}`,\n \"INVALID_FLAG\",\n ExitCode.UsageError,\n );\n if (!contained(outDir, outPath)) throw escapes();\n // Lexical containment alone isn't enough: a symlink planted inside\n // outDir would redirect the write. Walk up to the deepest existing\n // ancestor, realpath it, and re-check before touching the fs.\n for (let ancestor = dirname(outPath); ;) {\n try {\n const realAncestor = await realpath(ancestor);\n const realTarget = join(realAncestor, relative(ancestor, outPath));\n if (!contained(realOutDir, realTarget)) throw escapes();\n break;\n } catch (e) {\n if (e instanceof CliError) throw e;\n if ((e as NodeJS.ErrnoException).code !== \"ENOENT\") throw e;\n const up = dirname(ancestor);\n if (up === ancestor) break;\n ancestor = up;\n }\n }\n await mkdir(dirname(outPath), { recursive: true });\n // O_NOFOLLOW fails atomically on a symlinked leaf — no\n // check-then-write race on the final path component.\n const flags =\n constants.O_WRONLY |\n constants.O_CREAT |\n constants.O_TRUNC |\n constants.O_NOFOLLOW;\n let fh: FileHandle;\n try {\n fh = await open(outPath, flags);\n } catch (e) {\n if ((e as NodeJS.ErrnoException).code === \"ELOOP\") throw escapes();\n throw e;\n }\n try {\n await fh.writeFile(a.content);\n } finally {\n await fh.close();\n }\n written.push(outPath);\n }\n\n if (global.format === \"json\") {\n output.writeLine(\n JSON.stringify({\n command: \"compile\",\n data: { target, paths: written },\n durationMs: Date.now() - start,\n }),\n );\n } else {\n for (const p of written) {\n output.writeLine(`Compiled ${target} workflow to ${p}`);\n }\n }\n } else if (args.output) {\n const outPath = resolve(global.root, args.output);\n await mkdir(dirname(outPath), { recursive: true });\n await writeFile(outPath, yaml, \"utf8\");\n\n if (global.format === \"json\") {\n output.writeLine(\n JSON.stringify({\n command: \"compile\",\n data: { target, path: outPath },\n durationMs: Date.now() - start,\n }),\n );\n } else {\n output.writeLine(`Compiled ${target} workflow to ${outPath}`);\n }\n } else {\n if (global.format === \"json\") {\n output.writeLine(\n JSON.stringify({\n command: \"compile\",\n data: { target, yaml },\n durationMs: Date.now() - start,\n }),\n );\n } else {\n output.write(yaml);\n }\n }\n\n return hasError ? ExitCode.RuntimeError : ExitCode.Success;\n}\n","// synth command — alias for compile.\n// Delegates to compileCommand for backwards compatibility.\n\nimport type { GlobalFlags, OutputWriter } from \"../types.js\";\nimport { compileCommand, type CompileArgs } from \"./compile.js\";\n\nexport type SynthArgs = CompileArgs;\n\n/**\n * Alias for `compile`. Delegates to compileCommand.\n */\nexport async function synthCommand(\n args: SynthArgs,\n global: GlobalFlags,\n output: OutputWriter,\n start: number,\n): Promise<number> {\n return compileCommand(args, global, output, start);\n}\n","// BufferingOutputWriter — captures stdout output for JSON parsing,\n// routes errors/debug to stderr (NOT stdout — stdout is the MCP transport).\n\nimport process from \"node:process\";\nimport type { OutputWriter } from \"../types.js\";\n\n/**\n * OutputWriter for MCP tool execution: captures structured stdout output\n * (command handlers emit JSON when format=\"json\") and routes all error/debug\n * output to stderr. stdout is reserved for MCP JSON-RPC transport.\n */\nexport class BufferingOutputWriter implements OutputWriter {\n #buffer = \"\";\n\n write(text: string): void {\n this.#buffer += text;\n }\n\n writeLine(text: string): void {\n this.#buffer += text + \"\\n\";\n }\n\n error(text: string): void {\n process.stderr.write(text);\n }\n\n errorLine(text: string): void {\n process.stderr.write(text + \"\\n\");\n }\n\n debug(text: string): void {\n process.stderr.write(text + \"\\n\");\n }\n\n /** The captured stdout content (JSON string from the command handler). */\n get captured(): string {\n return this.#buffer;\n }\n}\n","// MCP tool definitions — 5 Sverka operations exposed as MCP tools.\n// Spec 28 — sverka mcp-server.\n\nimport { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { GlobalFlags, OutputWriter } from \"../types.js\";\nimport { ExitCode } from \"../types.js\";\nimport { validateCommand } from \"../commands/validate.js\";\nimport { planCommand } from \"../commands/plan.js\";\nimport { graphCommand } from \"../commands/graph.js\";\nimport { runCommand } from \"../commands/run.js\";\nimport { compileGithub, compileGitlab } from \"@sverka/compiler\";\nimport type { CompilationResult } from \"@sverka/compiler\";\nimport { loadProjectGraph } from \"./config.js\";\nimport { BufferingOutputWriter } from \"./buffering-writer.js\";\n\n/** MCP CallToolResult shape (kept loose to avoid deep SDK type coupling). */\ninterface ToolResult {\n [x: string]: unknown;\n content: { type: \"text\"; text: string }[];\n isError?: boolean;\n}\n\n/** Build GlobalFlags for JSON-format command execution. */\nfunction jsonFlags(root: string): GlobalFlags {\n return { format: \"json\", config: null, root, quiet: false, verbose: false };\n}\n\n/** Safely parse JSON, returning null on failure. */\nfunction safeJsonParse(text: string): unknown | null {\n try {\n return JSON.parse(text);\n } catch {\n return null;\n }\n}\n\n/**\n * Run a CLI command handler with a buffering writer and return an MCP\n * CallToolResult. On success (exit 0), the captured JSON `data` field is\n * returned as text content. On failure, isError is set with the error message.\n */\nexport async function runCommandAsTool(\n fn: (\n writer: OutputWriter,\n global: GlobalFlags,\n start: number,\n ) => Promise<number>,\n root: string,\n): Promise<ToolResult> {\n const writer = new BufferingOutputWriter();\n const global = jsonFlags(root);\n const start = Date.now();\n try {\n const exitCode = await fn(writer, global, start);\n const text = writer.captured.trim();\n if (exitCode === ExitCode.Success) {\n const parsed = text ? safeJsonParse(text) : null;\n const data =\n parsed && typeof parsed === \"object\" && \"data\" in parsed\n ? (parsed as { data: unknown }).data\n : (parsed ?? {});\n return { content: [{ type: \"text\", text: JSON.stringify(data) }] };\n }\n const parsed = text ? safeJsonParse(text) : null;\n const msg = parsed\n ? JSON.stringify(parsed)\n : text || `exit code ${exitCode}`;\n return { content: [{ type: \"text\", text: msg }], isError: true };\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n return { content: [{ type: \"text\", text: msg }], isError: true };\n }\n}\n\n/** Tool metadata for testing and introspection. */\nexport interface SverkaToolDef {\n readonly name: string;\n readonly description: string;\n readonly inputSchema: Record<string, unknown>;\n}\n\n/** The 5 Sverka MCP tool definitions (name, description, zod schema shape). */\nexport const SVERKA_TOOLS: readonly SverkaToolDef[] = [\n {\n name: \"sverka.validate\",\n description:\n \"Validate a sverka config: synthesize the Definition Graph and run validators.\",\n inputSchema: { root: z.string().optional() },\n },\n {\n name: \"sverka.plan\",\n description:\n \"Bind an Entry and inputs into a Run Plan and return the step list.\",\n inputSchema: {\n root: z.string().optional(),\n entryId: z.string().optional(),\n },\n },\n {\n name: \"sverka.graph\",\n description:\n \"Display the Definition Graph: pipelines, entries, steps, and dependencies.\",\n inputSchema: { root: z.string().optional() },\n },\n {\n name: \"sverka.run\",\n description:\n \"Execute the workflow locally through the native engine and return the run status.\",\n inputSchema: {\n root: z.string().optional(),\n entryId: z.string().optional(),\n executor: z.enum([\"host\", \"docker\"]).optional(),\n },\n },\n {\n name: \"sverka.synth\",\n description: \"Compile the workflow to a target CI YAML (github or gitlab).\",\n inputSchema: {\n root: z.string().optional(),\n target: z.enum([\"github\", \"gitlab\"]),\n },\n },\n] as const;\n\n/**\n * Register all 5 Sverka MCP tools on the given McpServer.\n * Each tool maps to the corresponding CLI command handler.\n */\nexport function registerSverkaTools(\n server: McpServer,\n defaultRoot: string,\n): void {\n server.tool(\n \"sverka.validate\",\n \"Validate a sverka config: synthesize the Definition Graph and run validators.\",\n { root: z.string().optional() },\n async (args) => {\n return runCommandAsTool(\n (w, g, s) => validateCommand(g, w, s),\n args.root ?? defaultRoot,\n );\n },\n );\n\n server.tool(\n \"sverka.plan\",\n \"Bind an Entry and inputs into a Run Plan and return the step list.\",\n { root: z.string().optional(), entryId: z.string().optional() },\n async (args) => {\n return runCommandAsTool(\n (w, g, s) =>\n planCommand(\n { ...(args.entryId !== undefined && { entryId: args.entryId }) },\n g,\n w,\n s,\n ),\n args.root ?? defaultRoot,\n );\n },\n );\n\n server.tool(\n \"sverka.graph\",\n \"Display the Definition Graph: pipelines, entries, steps, and dependencies.\",\n { root: z.string().optional() },\n async (args) => {\n return runCommandAsTool(\n (w, g, s) => graphCommand(g, w, s),\n args.root ?? defaultRoot,\n );\n },\n );\n\n server.tool(\n \"sverka.run\",\n \"Execute the workflow locally through the native engine and return the run status.\",\n {\n root: z.string().optional(),\n entryId: z.string().optional(),\n executor: z.enum([\"host\", \"docker\"]).optional(),\n },\n async (args) => {\n return runCommandAsTool(\n (w, g, s) =>\n runCommand(\n {\n ...(args.entryId !== undefined && { entryId: args.entryId }),\n ...(args.executor !== undefined && { executor: args.executor }),\n },\n g,\n w,\n s,\n ),\n args.root ?? defaultRoot,\n );\n },\n );\n\n server.tool(\n \"sverka.synth\",\n \"Compile the workflow to a target CI YAML (github or gitlab).\",\n { root: z.string().optional(), target: z.enum([\"github\", \"gitlab\"]) },\n async (args) => {\n return synthTool(args.root ?? defaultRoot, args.target);\n },\n );\n}\n\n/** Run the synth tool: load graph, compile to target, return artifacts. */\nasync function synthTool(\n root: string,\n target: \"github\" | \"gitlab\",\n): Promise<ToolResult> {\n try {\n const { graph } = await loadProjectGraph({ root, config: null });\n const result: CompilationResult =\n target === \"github\" ? compileGithub(graph) : compileGitlab(graph);\n const data = {\n target,\n artifacts: result.artifacts.map((a) => ({\n path: a.path,\n content: a.content,\n })),\n diagnostics: result.diagnostics,\n };\n return { content: [{ type: \"text\", text: JSON.stringify(data) }] };\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n return { content: [{ type: \"text\", text: msg }], isError: true };\n }\n}\n","// mcp-server command — expose Sverka operations as MCP tools over stdio.\n// Spec 28 — sverka mcp-server.\n\nimport process from \"node:process\";\nimport type { GlobalFlags, OutputWriter } from \"../types.js\";\nimport { ExitCode } from \"../types.js\";\nimport { registerSverkaTools } from \"../internal/mcp-tools.js\";\nimport { cliVersion } from \"../internal/version.js\";\n\n/** Args for the mcp-server command (none in v1 — stdio transport, all tools exposed). */\nexport interface McpServerArgs {}\n\n/**\n * Start an MCP server over stdio that exposes Sverka operations as tools.\n * External AI agents can invoke sverka.validate, sverka.plan, sverka.graph,\n * sverka.run, and sverka.synth via the Model Context Protocol.\n *\n * The server runs until stdin closes or SIGTERM is received. stdout is\n * reserved for MCP JSON-RPC transport — all logs go to stderr.\n *\n * @param shutdownSignal Optional promise that resolves to signal shutdown\n * (for testing). In production, the server waits for stdin close / SIGTERM.\n */\nexport async function mcpServerCommand(\n _args: McpServerArgs,\n global: GlobalFlags,\n output: OutputWriter,\n _start: number,\n shutdownSignal?: Promise<void>,\n): Promise<number> {\n output.debug(`mcp-server: root=${global.root}`);\n\n // Lazy-import the MCP SDK (~250ms) — only paid when serving MCP.\n const { McpServer } = await import(\"@modelcontextprotocol/sdk/server/mcp.js\");\n const { StdioServerTransport } =\n await import(\"@modelcontextprotocol/sdk/server/stdio.js\");\n const server = new McpServer({ name: \"sverka\", version: cliVersion() });\n registerSverkaTools(server, global.root);\n\n const transport = new StdioServerTransport();\n\n try {\n await server.connect(transport);\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n output.errorLine(`mcp-server: failed to start: ${msg}`);\n return ExitCode.RuntimeError;\n }\n\n // Wait for shutdown signal (stdin close / SIGTERM in production,\n // or an injected promise in tests).\n await (shutdownSignal ?? waitForStdinClose());\n\n await server.close();\n return ExitCode.Success;\n}\n\n/** Wait for stdin close or SIGTERM. */\nfunction waitForStdinClose(): Promise<void> {\n return new Promise<void>((resolve) => {\n const cleanup = (): void => {\n process.stdin.off(\"end\", cleanup);\n process.stdin.off(\"close\", cleanup);\n process.off(\"SIGTERM\", cleanup);\n resolve();\n };\n process.stdin.on(\"end\", cleanup);\n process.stdin.on(\"close\", cleanup);\n process.on(\"SIGTERM\", cleanup);\n });\n}\n","import { spawnSync } from \"node:child_process\";\nimport type { GlobalFlags, OutputWriter } from \"../types.js\";\nimport { ExitCode } from \"../types.js\";\n\ninterface DoctorCheck {\n name: string;\n status: \"ok\" | \"missing\";\n version: string | null;\n required: boolean;\n}\n\n/**\n * Check the environment: Node.js, Bun, git. Reports status of each.\n * Exit 0 when all pass, 3 when a required tool is missing.\n */\nexport async function doctorCommand(\n global: GlobalFlags,\n output: OutputWriter,\n start: number,\n): Promise<number> {\n output.debug(`doctor: root=${global.root}`);\n const checks: DoctorCheck[] = [\n runCheck(\"node\", \"node\", true),\n runCheck(\"bun\", \"bun\", false),\n runCheck(\"git\", \"git\", true),\n ];\n\n const allOk = checks.every((c) => !c.required || c.status === \"ok\");\n const exitCode = allOk ? ExitCode.Success : ExitCode.RuntimeError;\n\n const durationMs = Date.now() - start;\n if (global.format === \"json\") {\n output.writeLine(\n JSON.stringify({\n command: \"doctor\",\n data: { checks, allOk },\n durationMs,\n }),\n );\n } else {\n output.writeLine(\"Environment diagnostics:\");\n for (const check of checks) {\n const version = check.version ? `v${check.version}` : \"NOT FOUND\";\n output.writeLine(` ${check.name}: ${version}`);\n }\n output.writeLine(allOk ? \"All checks passed.\" : \"Some checks failed.\");\n }\n\n return exitCode;\n}\n\nfunction runCheck(\n name: string,\n binary: string,\n required: boolean,\n): DoctorCheck {\n try {\n const result = spawnSync(binary, [\"--version\"], {\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n encoding: \"utf8\",\n // Bound the check so a hung shim (broken PATH entry, blocking prompt,\n // etc.) cannot hang the CLI indefinitely. A timeout throws and is\n // treated the same as a missing tool.\n timeout: 5000,\n });\n if (result.status !== 0 || result.error) {\n return { name, status: \"missing\", version: null, required };\n }\n const out = result.stdout.trim();\n // Extract the first x.y.z version token so output like \"git version 2.43.0\"\n // or \"node v22.0.0\" is normalized to \"2.43.0\" / \"22.0.0\".\n const match = out.match(/(\\d+\\.\\d+\\.\\d+[^\\s]*)/);\n const version = match?.[1] ?? out;\n return { name, status: \"ok\", version, required };\n } catch {\n return { name, status: \"missing\", version: null, required };\n }\n}\n","// view command — view SARIF findings in TUI or generate HTML report.\n\nimport process from \"node:process\";\nimport { readFileSync } from \"node:fs\";\nimport type { GlobalFlags, OutputWriter } from \"../types.js\";\nimport { CliError, ExitCode } from \"../types.js\";\n\nexport interface ViewArgs {\n /** Path to a .sarif file. Reads from stdin if undefined. */\n file?: string;\n /** View format: \"tui\" (terminal) or \"web\" (HTML report). */\n format: \"tui\" | \"web\";\n /** Output HTML file path (for --format web). */\n output?: string;\n}\n\n/**\n * View SARIF findings in the terminal TUI or generate an HTML report.\n */\nexport async function viewCommand(\n args: ViewArgs,\n global: GlobalFlags,\n output: OutputWriter,\n start: number,\n): Promise<number> {\n // Read SARIF input.\n let sarifJson: string;\n if (args.file) {\n try {\n sarifJson = readFileSync(args.file, \"utf8\");\n } catch (e) {\n throw new CliError(\n `failed to read SARIF file: ${e instanceof Error ? e.message : String(e)}`,\n \"MISSING_ARG\",\n ExitCode.RuntimeError,\n );\n }\n } else if (!process.stdin.isTTY) {\n sarifJson = readFileSync(0, \"utf8\");\n if (sarifJson.trim() === \"\") {\n output.errorLine(\"sverka view: stdin is empty.\");\n return ExitCode.RuntimeError;\n }\n } else {\n output.errorLine(\n \"sverka view: no input. Provide a SARIF file argument or pipe SARIF via stdin.\",\n );\n return ExitCode.UsageError;\n }\n\n let sarif: unknown;\n try {\n sarif = JSON.parse(sarifJson);\n } catch (e) {\n output.errorLine(\n `sverka view: invalid JSON: ${e instanceof Error ? e.message : String(e)}`,\n );\n return ExitCode.RuntimeError;\n }\n\n if (args.format === \"web\") {\n return renderWeb(sarif, args, output);\n }\n\n return renderTui(sarif, output);\n}\n\n/** Launch the TUI viewer using @sverka/sarif-viewer-tui. */\nasync function renderTui(\n sarif: unknown,\n output: OutputWriter,\n): Promise<number> {\n try {\n const { renderSarifTui } = await import(\"@sverka/sarif-viewer-tui\");\n await renderSarifTui({ sarif: sarif as never });\n return ExitCode.Success;\n } catch (e) {\n output.errorLine(\n `sverka view: ${e instanceof Error ? e.message : String(e)}`,\n );\n return ExitCode.RuntimeError;\n }\n}\n\n/** Generate an HTML report using @sverka/sarif-viewer-web. */\nasync function renderWeb(\n sarif: unknown,\n args: ViewArgs,\n output: OutputWriter,\n): Promise<number> {\n try {\n const { renderSarifWeb } = await import(\"@sverka/sarif-viewer-web\");\n const outputPath = args.output ?? \"sarif-report.html\";\n renderSarifWeb({ sarif: sarif as never, outputPath });\n output.writeLine(`Wrote ${outputPath}`);\n return ExitCode.Success;\n } catch (e) {\n output.errorLine(\n `sverka view: ${e instanceof Error ? e.message : String(e)}`,\n );\n return ExitCode.RuntimeError;\n }\n}\n","// ui command — start local web dashboard server.\n\nimport process from \"node:process\";\nimport { join } from \"node:path\";\nimport type { GlobalFlags, OutputWriter } from \"../types.js\";\nimport { ExitCode } from \"../types.js\";\n\nexport interface UiArgs {\n /** Port to listen on (default: 3000). */\n port?: number;\n /** Host to bind (default: localhost). */\n host?: string;\n}\n\n/**\n * Start a local web dashboard server that lists SARIF files\n * and renders individual findings reports.\n */\nexport async function uiCommand(\n args: UiArgs,\n global: GlobalFlags,\n output: OutputWriter,\n _start: number,\n): Promise<number> {\n const artifactsDir = join(global.root, \".sverka\", \"artifacts\");\n const port = args.port ?? 3000;\n const host = args.host ?? \"localhost\";\n\n try {\n const { startUiServer } = await import(\"@sverka/ui\");\n const server = await startUiServer({ artifactsDir, port, host });\n output.writeLine(`Sverka UI running at ${server.url}`);\n output.writeLine(`Artifacts: ${artifactsDir}`);\n output.writeLine(\"Press Ctrl+C to stop.\");\n\n // Keep the process alive until interrupted.\n // Use `once` to prevent handler accumulation if uiCommand is called\n // multiple times in the same process.\n process.once(\"SIGINT\", () => {\n server.close();\n process.exit(ExitCode.Success);\n });\n\n // Return a promise that never resolves — the process exits via SIGINT.\n return new Promise<number>(() => {});\n } catch (e) {\n output.errorLine(\n `sverka ui: ${e instanceof Error ? e.message : String(e)}`,\n );\n return ExitCode.RuntimeError;\n }\n}\n","import process from \"node:process\";\nimport yargs, { type Arguments, type Argv } from \"yargs\";\n\nimport type { GlobalFlags, OutputWriter } from \"./types.js\";\nimport { CliError, ExitCode } from \"./types.js\";\nimport { createOutputWriter, wrapOutputWriter } from \"./output.js\";\nimport { missingBuildHint } from \"./internal/errors.js\";\nimport { cliVersion } from \"./internal/version.js\";\nimport { initCommand } from \"./commands/init.js\";\nimport { validateCommand } from \"./commands/validate.js\";\nimport { planCommand, type PlanArgs } from \"./commands/plan.js\";\nimport { graphCommand } from \"./commands/graph.js\";\nimport { runCommand, type RunArgs } from \"./commands/run.js\";\nimport { discoverCommand } from \"./commands/discover.js\";\nimport { checkCommand } from \"./commands/check.js\";\nimport { policyCommand, type PolicyArgs } from \"./commands/policy.js\";\nimport { synthCommand, type SynthArgs } from \"./commands/synth.js\";\nimport { compileCommand, type CompileArgs } from \"./commands/compile.js\";\nimport { mcpServerCommand } from \"./commands/mcp-server.js\";\nimport { doctorCommand } from \"./commands/doctor.js\";\nimport { viewCommand, type ViewArgs } from \"./commands/view.js\";\nimport { uiCommand, type UiArgs } from \"./commands/ui.js\";\n\n/** Optional dependencies for main (testability seam). */\nexport interface MainDeps {\n output?: OutputWriter;\n}\n\n/** Build GlobalFlags from parsed yargs options. */\nfunction buildGlobalFlags(parsed: Arguments): GlobalFlags {\n const format = resolveFormat(parsed.format);\n return {\n format,\n config: typeof parsed.config === \"string\" ? parsed.config : null,\n root: typeof parsed.root === \"string\" ? parsed.root : process.cwd(),\n quiet: Boolean(parsed.quiet),\n verbose: Boolean(parsed.verbose),\n };\n}\n\n/** Resolve the format string from parsed yargs. */\nfunction resolveFormat(\n format: unknown,\n): \"text\" | \"json\" | \"html\" | \"sarif\" | \"web\" {\n if (format === \"json\") return \"json\";\n if (format === \"html\") return \"html\";\n if (format === \"sarif\") return \"sarif\";\n if (format === \"web\") return \"web\";\n return \"text\";\n}\n\n/** Resolve the real output writer, wrapping injected writers with flag semantics. */\nfunction resolveOutputWriter(\n global: GlobalFlags,\n deps?: MainDeps,\n): OutputWriter {\n if (deps?.output) {\n return wrapOutputWriter(global, deps.output);\n }\n return createOutputWriter(\n global,\n (s) => process.stdout.write(s),\n (s) => process.stderr.write(s),\n );\n}\n\n/** Configure the init subcommand options. */\nfunction addInitCommand(y: Argv): Argv {\n return y\n .option(\"template\", {\n type: \"string\",\n default: \"minimal\",\n choices: [\"minimal\", \"full\"],\n })\n .option(\"force\", { type: \"boolean\", default: false })\n .option(\"detect\", {\n type: \"boolean\",\n default: false,\n describe:\n \"Generate config from detected project checks (overrides --template)\",\n });\n}\n\n/** Configure the run subcommand options. */\nfunction addRunCommand(y: Argv): Argv {\n return y\n .option(\"entry\", { type: \"string\" })\n .option(\"executor\", {\n type: \"string\",\n default: \"host\",\n choices: [\"host\", \"docker\"],\n })\n .option(\"evaluate\", { type: \"boolean\", default: false })\n .option(\"output\", {\n type: \"string\",\n alias: \"o\",\n describe: \"Output file path for HTML report (implies --format html)\",\n })\n .option(\"tui\", {\n type: \"boolean\",\n describe: \"Interactive terminal UI (off by default; opt-in only)\",\n })\n .option(\"jobs\", {\n type: \"number\",\n alias: \"j\",\n describe: \"Max steps running concurrently (default: 4)\",\n })\n .option(\"step-output-lines\", {\n type: \"number\",\n describe:\n \"Captured stdout/stderr tail lines printed per step (0 disables; default 20)\",\n })\n .option(\"watch\", {\n type: \"boolean\",\n alias: \"w\",\n describe: \"Re-run on file changes (debounced 300ms)\",\n });\n}\n\n/** Configure the plan subcommand options. */\nfunction addPlanCommand(y: Argv): Argv {\n return y.option(\"entry\", { type: \"string\" });\n}\n\n/** Configure the policy subcommand options. */\nfunction addPolicyCommand(y: Argv): Argv {\n return y\n .option(\"findings\", { type: \"string\", demandOption: true })\n .option(\"baseline\", { type: \"string\" });\n}\n\n/** Configure the synth subcommand options. */\nfunction addSynthCommand(y: Argv): Argv {\n return y.option(\"target\", {\n type: \"string\",\n demandOption: true,\n choices: [\"github\", \"gitlab\"],\n });\n}\n\n/** Configure the compile subcommand options. */\nfunction addCompileCommand(y: Argv): Argv {\n return y\n .option(\"target\", {\n type: \"string\",\n demandOption: true,\n choices: [\"github\", \"gitlab\"],\n })\n .option(\"output\", {\n type: \"string\",\n alias: \"o\",\n describe: \"Write YAML to a file instead of stdout\",\n })\n .option(\"output-dir\", {\n type: \"string\",\n describe: \"Write each artifact to <dir>/<artifact path> (multi-pipeline)\",\n })\n .option(\"pin\", {\n type: \"boolean\",\n default: false,\n describe: \"Pin GitHub action refs to commit SHAs (github target)\",\n });\n}\n\n/** Configure the view subcommand options. */\nfunction addViewCommand(y: Argv): Argv {\n return y\n .positional(\"file\", {\n type: \"string\",\n describe: \"Path to a .sarif file (reads from stdin if omitted)\",\n })\n .option(\"format\", {\n type: \"string\",\n alias: \"f\",\n choices: [\"tui\", \"web\", \"html\"],\n default: \"tui\",\n describe: \"View format: tui (terminal), web/html (HTML report)\",\n })\n .option(\"output\", {\n type: \"string\",\n alias: \"o\",\n describe:\n \"Output HTML file path (for --format web, default: sarif-report.html)\",\n });\n}\n\n/** Configure the ui subcommand options. */\nfunction addUiCommand(y: Argv): Argv {\n return y\n .option(\"port\", {\n type: \"number\",\n default: 3000,\n describe: \"Port to listen on\",\n })\n .option(\"host\", {\n type: \"string\",\n default: \"localhost\",\n describe: \"Host to bind\",\n });\n}\n\nfunction buildParser(): Argv {\n return yargs([])\n .scriptName(\"sverka\")\n .version(cliVersion())\n .option(\"format\", {\n type: \"string\",\n alias: \"f\",\n choices: [\"text\", \"json\", \"html\", \"sarif\", \"web\"],\n })\n .option(\"config\", { type: \"string\", alias: \"c\" })\n .option(\"root\", { type: \"string\", alias: \"r\", default: process.cwd() })\n .option(\"quiet\", { type: \"boolean\", alias: \"q\", default: false })\n .option(\"verbose\", { type: \"boolean\", alias: \"v\", default: false })\n .command(\"init\", \"Create a sverka.config.ts\", addInitCommand)\n .command(\"validate\", \"Validate a sverka config\")\n .command(\"plan\", \"Bind Entry + inputs → Run Plan\", addPlanCommand)\n .command(\"graph\", \"Display the Definition Graph\")\n .command(\"run\", \"Execute the workflow locally\", addRunCommand)\n .command(\"discover\", \"Discover and display project context\")\n .command(\"check\", \"Resolve proposed checks → StepDefinitions\")\n .command(\"policy\", \"Evaluate findings against policy\", addPolicyCommand)\n .command(\n \"synth\",\n \"Alias for compile — compile to a target CI YAML\",\n addSynthCommand,\n )\n .command(\"compile\", \"Compile to a target CI YAML\", addCompileCommand)\n .command(\"mcp-server\", \"Expose Sverka as an MCP server (stdio)\")\n .command(\"doctor\", \"Diagnose environment and dependencies\")\n .command(\n \"view [file]\",\n \"View SARIF findings in TUI or generate HTML report\",\n addViewCommand,\n )\n .command(\"ui\", \"Start local web dashboard server\", addUiCommand)\n .demandCommand(1, \"No command given\")\n .strict()\n .fail((msg, err) => {\n if (err) throw err;\n throw new CliError(msg, \"UNKNOWN_COMMAND\", ExitCode.UsageError);\n });\n}\n\n/** Dispatch a single command to its handler. */\nasync function dispatch(\n command: string,\n parsed: Arguments,\n global: GlobalFlags,\n output: OutputWriter,\n start: number,\n): Promise<number> {\n switch (command) {\n case \"init\":\n return dispatchInit(parsed, global, output, start);\n case \"validate\":\n return validateCommand(global, output, start);\n case \"plan\":\n return dispatchPlan(parsed, global, output, start);\n case \"graph\":\n return graphCommand(global, output, start);\n case \"run\":\n return dispatchRun(parsed, global, output, start);\n case \"discover\":\n return discoverCommand(global, output, start);\n case \"check\":\n return checkCommand(global, output, start);\n case \"policy\":\n return dispatchPolicy(parsed, global, output, start);\n case \"synth\":\n return dispatchSynth(parsed, global, output, start);\n case \"compile\":\n return dispatchCompile(parsed, global, output, start);\n case \"mcp-server\":\n return mcpServerCommand({}, global, output, start);\n case \"doctor\":\n return doctorCommand(global, output, start);\n case \"view\":\n return dispatchView(parsed, global, output, start);\n case \"ui\":\n return dispatchUi(parsed, global, output, start);\n default:\n throw new CliError(\n `unknown command: ${command}`,\n \"UNKNOWN_COMMAND\",\n ExitCode.UsageError,\n );\n }\n}\n\nfunction dispatchInit(\n parsed: Arguments,\n global: GlobalFlags,\n output: OutputWriter,\n start: number,\n): Promise<number> {\n return initCommand(\n {\n template:\n typeof parsed.template === \"string\" ? parsed.template : undefined,\n force: Boolean(parsed.force),\n detect: Boolean(parsed.detect),\n },\n global,\n output,\n start,\n );\n}\n\nfunction dispatchPlan(\n parsed: Arguments,\n global: GlobalFlags,\n output: OutputWriter,\n start: number,\n): Promise<number> {\n const args: PlanArgs = {};\n if (typeof parsed.entry === \"string\") args.entryId = parsed.entry;\n return planCommand(args, global, output, start);\n}\n\nfunction dispatchRun(\n parsed: Arguments,\n global: GlobalFlags,\n output: OutputWriter,\n start: number,\n): Promise<number> {\n const args: RunArgs = {\n executor: parsed.executor === \"docker\" ? \"docker\" : \"host\",\n evaluate: Boolean(parsed.evaluate),\n };\n if (parsed.jobs !== undefined) {\n const jobs = Number(parsed.jobs);\n if (!Number.isInteger(jobs) || jobs < 1 || jobs > 64)\n throw new CliError(\n \"--jobs must be an integer in [1, 64]\",\n \"INVALID_FLAG\",\n ExitCode.UsageError,\n );\n args.jobs = jobs;\n }\n if (parsed.stepOutputLines !== undefined) {\n const lines = Number(parsed.stepOutputLines);\n if (!Number.isInteger(lines) || lines < 0)\n throw new CliError(\n \"--step-output-lines must be a non-negative integer\",\n \"INVALID_FLAG\",\n ExitCode.UsageError,\n );\n args.stepOutputLines = lines;\n }\n if (typeof parsed.entry === \"string\") args.entryId = parsed.entry;\n if (typeof parsed.output === \"string\") args.output = parsed.output;\n if (parsed.tui === true) args.tui = true;\n if (parsed.tui === false) args.tui = false;\n if (parsed.watch === true) args.watch = true;\n return runCommand(args, global, output, start);\n}\n\nfunction dispatchPolicy(\n parsed: Arguments,\n global: GlobalFlags,\n output: OutputWriter,\n start: number,\n): Promise<number> {\n const args: PolicyArgs = { findings: String(parsed.findings) };\n if (typeof parsed.baseline === \"string\") args.baseline = parsed.baseline;\n return policyCommand(args, global, output, start);\n}\n\nfunction dispatchSynth(\n parsed: Arguments,\n global: GlobalFlags,\n output: OutputWriter,\n start: number,\n): Promise<number> {\n const target = parsed.target === \"gitlab\" ? \"gitlab\" : \"github\";\n const args: SynthArgs = { target };\n return synthCommand(args, global, output, start);\n}\n\nfunction dispatchCompile(\n parsed: Arguments,\n global: GlobalFlags,\n output: OutputWriter,\n start: number,\n): Promise<number> {\n const target = parsed.target === \"gitlab\" ? \"gitlab\" : \"github\";\n const args: CompileArgs = { target };\n if (typeof parsed.output === \"string\") args.output = parsed.output;\n if (typeof parsed.outputDir === \"string\") args.outputDir = parsed.outputDir;\n if (parsed.pin === true) args.pin = true;\n return compileCommand(args, global, output, start);\n}\n\nfunction dispatchView(\n parsed: Arguments,\n global: GlobalFlags,\n output: OutputWriter,\n start: number,\n): Promise<number> {\n const args: ViewArgs = {\n format: parsed.format === \"web\" || parsed.format === \"html\" ? \"web\" : \"tui\",\n };\n if (typeof parsed.file === \"string\") args.file = parsed.file;\n if (typeof parsed.output === \"string\") args.output = parsed.output;\n return viewCommand(args, global, output, start);\n}\n\nfunction dispatchUi(\n parsed: Arguments,\n global: GlobalFlags,\n output: OutputWriter,\n start: number,\n): Promise<number> {\n const args: UiArgs = {};\n if (typeof parsed.port === \"number\") args.port = parsed.port;\n if (typeof parsed.host === \"string\") args.host = parsed.host;\n return uiCommand(args, global, output, start);\n}\n\n/**\n * The main CLI entry point.\n * @param argv Command-line arguments (excluding node and script path).\n * @returns Exit code (0 = success, 1 = policy fail, 2 = usage error, 3 = runtime error).\n */\nexport async function main(argv: string[], deps?: MainDeps): Promise<number> {\n const start = Date.now();\n\n const output =\n deps?.output ??\n createOutputWriter(\n {\n format: \"text\",\n config: null,\n root: process.cwd(),\n quiet: false,\n verbose: false,\n },\n (s) => process.stdout.write(s),\n (s) => process.stderr.write(s),\n );\n\n let parsed: Arguments;\n try {\n parsed = await buildParser().parseAsync(argv);\n } catch (e) {\n return handleError(e, output, start);\n }\n\n const global = buildGlobalFlags(parsed);\n const realOutput = resolveOutputWriter(global, deps);\n const command = String(parsed._[0] ?? \"\");\n\n realOutput.debug(\n `sverka: command=${command} root=${global.root} format=${global.format}`,\n );\n\n try {\n return await dispatch(command, parsed, global, realOutput, start);\n } catch (e) {\n return handleError(e, realOutput, start);\n }\n}\n\nfunction handleError(e: unknown, output: OutputWriter, _start: number): number {\n const hint = missingBuildHint(e);\n if (e instanceof CliError) {\n output.errorLine(`error: ${e.message}`);\n if (hint !== null) output.errorLine(`hint: ${hint}`);\n return e.exitCode;\n }\n const msg = e instanceof Error ? e.message : String(e);\n output.errorLine(`error: ${msg}`);\n if (hint !== null) output.errorLine(`hint: ${hint}`);\n return ExitCode.RuntimeError;\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sverka",
3
- "version": "0.2.12",
3
+ "version": "0.2.13",
4
4
  "description": "Sverka CLI — validate, plan, run, and compile workflows",
5
5
  "license": "MIT",
6
6
  "sideEffects": false,
@@ -38,15 +38,15 @@
38
38
  },
39
39
  "dependencies": {
40
40
  "@modelcontextprotocol/sdk": "1.31.0",
41
- "@sverka/compiler": "^0.2.12",
42
- "@sverka/reporter": "^0.2.12",
43
- "@sverka/runtime": "^0.2.12",
44
- "@sverka/sarif-viewer-tui": "^0.2.12",
45
- "@sverka/sarif-viewer-web": "^0.2.12",
46
- "@sverka/sdk": "^0.2.12",
47
- "@sverka/ui": "^0.2.12",
48
- "@sverka/verification": "^0.2.12",
49
- "@sverka/workflow": "^0.2.12",
41
+ "@sverka/compiler": "^0.2.13",
42
+ "@sverka/reporter": "^0.2.13",
43
+ "@sverka/runtime": "^0.2.13",
44
+ "@sverka/sarif-viewer-tui": "^0.2.13",
45
+ "@sverka/sarif-viewer-web": "^0.2.13",
46
+ "@sverka/sdk": "^0.2.13",
47
+ "@sverka/ui": "^0.2.13",
48
+ "@sverka/verification": "^0.2.13",
49
+ "@sverka/workflow": "^0.2.13",
50
50
  "chokidar": "4.0.3",
51
51
  "yargs": "^18.2.0",
52
52
  "zod": "^4.6.5"