Toolbelt
Reference for haru's preferred modern CLI tools — when and how to use eza/bat/fd/ripgrep/sd/ast-grep, xh, gh, dasel, procs, doggo, hexyl, duckdb/psql/sqlx-cli, hyperfine/oha, difftastic, typos. Invoke when a task involves searching files, editing/refactoring code, HTTP/API or GitHub calls, data/SQL work, DNS or process debugging, hex inspection, diffing, or benchmarking, and you want the idiomatic tool + flags instead of the classic Unix default.From its SKILL.md
npx -y skills add azusachino/harus-skills --skill toolbeltAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
2 things to look at
- no licenseNo license file was found in the repository. Code published without one is not open source by default, so using it at work is a question for whoever answers licensing questions where you are.
- 5 stars5 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
14.5 KB, ~4.0k tokens by cl100k_base, as published. Nobody here has run it
Toolbelt Skill
haru's machines (managed by harus-nix Home Manager) ship a curated set of modern CLIs. Prefer these over the classic Unix tools by default — fall back to the classic only when the modern tool is genuinely unavailable.
Table of Contents
- Stop-and-ask rule (hard stop)
- Substitution table (always-on)
- Tooling discipline (carried from global defaults)
- Runtimes & package managers
- Search & navigate
- Edit text
- HTTP / API debugging
- GitHub and GitLab
- Data & SQL
- Debug & inspect
- Benchmark
- Domain & infra tools (know these exist)
- When NOT to substitute
This skill is self-contained — it carries both the substitution rules and the usage recipes so it works on any device, even one whose global ~/.claude/CLAUDE.md isn't synced or differs. Treat it as the portable source of truth; if the local global config disagrees, the local config wins for that machine, but these defaults travel with you.
Rule of thumb: classic tools for piping inside scripts that must be portable; modern tools for interactive/agent work where clarity and ergonomics win.
Stop-and-ask rule (hard stop)
On any ambiguity — an error you don't understand, a missing tool, a flag behaving oddly, state that contradicts your assumptions — STOP and ask. Never improvise a fallback, retry with guessed flags, or work around the block; one clear question beats three speculative attempts. This is the global stop-and-ask / fail-fast default (canonical in UserPreferences). The sole exception: a tool that's literally not installed (command -v fails) may fall back gracefully — anything else ambiguous is a stop.
Substitution table (always-on)
Reach for the right-hand tool by default; fall back to the classic only when the modern one is absent.
| Instead of | Use | For |
|---|---|---|
ls / cat / du | eza / bat / dust | listing, viewing, disk usage |
grep / find | ripgrep (rg) / fd | text/file search |
grep for code structure | ast-grep (sg) | AST-aware search & rewrite |
sed (substitute) | sd | find & replace |
git diff | difftastic (difft) | syntax-aware diffs |
ps / dig / xxd | procs / doggo / hexyl | processes, DNS, hex |
curl (API testing) | xh | HTTP requests |
jq for non-JSON | dasel | YAML/TOML/XML/CSV query+convert |
wc -l (code count) | tokei | code statistics (LOC) |
| ad-hoc regex design | grex | generate regular expressions |
| spell-check source | typos | typo linting in code + docs |
| ad-hoc SQL | duckdb, psql (postgres), sqlx-cli | data + migrations |
| benchmarking | hyperfine (CLI), oha (HTTP) | perf checks |
python / pip / pipx | uv / uvx | Python runtime, deps, tools |
node / npm / npx | bun / bunx | JS/TS runtime, deps, tools |
Tooling discipline (carried from global defaults)
These hold across all of haru's projects and are restated here so the skill stands alone:
- Nix-first — tools come from the project devShell (
nix develop); usemiseonly for language runtimes, not general tooling. To run a project-pinned runtime/tool through mise, usemise x -- <tool>(aliasmise exec) — it resolves the version from the repo's.mise.toml. makeis the task runner — referencemake <target>everywhere;make checkbefore commits,make validatebefore PRs (hook-enforced).- JSON →
jq— alwaysjqfor JSON processing; neverpython3 -cor inline Python. Reach fordaselthe moment the format isn't JSON. - Conventional commits, 2-space config indent — per global CodingStyle. Emojis are welcome (commits, prose, docs).
Runtimes & package managers
Prefer the fast modern runner over the legacy one by default — they're drop-in for the common paths and far faster.
uv— Python runtime + dependency + project manager (replacespython/pip/venv/pipx/poetry):uv run script.py(auto-resolves deps),uv run pytest(run a tool in the project env)uv add httpx/uv remove httpx(managepyproject.toml),uv sync(install lockfile)uv venv(create env),uv pip install -r req.txt(pip-compatible shim)uvx— run a Python CLI tool one-off without installing:uvx ruff check,uvx [email protected] format.
bun— JS/TS runtime + package manager + bundler (replacesnode/npm/npx/yarn/pnpm):bun run script.ts(runs TS directly, no compile step),bun testbun install(fast install),bun add zod/bun remove zodbunx— run a package one-off without installing:bunx prettier --write .,bunx tsx file.ts.
Caveats: stick to python3/node + pip/npm when a project's toolchain or CI pins them, when a native addon/wheel isn't yet bun/uv-compatible, or inside a Nix devShell that already provides the interpreter (per Nix-first, mise handles runtimes there). For everything ad-hoc and interactive, reach for uv/bun first.
Search & navigate
| Task | Tool | Idiom |
|---|---|---|
| Find text | ripgrep (rg) | rg -n "pattern", rg -t rust foo, rg -l pat (files only) |
| Find files | fd | fd -e nix, fd -t f name, fd -H (include hidden) |
| List dir | eza | eza -la --git, eza --tree --level=2 |
| View file | bat | bat file, bat -p (plain, no decorations for piping) |
| Disk usage | dust | dust -d 2 (depth 2) |
| Jump dirs | zoxide | z proj after visiting once |
Prefer rg/fd over grep -r/find — faster, respects .gitignore, sane defaults. When piping bat output, add -p to strip line numbers/borders.
ast-grep(sg) — structural, syntax-aware code search & rewrite (matches by AST, not regex — immune to formatting/whitespace):sg run -p 'console.log($A)' -l ts(find everyconsole.log(...)call, any argument)sg run -p 'foo($$$ARGS)' --rewrite 'bar($$$ARGS)' -l py -U(rename a call, preserving all args;-Uapplies in place)- Reach for
sgoverrgthe moment the pattern is about code shape (a call, an import, a JSX element) rather than literal text — no brittle regex, no false hits inside strings/comments.
Edit text
sd— find & replace, literal-friendly, real regex (nosedescaping pain):sd 'foo' 'bar' file.txt(in-place, no-ineeded)sd -p 'foo' 'bar' file.txt(preview diff, don't write)sd '(\w+)@(\w+)' '$2.$1' file(capture groups with$1)- Reach for
sedonly for stream edits in portable scripts. - For code-structure rewrites (rename a call, swap an API) use
ast-grep --rewriteinstead — it edits by AST, not text, so formatting and string/comment matches can't trip it up.
HTTP / API debugging
xh— httpie-style client, faster thancurlfor hand-driven requests:xh get https://api.example.com/users(auto-pretty JSON)xh post api.local/login name=haru pass=secret(JSON body fromk=v)xh -f post url field=val(form),xh --headers get url(headers only)xh get url Authorization:"Bearer $TOK"(header with:)- Use
curlin scripts / when exact wire control or--resolveis needed.
oha— load testing:oha -n 1000 -c 50 https://api.local/health.
GitHub and GitLab
gh— GitHub-native repository, PR, release, and workflow operations:gh repo view OWNER/REPO --json nameWithOwner,defaultBranchRefgh api repos/OWNER/REPO/releases/tags/v1.2.3 --jq '{name,body,html_url}'gh pr create --fill,gh pr view,gh run view- Prefer
gh apiover raw HTTP for GitHub metadata; use--jqto keep responses focused.
glab— GitLab-native equivalent for projects, merge requests, releases, and pipelines:glab mr create --fill,glab mr view,glab pipeline view
Use the provider-native CLI when the task targets GitHub or GitLab state. Keep xh for generic HTTP APIs and curl for scripts requiring exact wire control.
Data & SQL
dasel— one tool to query/convert JSON/YAML/TOML/XML/CSV:dasel -f config.yaml '.services.web.port'dasel -f data.json -r json -w yaml(convert JSON→YAML)dasel put -f config.yaml -v 8080 '.services.web.port'(edit YAML/TOML/etc. in place)- Use
jqfor pure-JSON pipelines (it's still the default for JSON); reach fordaselthe moment the format isn't JSON.daselhandles YAML query and edit — it's the one tool for non-JSON structured data here.
tokei— count lines of code quickly:tokei .(recursive code statistics by language)
duckdb— fast analytical SQL over files, no server:duckdb -c "select * from 'data.csv' limit 5"duckdb -c "select count(*) from read_parquet('*.parquet')"
miller(mlr) — CSV/TSV/JSON record processing:mlr --csv cut -f a,b then sort -nr b data.csv
psql(frompostgresql) — Postgres client:psql "$DATABASE_URL" -c '\dt',psql -h host -U user db
sqlx-cli— Rust SQL toolkit / migrations:sqlx database create,sqlx migrate add <name>,sqlx migrate runsqlx migrate revert,cargo sqlx prepare(offline query cache)
Debug & inspect
procs— modernps:procs(all),procs nginx(filter by name),procs --treeprocs --sortd cpu(sort by CPU desc), shows ports/TTY/user.
doggo— moderndigfor DNS debugging:doggo example.com,doggo MX example.comdoggo example.com @1.1.1.1(specific resolver),--jsonfor parsing.
hexyl— colored hex viewer:hexyl file.bin,hexyl -n 64 file(first 64 bytes), inspect encodings/headers.
tailspin(tspin) — auto-highlight logs:tspin app.logorcmd | tspin.btop— interactive system monitor.grex— generate regular expressions from user-provided test cases:grex a b c(returns^[a-c]$)grex -d -w -p [email protected](generate with digits, words, non-space)
typos— fast source-code spell checker (skips code identifiers sensibly):typos(check the tree),typos -w(auto-fix),typos path/to/file- Good as a pre-commit gate and before shipping docs; low false-positive rate.
difftastic(difft) — structural, syntax-aware diff (compares ASTs, ignores pure reflow):difft old.rs new.rs(standalone), or wire it into git:GIT_EXTERNAL_DIFF=difft git diff- Reach for it when a plain-text diff is noisy because indentation/wrapping changed but the code didn't.
Terminal multiplexing: tmux.
Benchmark
hyperfine— CLI command benchmarking with stats:hyperfine 'rg foo' 'grep -r foo .'(compare),--warmup 3.
oha— HTTP load (see above).
Domain & infra tools (know these exist)
Not substitutions — these are the specialised tools harus-nix already provisions. Reach for them by name instead of hand-rolling or asking the user to install something; they're on the machine.
| Domain | Tools | Reach for it when |
|---|---|---|
| Nix workflow | nh (ergonomic nix/home-manager wrapper), nom (nix-output-monitor) | rebuilding a config, watching a nix build's progress |
| Kubernetes | k9s (TUI), kubectl, stern (multi-pod log tail) | inspecting/driving a cluster, tailing pod logs |
| Cloud & sync | rclone | syncing to/from cloud/object storage |
| Containers (Linux) | podman, buildah, skopeo | building/running/inspecting OCI images (rootless, daemonless) |
| Secrets | sops, age | encrypting/decrypting secrets in the repo |
| Watch & run | watchexec | re-run a command on file changes (tests, builds) |
| Lint & format | shellcheck, shfmt, yamlfmt, prettier, markdownlint-cli2, typos, pre-commit | linting/formatting shell, YAML, JS/TS, Markdown; spell-check; hook setup |
| Lang tooling | golangci-lint, ruff/ty (Python), cargo-update/-sweep/-cache | project-local linting, Rust cargo maintenance |
| Archives & docs | ouch (compress/extract), typst (doc compiler) | packing/unpacking archives, typesetting |
| Shell & nav | navi (interactive cheat sheet), fzf, zoxide, yazi (file manager) | fuzzy-finding, cheat lookups, browsing files |
| Runtime pinning | mise (per-project versions via .mise.toml, run with mise x -- <tool>), rustup (Rust toolchains) | a project pins a language version; switching Rust toolchains |
If a task needs a tool not on this list or in the tables above, apply the stop-and-ask rule — confirm with the user before installing anything.
When NOT to substitute
- Portable shell scripts that may run on minimal/other machines → stick to POSIX (
grep,sed,find,curl) so they don't depend on this toolbelt. - Pure-JSON pipelines →
jqremains the default (per global CLAUDE.md). - If a tool isn't installed (
command -v <tool>fails), fall back gracefully.
What ships with it
Read from the repository
Just SKILL.md. No reference files, no scripts.