
watermarks-remover v0.5.0
Приложение с приоритетом приватности, которое удаляет AI-водяные знаки из вашего собственного контента.
_ _ _ ____ ___ ____ ____ _ _ ____ ____ _ _ ____ ____ ____ _ _ ____ _ _ ____ ____
| | | |__| | |___ |__/ |\/| |__| |__/ |_/ [__ __ |__/ |___ |\/| | | | | |___ |__/
|_|_| | | | |___ | \ | | | | | \ | \_ ___] | \ |___ | | |__| \/ |___ | \
watermarks-remover
Навык агента + сервис на 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, без зависимостей):
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> |
| Codex (личный) | --target codex | ~/.agents/skills/<skill> |
| Codex (проект) | --target codex-project --project-dir PATH | PATH/.agents/skills/<skill> |
| Cowork, claude.ai, облачные сессии, routines | --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, которые применяются при
загрузке в claude.ai и в Skills API: frontmatter только по спецификации
(name, description, license, compatibility, metadata,
allowed-tools), name в нижнем регистре с дефисами длиной не более 64
символов, совпадающий с именем каталога, непустой description длиной не
более 1024 символов. Пакет Cowork дополнительно должен укладываться в
ограничение загрузки 30 МБ, что обеспечивает упаковщик.
Терминал и десктоп Codex
Установите любой из поставляемых навыков для своего пользователя или установите один в конкретный проект:
python3 install_skill.py --skill remove-ai-marks --target codex
python3 install_skill.py --skill clean-user-facing-text --target codex
python3 install_skill.py --skill remove-ai-marks --target codex-project --project-dir /path/to/project
В Windows используйте py вместо python3. Откройте проект в Codex. В
терминале используйте /skills или введите $, чтобы выбрать навык; в настольном приложении
выберите или упомяните навык в своём запросе. Перезапустите Codex, если новый навык
не появился. Установка проекта доступна, когда Codex работает в этом проекте.
Для remove-ai-marks запустите существующий HTTP-сервис из этого репозитория
с помощью make serve перед использованием навыка (или в Windows без make выполните
py service/scripts/server.py --host 127.0.0.1 --port 8765). Он использует
WATERMARKS_SERVICE_URL (по умолчанию http://127.0.0.1:8765), проверяет /health
и вызывает существующие эндпоинты /inspect и /clean. Если сервис
требует API-ключ, задайте WATERMARKS_SERVER_API_KEY для клиента.
clean-user-facing-text является
самодостаточным и не нуждается в сервисе.
Автоматическая очистка через хук (детерминированная)
Навык — это инструкция: модель решает, вызывать ли его, и именно модель создаёт метки. Хук выполняется средой исполнения при каждом соответствующем вызове инструмента, без необходимости согласия. Это делает хук детерминированной половиной данного рабочего процесса.
Плагин регистрирует хук PostToolUse на Write|Edit|MultiEdit|NotebookEdit,
который запускает 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 и не перезапускают наблюдатели за файлами.