Updated: 47 minutes ago

ابزارهای ترمینال برای عصر هوش مصنوعی

🗺 نقشه

🗺 نقشه
🔎 پیدا کردن و خواندن آیا این فایل وجود دارد و چه چیزی در آن است؟
fd یابنده‌ی سریع فایل.
ripgrep جست‌وجوی بازگشتی متن.
eza نسخه‌ی خواناتر ls.
bat cat با هایلایت سینتکس.
fzf یابنده‌ی فازی فهرست‌ها.
yazi فایل‌منجر ترمینالی.
defuddle استخراج متن از HTML شلوغ.
obscura مرورگر هدلس: fetch و scrape.
🧬 بررسی و پرس‌وجو تبدیل داده به پاسخ.
jq برش JSON به فیلدهای لازم.
yq jq برای YAML و XML.
fq بررسی فرمت‌های باینری.
jnv مرورگر تعاملی JSON.
hurl اجرای درخواست HTTP از فایل متنی.
gh CLI گیت‌هاب.
✏️ ویرایش و بازبینی ویرایش فایل‌ها، بازبینی تغییرات.
micro ادیتور کوچک ترمینال.
edit ادیتور کوچک مایکروسافت.
delta diff خواناتر گیت.
lazygit TUI کامل گیت.
lazydocker TUI داکر.
📊 سیستم و شبکه واقعاً روی این ماشین چه می‌گذرد؟
dust مصرف دیسک، بزرگ‌ترین‌ها اول.
procs ps خوانا با درخت.
witr مالک پورت یا PID کیست.
bottom مانیتور سیستم.
bandwhich پهنای باند هر پروسس.
trippy تریس‌روت زنده، نیازمند root.
⚙️ ساخت و تأیید محیط، لینت، بنچمارک.
uv نصب سریع پایتون.
ruff لینت و فرمت پایتون.
hyperfine بنچمارک دستورها.
🗺️ پیمایش و چندبرابر کردن سریع‌تر جابه‌جا شو، بیشتر به خاطر بسپار.
zoxide پرش به دایرکتوری‌های پرتکرار.
atuin هیستوری شل (فقط انسان).
starship پرامپت سریع و پراطلاعات.
zellij مالتی‌پلکسر ترمینال.
pastel کار با رنگ‌ها در ترمینال.

🩺 مشکل چهل کیلوبایت

ایجنتت یک دستور با جواب درست فاصله دارد. ولی دستور اشتباه را می‌زند: cat config.json . فایل هم 40 کیلوبایت تنظیماتی را پس می‌دهد که هیچ‌کس نخواسته بود.

هیچ‌چیز خراب نمی‌شود. نه متن قرمزی، نه خطایی، نه تلاش دوباره‌ای. هر نوبت بعدی هم دوباره همان 40 کیلوبایت را پردازش می‌کند، تا شاید ایجنت بالأخره به پاسخ مناسب برسد. دستوری که باید اجرا می‌شد فقط چهار کلمه بود:

cat config.json # 40 کیلوبایت — هر نوبت بعدی هزینه‌اش را می‌دهد
jq '.logging' config.json # جواب و دیگر هیچ چیز

همین، موضوع کل این نوشته است. آدم از روی نویز رد می‌شود؛ ایجنت نمی‌تواند، و هر بایت را در هر نوبت بعد پردازش می‌کند.

ترمینال شما همین حالا یک جعبه‌ابزار بزرگ از هزاران ابزار توسعه است؛ از ابزارهای آشنایی مثل wget و curl که همراه سیستم‌عامل عرضه می‌شوند تا ابزارهای تخصصی مثل Ghidra و Aircrack-ng . بعضی از این‌ها در دست انسان خطرناک‌اند. حالا همین‌ها را به یک ایجنت هوش مصنوعی بدهید که دستورها را با سرعت ماشین پشت‌سرهم می‌چیند، و شکل خطر متفاوت می‌شود: دستوری که یک انسان بعد از فکر کردن یک بار اجرا می‌کند، تبدیل می‌شود به حلقه‌ای که هیچ‌کس نمی‌بیند. ایجنت به ابزار بیشتر نیاز ندارد؛ به ابزار درست نیاز دارد! و به محافظ‌هایی که نمی‌گذارند یک پاسخ غلطِ مطمئن به کاری ویرانگر تبدیل شود. ابزارها حجم هر پاسخ را کم می‌کنند؛ محافظ‌ها جلوی اقدام ویرانگر را می‌گیرند.

ترمینال دیگر فقط محل کار برنامه‌نویس‌ها نیست. افراد غیربرنامه‌نویس هم از آن استفاده می‌کنند و ایجنت‌های هوش مصنوعی هم می‌توانند از طریق رابط‌های ترمینالی مثل OpenCode TUI، Claude، Codex CLI و ابزارهای مشابه به بخش‌های مختلف سیستم دسترسی پیدا کنند. این مطلب ابزارهای CLIای را جمع کرده که هم برای انسان‌ها و هم برای ایجنت‌ها کاربردی‌اند. هر ابزاری که نصب می‌کنید، attack surface یا سطح حمله را هم گسترده‌تر می‌کند؛ پس ابزارها را به‌روز نگه دارید. در عصر ایجنت‌ها، این بخش مهمی از نگه‌داری سیستم است.

هر ابزار در ادامه با یک ضبط واقعی از اجرای خودش همراه است. بعضی ابزارها برای تعامل انسانی با TUI بهینه شده‌اند؛ خیلی‌هایشان رابطی دارند که ایجنت می‌تواند مستقیم از آن استفاده کند؛ و چند مورد هم به‌صورت پیش‌فرض همراه بعضی ایجنت‌ها عرضه می‌شوند (مثل Hermes Agent). در گردش‌کار مناسب، این ابزارها حجم هر پاسخ را کم می‌کنند و پیش از پر شدن پنجره‌ی کانتکست، نوبت‌های مفید بیشتری فراهم می‌کنند.

باید بدانید ایجنتت دقیقاً چه ابزاری را و برای چه کاری فراخوانی می‌کند. مسئول کاری که ایجنت انجام می‌دهد شما هستید. اگر نمی‌دانید یک ابزار چه می‌کند، یا نمی‌دانید چرا ایجنت برای استفاده از آن مجوز می‌خواهد، دسترسی ندهید؛ استفاده‌ی ناآگاهانه از ابزاری که به سیستم دسترسی دارد می‌تواند به خود سیستم یا فایل‌های شخصی شما آسیب بزند.

هر دستور نصب در این مطلب، نرم‌افزار را از اینترنت دریافت می‌کند و بعضی دستورها با دسترسی root اجرا می‌شوند. قبل از کپی‌پیست کردن، دستور را بخوانید؛ و قبل از اینکه یک ایجنت را بدون نظارت آزاد بگذارید، قوانین ایجنت‌ها را بخوانید. موارد واقعاً پرریسک هم در همان بخش مشخص شده‌اند.


🪜 از کجا شروع کنم

نود ثانیه، بعد مرجع. قوانین کلی را یک بار بخوان — آن‌ها بخش حیاتی این مطلب‌اند و بقیه جزئیات است. بعد، به همین ترتیب:

  1. هسته‌ی اصلی. fd ، ripgrep ، jq ، yq و hyperfine . نه TUI، نه root، نه کانفیگ. دستور یک‌خطی را بردار و بس.
  2. لایه‌ی ایجنت. rtk و procs . بقیه را وقتی یک کار واقعی خواست اضافه کن.
  3. چیت‌شیت. همان جدول را در system prompt ایجنتت بگذار.

این نوشته یک نقطه‌ی شروع است، نه جایگزین مستندات هیچ‌کدام از ابزارها. فلگ‌ها، گزینه‌ها و کی‌بایندها را از --help و پروژه‌ی upstream بگیر؛ میان‌برهایی که اینجا نوشته شده‌اند فقط همان‌هایی هستند که حدس اشتباه درباره‌شان می‌تواند به از دست رفتن داده منجر شود.


📦 نصب همه‌چیز

🐧 لینوکس و WSL — یک دستور

هر چیزی را که توزیع شما در مخازنش دارد نصب می‌کند، مواردی را که ندارد رد می‌کند و در همین مسیر تله‌ی نام‌گذاری ( fd-find → fd ) را هم اصلاح می‌کند.

Ubuntu / Debian / WSL — the packaged subset

sudo bash -lc 'set -u; apt-get update -qq; for p in ripgrep bat fd-find jq fzf zoxide lazygit git-delta hyperfine gh starship btm pastel procs micro fq; do if apt-get install -y --no-install-recommends "$p" >/dev/null 2>&1; then printf " [ ok ] %s\n" "$p"; else printf " [ -- ] %s (not in your repos)\n" "$p"; fi; done; if command -v fdfind >/dev/null; then ln -sf "$(command -v fdfind)" /usr/local/bin/fd; fi; if command -v batcat >/dev/null; then ln -sf "$(command -v batcat)" /usr/local/bin/bat; fi; echo; for c in fd rg bat jq fzf zoxide lazygit delta hyperfine gh starship btm pastel procs micro fq; do command -v "$c" >/dev/null && echo " $c"; done'

در stable دبیان نیستند، پس به‌جای apt آن‌ها را از ریلیزهای گیت‌هاب بگیر: zellij ، jnv ، rtk و yq نسخه‌ی Go؛ witr و pastel فقط در sid هستند، هرچند cargo install pastel روی هر stableای کار می‌کند. پیش از اجرای یک باینری دانلودشده، خلاصه‌ی SHA-256 منتشرشده را بررسی کن.

دوست نداری حلقه اجرا کنی؟ جدول اصلی نصب برایت یک سطر به‌ازای هر ابزار می‌دهد که به بخش خودش لینک شده — فقط آن‌هایی را که می‌خواهی کپی کن.

🪟 ویندوز و PowerShell — یک دستور

بسته‌ی نصب لینوکس روی ویندوز کاربردی ندارد. Scoop اینجا مسیر عملی‌تری است، چون scoop install کل فهرست را با یک دستور نصب می‌کند و 33 مورد از 34 ابزار این مطلب در یکی از bucketهای Scoop در دسترس‌اند:

PowerShell — the whole toolbox, one command (Scoop)

scoop bucket add extras # lazygit is the only tool not in the Main bucket
scoop install ripgrep bat fd eza fzf jq yq fq jnv hurl gh micro edit delta lazygit lazydocker dust procs witr bottom bandwhich trippy uv ruff hyperfine zoxide atuin starship zellij pastel rtk yazi obscura

