
Приложение с приоритетом приватности, которое удаляет AI-водяные знаки из вашего собственного контента.
_ _ _ ____ ___ ____ ____ _ _ ____ ____ _ _ ____ ____ ____ _ _ ____ _ _ ____ ____
| | | |__| | |___ |__/ |\/| |__| |__/ |_/ [__ __ |__/ |___ |\/| | | | | |___ |__/
|_|_| | | | |___ | \ | | | | | \ | \_ ___] | \ |___ | | |__| \/ |___ | \
Навык агента + сервис на stdlib Python для удаления мультивендорных меток происхождения ИИ из текста и файлов — для приватности и гигиены контента, которым вы владеете. Навык представляет собой тонкий клиент: он управляет механизмом по HTTP, поэтому хосту агента не требуется Python.
| Слой | Цель | Как |
|---|---|---|
| A | Невидимый Unicode, экзотические пробелы, bidi, тег-символы | Детерминированные Python-скрипты |
| B | Статистические (token-sampling) текстовые водяные знаки | Перезапись агентом + опциональный хук 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 (green-list) и 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+ stdlib, без зависимостей):```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` создаёт символические ссылки на этот
checkout вместо копирования, поэтому правки подхватываются
на лету. В Windows используйте `py install_skill.py ...`; обёртка `install-skill.sh`
предоставлена для оболочек macOS/Linux.
Прежде чем что-либо записывать, установщик проверяет навык на соответствие
правилам упаковки [Agent Skills](https://agentskills.io), которые применяют
загрузки claude.ai и Skills API: frontmatter только по спецификации (`name`, `description`,
`license`, `compatibility`, `metadata`, `allowed-tools`), `name` в нижнем регистре через дефис
длиной не более 64 символов, совпадающий с именем каталога, непустой
`description` длиной не более 1024 символов. Пакет Cowork дополнительно
должен укладываться в лимит загрузки 30 МБ, который обеспечивает упаковщик.
### Автоматическая очистка через хук (детерминированная)
Навык — это инструкция: модель решает, вызывать ли его, а
модель — это то, что создаёт метки. **Хук** выполняется средой
при каждом соответствующем вызове инструмента, согласие не требуется. Это делает хук
детерминированной половиной данного рабочего процесса.
Плагин регистрирует хук `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`,
читается хуком как `CLAUDE_PLUGIN_OPTION_HOOK_MODE`), или с помощью
`WATERMARKS_HOOK_MODE=clean` в окружении. Команда хука намеренно
**не** интерполирует `${user_config.hook_mode}`: Claude Code отказывается запускать
хук, который ссылается на опцию, которую пользователь никогда не открывал в `/plugin manage`, чтобы
её задать — объявленный `default` не удовлетворяет этому условию — поэтому интерполяция означала бы,
что хук молча никогда не запустится при свежей установке. Обнаружение повторно использует
`scan_file` / `is_actionable` из `audit_lib`, поэтому хук, шлюз pre-commit и экспорт
SARIF в CI согласованно определяют, что считается требующим действий; очистка вызывает
`clean_file.py`, поэтому логика очистки не дублируется. Режим `clean` пишет во
временный файл-сосед и заменяет только при реальном различии, поэтому файлы, которые
уже были чистыми, сохраняют свой mtime и не перезапускают наблюдатели за файлами.
Без плагина подключите его самостоятельно в `~/.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.
Чего хук сделать не может. Ни один хук не может переписать сообщение ассистента в чате
до того, как вы его прочитаете. Хук Stop в Claude Code получает last_assistant_message
только для чтения, и фильтра перед отправкой финальных ответов не существует — то же ограничение,
которое этот проект уже документирует для правил Cursor. Таким образом, детерминированная гарантия
охватывает файлы, которые записывает агент, плюс
гейт pre-commit для всего, что попадает в git. Текст, который
существует только в стенограмме чата, по-прежнему зависит от рабочего процесса навыка,
который основан на инструкциях модели и поэтому работает по мере возможностей.