🗺 نقشه
🗺 نقشه
🔎 پیدا کردن و خواندن آیا این فایل وجود دارد و چه چیزی در آن است؟
🧬 بررسی و پرسوجو تبدیل داده به پاسخ.
✏️ ویرایش و بازبینی ویرایش فایلها، بازبینی تغییرات.
📊 سیستم و شبکه واقعاً روی این ماشین چه میگذرد؟
⚙️ ساخت و تأیید محیط، لینت، بنچمارک.
🗺️ پیمایش و چندبرابر کردن سریعتر جابهجا شو، بیشتر به خاطر بسپار.
🩺 مشکل چهل کیلوبایت
ایجنتت یک دستور با جواب درست فاصله دارد. ولی دستور اشتباه را میزند: 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
اجرا میشوند. قبل از کپیپیست کردن، دستور را بخوانید؛ و قبل از اینکه یک ایجنت را بدون نظارت آزاد بگذارید،
قوانین ایجنتها
را بخوانید. موارد واقعاً پرریسک هم در همان بخش مشخص شدهاند.
🪜 از کجا شروع کنم
نود ثانیه، بعد مرجع. قوانین کلی را یک بار بخوان — آنها بخش حیاتی این مطلباند و بقیه جزئیات است. بعد، به همین ترتیب:
- هستهی اصلی.
fd،ripgrep،jq،yqوhyperfine. نه TUI، نه root، نه کانفیگ. دستور یکخطی را بردار و بس. - لایهی ایجنت.
rtkوprocs. بقیه را وقتی یک کار واقعی خواست اضافه کن. - چیتشیت. همان جدول را در 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 bucketscoop 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 ripgrepwinget 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" --versionwhere.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' # یا تطبیق globfd -e py # فقط فایلهای pyfd --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 # یک سطح، با وضعیت Giteza --long --sort=size --reverse # چه چیزی دیسکم را میخورد؟🦇 bat
bat v0.26.1 — یک فایل پایتون با حاشیهی شمارهخط. bat --style=numbers app.py
اجرا شد.
cat
با هایلایت سینتکس، شمارهخط، گاتر تغییرات Git و یک سرتیتر. خوشایندترین راه برای خواندن سورسکد توسط انسان.
bat main.py # هایلایت سینتکس + شمارهخطbat --diff # فقط خطهایی که تغییر کردند🎯 fzf
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 # رندر ترمینالی فایلهای .mdmkdir -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
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 dumpfq -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.jsoncat data.json | jnv🧪 hurl
hurl v8.0.1 — سورس تست، سپس همان تست که اسرشنهایش را پاس میکند. cat test.hurl
، سپس
hurl --test test.hurl
اجرا شد.
یک اجراکنندهی declarative برای درخواستهای HTTP. درخواست، وضعیت موردانتظار و assertionها را در یک فایل متنی ساده مینویسی و همان فایل به یک تست تبدیل میشود.
GET https://httpbin.org/getHTTP 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 logingh 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.txtexport 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.pagergit --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 venvuv add requestsuv 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یک دوازده بار اجرا میشود. هیچ هشداری هم نمیگیری. - دو کار متفاوت را طوری مقایسه نکن که انگار معادلاند.
- بر اساس تفاوتی که از
σاعلامشده کوچکتر است بهینه نکن. - وقتی کارایی ربطی به آن ندارد ازش استفاده نکن. رایگان نیست.
🗺️ دستهی 6 — پیمایش و چندبرابر کردن
🔖 zoxide
zoxide v0.10.0 — فهرست frecency، یک پرش فازی، و pwd
که ثابت میکند رسیده.
zoxide query --list
، بعد
z mock_env
، و در آخر
pwd
اجرا شد.
یک جایگزین cd
که یاد میگیرد. یک پایگاه دادهی frecency نگه میدارد — هر پوشه را بر اساس اینکه چند وقت یکبار و چقدر اخیراً به آن
سر زدهای امتیازدهی میکند.
eval "$(zoxide init bash)" # اضافهاش کن به ~/.bashrcz 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_xxxxxxxxxxxxcurl -H "Authorization: Bearer $API_KEY" https://api.example.com/...psql postgres://admin:hunter2@db.internal/appmysql -uroot -p'correct horse battery staple' < dump.sqlAWS_SECRET_ACCESS_KEY=wJalr... git push https://user:token@github.com/org/repo.gitatuin 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
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 searchDo you know the string, not a path? -> rgDo you know the path, not a string? -> fdIs it "how big / what's in here"? -> dust, or --summary flagsDo 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 بهخصوص، که نسخهی جدیدترش بیشتر امنیتی است.
