skit

CLI reference

Every command, flag, and exit code.

Plain skit opens the TUI menu. Everything below is the scriptable surface — the same actions, deterministic behavior.

Conventions

  • --json on every read command: list, show, params, deps, preset list, runner list, doctor, config.
  • --no-input on the commands that could prompt: add, run, runner remove. Read commands never prompt and don't take it.
  • --dry-run on run only: prints the exact command — tokens and globs expanded — and runs nothing.
  • Non-interactive contract: in a pipe, in CI, or under --no-input, skit never prompts and never guesses — it fails fast with a named error. "Interactive" requires both stdin and stdout to be TTYs.
  • Shell completion is dynamic: entry names, preset names, and runner names all complete.

Exit codes

CodeMeaning
0success
2usage error — bad flag combination, unknown --set name, unknown preset, a flag refused for the entry's type
125skit-side failure — missing/invalid parameter value, drift, token expansion error, over-long rendered command
126the target exists but can't run — missing interpreter or JS runtime, a needs command absent from PATH, no runner resolvable for a prompt
127no such entry in the library
130user cancelled an interactive screen (128 + SIGINT)

skit run passes the launched process's own exit code through untouched — even 125–127 (docker convention: 1–124 always belong to your script). A script killed by signal N reports 128+N, matching POSIX shells. skit doctor's exit code reflects uv availability only (0 = present or not needed, 1 = required but missing); per-entry warnings never change it.

skit add

skit add [PATH] — add a script, executable, prompt, or command template. PATH may be a file, - for stdin, or omitted in a terminal to be asked.

FlagEffect
--name, -nentry name (default: derived from the filename)
--description, -ddescription shown in the library
--refreference the original file in place instead of copying
--kind KINDforce a language kind
--exeforce the executable kind
--cmd 'TEMPLATE'register a command template
--promptadd as an AI-agent prompt
--edit, -edraft a new script in your editor
--runner NAMEpin the prompt's agent
--no-interpolateprompt: deliver verbatim, no placeholder insertion
--dep SPECpackage dependency (repeatable)
--python 'CONSTRAINT'Python version constraint
--no-inputnever prompt

The lane selectors — a file path, -, --cmd, --edit — are mutually exclusive (exit 2), and per-lane flags are refused with a hint when they don't apply to the chosen lane.

skit run

skit run NAME [flags] [-- ARGS]

FlagEffect
--set NAME=VALUEset a parameter (repeatable; tokens expand; --set NAME= delivers a real empty where the type supports it)
--preset, -p NAMEapply a saved preset
--save-preset NAMEsave this run's values as a preset
--runner NAMEprompt: override the pinned runner for this run
--dry-runprint the exact command, run nothing
--no-inputnever prompt; a required value with no source fails with 125
--plainline prompts instead of the TUI mini-form
--rawrun the stored copy as-is: no injection, no remembered args; refused for prompt/command (exit 2) and incompatible with --set/-p/--save-preset
--forget-argserase the remembered -- tail before this run

Value resolution, highest wins: --set → preset → last-used → the declared default. Extra -- ARGS are remembered per entry and replay on the next argument-less run (with a note on stderr); --forget-args clears them, --raw never replays them.

skit list / show

  • skit list [--json] — every entry: name, kind, description.
  • skit show NAME [--json] — full metadata, dependencies, parameters, presets. The JSON schema is stable; each parameter carries key, label, type, source, required, secret, multiple, repeat, degraded, choices, default, help, flag, action, env_source, delivers_empty, plus top-level param_origin, degraded_reason, and needs. Prompt entries add runner, runners_available, and interpolate.

skit remove / rename / describe / edit

  • skit remove NAME [--yes] — remove an entry (the original file is untouched; copy mode deletes skit's copy). Confirms unless --yes.
  • skit rename NAME NEW — presets, remembered values, and history follow.
  • skit describe NAME TEXT — set the description; empty text clears it.
  • skit edit NAME — open the stored source (the original, in reference mode) in your editor; offers to create the entry if the name is new. Refused for exe/command — there's no editable source.

skit params

skit params NAME [--json] shows managed parameters and last-used values. With flags it edits definitions — generally one editing operation per invocation:

FlagEffect
--resyncprune/refresh definitions to match the script's current source
--manage NAME / --unmanage NAMEmanage or drop a detected constant/prompt (repeatable)
--add NAME / --rm NAMEdeclare or remove a parameter by hand (exe/command and friends)
--type NAME=Tstr, int, float, bool, choice, path
--default NAME=VALUEdeclared default
--choices NAME=a,b,cchoice values
--deliver NAME=env|flag|placeholderhow the value reaches the script
--flag NAME=--outthe CLI flag to assemble (empty = positional)
--required NAME / --optional NAMErequiredness
--help-text NAME=TEXT / --prompt NAME=TEXTdescriptions
--secret NAME / --no-secret NAMEsecret marking (see Secrets)
--env-source NAME=ENVVARread the value from an env var at run time (empty clears)
--normalize NAMEshell only: rewrite a bare NAME=value into ${NAME:-value} in the stored copy — consent-gated, never the original
--runner NAMEprompt: pin a runner (empty clears the pin)
--interpolate / --no-interpolateprompt: placeholder insertion on/off
--workdir origin|store|invoke|/abs/pathworking directory policy
--template 'T'command entries: replace the template
--interpreter NAMEpin the interpreter for interpreted kinds (empty = auto; refused on python/prompt)

skit deps

skit deps NAME [--json] — package dependencies, Python constraint, and needed external commands.

FlagEffect
--dep SPECrepeatable; replaces the whole dependency list
--clearremove all package dependencies
--python 'CONSTRAINT'Python version constraint
--need CMDrepeatable; replaces the whole needs list
--clear-needsremove all needs

Package deps apply to Python and JS/TS entries; --need applies to every kind.

skit preset

  • skit preset save NAME PRESET [--from-last]--from-last snapshots the last run's values without asking.
  • skit preset list NAME [--json]
  • skit preset delete NAME PRESET

skit runner

  • skit runner list [--json] [--all] — configured prompt runners; --all also shows malformed raw rows with repair indexes.
  • skit runner add NAME COMMAND… — register a runner. Each word is one argv token (no shell); exactly one token must be {{prompt}} — see Prompts → Runners. --force replaces an existing name.
  • skit runner remove [NAME] [--row INDEX] [--yes] [--no-input]

skit agent

skit agent install [TARGET] — install the bundled Agent Skill. TARGET is claude, codex, or agents; --to DIR picks a directory explicitly; --project installs into the current repo (./.claude / ./.codex) instead of home. The bare form detects agent directories on your machine and asks.

skit doctor

skit doctor [--json] [--rebuild] — checks uv and library integrity, prints the resolved library path. --rebuild reconstructs the index from each entry's meta.toml. JSON keys include uv, entries, missing, drift, needs_missing, launch_blocked, runner_rows_invalid, rebuilt, rebuild_problems, mirror, location, size_bytes.

skit config

Git-config grammar: skit config lists everything, skit config KEY reads, skit config KEY VALUE writes; --json for machines. Every key is documented in Configuration.

On this page