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.
Design and build a CLI that an AI agent can operate safely and a human can supervise.
$ npx skills add crafter-station/skills --skill cli-build -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install crafter-station/skills cli-build --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/crafter-station/skills.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/cli-build .claude/skills/cli-build && 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-build" agent skill from https://github.com/crafter-station/skills/tree/main/skills/cli-build into .claude/skills/cli-build/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "cli-build", 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/crafter-station/skills/tree/main/skills/cli-buildType 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 crafter-station/skills --skill cli-build -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install crafter-station/skills cli-build --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/crafter-station/skills.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/cli-build .agents/skills/cli-build && 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-build" agent skill from https://github.com/crafter-station/skills/tree/main/skills/cli-build into .agents/skills/cli-build/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "cli-build", 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 crafter-station/skills --skill cli-build -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install crafter-station/skills cli-build --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/crafter-station/skills.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/cli-build .cursor/skills/cli-build && 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-build" agent skill from https://github.com/crafter-station/skills/tree/main/skills/cli-build into .cursor/skills/cli-build/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "cli-build", 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/crafter-station/skills.git --path skills/cli-build--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 crafter-station/skills --skill cli-build -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install crafter-station/skills cli-build --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/crafter-station/skills.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/cli-build .gemini/skills/cli-build && 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-build" agent skill from https://github.com/crafter-station/skills/tree/main/skills/cli-build into .gemini/skills/cli-build/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "cli-build", 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 crafter-station/skills cli-buildInstalls 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 crafter-station/skills --skill cli-build -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/crafter-station/skills.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/cli-build .github/skills/cli-build && 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-build" agent skill from https://github.com/crafter-station/skills/tree/main/skills/cli-build into .github/skills/cli-build/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "cli-build", 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 crafter-station/skills --skill cli-build -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install crafter-station/skills cli-build --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/crafter-station/skills.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/cli-build .opencode/skills/cli-build && 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-build" agent skill from https://github.com/crafter-station/skills/tree/main/skills/cli-build into .opencode/skills/cli-build/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "cli-build", 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-buildDesign 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. 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.
7 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit f0fe474. 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:
bunnpxbunxFrom the folder's file list and the shell code blocks in SKILL.md.
Links to these hosts (documentation or services it may open):
github.comFrom 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 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.
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 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.
The full file from crafter-station/skills at commit f0fe474, republished under its MIT licence (© crafter-station). 3,026 words, ~5,206 tokens.
.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.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.
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.
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.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.banner is a block and not a console.log.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):
--dry-run on every mutation, returning what would happen.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.
This comes first because it constrains the code you write, and retrofitting it is painful.
| Who installs this | Target | How |
|---|---|---|
| Only you, from source | Runtime shebang, no build | Fastest iteration, zero packaging |
| JS-ecosystem developers | Build to Node, publish to npm | npx works with no extra install |
| Anyone, no runtime | Compile to a native binary | No 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.
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.
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:
bunx --bun skills add Railly/cligentic --skill cligenticInstalling 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.
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.
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:
Link it globally first. Before verifying anything, put the CLI on your PATH so you invoke it the way a user will:
bun link # or npm link
which mycli && mycli --helpRunning 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:
--json, piped output, and other machine modes contain no ANSI escapes;NO_COLOR disables styling without changing content;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.
--wait, vocabulary enforced in CI, --deliver and feedback. Sourced from published work rather than the corpus, and labeled as suchThe 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
SKILL.md and 13 other files (references) in skills/cli-build of crafter-station/skills.
Open the folder on GitHubat commit f0fe474
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.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| CLI Build this skillcrafter-station/skills | 112 | — | ~5.2k | Automated safety check: Pass | MIT | |
| Defuddlekepano/obsidian-skills | 49k | 12 repos | ~208 | Automated safety check: Pass | MIT | |
| Vercel Deploybytedance/deer-flow | 83k | 10 repos | ~797 | Automated safety check: Pass | MIT | |
| MCP Server BuildershareAI-lab/learn-claude-code | 78k | 5 repos | ~1.2k | Automated safety check: Pass | MIT | |
| Knap Markdown Templateskepano/obsidian-skills | 49k | 2 repos | ~986 | Automated safety check: Pass | MIT | |
| Install Anti-Slop Oxlint Rulesdmmulroy/anti-slop | 5.3k | 1 repos | ~2.2k | Automated safety check: Pass | MIT |
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.
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.
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.
kepano/obsidian-skills
Renders Markdown notes from Knap templates and JSON data on the command line, including notes built from Defuddle web page output.
dmmulroy/anti-slop
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.
nomcopter/react-mosaic
Helps with running tasks in an Nx workspace. An agent skill from nomcopter/react-mosaic.
crafter-station/skills
Set up hierarchical Intent Layer (AGENTS.md files) for codebases.
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.
crafter-station/skills
Release a new version of an Obsidian community plugin without forgetting steps.
crafter-station/skills
Deprecated. An agent skill from crafter-station/skills.
crafter-station/skills
Generate OG images and favicon based on project branding. An agent skill from crafter-station/skills.
crafter-station/skills
Compile a mapped surface into working interfaces and keep them alive as the target changes.
Works with
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.
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.
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.
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.
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.
Going by SKILL.md and its folder, CLI Build needs the command-line tools its instructions call (bun, npx and bunx).
SKILL.md names 1 domain. As links in the text: github.com. This is read from the text; nothing was executed.
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.
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.
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.
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.
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.