_ _ _ ____ ___ ____ ____ _ _ ____ ____ _ _ ____ ____ ____ _ _ ____ _ _ ____ ____
| | | |__| | |___ |__/ |\/| |__| |__/ |_/ [__ __ |__/ |___ |\/| | | | | |___ |__/
|_|_| | | | |___ | \ | | | | | \ | \_ ___] | \ |___ | | |__| \/ |___ | \
Agent 技能 + 标准库 Python 服务,用于从文本和文件中剥离多厂商 AI 溯源标记——面向你拥有的内容的隐私与卫生需求。该技能是一个轻量客户端:它通过 HTTP 驱动底层机制,因此 agent 主机无需 Python。
| 层级 | 目标 | 方式 |
|---|---|---|
| A | 不可见 Unicode、异体空格、双向文本、标签字符 | 确定性 Python 脚本 |
| B | 统计式(token 采样)文本水印 | Agent 重写 + 可选的 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)并启动服务,然后如果服务地址不是 http://127.0.0.1:8765,则设置 WATERMARKS_SERVICE_URL。
在 Claude Code 中,最快的途径是内置的 插件市场——无需克隆,且可原地更新。在其他环境中,一个安装器即可覆盖所有受支持的主机 (Python 3.10+ 标准库,无依赖):```bash python3 install_skill.py --skill remove-ai-marks --target claude-code
| Host | Target | Lands in |
| --- | --- | --- |
| 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、云会话、routines | `--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 shell 提供的。
在写入任何内容之前,安装程序会根据
[Agent Skills](https://agentskills.io) 打包规则验证该技能,这些规则是 claude.ai 上传
和 Skills API 所强制执行的:仅规范 frontmatter(`name`、`description`、
`license`、`compatibility`、`metadata`、`allowed-tools`),一个与目录匹配的、最多 64 个字符的
小写连字符 `name`,一个非空的
`description`,最多 1024 个字符。Cowork 包还必须
符合 30 MB 的上传限制,打包程序会强制执行这一点。
### 通过 hook 自动清理(确定性)
技能是一种指令:模型决定是否调用它,而
模型正是产生标记的东西。**hook** 由 harness
在每次匹配的工具调用时执行,不需要配合。这使得 hook 成为此工作流中
确定性的那一半。
该插件在 `Write|Edit|MultiEdit|NotebookEdit` 上注册一个 `PostToolUse` hook,
它会针对 agent 刚刚写入的文件运行 [`service/scripts/hook_written_file.py`](https://github.com/guillaumemeyer/watermarks-remover/blob/main/service/scripts/hook_written_file.py)。
有两种模式,与默认检查的 pre-commit 约定一致:
| Mode | Behaviour |
| --- | --- |
| `check`(默认) | 报告来源标记,不修改文件。发现结果会发送给模型(exit 2),因此它可以提议清理它们。 |
| `clean` | 就地剥离标记,然后告诉模型磁盘上的文件已更改。 |
从插件的设置中设置模式(`/plugin manage` 中的 **Hook mode**,
hook 会将其读取为 `CLAUDE_PLUGIN_OPTION_HOOK_MODE`),或者使用
环境中的 `WATERMARKS_HOOK_MODE=clean`。hook 命令有意
**不**插值 `${user_config.hook_mode}`:Claude Code 拒绝运行
引用了用户从未打开 `/plugin manage` 设置过的选项的 hook——声明的 `default` 并不能满足它——因此
插值它意味着 hook 在全新安装时会静默地永不运行。检测复用 `audit_lib` 的
`scan_file` / `is_actionable`,因此 hook、pre-commit 门禁和 CI
SARIF 导出对什么算作可操作项保持一致;清理会调用
`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。
钩子无法做到的事。 没有任何钩子能在你阅读之前重写助手的聊天消息。Claude Code 的 Stop 钩子以只读方式接收 last_assistant_message,并且对于最终响应没有发送前过滤器——这与本项目已针对 Cursor 规则记录的限制相同。因此,确定性保证覆盖代理写入的文件,以及针对任何即将进入 git 的内容的预提交门禁。仅存在于聊天记录中的文本仍然依赖于技能工作流,而该工作流基于模型指令,因此是尽力而为的。
该仓库同时也是一个 Claude Code 插件和一个单插件市场(.claude-plugin/),因此两个技能都可以通过两条命令安装和更新,无需克隆或脚本:```
/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` 会拉取后续版本。通过 CLI 使用 `claude plugin marketplace add …` / `claude plugin install …` 也能达到同样效果,从本地检出安装时,传入路径而非 `owner/repo` 即可。
维护者:`make plugin-validate` 会对两个清单运行 `claude plugin validate . --strict`;`tests/test_plugin_manifest.py` 无需 CLI 即可覆盖相同的文件。
### Claude Code```bash
# Personal — available in all your projects
python3 install_skill.py --skill remove-ai-marks --target claude-code
# or: make install-claude-code-skill
# Project — commit .claude/skills/ to share it with the repo
python3 install_skill.py --skill remove-ai-marks --target claude-project \
--project-dir /path/to/project
# or: make install-claude-project-skill PROJECT=/path/to/project
Claude Code 无需重启即可加载个人和项目技能;/skills
会列出已加载的技能。使用 /remove-ai-marks 调用,或要求“去除 AI
水印 / C2PA / Claude 标记 / SynthID 类文本”。项目安装也是
cloud sessions
所读取的内容,因为它们会克隆仓库并加载其 .claude/skills/。
Cowork 会话不会读取你机器上的 ~/.claude/skills —— 它们加载
为你的 claude.ai 账户启用的技能,并在会话启动时同步。
因此,在那里通过上传一个 bundle 来安装:```bash
python3 install_skill.py --skill remove-ai-marks --target cowork
然后,在 Claude Desktop 应用中,打开 **Customize → Skills → Add** 并上传
该 zip 文件(claude.ai 上的相同技能设置也同样适用)。该捆绑包是可复现的,包含一个单一的顶层 `remove-ai-marks/` 目录,
其根目录下有 `SKILL.md`,这正是上传所期望的布局。
服务可达性在这里比在本地安装中更为重要:该技能是一个
轻量级 HTTP 客户端,因此会话必须能够访问 `WATERMARKS_SERVICE_URL`。
在你的机器上本地运行的 Cowork 会话可以访问本地的 `make serve`;
云会话和例程在远程运行,需要一个可从那里访问的服务 URL
(并在其上设置 `WATERMARKS_SERVER_API_KEY`)。如果你想要一个完全
不依赖服务的技能,请改为上传 `clean-user-facing-text` —— 它仅处理文本,
并自带其脚本:```bash
python3 install_skill.py --skill clean-user-facing-text --target cowork
mkdir -p .grok/skills ln -sfn "$(pwd)/skills/remove-ai-marks" .grok/skills/remove-ai-marks
mkdir -p ~/.grok/skills ln -sfn "$(pwd)/skills/remove-ai-marks" ~/.grok/skills/remove-ai-marks
### 可选的纯文本技能