cli-tool-architect — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited cli-tool-architect (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Language-agnostic conventions for command-line tools. Go-specific recipes use spf13/cobra + spf13/pflag + spf13/viper; Python-specific recipes use typer. Per-language stacks are canonical in go-architect and python-architect. See STACK.md for additional CLI-specific libraries (output styling, alternative loggers).
tool <subcommand> [args] [flags]. Mirrors git, kubectl, docker, rsk. Top-level flags are global; subcommand flags are scoped to that subcommand.tool create user is fine. tool create-user-now is not.tool resource action (e.g. kubectl get pods, aws s3 ls). Skip if your tool has fewer than ~5 commands — flatten.get, list, apply, delete. Two words if they're a phrase: get-config.tool delete <user-id>. Use sparingly — every extra positional reduces clarity.Required: true (cobra) / Option(...) (typer) and document explicitly.-v, -h, -f, -o. Don't shortify every flag — tool deploy -e prod -r us-east-1 -p high -d becomes unreadable; long form is self-documenting.--dry-run, not --dry-run=true. Negate with --no-foo if both states need an explicit form.--tag debug --tag perf becomes --tags debug,perf or --tag repeatable. Pick one and document.Configuration values can come from four places. The order is fixed and inviolable:
flag > env var > config file > built-in default--log-level=debug flag wins over TOOL_LOG_LEVEL=info env wins over log_level = "warn" in the config wins over the compiled-in default (info).TOOL_LOG_LEVEL, TOOL_API_URL. Document the prefix in --help.tool config show (or tool config --show) that prints the resolved values and where each came from (flag / env / file / default). This is the difference between "user can diagnose" and "user files a bug ticket".pyproject.toml, uv.lock).$XDG_CONFIG_HOME/<tool>/config.toml, falling back to ~/.config/<tool>/config.toml$XDG_CACHE_HOME/<tool>/, falling back to ~/.cache/<tool>/$XDG_DATA_HOME/<tool>/, falling back to ~/.local/share/<tool>/%APPDATA%\<tool>\config.toml (per XDG-on-Windows convention translated to platform).--config <path> flag (explicit override)TOOL_CONFIG env var./<tool>.toml (project-local; useful for tools that have per-repo config)$XDG_CONFIG_HOME/<tool>/config.toml (user-global).tool.toml, tool.config.toml, config.toml, .toolrc all at once. Pick one and stick to it.--force.Note:rskitself uses~/.config/rsk/config.json(JSON) for legacy / parsing reasons; TOML is the recommended default for new CLIs.
Every command, subcommand, and flag has documented help. Help is the API surface.
Strict separation. Always.
Non-negotiable. Tools that mix the streams break every shell pipeline. Concrete pipe examples in RECIPES § Output discipline.
--output json|yaml mandatory on list/getHuman-readable text is the default. Every command returning structured data must also support --output json and --output yaml.
kubectl, gh, oc).tool list -o json | grep works.Invocation examples in RECIPES § Output format flag examples.
Standard semantics across the ecosystem — full table in RECIPES § Exit-code reference. Key rules:
--help or tool help exit-codes.tool list | less should not contain ANSI escapes).git, grep, ls).green: OK, red: FAILED, yellow: WARN) is great. Rainbow output is not.CLI logging is for the user's terminal, not log aggregation. Different style from server logging.
-v → debug, -vv → trace. --quiet / -q → warn.log/slog (Go) or structlog (Python). charmbracelet/log (Go) and rich (Python) add pretty-printing while preserving structure.For long-running operations only — anything that takes more than ~2 seconds.
\r overwrites.tool completion <shell> writes the script to stdout; user can pipe to the right location or use the tool's tool completion install --shell <shell> if you provide that convenience.tool help completion page.tool <semver> (rev <sha>, built <date>, <runtime>) — version + git short SHA + build date + runtime version. The SHA is critical for dev builds. Example in RECIPES § Version output.go build static; Python via pyinstaller or distributed as a uv tool install package).goreleaser (Go) or equivalent for the release matrix.Tell the user what failed, why, and what to try next. Three-line format + structured example in RECIPES § Error message format. Key rules:
debug level (visible with -vv) or write to a file with a correlation id.Did you mean: tool depoly → deploy? (Levenshtein distance from known subcommands).Implementation skeletons for Go (cobra + pflag + viper) and Python (typer + rich) live in RECIPES.md. Canonical per go-architect §11 and python-architect §10.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.