
مسجل رحلات وماسح أسرار لوكلاء البرمجة بالذكاء الاصطناعي. يقرأ ما شغّله Claude Code وCodex وGemini CLI و9 غيرها، ويرصد الإجراءات الخطرة والمفاتيح المسربة. يعمل محليًا، بلا قياس عن بُعد، MIT.
مسجّل رحلات لوكلاء الذكاء الاصطناعي، وماسح ضوئي للصلاحيات التي يمتلكونها. أمان وكلاء البرمجة بالذكاء الاصطناعي لـ Claude Code وأحد عشر وكيل برمجة آخر، يعمل على جهازك الخاص. لا حساب، لا قياس عن بُعد، لا تبعيات.
الموقع والتوثيق: https://ranwhat.com
وكيل البرمجة الخاص بك يمتلك shell الخاص بك، ومفاتيحك، ومستودعك. يقرأ ranwhat
ما نفّذه فعليًا ويكشف عن العدد القليل من الإجراءات غير القابلة للتراجع التي تستحق
المعرفة.
$ ranwhat watch --days 90
ranwhat watch · local agent flight recorder
----------------------------------------------------------------------------
Read Claude Code: 4 transcripts, last 90 days
2 critical 2 high
* Credential material accessed 2026-09-30 18:13:00 Bash
cat ~/.ssh/id_rsa
-> The agent read a file whose only purpose is to hold secrets. Whatever
it read is now in a model context you do not control.
* Bulk or recursive deletion 2026-09-28 14:42:00 Bash
…rm -rf '@'
-> Recursive deletion. Recoverable only if something else was backing it
up.
* Package or release published 2026-09-21 11:05:00 Bash
npm publish
-> Something was pushed to a registry other people may install from.
Supply-chain reach, and usually irreversible.
* Destructive git operation 2026-09-15 17:30:00 Bash
git push --force origin main
-> History rewriting or branch deletion. This is the class of action
that destroys the record of what else happened.
----------------------------------------------------------------------------
Read locally. Nothing was transmitted.
يحذف Claude Code نص جلسة لم تستخدمها لمدة أطول من
cleanupPeriodDays،
وهي 30 يومًا افتراضيًا. لذا يجد --days 90 المزيد إذا كنت قد رفعت هذه القيمة، أو
إذا كانت جلسة استأنفتها خلال تلك الفترة تحتوي على إجراءات أقدم، أو للجلسات التي
بدأت أو استُكملت آخر مرة في Claude Desktop أو Cowork، والتي
يحتفظ بها Claude Code v2.1.248 وما بعده بأي عمر افتراضيًا.
شغّله مرة واحدة، دون تثبيت أي شيء:
uvx ranwhat check
أو ضعه على مسارك:
pipx install ranwhat
pip install ranwhat
ثم يعرض ranwhat demo فحصًا للصلاحيات على مثال مضمّن.
Python 3.9+. لا تبعيات، ولا شيء يُبنى على جهازك.
ranwhat check: كل ما يستحق المعرفة، في تمريرة واحدة للقراءة فقطيشغّل watch وclean معًا ولا يغيّر شيئًا.
على الطرفية، تُبقي check وwatch وclean سطر حالة واحدًا على stderr أثناء
القراءة، مع عدّ النصوص عبر كل تمريرة: indexing secrets
((first run) في المرة الأولى)، checking actions، looking for secrets.
لا يُكتب شيء هناك عندما لا يكون stderr طرفية، أو مع --json.
ranwhat watch: تدقيق ما نفّذه Claude Code ووكلاؤك الآخرونيقرأ ما كتبه Claude Code ووكلاء البرمجة الآخرون بالفعل على القرص. لا غلاف، لا وسيط، لا شيء في مسارك الحرج. كل وكيل أدناه يُقرأ افتراضيًا، كل واحد من حيث يحتفظ بتاريخه (المتغير بين الأقواس ينقله، كما ينقل الوكيل نفسه)؛ والوكيل غير الموجود على جهازك يُتخطى.
| المصدر | الموقع | التنسيق |
|---|---|---|
| Claude Code | ~/.claude/projects/*/*.jsonl وsubagents/**/agent-*.jsonl لكل جلسة، أو نفس المسار تحت $CLAUDE_CONFIG_DIR/projects عند ضبطه | JSONL |
| Codex (CLI، إضافة IDE، تطبيق سطح المكتب) | ~/.codex/sessions/YYYY/MM/DD/rollout-*.jsonl وarchived_sessions/ ($CODEX_HOME)؛ يُبحث في history.jsonl وshell_snapshots/ وفهرس الخيوط SQLite الخاص به عن الأسرار | JSONL؛ SQLite للقراءة فقط؛ .jsonl.zst للقراءة فقط، على Python 3.14 أو مع أمر zstd |
| Gemini CLI | ~/.gemini/tmp/<project>/chats/session-*.jsonl وsession-*.json الأقدم ($GEMINI_CLI_HOME) | JSONL، JSON |
| GitHub Copilot CLI | ~/.copilot/session-state/<session>/events.jsonl ($COPILOT_HOME) | JSONL |
| Qwen Code | ~/.qwen/projects/<project>/chats/*.jsonl وtmp/<hash>/chats/session-*.json الأقدم ($QWEN_RUNTIME_DIR، $QWEN_HOME) | JSONL، JSON |
| Grok Build | ~/.grok/sessions/<folder>/<session>/updates.jsonl ($GROK_HOME) | JSONL |
| Droid | ~/.factory/sessions/*.jsonl، و-<cwd>/*.jsonl وbtw/*.jsonl تحته ($FACTORY_HOME_OVERRIDE) | JSONL |
| Kimi Code | ~/.kimi-code/sessions/<folder>/<session>/agents/*/wire.jsonl ($KIMI_CODE_HOME) | JSONL |
| Kimi CLI | ~/.kimi/sessions/<folder>/<session>/wire.jsonl وcontext*.jsonl ($KIMI_SHARE_DIR) | JSONL |
| Pi | ~/.pi/agent/sessions/--<cwd>--/*.jsonl ($PI_CODING_AGENT_DIR) | JSONL |
| Muse Code | ~/.local/share/muse/sessions/YYYY/MM/DD/<session>/session.jsonl ($XDG_DATA_HOME/muse) | JSONL |
| OpenClaw | $OPENCLAW_STATE_DIR/agents/*/agent/openclaw-agent.sqlite | SQLite، للقراءة فقط |
يعمل Meta Muse في سحابة Meta ولا يحتفظ بشيء على جهازك، لذا لا يوجد شيء لقراءته؛ أما Muse Code، أداة البرمجة CLI من Meta، فهي مدعومة. يحتفظ Grok Bot بتاريخه في سحابة xAI، حتى للأوامر التي ينفّذها على جهازك؛ أما Grok Build، أداة البرمجة CLI من xAI، فهي مدعومة. يحتفظ Amp الحالي بخيوطه على ampcode.com. Cursor هو التالي، بمجرد التحقق من تنسيقه مقابل مصدر أساسي.
تسع قواعد: الوصول إلى بيانات الاعتماد، والسلاسل التي تشبه الأسرار في استدعاءات الأدوات، ونشر الحزم، وتغييرات موارد السحابة، واستدعاءات واجهات API المالية، والتلاعب بالسجلات، وgit المدمّر، والحذف التعاودي، والملفات المحلية المرفوعة عبر curl. تُحكم استدعاءات أدوات كل وكيل بالقواعد نفسها؛ وكل إجراء يذكر أي وكيل نفّذه.
ranwhat watch --days 30
ranwhat watch --source codex # one agent (repeatable)
ranwhat watch --path codex=~/work/.codex # an agent's history elsewhere
ranwhat watch --json
ranwhat sources # every agent, where it looked, what it found
لا يزال --root و--state-dir يعملان، كاسمَي
--path claude-code= و--path openclaw=.
ranwhat clean: العثور على الأسرار في نصوص Claude Code والوكلاء الآخرينعندما ينفّذ وكيل cat .env، تُكتب المخرجات في النص:
كلمة مرور قاعدة بياناتك، وسر JWT الخاص بك، ورموز مزوّدك، بنص صريح،
في ملف يحتفظ به Claude Code لمدة 30 يومًا افتراضيًا.
ranwhat clean # report, then open a review session
ranwhat clean --apply # mask everything without asking
يبحث clean في تاريخ كل وكيل، ويُخفي قيمة فقط في ملف
يسمح الوكيل بإعادة كتابته: ملف JSONL أو JSON أو نصي عادي لم يكتب فيه
شيء خلال الدقيقتين الأخيرتين. قواعد البيانات (فهرس خيوط Codex،
وقواعد بيانات وكيل OpenClaw) والملفات المضغوطة للقراءة فقط: يسمّي التقرير
كل واحد منها يحتوي على سر وكيفية إزالته في الوكيل
بدلاً من ذلك.
يستغرق فحص تاريخ حقيقي بعض الوقت، لذا تبقى الجلسة مفتوحة على ما وجدته للتو بدلاً من إجبارك على إعادة الفحص للتصرف بناءً عليه:
ranwhat> list the findings again
ranwhat> show 3 where it appears, and what to roll it at
ranwhat> mask 3 mask just that one
ranwhat> mask all mask everything listed
ranwhat> keep 3 leave it alone
ranwhat> rotate what to rotate, grouped by provider
كل نتيجة تذكر المشروع الذي وُجدت فيه، وعندما يسمّيه النص،
الملف الذي قُرئت منه، لأن سلسلة من 64 حرفًا
بلا فائدة دون معرفة أي .env تسرّبت منه:
* Stripe live secret key sk_…dc 32 chars seen 8x
read from api/.env
in /Users/you/Desktop/app
التنقيح ليس معالجة. إخفاء قيمة هنا لا يلغي كشفها. كانت بالفعل على القرص وكانت بالفعل في سياق نموذج لا تتحكم فيه. التدوير هو الحل؛ الإخفاء يوقف فقط تسرّبها مرة ثانية. يقول التقرير ذلك بدلاً من الإيحاء بالأمان.
يُخفي قيمة فقط عندما يسمّيها المفتاح المجاور لها كسر أو عندما تحمل القيمة
شكل بيانات اعتماد يمكن التعرف عليه. تُترك العناصر النائبة وملفات القوالب
والإعدادات العادية وحدها، وكذلك أمثلة التوثيق المنشورة
(AKIAIOSFODNN7EXAMPLE من AWS) وعناصر الاختبار الواضحة مثل
AKIA1234567890ABCDEF. تذهب النسخ الاحتياطية إلى ~/.ranwhat/backups، ويُحلَّل
الملف المعاد كتابته مرة أخرى قبل أن يحل محل الأصل.