دو خط اینجا مهم‌اند. lazygit در bucket Main اسکوپ نیست، پس scoop bucket add extras باید اول بیاید وگرنه همان یک بسته شکست می‌خورد. و ripgrep ، bat ، obscura ، rtk و starship بیلدهای MSVC هستند و به Visual C++ runtime نیاز دارند:

PowerShell — the vcredist runtime they need

scoop install extras/vcredist2022

اسکوپ مشکل دو-باینریِ obscura را برایت حل می‌کند؛ روی لینوکس خودت باید هر دو را روی PATH بگذاری.

تنها ابزاری که اسکوپ ندارد defuddle است، که یک بسته‌ی npm است و به Node.js نیاز دارد:

PowerShell — the last tool, which is an npm package

npm install -g defuddle

یا اصلاً نصبش نکن و هر وقت لازم شد اجرایش کن: npx defuddle parse <file> — چیزی نصب نمی‌شود، که روی ماشینی که مال خودت نیست حالت امن‌تری است.

مدیر بسته‌ی شخص ثالث نداری؟ winget همراه Windows 10/11 ارائه می‌شود، اما عمداً اینجا یک فهرست ثابت از IDها نگذاشته‌ام. این شناسه‌ها با تغییر نام و ثبت دوباره‌ی ناشرها ممکن است قدیمی شوند و winget install روی یک ID ناشناخته کامل خطا می‌دهد؛ یک فهرست حتی کمی قدیمی می‌تواند کل دسته را وسط کار متوقف کند. هر ابزار را همان موقع پیدا و بررسی کن:

PowerShell — winget, one tool at a time

