Semola

CLI

Typed command-line programs with Standard Schema args

Build CLIs with nested commands, validated arguments, and options. Schemas are Standard Schema (Zod, Valibot, …).

import { CLI } from "semola/cli";
import { z } from "zod";

A small program

const program = new CLI({
  name: "semola",
  version: "1.0.0",
  description: "Example CLI",
});

program
  .command("split")
  .argument("str", { schema: z.string() })
  .option("first", {
    schema: z.boolean().default(false),
    aliases: ["f"],
  })
  .action((args, options) => {
    const parts = args.str.split(" ");
    console.log(options.first ? parts[0] : parts);
  });

await program.parse();

parse() reads process.argv by default; pass an array for tests.

Nested commands

program
  .command("orm")
  .command("migrate")
  .option("dryRun", { schema: z.boolean().default(false) })
  .action(async (_args, options) => {
    if (options.dryRun) {
      console.log("would migrate");
      return;
    }

    await migrate();
  });

Errors

Exported from semola/cli: CliConfigurationError, CliValidationError, MissingArgumentError, UnknownCommandError.

On this page