sverka 0.2.10 → 0.2.11
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.map +1 -1
- package/dist/index.mjs +157 -2
- package/dist/index.mjs.map +1 -1
- package/package.json +11 -10
package/dist/index.d.mts.map
CHANGED
|
@@ -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;;;;;;;
|
|
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"}
|
package/dist/index.mjs
CHANGED
|
@@ -12,6 +12,7 @@ import { bindRunPlan, createPlanner } from "@sverka/sdk";
|
|
|
12
12
|
import { DEFAULT_POLICY, createBuiltinResolver, evaluatePolicy, loadBaseline, normalizeSarif, serializeSarif, synthesizeCheckSteps } from "@sverka/verification";
|
|
13
13
|
import { createDockerDriver, createEngine, createHostDriver } from "@sverka/runtime";
|
|
14
14
|
import { spawnSync } from "node:child_process";
|
|
15
|
+
import { watch } from "chokidar";
|
|
15
16
|
import { compileGithub, compileGitlab } from "@sverka/compiler";
|
|
16
17
|
import { z } from "zod";
|
|
17
18
|
//#region src/types.ts
|
|
@@ -799,11 +800,124 @@ function collectReportContext(root, command) {
|
|
|
799
800
|
};
|
|
800
801
|
}
|
|
801
802
|
//#endregion
|
|
803
|
+
//#region src/internal/watch.ts
|
|
804
|
+
const DEFAULT_IGNORED = [
|
|
805
|
+
/(^|[/\\])\.git([/\\]|$)/,
|
|
806
|
+
/(^|[/\\])\.sverka([/\\]|$)/,
|
|
807
|
+
/(^|[/\\])node_modules([/\\]|$)/,
|
|
808
|
+
/(^|[/\\])dist([/\\]|$)/,
|
|
809
|
+
/(^|[/\\])coverage([/\\]|$)/
|
|
810
|
+
];
|
|
811
|
+
/**
|
|
812
|
+
* Watch `root` and re-run `run()` on changes. Never rejects on a run
|
|
813
|
+
* failure — the failure is a result the user sees; the loop continues.
|
|
814
|
+
* `done` resolves when `signal` aborts and the in-flight run (if any)
|
|
815
|
+
* finished, so Ctrl+C never leaves a run printing after exit.
|
|
816
|
+
*/
|
|
817
|
+
function watchLoop(opts) {
|
|
818
|
+
const debounceMs = opts.debounceMs ?? 300;
|
|
819
|
+
const { output } = opts;
|
|
820
|
+
let running = false;
|
|
821
|
+
let pending = false;
|
|
822
|
+
let stopped = false;
|
|
823
|
+
let doneSettled = false;
|
|
824
|
+
let lastCode = 0;
|
|
825
|
+
let timer;
|
|
826
|
+
let runCount = 0;
|
|
827
|
+
let resolveDone;
|
|
828
|
+
const done = new Promise((resolve) => {
|
|
829
|
+
resolveDone = resolve;
|
|
830
|
+
});
|
|
831
|
+
const clearTimer = () => {
|
|
832
|
+
if (timer !== void 0) clearTimeout(timer);
|
|
833
|
+
timer = void 0;
|
|
834
|
+
};
|
|
835
|
+
const settleDone = (code) => {
|
|
836
|
+
if (doneSettled) return;
|
|
837
|
+
doneSettled = true;
|
|
838
|
+
resolveDone?.(code);
|
|
839
|
+
};
|
|
840
|
+
const invoke = async () => {
|
|
841
|
+
if (running) {
|
|
842
|
+
pending = true;
|
|
843
|
+
return;
|
|
844
|
+
}
|
|
845
|
+
running = true;
|
|
846
|
+
pending = false;
|
|
847
|
+
clearTimer();
|
|
848
|
+
runCount++;
|
|
849
|
+
output.errorLine(`watch: run #${runCount}`);
|
|
850
|
+
try {
|
|
851
|
+
lastCode = await opts.run();
|
|
852
|
+
} catch (e) {
|
|
853
|
+
output.errorLine(`watch: run failed: ${e instanceof Error ? e.message : String(e)}`);
|
|
854
|
+
lastCode = e instanceof CliError ? e.exitCode : 1;
|
|
855
|
+
}
|
|
856
|
+
running = false;
|
|
857
|
+
if (stopped) {
|
|
858
|
+
settleDone(lastCode);
|
|
859
|
+
return;
|
|
860
|
+
}
|
|
861
|
+
if (pending) await invoke();
|
|
862
|
+
};
|
|
863
|
+
const schedule = () => {
|
|
864
|
+
if (stopped) return;
|
|
865
|
+
clearTimer();
|
|
866
|
+
timer = setTimeout(() => {
|
|
867
|
+
timer = void 0;
|
|
868
|
+
invoke();
|
|
869
|
+
}, debounceMs);
|
|
870
|
+
};
|
|
871
|
+
const watcher = watch([opts.root, ...opts.extraPaths ?? []], {
|
|
872
|
+
ignoreInitial: true,
|
|
873
|
+
ignored: [...DEFAULT_IGNORED, ...opts.ignored ?? []]
|
|
874
|
+
});
|
|
875
|
+
let resolveReady;
|
|
876
|
+
const ready = new Promise((resolve) => {
|
|
877
|
+
resolveReady = resolve;
|
|
878
|
+
});
|
|
879
|
+
watcher.on("ready", () => resolveReady?.());
|
|
880
|
+
watcher.on("all", schedule);
|
|
881
|
+
watcher.on("error", (e) => {
|
|
882
|
+
output.errorLine(`watch: watcher error: ${e instanceof Error ? e.message : String(e)}`);
|
|
883
|
+
});
|
|
884
|
+
const stop = async () => {
|
|
885
|
+
if (stopped) return;
|
|
886
|
+
stopped = true;
|
|
887
|
+
clearTimer();
|
|
888
|
+
await watcher.close();
|
|
889
|
+
if (!running) settleDone(lastCode);
|
|
890
|
+
};
|
|
891
|
+
if (opts.signal?.aborted === true) {
|
|
892
|
+
stopped = true;
|
|
893
|
+
watcher.close();
|
|
894
|
+
settleDone(lastCode);
|
|
895
|
+
return {
|
|
896
|
+
ready,
|
|
897
|
+
done
|
|
898
|
+
};
|
|
899
|
+
}
|
|
900
|
+
opts.signal?.addEventListener("abort", () => void stop(), { once: true });
|
|
901
|
+
invoke();
|
|
902
|
+
return {
|
|
903
|
+
ready,
|
|
904
|
+
done
|
|
905
|
+
};
|
|
906
|
+
}
|
|
907
|
+
//#endregion
|
|
802
908
|
//#region src/commands/run.ts
|
|
909
|
+
/** Pure-argument guards — an invalid flag fails fast instead of surfacing
|
|
910
|
+
* as a recurring run failure inside the watch supervisor. */
|
|
911
|
+
function validateRunFlags(args) {
|
|
912
|
+
if (args.jobs !== void 0 && (!Number.isInteger(args.jobs) || args.jobs < 1 || args.jobs > 64)) throw new CliError("--jobs must be an integer in [1, 64]", "INVALID_FLAG", ExitCode.UsageError);
|
|
913
|
+
if (args.stepOutputLines !== void 0 && (!Number.isInteger(args.stepOutputLines) || args.stepOutputLines < 0)) throw new CliError("--step-output-lines must be a non-negative integer", "INVALID_FLAG", ExitCode.UsageError);
|
|
914
|
+
}
|
|
803
915
|
/**
|
|
804
916
|
* Execute a Run Plan through the native engine and print events.
|
|
805
917
|
*/
|
|
806
918
|
async function runCommand(args, global, output, start) {
|
|
919
|
+
validateRunFlags(args);
|
|
920
|
+
if (args.watch === true) return runWatch(args, global, output);
|
|
807
921
|
const executor = args.executor ?? "host";
|
|
808
922
|
const isSarif = global.format === "sarif";
|
|
809
923
|
const isWeb = global.format === "web";
|
|
@@ -820,8 +934,6 @@ async function runCommand(args, global, output, start) {
|
|
|
820
934
|
});
|
|
821
935
|
const workspace = global.root;
|
|
822
936
|
const artifactDir = join(global.root, ".sverka", "artifacts");
|
|
823
|
-
if (args.jobs !== void 0 && (!Number.isInteger(args.jobs) || args.jobs < 1 || args.jobs > 64)) throw new CliError("--jobs must be an integer in [1, 64]", "INVALID_FLAG", ExitCode.UsageError);
|
|
824
|
-
if (args.stepOutputLines !== void 0 && (!Number.isInteger(args.stepOutputLines) || args.stepOutputLines < 0)) throw new CliError("--step-output-lines must be a non-negative integer", "INVALID_FLAG", ExitCode.UsageError);
|
|
825
937
|
const { events, runStatus, renderer } = await consumeEvents(createEngine({
|
|
826
938
|
drivers: buildDrivers(executor),
|
|
827
939
|
maxConcurrent: args.jobs ?? 4
|
|
@@ -850,6 +962,44 @@ async function runCommand(args, global, output, start) {
|
|
|
850
962
|
if (evaluate && policyExitCode !== 0) return policyExitCode;
|
|
851
963
|
return exitCodeForStatus(runStatus);
|
|
852
964
|
}
|
|
965
|
+
/**
|
|
966
|
+
* Watch mode (Spec 53): delegate to the supervisor, which re-invokes
|
|
967
|
+
* runCommand per change — each cycle re-plans, so sverka.config.ts edits
|
|
968
|
+
* are picked up too. Ctrl+C aborts the watcher and exits cleanly.
|
|
969
|
+
*/
|
|
970
|
+
async function runWatch(args, global, output) {
|
|
971
|
+
if (args.tui === true) throw new CliError("--watch is incompatible with --tui (the TUI owns the terminal until exit)", "INVALID_FLAG", ExitCode.UsageError);
|
|
972
|
+
const ac = new AbortController();
|
|
973
|
+
let forced = false;
|
|
974
|
+
const onSigint = () => {
|
|
975
|
+
if (forced) process$1.exit(130);
|
|
976
|
+
forced = true;
|
|
977
|
+
ac.abort();
|
|
978
|
+
};
|
|
979
|
+
process$1.on("SIGINT", onSigint);
|
|
980
|
+
try {
|
|
981
|
+
const configPath = global.config === null ? null : resolve(global.root, global.config);
|
|
982
|
+
const extraPaths = configPath !== null && !configPath.startsWith(`${resolve(global.root)}/`) ? [configPath] : [];
|
|
983
|
+
const ignored = [];
|
|
984
|
+
if (args.output !== void 0) {
|
|
985
|
+
const out = resolve(global.root, args.output);
|
|
986
|
+
if (out.startsWith(`${resolve(global.root)}/`)) ignored.push(out);
|
|
987
|
+
}
|
|
988
|
+
return await watchLoop({
|
|
989
|
+
root: global.root,
|
|
990
|
+
extraPaths,
|
|
991
|
+
ignored,
|
|
992
|
+
output,
|
|
993
|
+
signal: ac.signal,
|
|
994
|
+
run: () => runCommand({
|
|
995
|
+
...args,
|
|
996
|
+
watch: false
|
|
997
|
+
}, global, output, Date.now())
|
|
998
|
+
}).done;
|
|
999
|
+
} finally {
|
|
1000
|
+
process$1.removeListener("SIGINT", onSigint);
|
|
1001
|
+
}
|
|
1002
|
+
}
|
|
853
1003
|
function assertExecutorAvailable(executor) {
|
|
854
1004
|
if (executor === "docker" && !isBinaryAvailable("docker")) throw new CliError("docker executor not available (docker not found on PATH)", "RUNTIME_NOT_AVAILABLE", ExitCode.RuntimeError);
|
|
855
1005
|
}
|
|
@@ -1822,6 +1972,10 @@ function addRunCommand(y) {
|
|
|
1822
1972
|
}).option("step-output-lines", {
|
|
1823
1973
|
type: "number",
|
|
1824
1974
|
describe: "Captured stdout/stderr tail lines printed per step (0 disables; default 20)"
|
|
1975
|
+
}).option("watch", {
|
|
1976
|
+
type: "boolean",
|
|
1977
|
+
alias: "w",
|
|
1978
|
+
describe: "Re-run on file changes (debounced 300ms)"
|
|
1825
1979
|
});
|
|
1826
1980
|
}
|
|
1827
1981
|
/** Configure the plan subcommand options. */
|
|
@@ -1977,6 +2131,7 @@ function dispatchRun(parsed, global, output, start) {
|
|
|
1977
2131
|
if (typeof parsed.output === "string") args.output = parsed.output;
|
|
1978
2132
|
if (parsed.tui === true) args.tui = true;
|
|
1979
2133
|
if (parsed.tui === false) args.tui = false;
|
|
2134
|
+
if (parsed.watch === true) args.watch = true;
|
|
1980
2135
|
return runCommand(args, global, output, start);
|
|
1981
2136
|
}
|
|
1982
2137
|
function dispatchPolicy(parsed, global, output, start) {
|
package/dist/index.mjs.map
CHANGED
|
@@ -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/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","// run command — execute Run Plan through native engine.\n// Spec 17 — §30.\n\nimport process from \"node:process\";\nimport { join, dirname } 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\";\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 /** 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/**\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 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 // runCommand is exported — re-validate, don't rely on argv parsing alone.\n // Upper bound: an absurd --jobs value can exhaust local/CI resources.\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 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\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}\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 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 | \"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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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sverka",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.11",
|
|
4
4
|
"description": "Sverka CLI — validate, plan, run, and compile workflows",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"sideEffects": false,
|
|
@@ -37,16 +37,17 @@
|
|
|
37
37
|
"typecheck": "tsc --noEmit"
|
|
38
38
|
},
|
|
39
39
|
"dependencies": {
|
|
40
|
-
"@sverka/workflow": "^0.2.10",
|
|
41
|
-
"@sverka/sdk": "^0.2.10",
|
|
42
|
-
"@sverka/runtime": "^0.2.10",
|
|
43
|
-
"@sverka/verification": "^0.2.10",
|
|
44
|
-
"@sverka/compiler": "^0.2.10",
|
|
45
|
-
"@sverka/reporter": "^0.2.10",
|
|
46
|
-
"@sverka/sarif-viewer-tui": "^0.2.10",
|
|
47
|
-
"@sverka/sarif-viewer-web": "^0.2.10",
|
|
48
|
-
"@sverka/ui": "^0.2.10",
|
|
49
40
|
"@modelcontextprotocol/sdk": "1.31.0",
|
|
41
|
+
"@sverka/compiler": "^0.2.11",
|
|
42
|
+
"@sverka/reporter": "^0.2.11",
|
|
43
|
+
"@sverka/runtime": "^0.2.11",
|
|
44
|
+
"@sverka/sarif-viewer-tui": "^0.2.11",
|
|
45
|
+
"@sverka/sarif-viewer-web": "^0.2.11",
|
|
46
|
+
"@sverka/sdk": "^0.2.11",
|
|
47
|
+
"@sverka/ui": "^0.2.11",
|
|
48
|
+
"@sverka/verification": "^0.2.11",
|
|
49
|
+
"@sverka/workflow": "^0.2.11",
|
|
50
|
+
"chokidar": "4.0.3",
|
|
50
51
|
"yargs": "^18.2.0",
|
|
51
52
|
"zod": "^4.6.5"
|
|
52
53
|
},
|