Interface Design
ccashwell/evm-cortex
Interface and abstract contract design patterns for Solidity protocols.
Unix-composable CLI design patterns. An agent skill from citypaul/.dotfiles.
$ npx skills add citypaul/.dotfiles --skill cli-design -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install citypaul/.dotfiles cli-design --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/citypaul/.dotfiles.git skills-src && mkdir -p .claude/skills && cp -r skills-src/claude/.claude/skills/cli-design .claude/skills/cli-design && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "cli-design" agent skill from https://github.com/citypaul/.dotfiles/tree/main/claude/.claude/skills/cli-design into .claude/skills/cli-design/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "cli-design", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/citypaul/.dotfiles/tree/main/claude/.claude/skills/cli-designType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add citypaul/.dotfiles --skill cli-design -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install citypaul/.dotfiles cli-design --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/citypaul/.dotfiles.git skills-src && mkdir -p .agents/skills && cp -r skills-src/claude/.claude/skills/cli-design .agents/skills/cli-design && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "cli-design" agent skill from https://github.com/citypaul/.dotfiles/tree/main/claude/.claude/skills/cli-design into .agents/skills/cli-design/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "cli-design", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add citypaul/.dotfiles --skill cli-design -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install citypaul/.dotfiles cli-design --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/citypaul/.dotfiles.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/claude/.claude/skills/cli-design .cursor/skills/cli-design && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "cli-design" agent skill from https://github.com/citypaul/.dotfiles/tree/main/claude/.claude/skills/cli-design into .cursor/skills/cli-design/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "cli-design", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/citypaul/.dotfiles.git --path claude/.claude/skills/cli-design--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add citypaul/.dotfiles --skill cli-design -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install citypaul/.dotfiles cli-design --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/citypaul/.dotfiles.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/claude/.claude/skills/cli-design .gemini/skills/cli-design && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "cli-design" agent skill from https://github.com/citypaul/.dotfiles/tree/main/claude/.claude/skills/cli-design into .gemini/skills/cli-design/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "cli-design", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install citypaul/.dotfiles cli-designInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add citypaul/.dotfiles --skill cli-design -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/citypaul/.dotfiles.git skills-src && mkdir -p .github/skills && cp -r skills-src/claude/.claude/skills/cli-design .github/skills/cli-design && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "cli-design" agent skill from https://github.com/citypaul/.dotfiles/tree/main/claude/.claude/skills/cli-design into .github/skills/cli-design/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "cli-design", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add citypaul/.dotfiles --skill cli-design -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install citypaul/.dotfiles cli-design --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/citypaul/.dotfiles.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/claude/.claude/skills/cli-design .opencode/skills/cli-design && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "cli-design" agent skill from https://github.com/citypaul/.dotfiles/tree/main/claude/.claude/skills/cli-design into .opencode/skills/cli-design/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "cli-design", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
cli-designUnix-composable CLI design patterns. An agent skill from citypaul/.dotfiles.
CLI Design is an agent skill from citypaul/.dotfiles. Unix-composable CLI design patterns. Use when building CLI tools, designing command trees, implementing output layers, or testing CLI behavior. Covers stream separation (stdout/stderr), format flags (--json/--plain), exit codes, TTY detection, composability, and error design. Language-agnostic principles; TypeScript implementation patterns in resources/. For API design (REST, HTTP), see api-design.
Its SKILL.md is about 6.6k tokens, which your agent loads only when the skill is triggered. The skill folder holds 7 other files (for example `resources/composability.md`, `resources/output-architecture.md` and `resources/source-notes.md`).
It sits in Backend & APIs, covering API design and Design patterns. It works with TypeScript. The licence is CC-BY-SA-4.0.
5 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit cd4028d. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
jqcurlgitFrom the folder's file list and the shell code blocks in SKILL.md.
Links to these hosts (documentation or services it may open):
clig.devspecifications.freedesktop.orgFrom URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
CLI Design loads about 6.6k tokens when it runs. Until then it costs about 103 tokens; SKILL.md has 3,269 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check noted patterns worth knowing about, such as sudo or a known installer.
- Read `.env` where appropriate, but don't use it as a substitute for proper configAutomated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from citypaul/.dotfiles at commit cd4028d, republished under its CC-BY-SA-4.0 licence (© citypaul). 3,269 words, ~6,562 tokens.
.claude/skills/cli-design/SKILL.md (or your agent's skills folder). This skill also uses 6 other files; get the full folder from GitHub.This skill covers language-agnostic CLI design principles. The rules about stream separation, exit codes, format flags, and composability apply regardless of implementation language.
This bundle adapts the CC BY-SA 4.0 Command Line Interface Guidelines.
Pinned provenance, modification notes, and license scope are recorded in
resources/source-notes.md and LICENSE.
For API contract stability and Hyrum's Law, see the api-design skill. For config, env vars, and graceful shutdown, see the twelve-factor skill.
TypeScript implementation patterns are in the resources/ directory. Load them on demand when building a CLI in TypeScript:
| Resource | Load when... |
|---|---|
output-architecture.md | Implementing Result types, entry point wiring, formatters, logger, JSON envelope schemas |
testing-cli.md | Writing Vitest tests for CLI behavior (streams, exit codes, pipes, contract tests) |
stream-contracts.md | Understanding Node.js buffering, NDJSON, signal handling, crash-only design |
composability.md | Designing or testing pipe behavior — worked shell examples (jq filtering, NDJSON streaming, stdin, chaining, --fields, parallel xargs) |
stdout is for DATA only — the product the user asked for. stderr is for EVERYTHING ELSE — diagnostics, progress, spinners, warnings, errors.
This separation is what makes mycli --json | jq ... work. One spinner character on stdout breaks every downstream pipe.
"Whatever software you're building, you can be absolutely certain that people will use it in ways you didn't anticipate. Your software will become a part in a larger system — your only choice is over whether it will be a well-behaved part." — clig.dev
| Content | Stream | Why |
|---|---|---|
| Primary output (data, results, JSON) | stdout | Pipeable, buffered for throughput |
| Progress bars, spinners, status | stderr, and only when stderr is a TTY (process.stderr.isTTY) — a piped stderr carries warnings and errors and nothing else | Not data — must not corrupt pipes, and a pipe consumer never wants a spinner |
| Warnings, errors, diagnostics | stderr | Visible to user even when stdout is piped |
| Debug/verbose output | stderr | Diagnostic, never data |
Stream behavior:
.write() backpressure for high-volume outputWhen stdout is piped, the user doesn't want your status messages in their data. All non-data output must go to stderr.
For a deep dive on buffering behavior and performance implications, see resources/stream-contracts.md.
The practical rule: functions that do the work should return data, not write to stdout. The CLI entry point handles all I/O.
Entry point (CLI main) Your logic (handlers)
───────────────────── ─────────────────────
parse args (input) → structured result
detect format (json/plain/human) no printing to stdout
call handler no writing to stderr
format the result no calling exit
write to correct stream just returns data
set exit codeThis isn't an architecture mandate — it's just clean function design with one hard edge: the entry-point file is the only file that writes to a stream or ends the process. When you extend or edit a module that already prints or exits, move that writing into the entry point as part of the same change — do not leave it there, and never add more printing alongside it because "that function already did it". The benefits are concrete:
For simple CLIs where the "handler" is just calling a library, this separation already exists naturally — your library returns data, your CLI formats it. No extra layers needed.
If your project uses hexagonal architecture, the mapping is direct: the CLI entry point is a driving adapter, and the handler is a use case that returns a result through a port. See the hexagonal-architecture skill — the patterns reinforce each other, but hex arch is not required to benefit from keeping handlers pure.
For TypeScript implementation patterns (Result types, entry point wiring, formatters, logger interfaces), see resources/output-architecture.md.
Prefer the command and prompt libraries the repository already owns when they can satisfy the contracts in this skill. For a new material dependency, inspect current versions and project constraints and use evaluate-existing-solutions; do not select from remembered popularity or stale package characteristics.
Stricli can fit typed, injected command handlers, and @clack/prompts can fit optional TTY-gated interactivity. Treat them as candidates, not defaults. Compare them with the existing stack and alternatives on handler testability, type safety, startup cost measured in the target runtime, maintenance, dependency weight, non-interactive behavior, and migration cost.
Three-tier output hierarchy:
--plain: Grep/Awk-Friendlymycli list --plain | grep error | wc -l"Encourage your users to use
--plainor--jsonin scripts to keep output stable." — clig.dev
--json: Structured Datafalse flag inside it. If the caller still needs the figures, put them
inside error (a details field), never on stdout--json implies non-interactive regardless of TTYConsistent envelopes:
Success on stdout:
{ "ok": true, "data": { ... } }The envelope is not optional and renames nothing: field names a consumer asked for
live unchanged inside data, and a list of records goes in data rather than
replacing the envelope with a bare array.
Failure on stderr:
{ "ok": false, "error": { "code": "CONFIG_MISSING", "message": "...", "fix": "..." } }For large datasets, use NDJSON (one JSON text per record, terminated by \n):
type
discriminator and an optional final summary record; neither is required by NDJSONmycli run --format ndjson | while read -r line; do ...; doneFor NDJSON specification details, see resources/stream-contracts.md.
| Code | Meaning | When |
|---|---|---|
| 0 | Success | Operation completed as expected |
| 1 | Domain failure | Tool-specific failure (e.g. quality threshold not met) |
| 2 | Invalid usage | Bad flags, missing required args, validation error |
| 78 | Configuration error | Invalid config file, missing required config |
| 75 | Temporary, retry-safe failure | Failure occurred before dispatch, or the operation is documented and demonstrably safe to retry |
| 130 | SIGINT | User pressed Ctrl-C (128 + 2) |
| 143 | SIGTERM-style status | Optional documented status when preserving signal termination (128 + 15); a handled graceful shutdown may instead return 0 |
Rules:
--helpstatus/reconcile instead of inviting a blind retryCheck priority order (first match wins):
| Priority | Condition | Effect |
|---|---|---|
| 1 | --format json or --json flag | Non-interactive, no color, no animation |
| 2 | --no-color flag | Disable color (output may still be interactive) |
| 3 | FORCE_COLOR env | Empty, 1, 2, 3, or true enables color; every other value (including 0) disables it. Supported values override NO_COLOR and NODE_DISABLE_COLORS |
| 4 | NO_COLOR (non-empty) or NODE_DISABLE_COLORS (defined), with FORCE_COLOR unset | Disable color |
| 5 | TERM=dumb | Disable color and animations |
| 6 | CI=true | No interactive prompts |
| 7 | stdout is not a TTY (!isatty(stdout)) | Plain output, no animations on stdout |
| 8 | Default | Full interactive with colors |
Resolve the output mode once, in the entry point, before anything is written. Walk the table above — format flags, --no-color, FORCE_COLOR, NO_COLOR, TERM, CI, and each stream's TTY status (isatty/isTTY) — into a single mode value and pass it to the formatters. Write that check even when today's output has no color and no animation yet: it is what keeps the decision in one place the day either is added.
Check stdout and stderr independently. When stdout is piped but stderr is a TTY, you can still show spinners on stderr while keeping stdout clean for the pipe consumer. Status lines, spinners and progress are written only when the stream carrying them is a TTY; when stderr is a pipe it carries warnings and errors and nothing else.
Gate prompts on stdin independently. Prompt only when stdin and the prompt's output stream are TTYs; stdout TTY status controls data formatting, not whether input is safe to request.
Optionally support MYCLI_NO_COLOR for app-specific color override.
rm a.txt b.txt c.txt), as are universal idioms (cp source dest)Flags are self-documenting, order-independent, and future-proof.
# Bad — which is source, which is destination?
mycli copy myapp backup
# Good — explicit
mycli copy --from myapp --to backupAlways provide long forms. Short flags only for the most common operations.
| Flag | Meaning |
|---|---|
-h, --help | Show help (this should only mean help) |
--version | Print version to stdout |
-q, --quiet | Suppress non-essential output |
-v, --verbose | More detail in human output |
-d, --debug | Diagnostic output to stderr |
-f, --force | Skip confirmation prompts |
-n, --dry-run | Show what would happen without doing it |
--json | Structured JSON output |
--plain | Stable, grep-friendly plain text |
--no-color | Disable color output |
--no-input | Disable all prompts/interactivity |
-o, --output | Output file |
--fields | Select output columns |
--yes or --force--type=value--name=value--password-file=path or stdin pipeps output and shell history). Prefer, in order: OS keychain or a 0600 credential file (~/.config/mycli/credentials), then stdin (mycli login --with-token < token.txt), then env vars only where the platform injects them (CI secret stores) — env leaks to child processes and crash reports, so never make it the primary documented pathy/N prompt with --yes bypass; moderate → prompt plus suggest --dry-run first; severe/irreversible (delete a database, overwrite production) → require typing the resource name to confirm-- to stop flag parsing: mycli run -- --flag-for-child-process- for stdin/stdout file arguments: curl ... | mycli process ---flag=value and --flag valuecat)Highest to lowest priority:
MYCLI_* prefix, per-session.myclirc, mycli.config.ts, or in package.json~/.config/mycli/ (follow XDG spec)Rules:
MYCLI_* prefix, uppercase letters + digits + underscores; keep values single-line; don't commandeer POSIX namesNO_COLOR, FORCE_COLOR, DEBUG, EDITOR, PAGER, HTTP_PROXY/HTTPS_PROXY/NO_PROXY, TMPDIR, TERM, LINES/COLUMNS.env where appropriate, but don't use it as a substitute for proper configEvery error needs:
UPPER_SNAKE_CASE (e.g. CONFIG_MISSING, AUTH_EXPIRED)mycli help <topic> (optional)Error: CONFIG_MISSING — Configuration file not found
No configuration file found at ./mycli.config.ts or ~/.config/mycli/config.ts
Fix: Run `mycli init` to create a default configuration file
Docs: https://mycli.dev/docs/configuration--debug)Errors are structured too — not just success responses:
{
"ok": false,
"error": {
"code": "CONFIG_MISSING",
"message": "No configuration file found at ./mycli.config.ts",
"fix": "Run `mycli init` to create a default configuration file",
"transient": false
}
}The transient boolean says the cause may clear. It does not by itself authorize
a retry: callers also need exit code 75 or an explicit retry-safe contract.
status-style command for anything with complex state (the git status pattern)$PAGER only when stdout is a TTY, never when
piped; do not execute the value through a shell, and document whether it is an
executable token or parsed by a reviewed shell-word parser--quiet, show progress on stderr if an operation is still running after roughly
100ms; keep machine modes quiet unless their protocol explicitly defines progress,
and include time estimates when interactive progress can stallresources/stream-contracts.mdDesign for real-world pipes: filtering with jq, streaming NDJSON line-by-line, feeding stdin, chaining commands through emitted identifiers, selecting columns with --fields, and fanning out with xargs -P.
See resources/composability.md for the worked shell examples covering each of these patterns.
Key patterns:
--fields for column selection (reduces output size, critical for agent efficiency)--quiet for CI scripts that only care about the exit code--dry-run with --json outputs planned changes as structured datamycli config set, mycli report generateupdate vs upgrade is confusing)mycli --help — top-level helpmycli help <subcommand> — subcommand helpmycli <subcommand> --help — same as aboveStdout is a public API. Breaking changes to stdout format are breaking changes to the CLI.
| Change | Impact |
|---|---|
| Adding new optional JSON fields | Safe (additive) |
| Adding new subcommands | Safe |
| Adding new flags with preserving defaults | Safe |
| Removing or renaming flags | Breaking |
| Removing or renaming JSON fields | Breaking |
| Changing exit codes | Breaking |
| Changing default behavior | Breaking |
| Changing human-readable output | Usually OK (not a contract) |
When in doubt, add alongside — don't modify. Deprecate with stderr warnings before removing — and once you can detect that users have migrated, stop warning.
| # | Anti-Pattern | Why It's Wrong |
|---|---|---|
| 1 | Mixing data and diagnostics on stdout | Breaks every pipe: mycli list | jq . fails if warnings are on stdout |
| 2 | Colors/ANSI in piped output | ANSI sequences corrupt downstream parsing. Check isatty(stdout) + NO_COLOR |
| 3 | Interactive prompts with no flag bypass | Agents can't type 'y'. Every prompt needs --yes/--force. Non-TTY without bypass = hang |
| 4 | Printing nothing on success | Silence is ambiguous — show brief confirmation. Offer -q for scripts that want silence |
| 5 | Designing for humans OR machines, not both | Detect context (TTY vs pipe), adapt automatically |
| 6 | Output that doesn't guide the next action | Every output is a signpost: success = next command, failure = fix command |
| 7 | Breaking existing CLI contracts | Flag names, exit codes, output shape are contracts. Add alongside, never modify |
| 8 | console.log anywhere except the CLI adapter | Handlers must return data; only the presentation layer writes to streams |
| 9 | Handlers that exit the process directly | Let the entry point decide. Handlers return errors as data |
| 10 | Non-zero exit without stderr explanation | Scripts need both the code and the reason |
| 11 | Verbose default output | A single test run can generate 419KB. Support --fields, --quiet, --json |
After designing or reviewing a CLI:
--json with success data on stdout and structured failures on stderr--help--yes/--force/--flag bypass--dry-run available for mutating commandsNO_COLOR, TERM=dumb, and --no-color respected--quiet; machine-mode protocols stay clean--help includes 2-3 realistic examplesStream routing, exit codes, and standard flags are tabled in the body — see "The Unix Stream Contract", "Exit Codes", and "Standard Flags" above.
Default (TTY) → colors, tables, formatted text
--plain → one record per line, stable, grep-friendly
--json → structured JSON, versioned schema
--format ndjson → streaming, one JSON object per lineflags > env vars > project config > user config > defaults© citypaul, CC-BY-SA-4.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 6 other files in claude/.claude/skills/cli-design of citypaul/.dotfiles.
Open the folder on GitHubat commit cd4028d
CLI Design next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| CLI Design this skillcitypaul/.dotfiles | 739 | — | ~6.6k | Automated safety check: Notes | CC-BY-SA-4.0 | |
| Interface Designccashwell/evm-cortex | 131 | — | ~1.7k | Automated safety check: Pass | MIT | |
| Node Backend Development Guidelinesdiet103/claude-code-infrastructure-showcase | 10k | 2 repos | ~2k | Automated safety check: Pass | MIT | |
| API Design Principlesjh941213/my-cc-harness | 126 | 20 repos | ~3.4k | Automated safety check: Pass | None | |
| API ContractChenyCHENYU/Robot_Admin | 1k | — | ~1.9k | Automated safety check: Pass | MIT | |
| Server TRPC Router Guidelobehub/lobehub | 83k | — | ~904 | Automated safety check: Pass | Custom licence |
ccashwell/evm-cortex
Interface and abstract contract design patterns for Solidity protocols.
diet103/claude-code-infrastructure-showcase
Sets layered architecture and coding rules for Node.js, Express and TypeScript microservices, covering routes, controllers, services, repositories, Prisma, Sentry and Zod.
jh941213/my-cc-harness
REST 및 GraphQL API 설계 원칙 가이드. An agent skill from jh941213/my-cc-harness.
ChenyCHENYU/Robot_Admin
A skill your agent uses when: generating TypeScript API layer (type definitions + request functions) from page-spec JSON or Swagger/OpenAPI docs.
lobehub/lobehub
Conventions for LobeHub's server tRPC routers: file locations, middleware that injects models into ctx, procedure patterns, aggregated detail endpoints and return shapes.
bighadj22/codflow
Creates new API endpoints, and converts older ones, with the defineRoute() pattern used in cod-server, including auth strategies, scopes and OpenAPI output.
citypaul/.dotfiles
Discover and, with authorization, install agent skills from the open skills ecosystem.
citypaul/.dotfiles
Render the shape of code — module boundaries, the types that cross them, signatures, and a cited call graph — for code that already exists or a change about to be built.
citypaul/.dotfiles
Design, audit, and evolve physical source and package structures that expose real architectural boundaries while keeping related behavior together.
citypaul/.dotfiles
Review test quality using Dave Farley's eight properties of good tests.
citypaul/.dotfiles
A skill your agent uses when modifying existing code that lacks tests and you need to document its actual current behavior before making changes -- the legacy code dilemma where you need tests to…
citypaul/.dotfiles
Systematic CI/CD failure diagnosis using hypothesis-first investigation, local reproduction, and environment delta analysis.
Works with
Categories
Unix-composable CLI design patterns. An agent skill from citypaul/.dotfiles. dotfiles. Unix-composable CLI design patterns.
CLI Design fits situations like: building CLI tools; designing command trees; implementing output layers; testing CLI behavior.
Run `npx skills add citypaul/.dotfiles --skill cli-design -a claude-code`. Or copy the skill folder (claude/.claude/skills/cli-design in citypaul/.dotfiles) into .claude/skills/cli-design in your project. Claude Code loads it when a task matches its description.
Run `npx skills add citypaul/.dotfiles --skill cli-design -a codex`. Or copy the skill folder (claude/.claude/skills/cli-design in citypaul/.dotfiles) into .agents/skills/cli-design in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add citypaul/.dotfiles --skill cli-design -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/cli-design, .gemini/skills/cli-design, .github/skills/cli-design and .opencode/skills/cli-design in your project.
Going by SKILL.md and its folder, CLI Design needs the command-line tools its instructions call (jq, curl and git). Our summary lists: Node.js; Docker.
SKILL.md names 2 domains. As links in the text: clig.dev and specifications.freedesktop.org. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found notes only (mentions a .env file), nothing it rates as a warning. It is not a guarantee. Review the folder before installing.
CLI Design is published under the CC-BY-SA-4.0 licence (from the LICENSE file in the skill folder). It allows redistribution, so the full SKILL.md is shown on this page.
About 6.6k tokens (SKILL.md is roughly 26k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with CLI Design: Interface Design (ccashwell/evm-cortex, 131 stars), Node Backend Development Guidelines (diet103/claude-code-infrastructure-showcase, 10k stars), API Design Principles (jh941213/my-cc-harness, 126 stars) and API Contract (ChenyCHENYU/Robot_Admin, 1k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
citypaul (a GitHub user) maintains it in citypaul/.dotfiles, which has 739 GitHub stars. The repository holds 44 skills in this directory. The repository was last updated on October 2, 2026.
Source: citypaul/.dotfiles on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.