Agent skill

CLI Build

by crafter-station in crafter-station/skills

Design and build a CLI that an AI agent can operate safely and a human can supervise.

MITAuto-check passed

Install CLI Build

skills CLI
$ npx skills add crafter-station/skills --skill cli-build -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install crafter-station/skills cli-build --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/crafter-station/skills.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/cli-build .claude/skills/cli-build && rm -rf skills-src

Use ~/.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/

Facts

Skill name
cli-build
GitHub stars
112
Token cost
~5.2k tokens
SKILL.md length
3,026 words
Files
14 (incl. references)
Skills in repo
7
Repo updated
First seen
Licence
MIT

At a glance

Design and build a CLI that an AI agent can operate safely and a human can supervise.

  • Works in 7 steps: where does the contract come from → decide the distribution target first → shape the command surface → …
  • The user wants to build a CLI
  • SKILL.md covers Phase 0: where does the…, What agent-first actually means, Phase 1: decide the… and Phase 2: shape the command…, plus 6 more sections
  • Calls bun, npx and bunx

What it does

CLI Build is an agent skill from crafter-station/skills. Design and build a CLI that an AI agent can operate safely and a human can supervise. Use when the user wants to build a CLI, wrap an API in a command-line tool, build a CRUD or local-first tool over a database or filesystem the user already owns, add --json or --dry-run to an existing CLI, design a trust ladder or approval gate for risky commands, wrap an async API so agents do not write their own poll loop, or decide how to distribute a CLI (npm, native binary, source). Runs on its own when the contract is…

Its SKILL.md is about 5.2k tokens, which your agent loads only when the skill is triggered. The skill folder holds 15 other files, including reference files (for example `cases/README.md`, `cases/conventions.md` and `cases/osmo.md`).

It works with npm. The repository describes itself as: Agent skills extracted from real work. Each one shipped something first. The licence is MIT.

When your agent uses it

  • The user wants to build a CLI
  • Wrap an API in a command-line tool
  • Local-first tool over a database
  • Filesystem the user already owns

Example prompts

  • “/cli-build”

Workflow steps

7 steps, taken from the step headings in SKILL.md.

  1. where does the contract come from
  2. decide the distribution target first
  3. shape the command surface
  4. assemble from proven blocks
  5. safety, sized to the damage
  6. wire every safety feature you name
  7. verify, then write it down

What it can do on your machine

Read from SKILL.md and the folder at commit f0fe474. It shows what the files ask for, not the result of running them.

  • Tool permissions

    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.

  • Runs code

    Shell commands in SKILL.md call:

    • bun
    • npx
    • bunx

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    Links to these hosts (documentation or services it may open):

    • github.com

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

CLI Build loads about 5.2k tokens when it runs, and up to ~20k if it reads all its reference files. Until then it costs about 154 tokens; SKILL.md has 3,026 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~154
When it runs · the whole SKILL.md, loaded when a task matches
~5.2k
With references · SKILL.md plus every file in references/, read only if the agent opens them
~20k

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.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated 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.

SKILL.md

The full file from crafter-station/skills at commit f0fe474, republished under its MIT licence (© crafter-station). 3,026 words, ~5,206 tokens.

