
تطبيق يضع الخصوصية أولاً ويزيل العلامات المائية للذكاء الاصطناعي من المحتوى الذي تملكه.
_ _ _ ____ ___ ____ ____ _ _ ____ ____ _ _ ____ ____ ____ _ _ ____ _ _ ____ ____
| | | |__| | |___ |__/ |\/| |__| |__/ |_/ [__ __ |__/ |___ |\/| | | | | |___ |__/
|_|_| | | | |___ | \ | | | | | \ | \_ ___] | \ |___ | | |__| \/ |___ | \
مهارة وكيل + خدمة Python بالمكتبة القياسية لإزالة علامات المصدر متعددة الموردين للذكاء الاصطناعي من النصوص والملفات — من أجل الخصوصية والنظافة على المحتوى الذي تملكه. المهارة عبارة عن عميل رفيع: تقود الآلية عبر HTTP، لذا لا يحتاج مضيف الوكيل إلى Python.
| الطبقة | الهدف | الكيفية |
|---|---|---|
| A | Unicode غير المرئي، المسافات الغريبة، bidi، محارف الوسوم | سكربتات Python حتمية |
| B | العلامات المائية النصية الإحصائية (أخذ عينات الرموز) | إعادة كتابة الوكيل + خطاف rewrite_text.py الاختياري |
| الملفات | C2PA / EXIF / XMP / خصائص المستند | PNG، JPEG، WebP، AVIF، HEIC، BMP، GIF، TIFF، SVG، PDF، DOCX، XLSX، PPTX، EPUB، ODT، HTML، Markdown، MP4/MOV/M4A/M4V، WAV، MP3، FLAC |
الموردون / الأنظمة البيئية (على مستوى الفئة): Claude، Gemini / SynthID-Text، أسطح المصدر الخاصة بـ OpenAI، علامات open-LLM بنمط Kirchenbauer (القائمة الخضراء) و keyed-Gumbel / EXP (Aaronson).
أحدث إصدار: v0.7.0
مسار المهارة: skills/remove-ai-marks/
مسار الخدمة: service/
(الترحيل: كان سابقًا remove-claude-marks؛ لا يزال الاسم المستعار /remove-claude-marks موثقًا)
المهارة لا تشحن أي كود — بل تستدعي الخدمة عبر HTTP. ثبّت المهارة (markdown فقط) وابدأ الخدمة، ثم اضبط WATERMARKS_SERVICE_URL إذا لم تكن http://127.0.0.1:8765.
في Claude Code، أسرع طريق هو سوق الإضافات المضمّن — بدون استنساخ، ويحدّث في مكانه. في كل مكان آخر، مثبّت واحد يغطي كل مضيف مدعوم (Python 3.10+ بالمكتبة القياسية، بدون تبعيات):```bash python3 install_skill.py --skill remove-ai-marks --target claude-code
| المضيف | الهدف | مكان الاستقرار |
| --- | --- | --- |
| Claude Code (شخصي) | `--target claude-code` | `~/.claude/skills/<skill>` (يحترم `CLAUDE_CONFIG_DIR`) |
| Claude Code (مشروع) | `--target claude-project --project-dir PATH` | `PATH/.claude/skills/<skill>` |
| Cowork، claude.ai، الجلسات السحابية، الروتينات | `--target cowork` | `dist/<skill>.zip` للرفع تحت **Customize → Skills** |
| Cursor | `--target cursor` (افتراضي) | `~/.cursor/skills/<skill>` |
المهارات المُضمَّنة: `remove-ai-marks` (كاملة، مدعومة بخدمة) و
`clean-user-facing-text` (نصية فقط، مكتفية ذاتيًا). يطبعها `--list`.
تُحفظ التثبيتات الموجودة ما لم تمرر `--force`؛ يتم تجهيز الاستبدال
أولًا ويُحتفظ بالتثبيت السابق كنسخة احتياطية باسم فريد.
يقوم `--link` بإنشاء روابط رمزية لهذا المستودع بدلًا من النسخ، فتُلتقط التعديلات
مباشرة. على Windows، استخدم `py install_skill.py ...`؛ غلاف `install-skill.sh`
متوفر لأصداف macOS/Linux.
قبل كتابة أي شيء، يتحقق المُثبِّت من المهارة وفق قواعد تغليف
[Agent Skills](https://agentskills.io) التي تفرضها عمليات الرفع إلى claude.ai
وواجهة Skills API: بيانات أمامية مطابقة للمواصفة (`name`، `description`،
`license`، `compatibility`، `metadata`، `allowed-tools`)، و`name` بحروف صغيرة
مفصولة بشرطات لا يتجاوز 64 حرفًا ويطابق الدليل، و`description` غير فارغ
لا يتجاوز 1024 حرفًا. كما يجب أن تتوافق حزمة Cowork مع
حد الرفع البالغ 30 ميغابايت، وهو ما يفرضه المُحزِّم.
### التنظيف التلقائي عبر hook (حتمي)
المهارة تعليمة: النموذج يقرر ما إذا كان سيستدعيها، والنموذج هو
ذاته ما ينتج العلامات. أما الـ **hook** فينفذه الـ harness
عند كل استدعاء أداة مطابق، دون الحاجة إلى تعاون. وهذا ما يجعل الـ hook
النصف الحتمي من سير العمل هذا.
تسجّل الإضافة hook من نوع `PostToolUse` على `Write|Edit|MultiEdit|NotebookEdit`
يشغّل [`service/scripts/hook_written_file.py`](https://github.com/guillaumemeyer/watermarks-remover/blob/main/service/scripts/hook_written_file.py)
على الملف الذي كتبه الوكيل للتو. وضعان، بما يطابق عُرف pre-commit
القائم على الفحص افتراضيًا:
| الوضع | السلوك |
| --- | --- |
| `check` (افتراضي) | يبلّغ عن علامات المصدر، ويترك الملف كما هو. تذهب النتائج إلى النموذج (exit 2)، ليتمكن من عرض تنظيفها. |
| `clean` | يزيل العلامات في مكانها، ثم يخبر النموذج أن الملف على القرص قد تغيّر. |
اضبط الوضع من إعدادات الإضافة (**Hook mode** في `/plugin manage`،
يقرأه الـ hook باسم `CLAUDE_PLUGIN_OPTION_HOOK_MODE`)، أو عبر
`WATERMARKS_HOOK_MODE=clean` في البيئة. أمر الـ hook **لا** يُدرج
`${user_config.hook_mode}` عمدًا: يرفض Claude Code تشغيل
hook يشير إلى خيار لم يفتح المستخدم `/plugin manage` لضبطه — فوجود
`default` معلن لا يكفي — لذا فإن إدراجه يعني أن الـ hook لن يعمل بصمت أبدًا
على تثبيت جديد. تعيد الكشف استخدام `scan_file` / `is_actionable` من `audit_lib`،
فيتفق الـ hook وبوابة pre-commit وتصدير CI SARIF على ما يُعد
قابلًا للتنفيذ؛ ويستدعي التنظيف `clean_file.py`، فلا تتكرر
أي منطق تنظيف. يكتب وضع `clean` إلى ملف مؤقت مجاور ويستبدل فقط عند
وجود فرق حقيقي، فتحتفظ الملفات النظيفة أصلًا بطابعها الزمني ولا تعيد
تفعيل مراقبي الملفات.
بدون الإضافة، اربطه بنفسك في `~/.claude/settings.json` (أو في
`.claude/settings.json` الخاص بالمشروع):```json
{
"hooks": {
"PostToolUse": [
{
"matcher": "Write|Edit|MultiEdit|NotebookEdit",
"hooks": [
{
"type": "command",
"command": "python3",
"args": ["/path/to/watermarks-remover/service/scripts/hook_written_file.py",
"--mode", "check"],
"timeout": 30
}
]
}
]
}
}
على Windows، استبدل python3 بـ py.
ما لا يمكن للـ hook فعله. لا يمكن لأي hook إعادة كتابة رسالة الدردشة الخاصة بالمساعد
قبل أن تقرأها. يتلقى hook Stop في Claude Code قيمة last_assistant_message
للقراءة فقط، ولا يوجد مرشّح ما قبل الإرسال للردود النهائية — وهو نفس القيد
الذي يوثّقه هذا المشروع بالفعل لقواعد Cursor. لذا فإن الضمان الحتمي
يغطي الملفات التي يكتبها الوكيل، بالإضافة إلى
بوابة pre-commit لأي شيء في طريقه إلى git. النص الذي
يوجد فقط في سجل الدردشة لا يزال يعتمد على سير عمل المهارة،
والذي يقوم على تعليمات النموذج وبالتالي فهو بأفضل جهد ممكن.
المستودع هو أيضًا plugin لـ Claude Code وmarketplace أحادي الإضافة
(.claude-plugin/)، لذا تُثبَّت كلتا المهارتين وتُحدَّثان بأمرين
فقط، دون الحاجة إلى clone أو script:```
/plugin marketplace add guillaumemeyer/watermarks-remover
/plugin install watermarks-remover@watermarks-remover
تُحمَّل المهارات بعد ذلك بنطاق أسماء: `/watermarks-remover:remove-ai-marks` و
`/watermarks-remover:clean-user-facing-text` (يعمل أيضًا `/remove-ai-marks` المجرّد
عندما لا يطالب به شيء آخر). يجلب `/plugin marketplace update
watermarks-remover` الإصدارات اللاحقة. وينطبق الأمر نفسه من واجهة سطر الأوامر باستخدام
`claude plugin marketplace add …` / `claude plugin install …`، ومن نسخة محلية
بتمرير مسار بدلًا من `owner/repo`.
للمشرفين: يشغّل `make plugin-validate` الأمر `claude plugin validate . --strict`
على كلا البيانين؛ ويغطي `tests/test_plugin_manifest.py` الملفات نفسها
دون الحاجة إلى واجهة سطر الأوامر.