Ven0m0

substituting-modern-tools

Substitutes modern performant tools for legacy equivalents in generated code (npm→bun, find→fd, pip→uv, grep→rg, jq→jaq, eslint→biome, black→ruff, git→gix). Use when generating shell commands or scripts.

Ven0m0 1 Updated 3mo ago
GitHub

Install

npx skillscat add ven0m0/claude-config/substituting-modern-tools

Install via the SkillsCat registry.

SKILL.md

Modern Tool Substitution

Replace legacy tools with modern performant alternatives in all generated code.

Core Substitutions

Apply these substitutions unless user explicitly requests the legacy tool:

npm → bun

  • npm installbun install
  • npm runbun run
  • npm createbun create
  • npxbunx
  • Scripts remain in package.json unchanged

find → fd

  • find . -name '*.py'fd -e py
  • find . -type f -name 'test*'fd -t f '^test'
  • find . -type dfd -t d
  • find . -path '*/node_modules' -prunefd --exclude node_modules
  • Use fd's simpler glob/regex syntax

pip → uv

  • pip install pkguv pip install pkg
  • pip install -r requirements.txtuv pip install -r requirements.txt
  • pip freezeuv pip freeze
  • python -m pipuv pip
  • Virtual envs: uv venv instead of python -m venv

grep → rg

  • grep -r patternrg pattern
  • grep -i patternrg -i pattern
  • grep -v patternrg -v pattern
  • grep -l patternrg -l pattern
  • rg excludes .git, node_modules by default

jq → jaq

  • jq '.field'jaq '.field'
  • jq -r '.[]'jaq -r '.[]'
  • jq -cjaq -c
  • jq -sjaq -s
  • Most filters compatible; jaq faster, stricter parsing

eslint/prettier → biome

  • eslint .biome check .
  • eslint --fixbiome check --write .
  • prettier --writebiome format --write .
  • eslint && prettierbiome ci .
  • Config: biome.json replaces .eslintrc + .prettierrc

black/flake8/isort → ruff

  • black .ruff format .
  • flake8 .ruff check .
  • isort .ruff check --select I --fix .
  • black . && flake8 . && isort .ruff check --fix . && ruff format .
  • Config: ruff.toml or pyproject.toml consolidates all

coreutils → uutils-coreutils

  • Drop-in replacement: ls, cat, cp, mv, rm, chmod, etc.
  • Install: uu-ls, uu-cat, etc. or multicall binary
  • Faster on large operations; Rust safety guarantees
  • Syntax identical for common ops

sudo → sudo-rs

  • sudo cmdsudo-rs cmd
  • sudo -u user cmdsudo-rs -u user cmd
  • sudo -isudo-rs -i
  • Drop-in replacement; identical flags
  • Rust rewrite; memory-safe vs C sudo

ls → eza

  • ls -laeza -la
  • ls -laheza -lah
  • ls -1eza -1
  • ls --treeeza --tree
  • Git-aware, colorful, faster on large dirs
  • Icons: eza --icons
  • Tree view: eza -T or eza --tree

git → gix

  • git clonegix clone
  • git fetchgix fetch
  • git index entriesgix index entries
  • git commit-graph verifygix commitgraph verify
  • git configgix config
  • Pure Rust implementation; faster on many operations
  • CLI binaries: gix, ein (extra tools)
  • Not 100% feature parity; porcelain commands limited

Flag Adaptations

fd syntax:

  • Regex by default; globs use -gfd -g '*.txt'
  • Case insensitive: -i
  • Fixed strings: -F
  • Depth: -d N
  • Hidden: -H; no-ignore: -I

rg performance:

  • --mmap for large files
  • -j$(nproc) parallel
  • --sort path when order matters
  • --max-count N stop after N

aria2 optimization:

  • -x16 -s16 max speed
  • -c resume
  • --file-allocation=none on SSDs
  • --summary-interval=0 reduce output

jaq differences:

  • Stricter null handling; use // for null coalescing
  • No @base64d (use @base64 | explode | implode)
  • Missing some rare filters; document if incompatible

biome vs eslint:

  • No plugin system; built-in rules only
  • Config minimal: biome.json with linter + formatter sections
  • biome migrate eslint converts configs
  • Missing custom rules → keep eslint; mention limitation

