
Une application axée sur la confidentialité qui supprime les filigranes IA du contenu que vous possédez.
_ _ _ ____ ___ ____ ____ _ _ ____ ____ _ _ ____ ____ ____ _ _ ____ _ _ ____ ____
| | | |__| | |___ |__/ |\/| |__| |__/ |_/ [__ __ |__/ |___ |\/| | | | | |___ |__/
|_|_| | | | |___ | \ | | | | | \ | \_ ___] | \ |___ | | |__| \/ |___ | \
Compétence d'agent + service Python stdlib pour supprimer les marques de provenance IA multi-fournisseurs du texte et des fichiers — pour la confidentialité et l'hygiène sur du contenu que vous possédez. La compétence est un client léger : elle pilote la mécanique via HTTP, donc l'hôte de l'agent n'a pas besoin de Python.
| Couche | Cible | Comment |
|---|---|---|
| A | Unicode invisible, espaces exotiques, bidi, caractères de balise | Scripts Python déterministes |
| B | Filigranes textuels statistiques (échantillonnage de tokens) | Réécriture par l'agent + hook optionnel rewrite_text.py |
| Fichiers | C2PA / EXIF / XMP / propriétés de document | PNG, JPEG, WebP, AVIF, HEIC, BMP, GIF, TIFF, SVG, PDF, DOCX, XLSX, PPTX, EPUB, ODT, HTML, Markdown, MP4/MOV/M4A/M4V, WAV, MP3, FLAC |
Fournisseurs / écosystèmes (au niveau des classes) : Claude, Gemini / SynthID-Text, surfaces de provenance OpenAI, marques open-LLM de style Kirchenbauer (green-list) et keyed-Gumbel / EXP (Aaronson).
Dernière version : v0.7.0
Chemin de la compétence : skills/remove-ai-marks/
Chemin du service : service/
(migration : anciennement remove-claude-marks ; l'alias slash /remove-claude-marks est toujours documenté)
La compétence ne contient aucun code — elle appelle le service via HTTP. Installez la compétence (markdown uniquement) et démarrez le service, puis définissez WATERMARKS_SERVICE_URL si ce n'est pas http://127.0.0.1:8765.
Dans Claude Code, la voie la plus rapide est le marketplace de plugins intégré — pas de clone, et il se met à jour sur place. Partout ailleurs, un seul installateur couvre tous les hôtes pris en charge (Python 3.10+ stdlib, aucune dépendance) :```bash python3 install_skill.py --skill remove-ai-marks --target claude-code
| Hôte | Cible | Emplacement final |
| --- | --- | --- |
| Claude Code (personnel) | `--target claude-code` | `~/.claude/skills/<skill>` (respecte `CLAUDE_CONFIG_DIR`) |
| Claude Code (projet) | `--target claude-project --project-dir PATH` | `PATH/.claude/skills/<skill>` |
| Cowork, claude.ai, sessions cloud, routines | `--target cowork` | `dist/<skill>.zip` à téléverser sous **Customize → Skills** |
| Cursor | `--target cursor` (par défaut) | `~/.cursor/skills/<skill>` |
Skills fournies : `remove-ai-marks` (complète, adossée à un service) et
`clean-user-facing-text` (texte uniquement, autonome). `--list` les affiche.
Les installations existantes sont préservées sauf si vous passez `--force` ; le
remplacement est d'abord mis en attente et l'installation précédente est
conservée comme sauvegarde nommée de manière unique.
`--link` crée un lien symbolique vers ce checkout au lieu de copier, de sorte que
les modifications sont prises en compte en direct. Sous Windows, utilisez
`py install_skill.py ...` ; le wrapper `install-skill.sh` est fourni pour les
shells macOS/Linux.
Avant d'écrire quoi que ce soit, l'installateur valide la skill selon les
règles d'empaquetage [Agent Skills](https://agentskills.io) que les téléversements
claude.ai et l'API Skills appliquent : frontmatter conforme à la spécification
(`name`, `description`, `license`, `compatibility`, `metadata`, `allowed-tools`),
un `name` en minuscules avec traits d'union d'au plus 64 caractères correspondant
au répertoire, une `description` non vide d'au plus 1024 caractères. Le bundle
Cowork doit en outre respecter la limite de téléversement de 30 Mo, ce que
l'empaqueteur impose.
### Nettoyage automatique via hook (déterministe)
Une skill est une instruction : le modèle décide de l'invoquer ou non, et le
modèle est ce qui produit les marques. Un **hook** est exécuté par le harnais
à chaque appel d'outil correspondant, sans nécessiter de coopération. Cela fait
du hook la moitié déterministe de ce flux de travail.
Le plugin enregistre un hook `PostToolUse` sur `Write|Edit|MultiEdit|NotebookEdit`
qui exécute [`service/scripts/hook_written_file.py`](https://github.com/guillaumemeyer/watermarks-remover/blob/main/service/scripts/hook_written_file.py)
sur le fichier que l'agent vient d'écrire. Deux modes, correspondant à la
convention de pré-commit de vérification par défaut :
| Mode | Comportement |
| --- | --- |
| `check` (par défaut) | Signale les marques de provenance, laisse le fichier intact. Les résultats sont transmis au modèle (exit 2), afin qu'il puisse proposer de les nettoyer. |
| `clean` | Supprime les marques sur place, puis indique au modèle que le fichier sur disque a changé. |
Définissez le mode depuis les paramètres du plugin (**Hook mode** dans `/plugin manage`,
lu par le hook sous le nom `CLAUDE_PLUGIN_OPTION_HOOK_MODE`), ou avec
`WATERMARKS_HOOK_MODE=clean` dans l'environnement. La commande du hook
n'interpole délibérément **pas** `${user_config.hook_mode}` : Claude Code refuse
d'exécuter un hook qui référence une option que l'utilisateur n'a jamais ouverte
via `/plugin manage` pour la définir — un `default` déclaré ne suffit pas — donc
l'interpoler signifierait que le hook ne s'exécuterait jamais silencieusement sur
une installation neuve. La détection réutilise `scan_file` / `is_actionable` de
`audit_lib`, de sorte que le hook, la barrière de pré-commit et l'export SARIF de
la CI s'accordent sur ce qui compte comme actionnable ; le nettoyage délègue à
`clean_file.py`, de sorte qu'aucune logique de nettoyage n'est dupliquée. Le mode
`clean` écrit dans un fichier temporaire voisin et ne permute qu'en cas de
différence réelle, de sorte que les fichiers déjà propres conservent leur mtime
et ne redéclenchent pas les observateurs de fichiers.
Sans le plugin, câblez-le vous-même dans `~/.claude/settings.json` (ou un
`.claude/settings.json` de projet) :```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
}
]
}
]
}
}
Sur Windows, remplacez python3 par py.