winget search ripgrep
winget install --id BurntSushi.ripgrep.MSVC -e --silent `
--accept-package-agreements --accept-source-agreements --disable-interactivity

هیچ‌کدام برای نصب در سطح کاربر به دسترسی ادمین نیاز ندارند. اگر بسته‌ای نصب نشد، از آن بگذر؛ همه‌ی ابزارهای این مطلب یک باینری قابل‌حمل به‌عنوان گزینه‌ی جایگزین دارند و هیچ‌کدام به دیگری وابسته نیست.

یک تله‌ی مخصوص ویندوز می‌تواند یک نصب کاملاً سالم را خراب به نظر برساند: در Windows PowerShell 5.1 ، curl یک نام مستعار برای Invoke-WebRequest است، نه curl.exe ، و باینری واقعی را زیر سایه می‌برد. دستوری که از یک راهنمای لینوکسی مثل curl -o out.json https://… کپی شود، با خطای پارامتر شکست می‌خورد که ربطی به ابزاری که داری نصب می‌کنی ندارد. (PowerShell 7+ این نام مستعار را حذف کرده، پس فقط 5.1 را درگیر می‌کند.) برای دور زدنش، باینری واقعی را با نام کامل صدا بزن:

PowerShell — the real curl, not the alias

curl.exe -o out.json https://example.com

هم دستور scoop install بالا و هم ستون ویندوز در جدول اصلی نصب atuin را دارند، چون این نوشته برای انسان‌ها نوشته شده است. پیش از اسکریپت‌کردن یک نصب، atuin را از هر دو فهرست حذف کن — این تنها ابزاری است در این نوشته که خودکارسازی‌اش هیچ‌وقت امن نیست، و دلیلش در بخش خودش است. بقیه‌ی موارد این دو فهرست مشکلی ندارند. ستون Agent مشخص می‌کند کدام سطرها را نگه داری.

هر ابزار این فهرست به همین روش روی یک ماشین Windows Server 2025 x64 نصب و بعد با --version اجرا شد؛ بنابراین مجموعه نه‌فقط روی کاغذ قابل‌نصب، بلکه در عمل هم تست شده است. تست روی Server SKU انجام شده که سخت‌گیرانه‌تر است، چون هیچ‌کدام از این ابزارها نمی‌توانند فرض کنند یک سشن دسکتاپ در دسترس است. دموها لینوکسی‌اند؛ ستون ویندوز برای این است که خواننده روی هر دو سیستم‌عامل بتواند همین مجموعه را راه بیندازد. طبیعی است که نسخه‌های ویندوز با نسخه‌های درج‌شده در کپشن‌ها متفاوت باشند.

این بررسی --version را به‌هرحال انجام بده، چون نصب موفق لزوماً به این معنی نیست که همان باینری نصب‌شده اجرا می‌شود. روی ماشین بالا، یک starship قدیمی‌تر نسخه‌ی 1.21.1 در C:\Program Files\starship\bin جلوتر از نسخه‌ی 1.26.0 اسکوپ روی PATH بود، پس دستور داشت برای فایل دیگری جواب می‌داد. از ویندوز بپرس واقعاً کدام فایل را اجرا می‌کند:

PowerShell — which binary is answering, and what else is on PATH?

where.exe starship
& "$env:USERPROFILE\scoop\apps\starship\current\starship.exe" --version

where.exe همه‌ی موارد منطبق را به ترتیبی که ویندوز بررسی‌شان می‌کند فهرست می‌کند؛ بنابراین اولین مسیر همان چیزی است که ابتدا resolve می‌شود. اگر آن نسخه‌ای نیست که همین حالا نصب کرده‌ای، یک نسخه‌ی دیگر دارد روی PATH سایه می‌اندازد. scoop status این را نمی‌گیرد: روی همان ماشین با خوشحالی گزارش داد همه‌چیز مرتبه! در حالی که یک starship کاملاً متفاوت دستور را اجرا می‌کرد. اسکوپ همیشه shim نمی‌سازد؛ برای starship خودش پوشه‌ی اپ را به PATH اضافه می‌کند، که راه دومی برای جلو افتادن یک نسخه‌ی قدیمی است.

✅ بررسی اینکه واقعاً چه نصب شد

ناهماهنگی بین نام پکیج و نام باینری یکی از رایج‌ترین علت‌های برداشت اشتباه از وضعیت نصب است؛ fd-find / fdfind ، git-delta / delta ، trippy / trip ، bottom / btm و تداخل yq همگی از همین دسته‌اند.

🐧 لینوکس / WSL

Print OK or MISSING for every command on this page

for cmd in fd rg eza bat jq yq fq jnv hurl gh micro edit delta lazygit lazydocker \
dust procs witr btm bandwhich trip uv ruff hyperfine zoxide atuin \
starship zellij pastel fzf yazi rtk; do
printf "%-12s : " "$cmd"
command -v "$cmd" >/dev/null && echo "OK" || echo "MISSING"
done

🪟 ویندوز / PowerShell

The same audit, Windows edition

$cmds = 'fd','rg','eza','bat','jq','yq','fq','jnv','hurl','gh','micro','edit','delta',
'lazygit','lazydocker','dust','procs','witr','btm','bandwhich','trip','uv','ruff',
'hyperfine','zoxide','atuin','starship','zellij','pastel','fzf','yazi','rtk'
$cmds | ForEach-Object {
'{0,-12} : {1}' -f $_, $(if (Get-Command $_ -ErrorAction SilentlyContinue) { 'OK' } else { 'MISSING' })
}

📇 جدول اصلی نصب

ستون Agent همان حکم هر برچسب ابزار را تکرار می‌کند. no یعنی آن سطر را هرگز در فهرست نصبی که یک عامل اجرا می‌کند نگذار. ستون Use instead یعنی سراغ چه چیزی بروی — و برای یک ابزار cond دقیقاً همان فرمی است که عامل باید استفاده کند. هر نام ابزار به بخش خودش لینک است، و این تنها جایی است که دستورهای نصب می‌آیند ؛ بخش خودِ هر ابزار می‌گوید چه کاری است و چطور از آن استفاده کنی.

pastel ، dust ، eza ، jnv ، bandwhich و atuin با cargo install نصب می‌شوند و به Rust toolchain روی ماشین نیاز دارند. اگر نمی‌خواهی Rust را هم نصب کنی، باینری release را بگیر؛ برای هرکدام digest منتشر شده و بهتر است خودت آن را بررسی کنی.

# Tool Agent Use instead 🐧 Linux (bash) 🪟 Windows (PowerShell)
1 fd yes — apt install fd-find + symlink to fd scoop install fd
2 ripgrep yes — apt install ripgrep scoop install ripgrep
3 defuddle yes — npm install -g defuddle ⚠️ or the release .zip npm install -g defuddle ⚠️ needs Node.js
4 obscura yes curl , for a page with no JavaScript release .tar.gz — extract both obscura and obscura-worker scoop install obscura — installs both binaries
5 jq yes — apt install jq scoop install jq
6 yq yes — GitHub release (not the apt one) scoop install yq
7 fq cond fq -V '.tools' file apt install fq (it's Go, not Rust) scoop install fq
8 hurl yes — apt install hurl scoop install hurl
9 gh yes — apt install gh scoop install gh
10 procs yes — apt install procs scoop install procs
11 witr yes — not in stable Debian - use the release binary scoop install witr
12 uv yes — official install.sh · or pipx install uv scoop install uv · or pip install uv
13 ruff yes — uv tool install ruff scoop install ruff
14 hyperfine yes — apt install hyperfine scoop install hyperfine
15 zoxide no the absolute path apt install zoxide scoop install zoxide
16 pastel cond pastel format hex apt install pastel · or cargo install pastel scoop install pastel
17 rtk yes — release binary (not packaged) scoop install rtk
18 fzf cond fzf --filter=PATTERN apt install fzf scoop install fzf
19 dust yes dust -j -n 20 / cargo install du-dust scoop install dust
20 trippy cond trip <host> -m json release .deb from the GitHub release, binary is trip scoop install trippy
21 eza no ls , or fd --type f apt install eza · or cargo install eza scoop install eza
22 bat no cat apt install bat → binary is batcat scoop install bat
23 delta no git --no-pager diff apt install git-delta → binary is delta scoop install delta
24 jnv no jq cargo install jnv scoop install jnv
25 yazi no fd , or ls apt install yazi scoop install yazi
26 micro no write the file directly apt install micro scoop install micro
27 edit no write the file directly release tarball → /usr/local/bin/edit scoop install edit
28 lazygit no git status , git --no-pager diff apt install lazygit scoop install lazygit
29 lazydocker no docker ps , docker logs official install_update_linux.sh scoop install lazydocker
30 bottom no procs , free -h , ss -s apt install btm (binary is also btm ) scoop install bottom
31 bandwhich no ss -tnp cargo install bandwhich scoop install bandwhich
32 starship no nothing — it is the prompt official install.sh scoop install starship
33 zellij no nothing - it is a UI release binary (not in apt) · or cargo install zellij scoop install zellij
34 atuin no nothing — never install official install.sh · or cargo install atuin scoop install atuin

🎬 درباره‌ی ضبط‌ها

هر دمو یک ضبط واقعی از اجرای ابزار است، نه انیمیشن. روی 2026/09/29 ضبط شده‌اند، و نسخه‌ی زیر هر ویدیو همان است که روی صفحه بوده، با پرچم --version خودِ ابزار تأیید شده است.


🔎 دسته‌ی 1 — پیدا کردن و خواندن

آیا این فایل وجود دارد و چه چیزی در آن است؟ دو سؤالی که یک عامل بیش از همه می‌پرسد، و همان دو تایی که بدون کمک از پسشان برنمی‌آید. آخرین ابزار این دسته از آن سر شروع می‌کند — همان دو سؤال، اما درباره‌ی یک URL.

📂 fd

fd v10.5.0 — فیلتر کردن درخت بر اساس پسوند فایل. fd -e py اجرا شد.

یک جست‌وجوگر فایل سریع و خوش‌برخورد: find بدون تشریفات. به‌صورت پیش‌فرض با regex، رنگی، و .gitignore را رعایت می‌کند.

fd notes # تطبیق regex روی اسم‌های زیر همین‌جا
fd --glob '*.py' # یا تطبیق glob
fd -e py # فقط فایل‌های py
fd --type d --max-depth 3 src # محدودش کن: سه سطح، فقط پوشه
fd -0 # جدا شده با NUL، تا مسیرهای دارای فاصله سالم بمانند

✅ انجام بده

  • با fd یک مسیر فایل را پیدا کن؛ با rg یک رشته‌ی متنی را. قاطی کردن این دو شایع‌ترین اشتباه ایجنت‌هاست.
  • همیشه با --type ، --extension ، --max-depth یا --changed-within محدودش کن. حالت پیش‌فرض، پیمایش بازگشتی همه‌ی فایل‌های زیر پوشه‌ی جاری است؛ یعنی سیل خروجی متنی و هدررفت پنجره‌ی کانتکست.
  • همان پوشه‌ای را که می‌خواهی هدف بگیر: fd <pattern> <dir> بهتر از آن است که cd کنی و بعد یک fd تنها بزنی.

🚫 انجام نده

  • وقتی fd با یک بار اجرا انجامش می‌دهد، برای نام فایل از rg --files استفاده نکن.

🔍 ripgrep ( rg )

rg v15.2.0 — یک جست‌وجو در کل درخت، با نمایش فایل، خط و تطبیق. rg 'Hello' . اجرا شد.

موتور جست‌وجوی بازگشتی متن، و ابزار مناسب برای «گشتن در کل این پروژه». چیزی که یک ایجنت واقعاً از آن می‌گیرد، محدوده و کنترل حجم خروجی است: .gitignore و فایل‌های باینری به‌صورت پیش‌فرض نادیده گرفته می‌شوند، پس نتیجه همان فایل‌هایی است که می‌خواستی نه هر فایلی روی دیسک؛ و -l ، -c ، -g و -t خروجی را محدود می‌کنند. پیمایش موازی هم یک برد واقعی است — ولی بردِ ثانویه، نه عنوان اصلی.

rg 'Hello' . # یک جست‌وجو در کل درخت
rg -l "os.environ" # فقط نام فایل‌ها: خروجی کوچک
rg -c "TODO" # شمارش در هر فایل: ارزان‌ترین بررسی

✅ انجام بده

  • اول باریک جست‌وجو کن، بعد گسترده کن. rg -g '*.ts' "token" src/ قبل از rg "token" . ؛ روی زیرپوشه‌ی مرتبط محدود شو و با -g / -t بر اساس نوع فیلتر کن.
  • وقتی فقط کجا یا چقدر را می‌خواهی از -l (نام فایل) یا -c (شمارش) استفاده کن. تفاوت حجم کانتکست عظیم است.

🚫 انجام نده

  • .git ، node_modules ، target ، dist ، .venv ، __pycache__ را جست‌وجو نکن — .gitignore همیشه پوشه‌های تولیدشده را پوشش نمی‌دهد.
  • فرض نکن نبودنِ یک تطبیق یعنی نبودنِ آن چیز. rg داخل PDF، تصویر یا فایل‌های کامپایل‌شده را نمی‌خواند.

📋 eza

eza v0.23.5 — یک درخت یک‌سطحی که در کادر جا می‌شود، بعد همان فهرست با بزرگ‌ترین‌ها اول. eza -la --icons=always --git --tree -L 1 اجرا شد، بعد --sort=size --reverse .

یک جایگزین مدرن برای ls — با رنگ، آیکون نوع فایل، ستون‌های وضعیت Git و نمای درختی.

eza -la --icons=always --git --tree -L 1 # یک سطح، با وضعیت Git
eza --long --sort=size --reverse # چه چیزی دیسکم را می‌خورد؟

🦇 bat

bat v0.26.1 — یک فایل پایتون با حاشیه‌ی شماره‌خط. bat --style=numbers app.py اجرا شد.

cat با هایلایت سینتکس، شماره‌خط، گاتر تغییرات Git و یک سرتیتر. خوشایندترین راه برای خواندن سورس‌کد توسط انسان.

bat main.py # هایلایت سینتکس + شماره‌خط
bat --diff # فقط خط‌هایی که تغییر کردند

🎯 fzf

https://github.com/junegunn/fzf agent: yes, with --flag

fzf v0.74.4 — سه نام فایل که با پایپ شدن به داخل آن به‌صورت غیرتعاملی مچ شدند. fzf --filter=app اجرا شد، که مچ را بدون TTY برمی‌گرداند.

فازی‌فایندر همه‌کاره. هر چیزی را به آن پایپ کن، دو حرف تایپ کن، فایل را تحویل بگیر.

fd --type f | fzf --filter='\.rs$' --select-1 --exit-0 # غیرتعاملی
fd --type f | fzf --preview 'bat --color=never {}' # انتخابگر انسان

✅ انجام بده

  • حالت تعاملی را با fd ( FZF_DEFAULT_COMMAND ) و bat ( --preview ) ترکیب کن تا یک فایل‌اوپنر خوب بسازی.

🚫 انجام نده

  • find . undefined fzf را داخل الیاسی نگذار که ممکن است یک شل غیرتعاملی اجرایش کند.

🗂️ yazi

yazi v26.9.1 — چهار نوع فایل که به‌ترتیب پیش‌نمایش شدند، همه با هایلایتر داخلی خود yazi. yazi اجرا شد، بعد با کلید Down بین آیتم‌ها جابه‌جا شد و در پایان q زده شد.

یک فایل‌منجر ترمینالی فوق‌سریع با I/O ناهمگام، مرور آرشیو و پیش‌نمایش آگاه به نوع فایل. نزدیک‌ترین تجربه به فایل‌مرورگر گرافیکی، داخل ترمینال.

yazi # مرور پوشه‌ی جاری
yazi ~/Downloads # یا از جای دیگری شروع کن

پیش‌نمایش نقطه‌ی قوت اصلی است. دو ابزار کمکی خارجی آن را عالی می‌کنند:

sudo apt install chafa # رندر تصاویر به‌صورت درون‌خطی
sudo apt install glow # رندر ترمینالی فایل‌های .md
mkdir -p ~/.config/yazi # پوشه‌ی کانفیگ، اگر نباشد ساخته می‌شود
cat > ~/.config/yazi/yazi.toml << 'EOF' # [plugin]: افزودن یک قاعده‌ی پیش‌نمایش
[plugin] # ...که روی mime تطبیق می‌خورد
prepend_previewers = [
{ mime = "text/markdown", run = "glow" },
]
EOF

🧽 defuddle

defuddle v0.19.2 — یک صفحه‌ی عمداً شلوغ، بعد همان صفحه پس از استخراج: 2107 بایت ← 678. defuddle --version ، wc -c noisy.html ، defuddle parse -m noisy.html undefined wc -c ، defuddle parse -m noisy.html ، و در آخر defuddle parse -m -f noisy.html اجرا شد.

صفحه را تمیز می‌کند و به متن اصلی مقاله می‌رساند. ناوبری، بنر کوکی، جایگاه تبلیغات، سایدبار مقالات مرتبط، کامنت‌ها، فوترها و تگ‌های <script> همه حذف می‌شوند.

HTMLای را که از قبل داری فیلتر می‌کند — از فایل، stdin یا curl . اگر آرگومان http:// به آن بدهی، خودش آن URL را فچ می‌کند. و -f فرانت‌متر YAML اضافه می‌کند، پس دیسکریپشن <meta> صفحه — که لابه‌لای HTML خام گم شده — به‌جای حذف شدن همراه نویز، به‌صورت یک فیلد مجزا برمی‌گردد.

✅ انجام بده

  • به آن پایپ کن. curl -L URL undefined defuddle parse -m نیاز به فایل موقت را کاملاً حذف می‌کند.
  • از -p استفاده کن تا فقط یک فیلد ( title ، description ، author ) را استخراج کنی، بدون اینکه بدنه‌ی اصلی چاپ شود.

🚫 انجام نده

  • به آن URLای که خودت انتخاب نکرده‌ای نده. گارد شبکه‌ی خصوصی ندارد، پس ایجنتی که URL مخرب بگیرد آن را فچ می‌کند. همان دسته باگی است که obscura مراقبش است.
  • روی صفحه‌ای که هیچ بخشش سمت سرور رندر نشده حساب نکن. استخراج هیوریستیک و تقریبی است و نویسنده هم آن را به‌عنوان پروژه‌ی در حال توسعه منتشر کرده است.

🥷 obscura

obscura v0.2.3 — صفحه‌ای که بدنه‌اش را یک <script> درون‌خطی می‌نویسد: curl مقدار root">Loading را برمی‌گرداند، obscura گزارش رندرشده را. بعد بخش دسته‌ای، هر بار دو URL. obscura --version ، curl -s http://127.0.0.1:8099/ undefined grep -o 'root.*Loading' ، obscura fetch --allow-private-network --dump markdown http://127.0.0.1:8099/ ، obscura scrape https://example.com https://www.iana.org/help/example-domains ، و بعد obscura scrape --eval 'document.title' --format json https://example.com https://httpbin.org/html اجرا شد.

یک مرورگر هدلس نوشته‌شده با Rust که جاوااسکریپت واقعی را در V8 اجرا می‌کند و با CDP ارتباط می‌گیرد، پس Puppeteer و Playwright بدون تغییر به آن وصل می‌شوند. بدون کرومیوم و بدون Node: باینری حدود 70 مگابایت، حدود 30 مگابایت حافظه‌ی رزیدنت، در برابر 300 مگابایت دانلود و 200 مگابایت حافظه‌ی رزیدنت کروم.

تمام فلسفه‌ی وجودی‌اش همان صفحه‌ای است که curl از پسش برنمی‌آید. در سایت‌های پر JS، curl همان پوسته‌ی خالی را برمی‌گرداند که قرار است اسکریپت آن را پر کند — root">Loading در کلیپ دقیقاً همان است — پس هیچ‌چیز جز مرورگر محتوا را نمی‌بیند. اگر HTML از قبل موجود است از curl استفاده کن؛ اگر نه، سراغ این ابزار برو.

هر دو باینری را نصب کن، نه فقط یکی. فایل tar شامل obscura و obscura-worker کنار هم است و scrape دومی را صدا می‌زند — پس نصب اولیه‌ای که فقط obscura را در PATH گذاشته باشد برای fetch عالی کار می‌کند و بعد در مرحله‌ی دسته‌ای فقط با خطای worker binary not found شکست می‌خورد. روی لینوکس یعنی خودت tar را اکسترکت کنی و هر دو را در PATH قرار بدهی؛ scoop install obscura این کار را روی ویندوز برایت انجام می‌دهد.

کاربردها

  • خواندن صفحه‌ای که فقط بعد از اجرای جاوااسکریپت شکل می‌گیرد — --dump markdown برای متن، --dump links برای گراف url<TAB>title و --dump assets برای فهرست زیرمنبع‌ها به‌شکل NDJSON.
  • obscura scrape url1 url2 … برای همان کار روی یک دسته، به‌صورت موازی. خروجی JSON آن شامل total_urls ، concurrency ، شناسه‌ی ورکر برای هر نتیجه و time_ms برای هر URL است و --eval 'document.title' عبارت دلخواهت را هم‌زمان روی همه‌ی URLها اجرا می‌کند — که همین دلیل مراجعه‌ی ایجنت به آن است.

✅ انجام بده

  • محافظت شبکه‌ی خصوصی را دستکاری نکن. لوپ‌بک و آدرس‌های داخلی به‌صورت پیش‌فرض مسدودند، پس نمی‌توان ایجنت را که URLای از بیرون گرفته فریب داد تا اندپوینت متادیتای ابری‌ات را فچ کند.

🚫 انجام نده

  • برای هر چیزی که خودت شروع نکرده‌ای --allow-private-network اضافه نکن. آن محافظت SSRF را غیرفعال می‌کند که در یک شبکه‌ی مشترک یک سطح حمله‌ی واقعی است.
  • obscura serve یا obscura mcp را روی یک بایند غیرلوپ‌بک نگذار. از نسخه‌ی 0.2.3 به بعد این پورت‌های کنترلی حداقل یک bearer token با 32 بایت می‌خواهند، و تنها دلیلی که اصلاً آن کلید را نگه می‌داری همان بایند لوپ‌بک است.

🧬 دسته‌ی 2 — بررسی و پرس‌وجو

این ابزارها داده را به پاسخ تبدیل می‌کنند. به کمکشان ایجنت می‌تواند بدون نوشتن پارسر بفهمد داخل یک فایل چیست؛ اما اگر بی‌احتیاط استفاده شوند، می‌توانند یک پاسخ غلط را هم قانع‌کننده جلوه دهند.

🔣 jq

jq-1.7 — چاپ یک فایل JSON، سپس کلیدهای سطح‌بالای آن، سپس استخراج یک فیلد از هر آیتم. cat inventory.json ، سپس jq keys و در پایان یک jq -r برای خروجی خام روی .items[].id اجرا شد.

در این مطلب، jq برای کار ایجنتی بیشترین کاربرد را دارد، چون نمی‌گذارد یک پاسخ 40 کیلوبایتی API مستقیم به 40 کیلوبایت کانتکست تبدیل شود. زبان فیلتر خودش را دارد و با yq هم‌خانواده است، اما این دو جای هم نیستند؛ پیش از قرض گرفتن یک فیلتر از دیگری، نکته‌ی بخش yq را بخوان.

jq 'keys' file.json # اول اسکما را بررسی کن
jq -r '.items[].id' results.json # ‎-r = رشته‌ی خام، نه JSON داخل کوتیشن

✅ انجام بده

  • JSON بزرگ را پیش از رسیدن به کانتکست ایجنت از jq عبور بده. برش دادن پاسخ به فیلدهای موردنیازت، بزرگ‌ترین صرفه‌جویی توکن در کل این مطلب است.

🚫 انجام نده

  • اسکما را فرض نکن. اول jq 'keys' را اجرا کن — یک مسیر اشتباه null برمی‌گرداند و ایجنت تحلیلش را بر همان بنا می‌کند.
  • JSON مهم را کورکورانه تغییر نده. خروجی را در فایل جدید بنویس، بررسی کن، بعد جایگزین (move) کن.
  • از jq روی HTML یا یک خط لاگ استفاده نکن. آن کار rg است.

📄 yq

yq v4.53.6 — کل کانفیگ، سپس یک زیردرخت، سپس یک اسکالر. cat config.yaml ، سپس انتخاب .server و سپس استخراج مقدار .server.port اجرا شد.

یک پردازنده‌ی داده‌ی ساخت‌یافته با موتور expression مخصوص خودش که YAML، JSON، XML، TOML، CSV، properties و ini را می‌خواند و می‌نویسد. شکل استفاده‌اش شبیه jq است، اما jq نیست؛ موتور و operatorهایش متفاوت‌اند.

yq '.server' config.yaml # بیرون کشیدن یک زیردرخت
yq -o=json '.services' compose.yml # به‌شکل JSON، برای یک برنامه
yq -i '.services.api.replicas = 3' compose.yml # ویرایش ساخت‌یافته، هرگز sed

✅ انجام بده

  • برای YAML همیشه yq -i را به sed ترجیح بده. یک sed که تعداد replica را عوض می‌کند می‌تواند کوتیشن‌گذاری کل فایل را به‌هم بزند و به چیزی تبدیلش کند که پارسر بعداً آن را رد می‌کند.
  • پیش از ویرایش زیردرخت را بررسی کن و بعدش فایل را دوباره بخوان.
  • وقتی برنامه‌ای خروجی را می‌خواند از -o=json استفاده کن. -I همان --indent است نه جداکننده‌ی سند، پس فلگ «هر سند در یک خط» نیست.
  • توجه کن که yq اپراتور system دارد و به‌صورت پیش‌فرض غیرفعال است — فرم واقعی‌اش system("<exe>") است و فقط با --security-enable-system-operator اجرا می‌شود. حتی در آن حالت yq کل رشته را به‌عنوان یک مسیر اجرایی واحد در نظر می‌گیرد، پس آرگومان‌ها تفکیک (split) نمی‌شوند. هرگز نگذار عبارتی که خودت ننوشته‌ای به آن برسد. --security-disable-env-ops و --security-disable-file-ops توابع مرتبط را غیرفعال می‌کنند.

🚫 انجام نده

  • apt install yq نکن و گمان نکن همین نسخه را گرفته‌ای. روی دبیان/اوبونتو yq یک ابزار پایتونی کاملاً متفاوت با سینتکس jq است. با yq --version بررسی کن.
  • "cmd" undefined system ننویس — آن فرم خطای سینتکسی است، نه فرم خلاصه. و انتظار نداشته باش آرگومان‌ها کار کنند: system("cat /etc/hostname") با خطای fork/exec شکست می‌خورد چون yq دنبال یک فایل اجرایی با نام دقیق cat /etc/hostname می‌گردد. system("hostname") ، system("cat") و system("id") واقعاً اجرا می‌شوند.
  • برای تغییر یک فیلد کل فایل YAML را بازنویسی نکن. از خروجی diff بگیر.

🔬 fq

https://github.com/wader/fq agent: yes, with --flag

fq v0.18.0 — یک سند JSON کامل، بعد یک آرایه، بعد یک کلید. cat sample.json ، بعد انتخاب .tools ، و بعد انتخاب .version اجرا شد.

یک query engine برای داده‌های باینری و ساخت‌یافته با زبانی شبیه jq. جایی که jq فقط JSON می‌خواند، fq تقریباً هر فرمت داده‌ای را که اینجا نام برده شده می‌خواند — PCAP، ELF، PNG، MP4، protobuf و gzip؛ SQLite جزو آن‌ها نیست. fq فورکی از gojq است، بنابراین از بیشتر ابزارهای این فهرست به jq نزدیک‌تر است، اما باز هم jq نیست.

fq -V '.tools' sample.json # ‎-V یعنی خروجی JSON، نه hex dump
fq -V '.boxes[0].type' clip.mp4 # ...و فرمت‌هایی که jq اصلاً نمی‌خواند

✅ انجام بده

  • برای بررسی یک فرمت، پیش از تصمیم به نوشتن پارسر سفارشی از آن استفاده کن. در بیشتر موارد همین کار تو را از نوشتن پارسر بی‌نیاز می‌کند.
  • همیشه -V بده. بدون آن یک نمای انسانی، رنگی و خلاصه‌شده می‌گیری؛ برای خواندن کامل و بدون truncation، -M و -o array_truncate=0 -o string_truncate=0 را هم اضافه کن.
  • فقط همان بخشی را که لازم داری پرس‌وجو کن، و وقتی بایت‌های دقیق، هش یا آفست مهم است روی یک کپی کار کن.

🚫 انجام نده

  • یک فیلتر jq را دست‌نخورده منتقل نکن. آرگومان‌ها با ; جدا می‌شوند نه , ، و تابع خروجی پیش‌فرض یک نمایش است، نه JSON.
  • خروجی‌اش را حکم قطعی ندان. بایت‌ها را رمزگشایی می‌کند؛ از نیت کار خبر ندارد.

🧭 jnv

jnv v0.7.1 — کل فایل، یک پرس‌وجوی زنده و یک مسیر نامعتبر که به‌جای نادیده گرفته شدن، خطایش گزارش می‌شود. cat sample.json ، سپس jnv sample.json ، تایپ .tools ، اضافه کردن یک کلید نامعتبر و در پایان خروج با q .

یک مرورگر تعاملی JSON: یک پرامپت زنده‌ی jq که نتیجه را هم‌زمان با تایپ نشان می‌دهد. مسیر نامعتبر همان لحظه گزارش می‌شود، به‌جای اینکه بی‌سروصدا null برگردد؛ بنابراین کلید اشتباه را زودتر پیدا می‌کنی.

jnv file.json
cat data.json | jnv

🧪 hurl

hurl v8.0.1 — سورس تست، سپس همان تست که اسرشن‌هایش را پاس می‌کند. cat test.hurl ، سپس hurl --test test.hurl اجرا شد.

یک اجراکننده‌ی declarative برای درخواست‌های HTTP. درخواست، وضعیت موردانتظار و assertionها را در یک فایل متنی ساده می‌نویسی و همان فایل به یک تست تبدیل می‌شود.

GET https://httpbin.org/get
HTTP 200
[Asserts]
jsonpath "$.url" == "https://httpbin.org/get"
hurl --test test.hurl

✅ انجام بده

  • به‌جای بازنویسی دستورهای یک‌بارمصرف curl در هر بررسی، از آن استفاده کن. خود فایل تست همان چیزی است که ارزش نگه داشتن دارد؛ آن را در CI قرار بده.
  • برای فلوهای چندمرحله‌ای از مقادیر کپچرشده استفاده کن. سینتکسش name: <query> است — یعنی token: jsonpath "$['access_token']" که بعداً با {{token}} به آن رفرنس می‌دهی. هدر درخواست یک خط ساده‌ی Name: value در هر entry است نه header "..." ؛ آن فرم یک کوئری کپچر یا اسرت است.

🚫 انجام نده

  • آن را ابزار لودتست ندان. این یک اجراکننده‌ی درخواست است — هرچند توجه داشته باش --repeat -1 حلقه‌ی بی‌نهایت است، پس مگر اینکه خود تکرار هدف باشد، فلگ‌های تکرار را خاموش نگه دار.
  • HTTP 200 را دلیل موفقیت ندان. یک عملیات بیزینسی ناموفق هم اغلب 200 برمی‌گرداند — که دقیقاً کاربرد [Asserts] همین است. آن‌ها را حذف نکن و --no-assert هم نده.
  • بدون اجازه آن را به سمت سرویسی که کنترلش را نداری نگیر.

🐙 gh

gh v2.101.0 — یک مخزن به‌شکل JSON با چهار فیلد درخواستی. gh repo view charmbracelet/vhs --json name,description,stargazerCount,url اجرا شد.

CLI رسمی گیت‌هاب. Issues، pull requestها، releaseها و Actions — و مهم‌تر از همه، دسترسی احراز هویت‌شده و ساخت‌یافته به API، بدون اینکه لازم باشد هدرها را دستی بنویسی.

The pattern that matters: ask for exactly the fields you want

gh auth login
gh repo view charmbracelet/vhs --json name,description,stargazerCount,url

✅ انجام بده

  • روی دستورهایی که پشتیبانی می‌کنند، --json را با فهرست صریح فیلدها بده — همین مکانیزم خروجی ساخت‌یافته‌ی gh است و تایپو با خطا و نمایش فهرست فیلدهای معتبر مشخص می‌شود.
  • توکن را در متغیر محیطی بگذار ( GH_TOKEN ) نه در خط فرمان که در هیستوری شل و ترنسکریپت ایجنت می‌افتد. آن را کامیت نکن، داخل دستوری پیست نکن و موقع ضبط $GH_TOKEN را پرینت نکن.

🚫 انجام نده

  • از gh به‌عنوان یک کلاینت HTTP عمومی استفاده نکن. gh api --hostname به هاست‌های GitHub Enterprise و ghe.com هم وصل می‌شود ولی فقط با شکل API گیت‌هاب کار می‌کند، پس مثل curl یک API غیرگیت‌هابی دلخواه را فچ نمی‌کند.
  • مقدار زنده‌ای مثل stargazerCount را به‌عنوان عدد قطعی نقل نکن — در یک ماه هزاران واحد نوسان دارد.

✏️ دسته‌ی 3 — ویرایش و بازبینی

📝 micro

micro v2.0.15 — یک فایل پایتون با هایلایت و نوار وضعیت، سپس یک خروج تمیز. micro app.py اجرا شد، سپس Ctrl+Q فشرده شد.

یک ویرایشگر ترمینال مدرن با پشتیبانی از ماوس، چند بافر و کی‌بایندهای مدرن. گزینه‌ی مناسب وقتی است که جایگزینی برای یک IDE کامل می‌خواهی.

micro file.txt
export EDITOR=micro # تا `crontab -e` و ابزارهای مشابه یک ادیتور قابل‌استفاده باز کنند

✏️ edit

edit v2.0.0 — فایل چاپ شد تا شماره‌خط‌ها دیده شوند، بعد مستقیم روی خط 2 باز شد. cat app.py اجرا شد، بعد edit -g app.py:2 .

ویرایشگر کوچک و سریع ترمینالی مایکروسافت با جست‌وجوی داخلی Ctrl+F و بدون نیاز به یادگیری کانفیگ. قابلیت ویژه‌اش فرم -g است — فایل را با کرسر در همان موقعیت درست باز می‌کند. مایکروسافت پیشنهاد می‌کند برای جلوگیری از تداخل نام، آن را با نام msedit پکیج کنی.

edit -g app.py:2 # ‎-g لازم است؛ app.py:2 تنها یک نام فایل است
sudo apt install libicu-dev # کتابخانه‌ی ران‌تایم برای Ctrl+F روی لینوکس؛ پسوندش به نسخه‌ی توزیع بستگی دارد (روی bookworm می‌شود libicu72)

↔️ delta

delta v0.19.2 — یک diff unstaged با هایلایت سینتکس. git diff به delta پایپ شد.

یک پیجر با هایلایت سینتکس برای git diff ، git log و git blame .

git config --global pager.diff delta # نه core.pager
git --no-pager diff | delta --paging=never --color-only

برای یک diff زنده و هایلایت‌شده داخل git add -p ، مقدار interactive.diffFilter را تنظیم کن.

🐢 lazygit

lazygit v0.65.1 — پنل Files و سپس diff زنده‌ی unstaged. lazygit ، سپس Enter برای رد کردن صفحه شروع، سپس Down و در پایان q فشرده شد.

کل ورک‌فلوی گیت — وضعیت، staging، diff، شاخه، stash و rebase — در یک TUI. با ? در هر لحظه همه‌ی کی‌بایندها نمایش داده می‌شود.

🐳 lazydocker

lazydocker v0.25.2 — پنل‌های زنده‌ی کانتینر و سپس نمای جزئیات یک شبکه‌ی Docker. lazydocker اجرا شد، سپس Down Down ، سپس Right و در پایان q فشرده شد.

یک رابط ترمینالی برای Docker daemon خودت: کانتینرها، ایمیج‌ها، والیوم‌ها، شبکه‌ها، لاگ‌های زنده و آمار. کلیدها همیشه در نوار پایین صفحه نوشته شده‌اند، پس لازم نیست کلیدی را حدس بزنی.


📊 دسته‌ی 4 — سیستم و شبکه

روی این ماشین واقعاً چه می‌گذرد؟ اینجا جایی است که ایجنتی که به‌جای اندازه‌گیری حدس می‌زند، می‌تواند خسارت واقعی به بار بیاورد.

🌫️ dust

dust v1.2.6 — یک سطح از اندازه‌ی پوشه‌ها. dust -d 1 اجرا شد.

نسخه‌ای خواناتر از du . بزرگ‌ترین پوشه‌ها را یک‌جا می‌بینی، به‌جای انبوهی از شمارش بلوک‌های 4 کیلوبایتی.

dust -j -n 20 / # 20 تای بزرگ‌تر، به‌شکل JSON

✅ انجام بده

  • اول از dust -n 20 استفاده کن — خروجی محدود است و با یک بار اجرا جواب «این‌جا چه چیزی بزرگ است؟» را می‌دهد. وقتی برنامه‌ای خروجی را می‌خواند -j را هم اضافه کن، ولی -n را نگه دار: محدودیت تعداد سطر، خروجی را محدود نگه می‌دارد.
  • با -d عمق را کنترل کن. dust / با عمق کامل یک سیل کانتکست است، پس روی ماشینی که مال خودت نیست اجرایش نکن.

🚫 انجام نده

  • برای موازی‌سازی پویش سراغ -j نرو. مدیریت تردها با -T / --threads انجام می‌شود؛ در dust ، -j همان --output-json است. نسبت سرعت در برابر du را ویژگی ذاتی ابزار ندان: سرعت dust از تردها می‌آید، پس فقط وقتی از du سریع‌تر است که هسته‌ها آزاد باشند. با یک ترد ( -T1 ) از du کندتر است و روی هاست بومی با 8 vCPU، du حدود 2.3 برابر سریع‌تر بود. dust را برای خروجی محدود -n و JSON بومی به کار ببر، نه برای سرعت.
  • du -sh را در حلقه نچرخان. dust دقیقاً جای همان را گرفته است.

🌳 procs

procs v0.14.12 — جدول پروسه‌ها که به یک نام فیلتر شده. procs python اجرا شد.

یک نمایشگر مدرن پروسه: درخت پروسه‌ها، مصرف منابع، پورت‌ها، کانتینرها و cgroupها در یک جدول خوانا.

procs --json # JSON، یک آبجکت برای هر پروسه
procs --tree # اولین حرکت وقتی یک چیز درست کار نمی‌کند

✅ انجام بده

  • وقتی چیز دیگری قرار است نتیجه را بخواند، از procs --json استفاده کن. pager، بریدگی و رنگ را کلاً دور می‌زند، و به همین دلیل است که فلگ است نه نمای پیش‌فرض. در man page خودش نیامده، پس به‌سادگی از قلم می‌افتد؛ اگر --json را ندیدی، CHANGELOG را بررسی کن.
  • procs --tree را اولین حرکت وقتی چیزی عجیب رفتار می‌کند در نظر بگیر. شکل والد/فرزند معمولاً خودش مشکل را توضیح می‌دهد.
  • مرحله‌به‌مرحله جلو برو: procs برای نگاه اول، بعد /proc ، ps با ستون‌های صریح، ss ، systemctl یا docker inspect وقتی جواب واقعی را می‌خواهی.
  • سراغ witr برو وقتی سؤال چرا یک پروسه وجود دارد، نه فقط اینکه چیست.

🚫 انجام نده

  • یک پروسه را فقط چون در procs ظاهر شد نکش. پیش از آنکه تو شروع کنی آنجا بوده است.
  • فرض نکن چون یک پروسه مالک یک پورت است، کشتنش امن است؛ یا اینکه نام پروسه مالکیت را ثابت می‌کند. python3 می‌تواند هر چیزی باشد.
  • برای ستون Env درخواست نکن. محیط کامل یک پروسه‌ی دیگر را چاپ می‌کند، و همان‌جاست که کلیدهای API زندگی می‌کنند، و آن خروجی در کانتکست تو می‌نشیند.
  • --json را با --only یا --tree روی v0.14.12 ترکیب نکن — یک ستون که رد شود، JSON نامعتبر می‌سازد. بررسی کن که خروجی پارس می‌شود.
  • systemctl status یا docker inspect را وقتی مرجع اصلی هستند با procs عوض نکن.

🕵️ witr

witr v0.3.3 — یک دیمن سیستمی زنده که ریشه‌اش را تا مالک، فایل سرویس و زنجیره‌ی والد دنبال کرد. witr cron اجرا شد.

نه «چه چیزی در حال اجراست»، بلکه « چرا این در حال اجراست، و چه کسی راه انداخته؟ » — والد، ناظر، فایل سرویس، کاربر، کل زنجیره‌ی والدها.

problem -> witr -> identify owner/parent/supervisor -> inspect -> decide -> only then restart/kill/modify

✅ انجام بده

  • witr را پیش از کشتن یا ری‌استارت کردن هر چیز ناآشنا اجرا کن، و مخصوصاً پیش از آزاد کردن یک پورت اشغال‌شده.
  • یک نام بده، نه یک PID ثابت. یک PID از یک دقیقه پیش ممکن است تمام شده باشد، و یک PID کهنه یک جواب مطمئن ولی غلط تولید می‌کند.
  • بلوک هشدارها را بخوان. «اجرا با دسترسی root» ریسک هر کاری که بعدش بکنی را بالا می‌برد.

🚫 انجام نده

  • یک پروسه‌ی مرموز را فقط چون پورت 8000 را مالک است با kill -9 نکش. اینجوری یک دیتابیسِ در حال اجرا کارهای ذخیره‌نشده‌اش را از دست می‌دهد.
  • یک سرویس را پیش از آنکه بفهمی آیا اصلاً باید اجرا شود متوقف نکن.
  • از نام پروسه به‌تنهایی نتیجه نگیر که مالک آن است.

🖥️ bottom ( btm )

btm v0.14.9 — نمودارهای زنده‌ی CPU، حافظه، شبکه و پروسه؛ پنل دما روی یک VM خالی است. btm ، بعد q اجرا شد.

یک مانیتور گرافیکی سیستم — خواهر کوچک‌تر و خوش‌ظاهرتر htop . CPU، حافظه، I/O دیسک و شبکه به‌شکل نمودار زنده، طوری که یک دندانه‌ارّه یا یک اسپایک 30 ثانیه‌ای واضح می‌شود، به‌علاوه‌ی یک فهرست پروسه که می‌توانی مرتبش کنی، فیلترش کنی و روی همان پروسه‌ها عملیات بزنی، بدون حفظ کردن پرچم‌های ps .

btm --basic # فقط CPU، حافظه، شبکه، دیسک

🚫 انجام نده

  • برای گرفتن یک عدد btm را اجرا نکن. این یک TUI تمام‌صفحه است که روی صفحه‌کلید منتظر می‌ماند، و هیچ حالت گزارشی ندارد: به‌جای آن procs ، free -h و ss -s را بخوان، یا برای کانتینرها docker stats .

🌐 bandwhich

bandwhich v0.23.1 — نسبت‌دهی پهنای‌باند به هر پروسه با تعداد اتصال‌ها و نرخ آپلود/دانلود. bandwhich اجرا شد، سپس Tab فشرده شد تا بین نماها جابه‌جا شود.

یک مانیتور زنده‌ی پهنای‌باند در ترمینال که ترافیک را به پروسه‌ای که مالک آن است نسبت می‌دهد — و نشان می‌دهد کدام هاست یا آدرس بیشترین سهم را دارد، نه فقط مجموع را.

bandwhich # نیاز به root، یا هر چهار قابلیت
sudo setcap cap_sys_ptrace,cap_dac_read_search,cap_net_raw,cap_net_admin+ep "$(command -v bandwhich)"
bandwhich --raw -n # حالت قابل پایپ، بدون DNS

🛰️ trippy ( trip )

trip v0.13.0 — یک جدول زنده‌ی هاپ‌به‌هاپ که با ستون‌های اتلاف و تأخیر پر می‌شود. trip 1.1.1.1 اجرا شد.

traceroute و ping ترکیب‌شده در یک نمای زنده: اتلاف، جیتر و تأخیر به‌ازای هر هاپ، که به‌صورت زنده به‌روز می‌شود.

trip 1.1.1.1 # TUI زنده
trip 1.1.1.1 -m json # ایجنت: قابل خواندن ماشینی

✅ انجام بده

  • در هر کار خودکار از -m json (یا حالت گزارشی دیگر) استفاده کن و خروجی را در فایل بنویس تا اعداد بعد از پایان سشن باقی بمانند. آن‌قدر اجرایش کن که معنادار شود؛ یک پروب چیزی را ثابت نمی‌کند.

🚫 انجام نده

  • با یک پروب گذرا خود را قانع نکن که شبکه مشکل دارد. اندازه‌گیری را تکرار کن.
  • یک هاپ میانی بی‌پاسخ را نشانه‌ی خرابی ندان — بسیاری از روترها پاسخ نمی‌دهند و مسیر از آن‌ها عبور می‌کند.

⚙️ دسته‌ی 5 — ساخت و تأیید

🐍 uv

uv v0.11.29 — ساخت یک virtualenv، بعد فهرست کردن اینکه چه چیزی در آن نصب است. uv venv ، بعد uv pip list اجرا شد.

یک مدیر بسته و پروژه‌ی پایتون فوق‌سریع — از حل وابستگی و ساخت محیط مجازی تا نصب، معمولاً یک مرتبه بزرگی سریع‌تر از pip .

A project, start to finish

uv venv
uv add requests
uv run python main.py # هر بار محیط درست را حل می‌کند
uvx ruff --version # اجرای یک ابزار بدون نصبش

✅ انجام بده

  • به‌جای فعال کردن یک venv، از uv run <cmd> استفاده کن. یک دسته کامل از باگ‌های «پایتون اشتباه» را حذف می‌کند.
  • برای ابزارهای یک‌بارمصرف از uvx استفاده کن — بدون نصب، بدون آلودگی محیط.
  • uv.lock را با uv add / uv sync مرجع تیم نگه دار.

🚫 انجام نده

  • pip install و uv را در یک محیط قاطی نکن. وضعیت وابستگی خرابی به دست می‌دهد که هیچ‌کدام از ابزارها نمی‌توانند آن را درست تحلیل کنند.
  • با uv pip install در پایتون سیستم نصب نکن. venv دقیقاً برای همین است.

🧹 ruff

ruff v0.16.9 — یک دور lint روی یک فایل. ruff check app.py اجرا شد.

یک linter و فرمت‌کننده‌ی پایتون خیلی سریع در یک باینری.

ruff check . # دروازه‌ی پیش‌فرض
ruff check --output-format=json . # برای یک برنامه، نه یک انسان

✅ انجام بده

  • هر بار که کد پایتون را تغییر دادی، ruff check را اجرا کن. آن‌قدر سریع است که دیگر هیچ بهانه‌ای نمی‌ماند.
  • اصلاحات خودکار امن را به ویرایش دستی خطاهای lint ترجیح بده، و به کانفیگ ruff خود پروژه احترام بگذار — آن را override نکن که یک هشدار ناپدید شود.

🚫 انجام نده

  • lint تمیز را دلیل درست بودن برنامه ندان. Ruff ظاهر کد و یک دسته از باگ‌ها را بررسی می‌کند؛ منطق، نوع‌ها و تست‌های تو را نه.
  • بی‌خود سراغ --unsafe-fixes نرو — «unsafe» یعنی ابزار دارد به تو می‌گوید ممکن است رفتار را عوض کند.

⏱️ hyperfine

hyperfine v1.20.0 — دو دستور که به میانگین ± σ و نسبت سرعت رسیدند. hyperfine --warmup 1 'sleep 0.02' 'sleep 0.04' اجرا شد.

بنچمارک آماری خط فرمان. به‌جای یک بار اجرای time ، یک دستور را آن‌قدر تکرار می‌کند که به تو بگوید تفاوت واقعی است یا نه.

hyperfine --warmup 1 'sleep 0.02' 'sleep 0.04'

✅ انجام بده

  • پیش از بهینه‌سازی، یک baseline را بنچمارک کن، و از --warmup استفاده کن تا اثر شروع سرد روی مقایسه نیفتد.
  • وقتی داری نتیجه را می‌نویسی export کن: hyperfine --export-json result.json … .
  • خودت مقایسه‌ی معناداری را انجام بده. ± σ نکته‌ی اصلی است — نشان می‌دهد پراکندگی اندازه‌گیری‌ها چقدر بوده، تا ببینی فاصله‌ی دو میانگین نسبت به آن چقدر است، چیزی که یک time خالی نمی‌گوید. hyperfine میانگین، σ و یک نسبت شتاب را می‌دهد و همین‌جا تمام می‌کند: آزمون معناداری ندارد و به تو نمی‌گوید تفاوتی واقعی است.

🚫 انجام نده

  • هیچ چیزی را که idempotent نیست بنچمارک نکن. --min-runs پیش‌فرض 10 است، و --prepare پیش از هر اجرای زمان‌سنجی اجرا می‌شود، پس یک git commit یا curl -X POST یک دوازده بار اجرا می‌شود. هیچ هشداری هم نمی‌گیری.
  • دو کار متفاوت را طوری مقایسه نکن که انگار معادل‌اند.
  • بر اساس تفاوتی که از σ اعلام‌شده کوچک‌تر است بهینه نکن.
  • وقتی کارایی ربطی به آن ندارد ازش استفاده نکن. رایگان نیست.

🔖 zoxide

zoxide v0.10.0 — فهرست frecency، یک پرش فازی، و pwd که ثابت می‌کند رسیده. zoxide query --list ، بعد z mock_env ، و در آخر pwd اجرا شد.

یک جایگزین cd که یاد می‌گیرد. یک پایگاه داده‌ی frecency نگه می‌دارد — هر پوشه را بر اساس اینکه چند وقت یک‌بار و چقدر اخیراً به آن سر زده‌ای امتیازدهی می‌کند.

eval "$(zoxide init bash)" # اضافه‌اش کن به ~/.bashrc
z project # تطبیق فازی زیررشته‌ای، نه مسیر

📜 atuin — یک ابزار فقط مخصوص انسان، و دلیلش مهم است

atuin v18.23.0 — جدول تاریخچه، رابط جست‌وجوی Ctrl+R با تب‌های حالتش و نشانگر [GLOBAL] ، بعد میله‌های فرکانس از atuin stats . atuin --version ، atuin history list ، Ctrl+R → git → Esc ، atuin search --format '{command}' git ، atuin history list --cmd-only --cwd ، و در آخر atuin stats اجرا شد.

جدول تاریخچه، clear ، cd /srv/api-gateway و دستورهای خود atuin را فهرست می‌کند، چون واقعاً موقع ضبط کلیپ اجرا شده‌اند.

یک تاریخچه‌ی شل کامل‌تر: قابل جست‌وجو، همگام بین ماشین‌ها و دسته‌بندی‌شده بر اساس پوشه، کد خروج و مدت اجرا. برای انسان واقعاً کاربردی است، اما برای یک ایجنت خودکار خطرناک‌ترین ابزار این مطلب است.

مشکل این نیست که تاریخچه خصوصی است. مشکل این است که تاریخچه‌ی شل در عمل یک انبار اسرار است. هر اعتبارنامه‌ای که تا حالا روی خط فرمان تایپ شده جمع می‌شود:

export GH_TOKEN=ghp_xxxxxxxxxxxx
curl -H "Authorization: Bearer $API_KEY" https://api.example.com/...
psql postgres://admin:hunter2@db.internal/app
mysql -uroot -p'correct horse battery staple' < dump.sql
AWS_SECRET_ACCESS_KEY=wJalr... git push https://user:token@github.com/org/repo.git

atuin search را بزن و همه‌ی آن‌ها را داری. ثبت‌نام کنی و atuin sync را اجرا کنی، یک کانال داری که تاریخچه‌ات را به ماشین دیگری می‌برد. و رابط جست‌وجو دستور انتخاب‌شده را با Enter اجرا می‌کند — یک ضربه‌ی کلید فاصله داری تا یک چیز مخرب دوباره اجرا شود.

دو چیز این وضعیت را برای یک ایجنت بدتر می‌کند. Atuin یک atuin hook install opencodeundefinedclaude-codeundefinedcodexundefinedpi دارد که دستورهای خودِ ایجنت را در همان آرشیو ثبت می‌کند، به‌علاوه‌ی یک سرور MCP و ai.capture_sessions برای کپی کردن کل ترنسکریپت ایجنت. و پالایش کریدنشیال‌ها، با اینکه پیش‌فرض روشن است، یک بلاک‌لیست regex است که خودِ بالادست آن را best-effort می‌داند — فرمت‌های رایج را می‌شناسد و یک کریدنشیال تکه‌تکه‌شده با کد رنگی را از دست می‌دهد.

قانون: اگر یک ایجنت هستی، atuin را نصب نکن، اصلاً atuin را اجرا نکن، و پایگاه داده‌اش را نخوان. اگر واقعاً لازم داری بدانی چه چیزی اجرا شده، از انسان بخواه کپی‌پیست کند.

با install.sh رسمی نصبش کن، ولی حواست باشد که اسکریپت نصب در ادامه تو را به ساختن حساب Atuin Cloud هدایت می‌کند.

eval "$(atuin init bash)" # بعد Ctrl+R برای تاریخچه‌ی فازی
# فقط محلی: auto_sync = false در کانفیگ atuin، و هرگز atuin register نزن

دو ابزار متفاوت، دو میان‌بر متفاوت: z مربوط به zoxide (پرش بین پوشه‌ها) و Ctrl+R مربوط به atuin (جست‌وجوی تاریخچه) — مگر اینکه شل یا ابزار تاریخچه‌ی دیگری زودتر آن کلید را گرفته باشد. اگر خواستی هر دو را نصب کن — ولی بدان کدام کلید را زدی، و بدان که فقط یکی‌شان از یک اسکریپت یا عامل امن است.

⭐ starship

starship v1.26.0 — پرامپت رندرشده برای پوشه‌ی جاری. starship prompt اجرا شد.

یک پرامپت سریع که بین شل‌های مختلف کار می‌کند: پوشه، شاخه و وضعیت Git، و نسخه‌ی فعال زبان، در چند میلی‌ثانیه. پریست‌ها فوراً یک پرامپت خوش‌ظاهر به تو می‌دهند؛ کانفیگ جدا برای هر ماژول وقتی چیز بیشتری می‌خواهی.

eval "$(starship init bash)"
starship explain # چرا پرامپت من کند است؟

🪟 zellij

zellij v0.45.1 — پیش‌فرض‌هایی که مردم معمولاً اشتباه می‌زنند، نمایش داده‌شده: تقسیم پایین، تب جدید، تقسیم راست، و بعد خروج. Ctrl+p d → Ctrl+t n → Ctrl+p r → Ctrl+q اجرا شد.

یک فضای کاری و مالتی‌پلکسر مدرن ترمینال — جایگزین tmux که با پیش‌فرض‌های معقول، چیدمان‌ها و سیستم پلاگین همراه است، پس یک آخر هفته را صرف کانفیگ نمی‌کنی. پنل، تب، پنجره‌ی شناور و یک مدیر سشن، بدون آنکه اول فایلی بنویسی: یک اجرای طولانی ایجنت، دنبال کردن لاگ و شلت را در سه پنل نگه دار، بدون گم شدن هیچ‌کدام. zellij setup --dump-config همه‌ی کی‌بایندها را نشان می‌دهد.

🎨 pastel

https://github.com/sharkdp/pastel agent: yes, with --flag

pastel v0.12.0 — یک رنگ hex به شکل نمونه‌رنگ‌ها و مؤلفه‌ها. pastel color روی یک مقدار hex اجرا شد.

یک ابزار رنگ خط فرمان: تولید، تبدیل، ترکیب و چاپ رنگ‌ها در فرمتی که نیاز داری.

pastel format hex '#ff8800' # تبدیل رنگ
pastel textcolor '#1e1e1e' --on white # کنتراست
pastel random | pastel format hex # خروجی ماشینی

✅ انجام بده

  • از یک رنگ پایه کل یک پالت بساز تا تم تو خودبه‌خود منسجم دربیاید.
  • هر وقت خروجی به درون یک اسکریپت یا متغیر می‌رود، از pastel format <type> استفاده کن. همین پایپ‌لاین مستندشده است.
  • برای کنتراست از pastel textcolor استفاده کن. حساب روشنایی نسبی با تبدیل درست sRGB از روی حافظه سخت است و هیچ‌چیز هم خطایش را نمی‌گیرد.

🚫 انجام نده

  • سراغ -s نرو. روی pastel random همان --strategy است و به یک مقدار نیاز دارد، پس pastel random -s روی پارس آرگومان شکست می‌خورد.
  • خروجی پیش‌فرض را پارس نکن. روی پایپ HSL می‌دهد، نه hex — چون قالب بوم انسان است.
  • جایی که رنگ باید ثبات داشته باشد از pastel random استفاده نکن.
  • برای تبدیل یک hex تنها به RGB از آن استفاده نکن. printf کافی است.

🤖 راهنمای ایجنت

تا اینجا هر ابزاری که دیدی یک بخش اختصاصی داشت. این بخش مشخصاً برای خواندن توسط یک ایجنت نوشته شده است و نسخه‌ی مرجع همان قواعدی است که در بخش ابزارها تکرار شده‌اند. از اینجا شروع کن؛ یادداشت‌های هر ابزار را جزئیات تکمیلی در نظر بگیر.

📌 یادداشت‌هایی برای ایجنت‌ها

خودِ جایگزین را در ستون Use instead در جدول اصلی نصب می‌بینی. منطق انتخاب هم یک‌بار برای همیشه این است:

  • متن ساده بر تزئینات برتری دارد. ls ، cat و git --no-pager diff همان را نشان می‌دهند که eza ، bat و delta — بدون آیکون، رنگ یا حاشیه‌ی سینتکس که در پنجره‌ی کانتکست فقط نویز است. bat و delta هر دو روی پایپ امن هستند؛ دلیل کنار گذاشتن آن‌ها باز شدن تب و ANSI است، نه پیجری که باعث هنگ کردن شود.
  • یک پیجر بدون راه خروج از نداشتن پیجر بدتر است. fzf خالی و trip خالی هر دو منتظر یک کلید می‌مانند. از فرم غیرتعاملی یا جایگزین استفاده کنید؛ هرگز برای گرفتن یک عدد یک TUI را فراخوانی نکنید.
  • یک پروسه بهتر از یک مرورگر تعاملی است. jq جایگزین کامل jnv است — همان هدف، بدون TTY و بدون فلگی برای به‌خاطر سپردن.
  • خروجی را پیش از رسیدن به کانتکست محدود کن. dust / خالی یک پنجره را غرق می‌کند، ولی dust -j -n 20 / بیست خط مفید پر می‌کند.
  • رتبه‌بندی جواب نیست. zoxide پوشه‌ها را با فرمولی امتیاز می‌دهد که با گذر زمان عوض می‌شود و تساوی‌هایش را ناپایدار مرتب می‌کند. اگر مسیر را می‌دانی، همان را بزن.
  • پیش از متوقف کردن چیزی، مالکیت را مشخص کن. kill روی یک PID ناشناخته یعنی از دست دادن کارهای ذخیره‌نشده‌ی یک دیتابیسِ در حال اجرا. اول witr را با یک نام اجرا کن.
  • atuin نه جایگزین دارد و نه به آن نیاز است. هرگز نصبش نکن، هرگز اجراش نکن، هرگز پایگاه داده‌اش را نخوان.

اصلاً جایگزینی ندارند — اجراشان نکن: yazi ، lazygit ، lazydocker ، zellij ، bottom ، bandwhich ، micro ، edit ، starship ، zoxide .

⚖️ قوانینی که برای همه‌ی ابزارها صدق می‌کند

💸 حجم خروجی، با عدد و رقم واقعی

دو هزینه مهم‌اند: دستوری که تایپ می‌کنی و خروجی‌ای که برمی‌گردد.

دستوری که تایپ می‌کنی:

به‌جای بنویس کاراکتر
find . -name "*notes*" -type f fd notes 30 ← 8
find . -type f -name "*.py" fd -e py 27 ← 8
python -c "import json;print([i['id'] for i in json.load(open('f.json'))['items']])" jq -r '.items[].id' f.json 84 ← 26

خروجی — این همان چیزی است که واقعاً بودجه‌ی کانتکست را تعیین می‌کند. اندازه‌گیری روی فایل‌های پشت این مطلب (tokenizer مدل cl100k_base ، کل فایل سورس، اندازه‌گیری 2026-10-03):

چه چیزی بایت، اندازه‌گیری‌شده توکن، اندازه‌گیری‌شده
SKILL.md — کل راهنمای ایجنت، با یک fetch 52,938 12,042
SKILL.yml — قرارداد پرس‌وجوی انتخابی 41,375 9,210
سورس این مطلب، نسخه‌ی انگلیسی 90,824 24,298
سورس این مطلب، نسخه‌ی فارسی 134,800 51,243

دو برداشت. اول: fetch کامل SKILL.md حدود 12 هزار توکن هزینه دارد — دقیقاً به همین دلیل SKILL.yml به‌صورت قرارداد پرس‌وجوی انتخابی ساخته شده، نه یک خوانش کامل دوم. دوم: فارسی حدود 1.8 کاراکتر در هر توکن است در برابر حدود 3.7 انگلیسی — همان محتوا به فارسی تقریباً دو برابر بودجه می‌برد. tokenizerها عوض می‌شوند؛ نسبت را به خاطر بسپار، نه رقم‌ها را.

curl -s "$API/items" | python -m json.tool # همه‌ی فیلدها، همه‌ی موارد
curl -s "$API/items" | jq '.[] | {id, name, status}' # چهارتایی که لازم داشتی

🤔 آیا عامل اصلاً باید جست‌وجو کند؟

جدول پایین به سؤال چطور جست‌وجو کنم؟ جواب می‌دهد، نه به سؤال اصلاً باید جست‌وجو کنم؟ :

Do you already know the file? -> address it directly, don't search
Do you know the string, not a path? -> rg
Do you know the path, not a string? -> fd
Is it "how big / what's in here"? -> dust, or --summary flags
Do you need the whole file? -> don't; slice it (jq, yq, rg -l)
Is it a TUI? -> stop. Say you can't see it, ask.

خط آخر از همه مهم‌تر است: اگر راه غیرتعاملی برای رسیدن به پاسخ وجود ندارد، همین را بگو؛ با ابزاری که ممکن است گیر کند بداهه‌کاری نکن.

🗜️ rtk — لایه‌ی فشرده‌سازی کانتکست

rtk v0.50.0 — RTK دارد گزارش می‌دهد چقدر کانتکست ذخیره کرده. با rtk gain اجرا شد.

یک proxy برای خروجی که محتوای تکراری را از نتیجه‌ی دستورها، پیش از رسیدن به کانتکست مدل، حذف می‌کند. جایگزین خودِ دستور نیست؛ فقط خروجی آن را فیلتر می‌کند.

git status # استفاده‌ی عادی: rtk را تایپ نمی‌کنی
rtk git status # فقط وقتی که به‌طور شفاف بازنویسی نمی‌شود

✅ انجام بده

  • به نوشتن دستورهای عادی ادامه بده. وقتی یکپارچه‌سازی Hermes RTK فعال باشد، دستورهای پشتیبانی‌شده را خودکار بازنویسی می‌کند — پس پیشوند rtk را دستی روی آن نگذار، وگرنه پردازش دو‌لایه و یک لاگ گمراه‌کننده می‌گیری.
  • rtk <command> را فقط وقتی صریح تایپ کن که دستور بازنویسی نمی‌شود ، یا به یک قابلیت مخصوص RTK نیاز داری، یا خود RTK را دیباگ می‌کنی.
  • هر وقت خروجی خلاصه‌شده کافی نبود، به دستور خام زیرش برگرد — RTK عمداً محتوا را حذف می‌کند، پس هرگز نمی‌تواند یک حذف را مجاز کند.

🚫 انجام نده

  • rtk gain را شمارش توکن نخوان. خروجی را بر بایت تقسیم می‌کند بر 4 و نتیجه را توکن می‌نامد، چون rtk هیچ tokenizerای ندارد — بالادست خودش می‌گوید درصدها عدد معناداری هستند. هیچ بنچمارک tokenizerای پشتش نیست، پس نه شمارش‌ها و نه درصدها را عدد بودجه ندان.
  • هرگز خروجی خلاصه‌شده را دلیل نبودن یک چیز ندان. اگر RTK حذفش کرده باشد، این با غایب بودنش یکی نیست.
  • وقتی شکست خورد، پشت‌سرهم تکرارش نکن.

🧩 انتخاب ابزار در یک نگاه

این بخش را می‌توانی مستقیم در system prompt ایجنتت paste کنی.

اگر نیاز داری… استفاده کن از
پیدا کردن فایل / پوشه fd
جست‌وجوی محتوای فایل یا کد rg
فیلتر کردن یک فهرست بدون TTY rg -F — fzf --filter روی هر sink کندترینِ این سه است، روی یک پایپ واقعی حدود 5 برابر عقب‌تر
خواندن متن مقاله‌ی یک صفحه‌ی وب defuddle parse -m
خواندن صفحه‌ای که فقط بعد از جاوااسکریپت وجود دارد obscura fetch --dump markdown
اجرای JS خودت روی یک دسته صفحه obscura scrape --eval
پارس یا فیلتر کردن JSON jq
پارس یا ویرایش YAML / کانفیگ yq
بررسی ساختار باینری یا پروتکل fq -V — برای JSON خالص از jq استفاده کن که 7.3 برابر سریع‌تر است
پرس‌وجو یا عمل روی مخزن، PR یا مسئله‌ی گیت‌هاب gh
تست یا بازپخش جریان‌های HTTP hurl
بررسی latency یا packet loss شبکه ping -c 5 -q <host> — trip نیازمند root است
مدیریت یک پروژه، venv یا ابزار پایتون uv
lint و فرمت پایتون ruff
اندازه‌گیری کارایی hyperfine
بررسی پروسه‌ها و مصرف منابع procs --json
تشخیص مالکیت پروسه / پورت / سرویس witr
بزرگ‌ترین پوشه‌ها روی دیسک dust -j -n 20 /
کم کردن نویز خروجی CLI / کانتکست rtk
پرش به پوشه‌ای که قبلاً در آن بوده‌ای مسیر مطلق — رتبه‌بندی frecency برای عامل امن نیست
تبدیل رنگ hex به RGB printf '%d %d %d' lpar;(0x1e)) lpar;(0x1e)) lpar;(0x1e))

🚫 چیزهایی که این مطلب پوشش نمی‌دهد

دو خلأ عمدی. جست‌وجوی ساختاری کد ( ast-grep ) خارج از محدوده است: rg به «این رشته کجاست» جواب می‌دهد، نه «این الگوی نحوی کجاست». بررسی زنجیره‌ی تأمین ( syft ) هم خارج از محدوده است، حتی با اینکه هر نصب در اینجا سطح حمله را گسترده‌تر می‌کند — آن کارِ اسکنر است، نه ابزار شل. هیچ‌کدام از این موارد، حکمی از این مطلب را تغییر نمی‌دهد؛ وقتی پرسش شکل کد یا محتوای یک ایمیج است، سراغ آن‌ها برو.

در فهرست آزمایش. همه‌ی موارد بالا ابزار بازبینی یا UI هستند؛ هیچ‌کدام درستی را بررسی نمی‌کنند. این سوگیری سیستماتیک کاتالوگ است و فهرست زیر شروع به رفع آن می‌کند.

نامزد چرا مناسب است وضعیت
ast-grep ( sg ) جست‌وجوی ساختاری: print($X) با فراخوانی‌ها تطبیق می‌دهد، نه با زیررشته‌ها؛ --json=stream قاعده‌ی خروجی ماشین‌خوان را برآورده می‌کند در اولویت — نیازمند آزمایش و دمو
mise task runner و مدیر env رست در یک باینری؛ یک ابزار به‌جای دو ابزار در صف
syft تولیدکننده‌ی SBOM با گو: جواب «داخل این ایمیج چیست» در صف

این مطلب را به‌روز نگه می‌دارم — با آزمایش هر ابزار، یک مورد از فهرست کم می‌شود و ابزار فقط وقتی به بخش اصلی راه می‌یابد که دمویش روی همان ماشین ضبط شده باشد.

🧾 نکات احتیاطی

  • کلیپ atuin روی نتایج جست‌وجو متوقف می‌شود. Enter در آن لایه، دستور هایلایت‌شده را اجرا می‌کند، و به همین دلیل کلیپ به‌جای اجرای چیزی روی فهرست تمام می‌شود.
  • ضبط hurl یک درخواست شبکه‌ی واقعی به httpbin.org می‌زند، پس پاس یا فیلش به در دسترس بودن آن سرویس بستگی دارد.
  • ضبط gh یک stargazerCount زنده را نشان می‌دهد — در تاریخ ضبط به‌روز بوده، فردایش قدیمی خواهد شد!
  • کلیپ obscura فقط fetch و scrape را پوشش می‌دهد. serve و mcp روی میزبان ضبط نصب‌اند، ولی هیچ‌کدام جلوی دوربین اجرا نمی‌شود.
  • هر کپشن بیلدی را نام می‌برد که در تاریخ ضبط روی صفحه بوده، نه نسخه‌ی جاری — زنجیره‌ی ابزار ضبط را ببین. چندتایی عقب‌اند — jq به‌خصوص، که نسخه‌ی جدیدترش بیشتر امنیتی است.

Loading Giscus...