shell output tester
Go to file
2026-03-10 10:08:53 -07:00
src Fix port assignment to respect user-defined PORT vars 2026-03-10 10:08:53 -07:00
test Add @env, @setup directives and --port-from flag 2026-03-10 09:32:06 -07:00
.gitignore shout it out 2026-03-09 21:13:41 -07:00
.npmrc shout it out 2026-03-09 21:13:41 -07:00
bun.lock shout it out 2026-03-09 21:13:41 -07:00
CLAUDE.md docs: add @env/@setup directives to CLAUDE.md 2026-03-10 09:45:43 -07:00
index.ts shout it out 2026-03-09 21:13:41 -07:00
package.json 0.0.2 2026-03-09 23:56:43 -07:00
README.md Rename --bin to --path, support repeatable 2026-03-09 23:47:22 -07:00
SHOUT.md ideas 2026-03-10 00:04:38 -07:00
tsconfig.json shout it out 2026-03-09 21:13:41 -07:00

shout

shout is kinda like really basic integration testing for your cli.

Write .shout files that look like shell sessions and run shout to test 'em.

Install

bun install -g @because/shout

Features

Everything you could ever ask for:

$ echo hello
hello

$ brew --version
Homebrew 5...

$ ls missing
ls: missing: No such file or directory
[1]

... matches anything — a whole line inline, or any number of lines on its own.

[1] after the expected output matches the exit code.

Usage

$ shout
...............
15 passed in 23ms

shout runs code in a temp directory. -k/--keep keeps it around.

--update will modify .shout files to match reality, without running any tests.

Each line in a .shout file is run sequentially, unless --parallel is passed.

Usage: shout [options] [files...]

shell output tester.

Arguments:
  files            Files or directories to test

Options:
  -u, --update     Rewrite expected output in-place with actual output
  -k, --keep       Keep temp directories after run
  --clean-env      Start with empty environment
  --path <path>    Prepend <path> to PATH (repeatable)
  --timeout <dur>  Per-command timeout (default: "10s")
  -v, --verbose    Print each command as it runs
  --parallel       Run files in parallel
  -h, --help       display help for command