Getting it into your agent
One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.
npx agentmods add skills/aspenkit/aspens/cli-shellnpx skills add aspenkit/aspens --skill cli-shellgit clone --depth 1 https://github.com/aspenkit/aspensWhat it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5 | $0.00027 | $0.01054 |
| Opus 5 | $0.00014 | $0.00527 |
| Sonnet 5 | $0.00005 | $0.00211 |
| Haiku 4.5 | $0.00003 | $0.00105 |
Grade A, and why
cli-shell scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured yesterday.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 54 lines — stays where its author put it; the contents beside it link to each section on GitHub.
You are working on the CLI shell — the entry point that wires Commander subcommands, prints the welcome screen, warns about missing Claude hooks, dispatches to handlers, and translates CliError into a clean exit. Also the public programmatic surface re-exported from src/index.js.
Domain purpose
This layer is what a user actually invokes (aspens …) and what programmatic consumers import. It owns argument parsing, top-level error handling, and the welcome UX. All real work lives in src/commands/*.js — the shell only routes.
Business rules / invariants
- Handlers must throw
CliError, never callprocess.exit(). The top-level handler inbin/cli.js:250catches it, printsError: <message>(unlesslogged: true) in red, and exits witherr.exitCode(default 1). PlainErrorfalls through to the same printer but always exits 1. logged: truemeans "I already printed a user-friendly message" — top level then exits silently with the given code. Use it when the handler rendered a clackoutroor multi-line failure already.checkMissingHooks(repoPath)runs beforedoc sync,add, andcustomize— warns (does not throw) when.claude/skills/exists but.claude/hooks/skill-activation-prompt.shor.claude/skills/skill-rules.jsonis absent. Skipped entirely when.claude/skills/is missing (nothing to activate).- No-command invocation shows
showWelcome()— listing essential commands, generate/sync, Claude add-ons, utilities, options, typical workflow, and target notes. Adding a new subcommand requires updating this screen too. - Template counts in the welcome are filesystem-derived —
countTemplates(subdir)readssrc/templates/{agents,commands,hooks}and filters dotfiles; returns'?'on read failure (never throws). - Version comes from
package.jsonat runtime viareadFileSync; falls back to'0.0.0'silently if parse/read fails. Do not hardcode. - Numeric option parsers throw
InvalidArgumentError(Commander-native) —parsePositiveIntrejects ≤0/NaN;parseCommitsadditionally caps at 50. - Signal handlers exit with conventional codes — SIGINT→130, SIGTERM→143. Used to clean up spawned
claude -p/codex execchildren.
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- yesterday First seen · 54 lines · 27 tokens per session scan A 52ba8f08862e
cli-shell is a skill published in the GitHub repository aspenkit/aspens (96 stars, last pushed 16d ago), licensed MIT. It adds 27 tokens to every session and 1,054 once invoked, about $0.0001 per session on Opus 5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-30.
Other skills, from other repositories
golden-rss
Use when testing the rss golden build.
golden-chat-topics
Use when testing the goldenchattopics golden build.
golden-chat-single
Use when testing the goldenchatsingle golden build.
decided-import
Reformat ONE existing document (a decision, requirement, design, roadmap, or prompt) into ONE valid RAC (requirements-as-code) artifact, with a mandatory human-review step before any file is written and decided validate as the deterministic close. Use when a user wants to add or import a single existing decision or…
keep-the-why
Preserves or recovers the reasoning behind a codebase - architectural decisions, rejected alternatives, workarounds, incident learnings, operational constraints, and historical context the code itself cannot explain. Use when implementing or reviewing a non-trivial change involving a design decision, workaround…
summarize
Summarize conversations, logs, docs, or investigation notes into action-oriented text with evidence tags. Use for recap, handoff, CI failure digest, or MEMORY. Triggers: 总结, 汇总, summarize, 交接, 复盘, 调试总结.