Files
2026-05-27 23:29:53 +01:00

2.4 KiB

Spec: @suaveplan/cli

Purpose

Enterprise-grade CLI framework. Composable fluent API with subcommand routing, option parsing, OTel tracing, and terminal UI primitives. Depends on @suaveplan/readline, @suaveplan/error, @suaveplan/types, @opentelemetry/api, zod.

ADDED Requirements

App / cli()

  • cli(name, version?) factory shorthand
  • new App(config) with name, version, description, writer, onError, enableVersion, enableHelp
  • app.run(argv?, opts?) with AbortSignal support
  • Delegates to root Command for subcommand routing

Command

  • Fluent: description(), option(flags, desc, default?), argument(spec, desc), alias(name), hidden(), example(str), action(fn)
  • execute(argv) — parse args, route to subcommand or call action
  • helpText(parentName?) — generates formatted help
  • OTel span per execute() call

Parser

  • parseArgs(argv, config?) — options, positionals, rest (-- separator), allowUnknown
  • parseOptionFlags(flags, desc?, default?) — flag string → OptionConfig
  • parseArgumentSpec(spec, desc?) — spec string → ArgumentConfig
  • Types: boolean, string, number; choices validation; required options/arguments

Style

  • createStyler(enabled?) — returns Proxy-based chainable styler
  • Codes: bold, dim, italic, underline, strikethrough, 8 fg colors, 8 bg colors
  • stripAnsi(text), isColorSupported(), getStyleNames()

Output/Format

  • keyValue(obj, opts?), list(items, opts?), tree(node), columns(rows), json(obj, opts?)
  • heading(text, level?), divider(char?, width?), indent(text, spaces?)

Output/Table

  • table(headers, rows, opts?) — printTable variant
  • Border styles: ascii, unicode, none

Spinner

  • createSpinner(opts?) — start(text?), stop(), succeed(text?), fail(text?), warn(text?), update(text)
  • TTY: in-place frame animation via setInterval; non-TTY: newline-per-frame
  • AbortSignal support

Progress

  • createProgress(opts) — update(value), complete(label?)
  • ASCII bar [████░░░] with percentage and count
  • TTY in-place clear via clearLine/cursorTo; AbortSignal support

Prompt

  • text(opts, reader?), password(opts, reader?), confirm(opts, reader?), select(opts, reader?), multiselect(opts, reader?)
  • Injectable reader?: InputReader for testing; _setReaderFactory() internal seam
  • Validation, re-prompt on invalid, min/max for multiselect