| | | || | |_ |/ |/| || |/ |_/ [ __ |/ |_ |/| | | | | |___ |/
||| | | | |_ | \ | | | | | \ | _ ] | \ | | | || / |_ | \
watermarks-remover
CI
Release
Stars
Forks
사용자가 소유한 콘텐츠의 프라이버시와 위생을 위해 텍스트 및 파일에서 **다중 공급업체 AI 출처 표식(multi-vendor AI provenance marks)**을 제거하는 Agent skill + stdlib Python 서비스. 이 스킬은 씬 클라이언트(thin client)입니다: HTTP를 통해 장치를 구동하므로, 에이전트 호스트는 Python이 필요하지 않습니다.
| 레이어 (Layer) | 대상 (Target) | 방법 (How) |
|---|
| A | 보이지 않는 Unicode, 이국적인 공백(exotic spaces), bidi, 태그 문자 (tag chars) | 결정론적 Python 스크립트 (Deterministic Python scripts) |
| ... | | |
| Vendors / ecosystems (클래스 레벨): Claude, Gemini / SynthID-Text, OpenAI 출처 표식(provenance surfaces), open-LLM Kirchenbauer 스타일 (green-list) 및 keyed-Gumbel / EXP (Aaronson) 표식. | | |
최신 릴리스: v0.7.0
Skill 경로: skills/remove-ai-marks/
Service 경로: service/
(마이그레이션: 이전에는 remove-claude-marks였으며, 슬래시 별칭 /remove-claude-marks도 여전히 문서화되어 있습니다)
설치 (agent skill)
이 스킬은 어떤 코드도 포함하지 않습니다. HTTP를 통해 서비스를 호출합니다. 스킬을 설치(마크다운만)하고 서비스를 시작한 다음, WATERMARKS_SERVICE_URL이 http://127.0.0.1:8765가 아닐 경우 설정해야 합니다.
클로드 코드(Claude Code)에서는 번들로 제공되는 플러그인 마켓플레이스를 이용하는 것이 가장 빠르며, 복제 과정 없이 제자리에서 업데이트됩니다. 다른 모든 환경에서는 하나의 설치 프로그램이 지원되는 모든 호스트(Python 3.10 이상 표준 라이브러리, 종속성 없음)를 포괄합니다:
python3 install_skill.py --skill remove-ai-marks --target claude-code
| Host | Target | Lands in |
|---|
| Claude Code (personal) | --target claude-code | ~/.claude/skills/<skill> (CLAUDE_CONFIG_DIR 준수) |
| ... | | |
제공되는 스킬(Shipped skills): remove-ai-marks(전체 기능, 서비스 지원)와 clean-user-facing-text(텍스트 전용, 독립 실행형)입니다. --list를 사용하면 목록을 출력할 수 있습니다. 기존 설치는 --force 옵션을 전달하지 않는 한 유지됩니다. 교체 시에는 먼저 스테이징(staged)되며, 이전 설치본은 고유한 이름의 백업으로 보관됩니다.
--link는 복사 대신 심볼릭 링크(symlink)를 생성하므로, 수정 사항이 실시간으로 반영됩니다. Windows에서는 py install_skill.py ...를 사용하고, macOS/Linux 셸을 위해서는 install-skill.sh 래퍼(wrapper)가 제공됩니다.
무언가를 작성하기 전에, 설치 프로그램은 claude.ai가 업로드하고 Skills API가 강제하는 Agent Skills 패키징 규칙에 따라 스킬을 검증합니다: 오직 사양(spec-only) 프런트매터(name, description, license, compatibility, metadata, allowed-tools), 디렉터리와 일치하는 최대 64자 길이의 소문자 하이픈 이름(name), 최대 1024자의 비어있지 않은 설명(description) 등이 포함됩니다. Cowork 번들은 추가적으로 패커(packager)가 강제하는 30MB 업로드 제한을 충족해야 합니다.
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에서는 python3 대신 py를 사용합니다. 프로젝트를 Codex에서 엽니다. 터미널에서는 /skills를 사용하거나 $를 입력하여 스킬을 선택하고, 데스크톱 앱에서는 프롬프트에서 스킬을 선택하거나 언급합니다. 새로운 스킬이 나타나지 않으면 Codex를 재시작하십시오. 프로젝트 설치는 Codex가 해당 프로젝트 내에서 실행될 때 사용할 수 있습니다.
remove-ai-marks의 경우, 스킬을 사용하기 전에 이 저장소에서 기존 HTTP 서비스를 make serve로 시작해야 합니다 (또는 make가 없는 Windows에서는 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는 독립적으로 작동하므로 해당 서비스가 필요하지 않습니다.
훅을 통한 자동 정리 (결정론적)
스킬은 지침입니다. 모델이 이를 호출할지 여부를 결정하며, 마크를 생성하는 주체 역시 모델입니다. **훅(hook)**은 하네스(harness)에 의해 일치하는 모든 도구 호출마다 실행되며, 협조가 필요하지 않습니다. 이것이 훅을 이 워크플로우의 결정론적(deterministic) 절반으로 만듭니다.
이 플러그인은 Write|Edit|MultiEdit|NotebookEdit에 대한 PostToolUse 훅을 등록하며, 에이전트가 방금 작성한 파일을 대상으로 service/scripts/hook_written_file.py를 실행합니다. 기본적으로 확인(check-by-default)하는 pre-commit 관행과 일치하는 두 가지 모드가 있습니다:
| 모드 | 동작 방식 |
|---|
check (기본값) | 출처 마크(provenance marks)를 보고하고 파일을 그대로 둡니다. 발견된 내용은 모델로 전달됩니다 (종료 코드 2), 따라서 모델이 이를 정리할 것을 제안할 수 있습니다. |
clean | 마크를 제자리에서 제거한 후, 디스크의 파일이 변경되었음을 모델에게 알립니다. |
플러그인 설정에서 모드를 지정하거나(/plugin manage의 훅 모드에서 훅이 CLAUDE_PLUGIN_OPTION_HOOK_MODE로 읽음), 환경 변수에서 WATERMARKS_HOOK_MODE=clean을 사용할 수 있습니다. 훅 명령어는 의도적으로 ${user_config.hook_mode}를 보간하지 않습니다. Claude Code는 사용자가 /plugin manage를 열어 설정한 옵션을 참조하는 훅 실행을 거부하며, 선언된 default 값으로는 이를 충족할 수 없습니다. 따라서 이를 보간하면 신규 설치 시 훅이 조용히 작동하지 않게 됩니다. 감지 기능은 audit_lib의 scan_file / is_actionable 기능을 재사용하므로, 훅, pre-commit 게이트, 그리고 CI SARIF export는 무엇을 실행 가능(actionable)한 것으로 간주하는지에 대해 일치합니다. 클리닝(cleaning)은 clean_file.py로 작업을 위임하기 때문에 클리닝 로직이 중복되지 않습니다. clean 모드는 형제 임시 파일에 쓰기하며 실제 차이가 있을 때만 스왑하므로, 이미 깨끗한 상태였던 파일들은 mtime을 유지하고 파일 워처를 재트리거하지 않습니다.
플러그인 없이 사용하려면, 직접 ~/.claude/settings.json (또는 프로젝트의 .claude/settings.json)에 연결해야 합니다:
{
"hooks": {
"PostToolUse": [
...
Windows에서는 python3을 py로 대체하십시오.
훅이 할 수 없는 것. 어떤 훅도 사용자가 읽기 전에 어시스턴트의 채팅 메시지를 재작성할 수는 없습니다. Claude Code의 Stop 훅은 last_assistant_message를 읽기 전용으로 받으며, 최종 응답에 대한 pre-send 필터가 존재하지 않습니다. 이는 이 프로젝트에서 Cursor 규칙을 위해 이미 문서화된 제한 사항과 같습니다. 따라서 결정론적 보장은 에이전트가 작성하는 파일과 Git으로 들어가는 모든 것에 대한 pre-commit 게이트를 포함합니다. 채팅 기록에만 존재하는 텍스트는 여전히 모델-지침 기반의 스킬 워크플로우에 의존하며, 따라서 최선 노력(best-effort)입니다.
Claude Code 플러그인 (마켓플레이스)
이 저장소는 또한 Claude Code 플러그인이자 단일 플러그인 마켓플레이스(.claude-plugin/)이므로, 두 스킬 모두 클론이나 스크립트 없이 두 개의 명령어로 설치 및 업데이트할 수 있습니다.
/plugin marketplace add guillaumemeyer/watermarks-remover
/plugin install watermarks-remover@watermarks-remover
이후 스킬들은 네임스페이스(namespaced)로 로드됩니다: /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 대신 경로(path)를 전달하여 로컬 체크아웃을 할 때도 작동합니다.
관리자: make plugin-validate는 두 매니페스트(manifests) 모두에 대해 claude plugin validate . --strict를 실행하며, tests/test_plugin_manifest.py는 CLI가 필요 없이 동일한 파일을 커버합니다.
Claude Code
python3 install_skill.py --skill remove-ai-marks --target claude-code
...
Claude Code는 재시작 없이 개인 및 프로젝트 스킬을 가져옵니다. /skills를 통해 로드된 목록을 확인할 수 있습니다. /remove-ai-marks로 호출하거나 “AI 워터마크 / C2PA / Claude 마크 / SynthID급 텍스트 제거”를 요청할 수 있습니다. 프로젝트 설치는 cloud sessions가 읽어들이는 방식이기도 한데, 이는 저장소를 클론(clone)하고 그 안의 .claude/skills/ 폴더를 로드하기 때문입니다.
Cowork (및 claude.ai, cloud sessions, routines)
Cowork 세션은 사용자의 기기에 있는 ~/.claude/skills를 읽지 않습니다. 대신, 세션이 시작될 때 동기화(synced)되는 claude.ai 계정에 활성화된 스킬들을 로드합니다. 따라서 번들(bundle)을 업로드하여 설치해야 합니다:
python3 install_skill.py --skill remove-ai-marks --target cowork
그런 다음, Claude 데스크톱 앱에서 Customize → Skills → Add를 열고 zip 파일을 업로드합니다 (claude.ai의 동일한 스킬 설정도 작동합니다). 이 번들은 재현 가능하며(reproducible), 루트에 SKILL.md가 있는 단일 최상위 remove-ai-marks/ 디렉터리를 포함하고 있으며, 이는 업로드가 기대하는 레이아웃입니다.
서비스 도달 가능성(Service reachability)은 로컬 설치 환경보다 여기서 더 중요합니다. 이 스킬은 얇은 HTTP 클라이언트이므로, 세션이 WATERMARKS_SERVICE_URL에 도달할 수 있어야 합니다.
사용자 컴퓨터에서 로컬로 실행되는 Cowork 세션의 경우 로컬 make serve를 사용하지만, 클라우드 세션 및 루틴은 원격으로 실행되며 해당 서비스 URL(그리고 여기에 설정된 WATERMARKS_SERVER_API_KEY)에 도달할 수 있어야 합니다. 만약 서비스가 전혀 없는 스킬을 원한다면, 대신 clean-user-facing-text를 업로드하세요. 이 스킬은 텍스트 전용이며 자체 스크립트를 가지고 있습니다:
python3 install_skill.py --skill clean-user-facing-text --target cowork
Grok
mkdir -p .grok/skills
ln -sfn "$(pwd)/skills/remove-ai-marks" .grok/skills/remove-ai-marks
...
선택적 텍스트 전용 스킬
skills/clean-user-facing-text는 승인된 원고, 문서 및 웹 카피를 위한 자체 포함(self-contained) 스킬입니다. 이미지, C2PA, 서비스 및 외부 모델 도구는 제외하며, 서비스를 호출하는 대신 자체적으로 패키징된 Layer A 스크립트를 실행합니다.
python3 install_skill.py --skill clean-user-facing-text --target claude-code
python3 install_skill.py --skill clean-user-facing-text --target cursor
스킬 호출은 모델 선택에 따라 달라집니다. Cursor에서 이 워크플로우를 명시적으로 채택하는 프로젝트는 다음의 선택적 규칙도 복사할 수 있습니다:
mkdir -p /path/to/project/.cursor/rules
cp integrations/cursor/clean-user-facing-text.mdc \
/path/to/project/.cursor/rules/clean-user-facing-text.mdc
모든 프로젝트의 경우, 대신 Cursor **사용자 규칙(User Rules)**에 동일한 지침을 입력하세요. 규칙은 일관성을 높이지만 여전히 모델 지침으로 남아있으며, Cursor는 최종 채팅 응답에 대한 결정론적(deterministic) 사전 전송 필터(pre-send filter)를 노출하지 않습니다.
서비스 시작하기
가장 빠른 경로는 로컬 HTTP 서버입니다 (Python 3.10+ 표준 라이브러리만 사용 가능 — 의존성 없음, Docker 불필요):
make serve
python3 service/scripts/server.py --host 127.0.0.1 --port 8765
Windows (Docker 없음)
도커 없이 Windows 로그인 시 서비스를 자동 시작하는 방법은 docs/windows-autostart.md를 참조하세요.
전체 인프라(코어 + 선택적 하네스/무거운 백엔드)는 아래의 Docker / compose를 참조하세요.
선택적 시스템 도구(존재 시 자동 사용됨 — 코어 Docker 이미지에 사전 설치됨):
| Tool | 역할 (Role) |
|---|
c2patool | C2PA 매니페스트 검사 (Inspect C2PA manifests) |
| ... | |
| 코어 스크립트는 Python 3.10 이상의 표준 라이브러리(stdlib)만 필요합니다. Layer B 모델 호출은 선택 사항입니다. | |
빠른 사용법 (스크립트)
SCRIPTS=service/scripts
...
텍스트 도구는 바이너리 입력을 거부합니다.