ruff vs black/flake8:

  • 10-100x faster than black
  • Combines formatter + linter
  • Select rule sets: --select E,F,I (pycodestyle, pyflakes, isort)
  • --fix auto-fixes; --unsafe-fixes for aggressive changes
  • Missing: complex flake8 plugins → note ruff limitation

uutils performance:

  • uu-ls -l faster for huge dirs
  • uu-sort parallel by default
  • uu-cp shows progress with -v
  • 100% compatible for POSIX ops

sudo-rs compatibility:

  • Full flag parity with sudo
  • Same sudoers config format
  • Drop-in binary replacement
  • No behavioral changes; security hardened

gix vs git:

  • Plumbing commands mostly complete
  • Porcelain commands limited; lacks add, commit, push, pull
  • Use for: clone, fetch, verify, config, index operations
  • Fallback to git for: interactive workflows, advanced porcelain

Edge Cases

bun compatibility:

  • Native addons may fail → mention, suggest node fallback

fd vs find:

  • -exec → pipe to xargs or fd -x
  • -printf → fd output + awk/sed
  • Complex boolean → may need find

uv limitations:

  • Not for editable installs: uv pip install -e . → keep pip
  • Poetry/pipenv → keep; uv is pip replacement only

rg vs grep:

  • Binary skip default; rg -a for grep -a
  • Symlinks skipped; rg -L to follow
  • Multiline: rg -U

aria2 for curl:

  • REST APIs → keep curl
  • Small file + parse response → keep curl
  • Large/parallel downloads → aria2

jaq limitations:

  • Missing advanced filters → document, use jq
  • Stream processing: jq's --stream not in jaq

biome limitations:

  • No plugins → complex rules need eslint
  • TypeScript-first; JSX support solid
  • Vue/Svelte → keep eslint

ruff limitations:

  • Missing niche flake8 plugins → note limitation
  • Formatter matches black ~95%; edge cases differ

uutils caveats:

  • BSD variants: some flags differ → test
  • GNU-specific extensions → check compat

sudo-rs advantages:

  • Memory safety vs C sudo
  • No historical CVE baggage
  • Identical interface; zero migration cost

gix limitations:

  • Incomplete porcelain: no add, commit, push, pull
  • Submodule support partial
  • LFS support experimental
  • Keep git for: interactive rebase, bisect, filter-branch
  • Use gix for: clone, fetch, verify, pack operations, config

Exception Handling

Skip substitution when:

  • User explicitly names legacy tool
  • CI/CD requires specific tool
  • Tool unavailable in environment
  • Explaining tool differences

Quick Reference

# Package management
bun install pkg          → bun install pkg
uv pip install pandas    → uv pip install pandas

# File operations
find . -name '*.rs'      → fd -e rs
grep -r TODO .           → rg TODO
wget https://x.com/f     → aria2c https://x.com/f

# JSON processing
jq '.data[] | .name'     → jaq '.data[] | .name'
cat file.json | jq -r    → <file.json jaq -r

# Linting/Formatting
eslint --fix .           → biome check --write .
black . && flake8        → ruff check --fix . && ruff format .

# Core utilities
ls -lah                  → uu-ls -lah
cat large.txt            → uu-cat large.txt
sudo systemctl restart   → sudo-rs systemctl restart

# Git operations
git clone repo           → gix clone repo
git fetch origin         → gix fetch origin
git config --list        → gix config --list
git commit-graph verify  → gix commitgraph verify
git add .                → git add . # keep git

# Combined workflows
bun i && eslint --fix    → bun i && biome check --write .
uv pip install -r req.txt → uv pip install -r req.txt
grep -r TODO | jaq       → rg TODO | jaq
find . -name '*.py'      → fd -e py

Installation Check Pattern

# Graceful fallback pattern
has(){ command -v -- "$1" &>/dev/null; }

# Example: jq/jaq
if has jaq; then
  jaq '.field' file.json
elif has jq; then
  jq '.field' file.json
else
  die "Install jaq (recommended) or jq"
fi

# Example: sudo/sudo-rs
PRIV_CMD=$(has sudo-rs && echo sudo-rs || echo sudo)
$PRIV_CMD systemctl restart service

# Example: git/gix (context-aware)
if [[ $GIT_OP == @(clone|fetch|verify) ]] && has gix; then
  gix "$GIT_OP" "$@"
else
  git "$GIT_OP" "$@"
fi

Apply these substitutions automatically in all code generation unless legacy tool explicitly requested.