Download SKILL.mdSave it as .claude/skills/cli-build/SKILL.md (or your agent's skills folder). This skill also uses 13 other files; get the full folder from GitHub.
name
cli-build
description
Design and build a CLI that an AI agent can operate safely and a human can supervise. Use when the user wants to build a CLI, wrap an API in a command-line tool, build a CRUD or local-first tool over a database or filesystem the user already owns, add --json or --dry-run to an existing CLI, design a trust ladder or approval gate for risky commands, wrap an async API so agents do not write their own poll loop, or decide how to distribute a CLI (npm, native binary, source). Runs on its own when the contract is yours to define; follows a surface-recon report when the target is someone else's service.
version
0.12.0

cli-build

Build a CLI whose primary user is an agent and whose supervisor is a human. That inverts the usual defaults: machine-readable output is not a flag you add later, prompts are a failure mode in non-interactive contexts, and every write leaves a receipt.

Phase 0: where does the contract come from

Every command you write reads or mutates something with a shape. This phase names that shape's owner, because it decides whether you go find the contract or write it.

Discovered. The CLI wraps a system you do not control: a third-party API, a login-walled portal, a device, an undocumented file format. The contract exists and is unverified, so guessing at it wastes more time than mapping it. Run surface-recon first and start from its report.

Defined. You own the model: CRUD over your own database, a scaffolder, a local transform, a wrapper around a library whose types you already have. There is nothing to reverse-engineer, so surface-recon has no input and skipping it costs nothing. Write the contract instead, in one pass before Phase 1: the entities, their fields and types, the operations allowed on each, and what makes a write irreversible. That artifact is what a recon report would have given you.

Mixed. A CLI over your own database that also calls a payment provider is discovered at the boundary and defined in the middle. Recon only the discovered part; do not let one external call turn the whole build into a recon job.

Say which one this is out loud before Phase 1, and write it into friction.md. An unstated classification defaults to discovered, which is how a defined build ends up blocked waiting for a report nobody can produce.

Done when: the origin is named, and either a recon report exists or the entities and operations are written down.

Open friction.md next to the code now and append as you go.

A block you rejected and why, a convention that turned out wrong for this domain, a reference that was thin. It folds into the case at the end, and it is what corrects this skill: seven claims inherited from an older version were false against the source, and they surfaced only because someone wrote down that they did not match.

What agent-first actually means

Every CLI, no exceptions:

  • --json, and JSON automatically when stdout is not a TTY even without the flag. Three CLIs converged on this independently; it is the most valuable default here.
  • No prompt ever blocks a non-interactive run. Anything that would prompt fails with a structured error instead of hanging.
  • A schema command with a version field, so agents introspect at runtime instead of parsing --help. Present in 3 of 14 corpus CLIs: the highest-value convention and the least adopted.
  • Exit codes that mean something. Zero is success; user error and system failure are distinguishable.
  • Data on stdout, diagnostics on stderr, always. Including the banner, which is why banner is a block and not a console.log.
  • A secret read from the terminal never echoes, and returns null with no TTY rather than hanging. That is prompt-secret.

Those are now enforced as tests rather than trusted as prose, in the surfacer repository, which compiles CLIs from a recon descriptor. Each test names the rule it checks so the two read together.

It is worth knowing what that exercise found, because the same shape is likely wherever this list is only written down. Encoding the rules against the generator caught three violations, including the two most valuable defaults here. Then applying the identical list to the generator's own CLI caught four more, in the tool that had just been taught to enforce them. A compiler that emits agent-first CLIs while not being one is the easiest version of this to miss, because every test was passing and every test was pointed at the output.

So the list binds twice, and the tests live in two files only because a test cannot invoke a binary from another crate: crates/surfacer-emit-cli/tests/agent_first_rules.rs for what is generated, crates/surfacer-app/tests/agent_first_rules.rs for the tool doing the generating. If you build a tool that produces CLIs, check the producer against this list too. Prose does not fail a build, and a rule you enforce on others is the one you stop checking on yourself.

When the domain has real consequences (money, irreversible writes, third-party side effects, personal data):

  • A trust ladder classifying commands by risk.
  • --dry-run on every mutation, returning what would happen.
  • An append-only audit log written before the network call, not after.
  • A killswitch the human can trigger out of band.

When the API is asynchronous: --wait on every submitting command, backed by a job ledger that survives a killed poll. Handing the poll loop to the caller makes the agent write backoff logic it will get subtly wrong. See compounding-surface.md.

Size the friction to the damage, and "none" is a real size. Ask what one wrong call costs, then choose. A read-only CLI over a public dataset earns --json and a schema command and stops there: nobody loses anything by running the query twice. Intent tokens are for a wrong call that costs money. Adopting the full ladder for a tool that cannot hurt anyone is not caution, it is a tax the agent pays on every invocation, and it trains the human to approve without reading.

The question is damage, not distance. A delete against your own local database is irreversible even with no network, no money, and no third party in sight, so it earns --dry-run and a confirmation on the destructive verbs while the reads next to it earn nothing. Writes you can undo from a backup you actually have earn less. Grade the commands, not the project. See trust-ladder-patterns.md.

Phase 1: decide the distribution target first

This comes first because it constrains the code you write, and retrofitting it is painful.

Who installs thisTargetHow
Only you, from sourceRuntime shebang, no buildFastest iteration, zero packaging
JS-ecosystem developersBuild to Node, publish to npmnpx works with no extra install
Anyone, no runtimeCompile to a native binaryNo prerequisite at all

The rule that makes all three reachable: write against Node's API surface (fs, path, process, http), not runtime-specific APIs. Then the target is a build-time decision instead of a rewrite.

Done when: the audience is named and the target follows from it, not from preference.

Why this matters more than it looks: nothing stops you from publishing a package whose shebang names a runtime the installer lacks. Three of the four published packages in the corpus behind this skill do exactly that. It works until someone without that runtime installs it and gets env: <runtime>: No such file or directory, a message that names no cause and no fix, so the package reads as broken rather than under-specified. See build-and-runtime.md.

Phase 2: shape the command surface

Noun-verb, consistently, and enforced in CI rather than agreed in a style guide. Agents carry a generalized model of what CLIs do; a tool that says info where everything else says get succeeds slowly, after the agent spends tokens on --help. Two corpus CLIs independently overloaded --json to mean input, which is what happens when nothing checks. See compounding-surface.md.

{cli} {noun} {verb} [args] [flags]

{cli} order preview --ticker AAPL --amount 100
{cli} order submit --intent-token <token>

Include a shorthand for the single most common operation. If ninety percent of use is one command, that command should be the shortest thing to type.

Filter what deserves a command. Not every UI affordance should be one. Keep actions that repeat, that benefit from being scriptable, that have clear input and output, and that compose with other tools. Drop the ones that are inherently visual or exploratory.

Define the JSON contract per command before writing code. Field names, types, nesting. This is the API agents depend on, and changing it later breaks them silently. Note that --json conventionally means output mode: if you need JSON input, give it a different flag name. Two corpus CLIs overloaded --json as an input flag and broke the convention agents expect. See json-contract.md.

Done when: every command has a noun-verb name and a written JSON output shape. A command whose output shape is undecided is not shaped yet.

Add nextSteps to structured output. Telling an agent what it can run next, in the response, prevents a class of flailing that --help does not.

Shape the human view separately. The machine mode returns everything because the agent filters; the human mode returns what a person asked for. Building one output for both serves neither. Everything about legibility, which metric direction a reader assumes, where a scale's thresholds go, when repetition is a heading, is in human-output.md. This skill's other gates cannot catch an unreadable table: the first CLI built with it passed every one of them and printed 275 rows for someone who asked what was playing that evening.

Polished human output is the default scope. Unless the user explicitly asks for an MVP, minimal, headless, or machine-only CLI, include visual hierarchy, semantic color, readable tables, progress for work that takes time, and a TTY-only banner when the command has a human-facing surface. A small command count is not a reason to ship plain output. It is only a reason to keep the presentation compact.

Phase 3: assemble from proven blocks

Every CLI needs the same primitives: flag parsing, config paths, atomic writes, audit logs, TTY detection, approval gates, error shapes. Writing them fresh each time is where the time goes and where the bugs live.

Default to cligentic for TypeScript CLI infrastructure. Its registry ships plain TypeScript that the project owns after installation, with transitive block and package dependencies resolved and no cligentic runtime dependency. Projects without components.json register the namespace in package.json, so component tooling is no longer a prerequisite.

The canonical adoption process lives in the cligentic skill. If cligentic is already available, follow it for discovery, per-block decisions, installation, wiring, and verification. If it is absent and implementation is in scope, offer to install it before changing files:

bash
bunx --bun skills add Railly/cligentic --skill cligentic

Installing a skill changes the project or user environment, so wait for consent. If the user declines, the task is read-only, or skill installation is unavailable, read the canonical skill from GitHub and follow its adoption branch without installing it.

Opt-in, per block, with a reason. Each block earns its place by replacing something you would otherwise write from memory. For a human-facing TypeScript CLI, detect, style, and banner are the default presentation set unless the user reduced the scope explicitly. In a real retrofit, seven blocks were taken wholesale, two stayed as hybrids, and seven were rejected with reasons. The most important rejection was an output helper whose shape conflicted with an envelope already published to agents. A published contract outranks a shared block.

Done when: each block is adopted, hybridized, or rejected with the reason recorded in the repo. Silence about a rejection reads as an oversight to whoever touches it next.

If you are not in a TypeScript project, or the install path does not fit, read the block source and reimplement the pattern. The patterns are the point; the files are a shortcut.

Show full SKILL.md (1,176 more words)Show less

Phase 4: safety, sized to the damage

First, the exit: if no command in the surface can lose data, spend money, or touch a third party, this phase is one line in friction.md naming that fact, and you move on. A CLI that only reads, or only writes files it can rewrite, has nothing to gate. Record the finding so the next reader knows it was decided rather than skipped.

Otherwise read trust-ladder-patterns.md and pick a shape. Three materially different ones exist in real code, and the right choice depends on the domain rather than on fashion.

Non-negotiables when the domain has consequences:

Audit before, not after. Write the pending record, make the call, write the final record with the same id. If the process dies mid-flight you have an auditable pending entry instead of silence. Day-bucketed JSONL, append-only, restrictive file permissions.

Dry-run must exercise the real path. A --dry-run that returns a hardcoded shape proves nothing. The strongest corpus implementation calls the provider's own preview endpoint and returns that.

Consent gates are stricter than trust gates. Legal acceptance should require a real TTY and have no --yes escape hatch at all. If an agent can accept terms on the human's behalf, the gate is decorative.

Validate what came back before acting on it. One corpus CLI refuses to submit unless the provider's preview screen literally contains the expected name, amount, and currency. That check catches both provider bugs and your own bad request construction.

Done when: every mutating command has a trust level and the ladder shape is chosen from the domain rather than copied, or friction.md records that no command in the surface carries consequence.

Treat third-party response text as untrusted input. Free-text from an external API can carry prompt injection aimed at the agent reading your output. Escape it before it reaches any place where it reads as instruction.

Phase 5: wire every safety feature you name

A feature is wired when its call site exists. Until then it is a definition, and --help describing it is a claim the code does not back.

An audit-log module imported and never called. --dry-run parsed into a flags object no command body reads. --help advertising both. This shape is live in a package installable today, and it is strictly worse than having neither feature, because the operator, human or agent, believes there is a paper trail and a preview when there is nothing.

The check: grep for the call site. One hit, at the definition, means unwired.

Done when: every safety feature named in --help or the docs has a grep-confirmed call site.

Two more from the same corpus, both live in published packages:

  • Published with zero tests. At minimum: the auth flow, the JSON output contract per command, and any signing or crypto code.
  • Dead code from a renamed product still reachable from the entry point. Deprecated means removed, not merely unmentioned.

Phase 6: verify, then write it down

Link it globally first. Before verifying anything, put the CLI on your PATH so you invoke it the way a user will:

bash
bun link          # or npm link
which mycli && mycli --help

Running bun run src/cli.ts verifies a file. Running mycli verifies what ships: the bin entry, the shebang, the resolved dependencies, the banner. Three of those are invisible from a source-file invocation, and a broken bin path reaches a user's first install.

Definition of done is observed behavior. Run the command, read the output, and read it twice: once for correctness, once as someone who does not know the domain. What does the biggest number mean, what does the eye land on first, is there a column where every row says the same thing. See human-output.md.

For a human-facing CLI, inspect the real TTY path and verify all of these before calling it done:

  • the banner and diagnostics stay on stderr, while machine data stays on stdout;
  • --json, piped output, and other machine modes contain no ANSI escapes;
  • NO_COLOR disables styling without changing content;
  • colored columns remain aligned using visible width rather than string length;
  • long operations report real progress from completed work, not a timer animation.

Verifying a new feature probes the old ones sharing its stream. Confirming a fresh banner kept stdout clean turned up 810 bytes there, none of it the banner: a bare invoke had been writing help text to stdout with a nonzero exit since the previous round. Nobody had looked because bare invoke is not a case people test.

A green suite proves less than it appears to. What it misses, and how to close each gap, is in testing.md.

Ship the agent's manual with the CLI. A skills/<name>/SKILL.md in the CLI's own repo: commands, JSON envelope, the flags that matter, workflows worth composing. Without it every agent rediscovers the surface through --help, which is the cost this skill exists to remove. It lives with the code so it cannot drift, and it makes the CLI installable with npx skills add <owner>/<repo>.

Then record the build in cases/: target, terrain, distribution choice, which blocks were adopted or rejected and why, what broke, what you would do differently. Fold friction.md in. Distill repeated findings into conventions.md, and read portfolio-shape.md for the aggregate picture.

Name your own code, not other people's. A case about a CLI you wrote can be specific about what broke. A finding about someone else's package drops the subject and keeps the defect. The full boundary is in cases/README.md.

Done when: the CLI has been linked globally and run by its own name, its real output read, skills/<name>/SKILL.md exists with valid frontmatter, and a case file exists with friction.md folded in.

npx skills add <owner>/<repo> cannot be checked until the remote exists, and its failure for an unpublished repo is indistinguishable from a malformed SKILL.md unless you read the message. Valid frontmatter is a local check; installable is post-push.

This is the part everyone skips, and skipping it is why the same lessons get rediscovered. Before someone wrote the corpus down, four CLIs had independently reinvented the same audit-log design.

References

Boundaries

The phases above say what to do. These are the two that hold when a phase does not obviously apply:

Store identifiers, take secrets from the environment. A password belongs in memory for the session, or in a keychain. The persisted config holds the account id and the username.

Claim what you implemented. NDJSON, day-bucketed audit, and dry-run each earn a mention once the code does them, not before.

© crafter-station, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 13 other files (references) in skills/cli-build of crafter-station/skills.

  • SKILL.md
  • cases/README.md
  • cases/conventions.md
  • cases/osmo.md
  • cases/portfolio-shape.md
  • cases/sunat-cli-renta.md
  • references/audit-log-patterns.md
  • references/auth-patterns.md
  • references/build-and-runtime.md
  • references/compounding-surface.md
  • references/human-output.md
  • references/json-contract.md
  • references/testing.md
  • references/trust-ladder-patterns.md

Open the folder on GitHubat commit f0fe474

Compare with similar skills

CLI Build 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.

CLI Build compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
CLI Build this skillcrafter-station/skills112—~5.2kAutomated safety check: PassMIT
Defuddlekepano/obsidian-skills49k12 repos~208Automated safety check: PassMIT
Vercel Deploybytedance/deer-flow83k10 repos~797Automated safety check: PassMIT
MCP Server BuildershareAI-lab/learn-claude-code78k5 repos~1.2kAutomated safety check: PassMIT
Knap Markdown Templateskepano/obsidian-skills49k2 repos~986Automated safety check: PassMIT
Install Anti-Slop Oxlint Rulesdmmulroy/anti-slop5.3k1 repos~2.2kAutomated safety check: PassMIT

Similar skills

  • Defuddle

    kepano/obsidian-skills

    Uses the Defuddle CLI to pull clean, readable Markdown, JSON or metadata from web pages, stripping navigation, ads and clutter to save tokens.

    49k GitHub starsUsed in 12 repos~208 tokens
    Knowledge ManagementAuto-check passed
  • Vercel Deploy

    bytedance/deer-flow

    Deploys a project to Vercel with one script and no login, then returns a live preview URL and a claim link for moving the deployment into your own Vercel account.

    83k GitHub starsUsed in 10 repos~797 tokens
    DevOps & CloudAuto-check passed
  • MCP Server Builder

    shareAI-lab/learn-claude-code

    Walks through building MCP servers in Python or TypeScript that expose tools, resources and prompts to Claude, with templates, registration and testing.

    78k GitHub starsUsed in 5 repos~1.2k tokens
    Agent WorkflowsAuto-check passed
  • Knap Markdown Templates

    kepano/obsidian-skills

    Renders Markdown notes from Knap templates and JSON data on the command line, including notes built from Defuddle web page output.

    49k GitHub starsUsed in 2 repos~986 tokens
    Documents & OfficeAuto-check passed
  • Installs, updates or migrates the vendored anti-slop Oxlint plugin in a repository, keeping local rule changes and the plugin's license and provenance files.

    5.3k GitHub starsUsed in 1 repo~2.2k tokens
    DevelopmentAuto-check passed
  • Nx Run Tasks

    nomcopter/react-mosaic

    Helps with running tasks in an Nx workspace. An agent skill from nomcopter/react-mosaic.

    4.8k GitHub starsUsed in 8 repos~613 tokens
    DevelopmentAuto-check passed

More from crafter-station/skills

  • Intent Layer

    crafter-station/skills

    Set up hierarchical Intent Layer (AGENTS.md files) for codebases.

    112 GitHub starsUsed in 1 repo~633 tokens
    Auto-check passed
  • CLI Audit

    crafter-station/skills

    Audit an existing CLI against cli-build: how well an agent can operate it and how well a human can read it.

    112 GitHub stars~3k tokensUpdated 1 mo ago
    Auto-check passed
  • Obsidian Plugin Release

    crafter-station/skills

    Release a new version of an Obsidian community plugin without forgetting steps.

    112 GitHub stars~1.8k tokensUpdated 1 mo ago
    Auto-check passed
  • Skill Gen

    crafter-station/skills

    Deprecated. An agent skill from crafter-station/skills.

    112 GitHub stars~5.7k tokensUpdated 1 mo ago
    Auto-check passed
  • Generate Brand Assets

    crafter-station/skills

    Generate OG images and favicon based on project branding. An agent skill from crafter-station/skills.

    112 GitHub stars~1.3k tokensUpdated 1 mo ago
    Auto-check passed
  • Surfacer

    crafter-station/skills

    Compile a mapped surface into working interfaces and keep them alive as the target changes.

    112 GitHub stars~829 tokensUpdated 1 mo ago
    Auto-check passed

Works with

Questions about CLI Build

What does CLI Build do?

Design and build a CLI that an AI agent can operate safely and a human can supervise. CLI Build is an agent skill from crafter-station/skills. Design and build a CLI that an AI agent can operate safely and a human can supervise.

When should I use CLI Build?

CLI Build fits situations like: the user wants to build a CLI; wrap an API in a command-line tool; local-first tool over a database; filesystem the user already owns.

How do I install CLI Build in Claude Code?

Run `npx skills add crafter-station/skills --skill cli-build -a claude-code`. Or copy the skill folder (skills/cli-build in crafter-station/skills) into .claude/skills/cli-build in your project. Claude Code loads it when a task matches its description.

How do I install CLI Build in Codex?

Run `npx skills add crafter-station/skills --skill cli-build -a codex`. Or copy the skill folder (skills/cli-build in crafter-station/skills) into .agents/skills/cli-build in your project. Codex loads it when a task matches its description.

Can I use CLI Build in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add crafter-station/skills --skill cli-build -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-build, .gemini/skills/cli-build, .github/skills/cli-build and .opencode/skills/cli-build in your project.

What does CLI Build need to run?

Going by SKILL.md and its folder, CLI Build needs the command-line tools its instructions call (bun, npx and bunx).

Does CLI Build access the network?

SKILL.md names 1 domain. As links in the text: github.com. This is read from the text; nothing was executed.

Is CLI Build safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does CLI Build use?

CLI Build is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does CLI Build use?

About 5.2k tokens (SKILL.md is roughly 21k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 14k tokens, read only when the agent opens those files.

What are the alternatives to CLI Build?

Skills that share tags, products or a category with CLI Build: Defuddle (kepano/obsidian-skills, 49k stars), Vercel Deploy (bytedance/deer-flow, 83k stars), MCP Server Builder (shareAI-lab/learn-claude-code, 78k stars) and Knap Markdown Templates (kepano/obsidian-skills, 49k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains CLI Build?

crafter-station (a GitHub organization) maintains it in crafter-station/skills, which has 112 GitHub stars. The repository holds 7 skills in this directory. The repository was last updated on September 7, 2026.

Source: crafter-station/skills on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.