1仕組みと動作原理
本バッチの中でも珍しい「実コードを伴う」スキルです。SKILL.mdの核となる指示は1つだけで、SKILL.mdが存在するディレクトリで `python3 -m scripts <絶対パス>` を実行することであり、すべての圧縮ロジックは同梱されたPythonパッケージ内に実装されています。
The compression scripts live in `scripts/` (adjacent to this SKILL.md). If the path is not immediately available, search for `scripts/__main__.py` next to this SKILL.md. 2. From the directory containing this SKILL.md, run: python3 -m scripts <absolute_filepath>
圧縮処理はファイル本文をClaudeに送信して行われます。Anthropic SDK(ANTHROPIC_API_KEYが必要)を優先し、利用できない場合はローカルの `claude --print` CLIサブプロセス(デスクトップのユーザー認証を使用)にフォールバックします。
api_key = os.environ.get("ANTHROPIC_API_KEY") if api_key: try: import anthropic client = anthropic.Anthropic(api_key=api_key, timeout=CLAUDE_CALL_TIMEOUT_SECONDS) msg = client.messages.create( model=os.environ.get("CAVEMAN_MODEL", "claude-sonnet-4-5"),
コードブロックはモデル送信前に解読不能なマーカーへ置換され、復元時に「各マーカーが厳密に1度だけ出現する」ことを検証します。違反した場合は書き込み全体を拒絶します。これは圧縮によるコマンド破損を防ぐ中核メカニズムです。
def restore_code_blocks(text: str, blocks: List[Tuple[str, str]]) -> str: """Restore markers exactly; fail closed if model removed, copied, or altered one."""
書き込み完了後も処理は終わりません。構造バリデータ(validate.py)が見出し、コードブロック、URL、パス、箇条書き、インラインコードを原文と圧縮稿で比較検証し、失敗した場合はエラー箇所のリストをClaudeに渡して「指摘されたエラーのみ修正」を最大2回再試行します。
validate_headings(orig, comp, result) validate_code_blocks(orig, comp, result) validate_urls(orig, comp, result) validate_paths(orig, comp, result) validate_bullets(orig, comp, result) validate_inline_codes(orig, comp, result)
書き込みは「事前バックアップ、読み戻し検証、アトミック置換、権限ビットおよび改行スタイルの保持」という一連のチェーンで行われ、過去のデータ消失障害の修正を反映した実装となっています。
write_bytes_atomic(backup_path, original_raw) if backup_path.read_bytes() != original_raw: print(f"❌ Backup write verification failed: {backup_path}")
厳格な入力ゲートが設けられています。500KBを超えるファイル、認証情報やキーを疑わせるファイル名、空ファイルは拒絶され、既存バックアップが存在する場合は上書き防止のため中断されます。
MAX_FILE_SIZE = 500_000 # 500KB
並行処理制御にはOSネイティブのファイルロック(POSIX fcntl.flock / Windows msvcrt.locking)が用いられ、ロックキーはバックアップパスのsha256先頭16文字です。ロック非対応のファイルシステムでは警告を出して非協調実行にフォールバックし、ロックディレクトリやロックファイル内のシンボリックリンクは拒絶されます。
return _state_base_dir("locks") / f"{digest}.lock"
非膨張不変条件:frontmatterを除いた本文ベースで比較し、圧縮結果は原文より厳密に短くなければならず、満たさない場合は元ファイルを変更せず処理を中止します。この規則は修復パスにも適用されます。
if not _is_smaller_than_body(compressed_body, body): print(" Original file is untouched (no backup created).") return False
圧縮対象はdetect.pyの拡張子ホワイトリスト/ブラックリストと、拡張子のないファイルに対する内容スニッフィングによって判定されます。.original.md バックアップが二重に圧縮されることはありません。
COMPRESSIBLE_EXTENSIONS = {".md", ".mdc", ".txt", ".markdown", ".rst", ".typ", ".typst", ".tex"}
2コア機能
3外部依存関係
| Kind | Dependency / Endpoint |
|---|---|
| api | Anthropic Messages API(经 anthropic Python SDK) |
| cli | claude CLI(Claude Code / Claude desktop 认证) |
| package | anthropic(Python SDK,可选) |
| package | tiktoken(可选,仅 benchmark.py) |
| cli | python3(运行时不带第三方依赖;仅标准库 contextlib/errno/hashlib/os/re/shutil/stat/subprocess/tempfile/time/pathlib,Windows 用 msvcrt、POSIX 用 fcntl) |
4推奨統制措置と判定根拠
- scripts/: ローカルスクリプトまたはコマンドの実行: python3 -m scripts <absolute_filepath>(SKILL.mdで指定された唯一の実行手段)
- 网络端点: 外部ネットワークアクセスの宣言: anthropic SDK(client.messages.create)経由でのAnthropic APIアクセス(ANTHROPIC_API_KEY 設定時のみ)
- 本地工作目录: ファイルI/Oおよび成果物出力: 対象ファイル自体(圧縮後の内容によるインプレース上書き)
5二重目の独立検証
- [ok] SKILL.md 提到的脚本路径与运行方式 — `python3 -m scripts <file>` 成立:scripts/__main__.py 导入 cli.main 并调用;cli.py 校验参数个数与文件存在/类型后执行 compress_file。SKILL.md 提示的 'search for scripts/__main__.py' 与实际文件名一致。
- [ok] Anthropic 为唯一网络出口 — 六个脚本中无 urllib/requests/socket/curl/wget 命中;网络仅经 anthropic SDK client.messages.create 或 claude CLI 子进程。SDK 端点在源码中未硬编码,故 external_deps.endpoint 留空(不臆测)。
- [ok] 「subprocess 无 shell 注入」这一说法 — subprocess.run([claude_bin, "--print", "--setting-sources", "", "--strict-mcp-config"], input=prompt, ...) 为列表参数 + stdin,无 shell=True;SECURITY.md 亦声明 'Does not use shell=True or string interpolation in subprocess calls'。
- [ok] 「备份在源目录之外」是否属实(SKILL.md / Purpose 段) — backup_dir_for() 返回 _state_base_dir("backups")/filepath.parent.name,其中 _state_base_dir 为 $XDG_DATA_HOME/caveman-compress 或 ~/.local/share/caveman-compress(Windows 用 %LOCALAPPDATA%),确实不在源文件旁;注释给出理由(skill auto-loader 会二次读入 .original.md)。
- [ok] 敏感文件拒绝覆盖面的自评(第一遍称「覆盖 .env/credentials/密钥」) — 逐条核对 SENSITIVE_BASENAME_REGEX 与 SENSITIVE_PATH_COMPONENTS/SENSITIVE_NAME_TOKENS:.env*、.netrc、credentials*、secret(s)*、password(s)*、id_rsa/dsa/ecdsa/ed25519(.pub)、authorized_keys、known_hosts、*.pem|key|p12|pfx|crt|cer|jks|keystore|asc|gpg;路径组件含 .ssh/.aws/.gnupg/.kube/.docker 与 credential(s)/secret(s);名字 token 含 secret/credential/password/passwd/apikey/accesskey/token/privatekey。属启发式 denylist(可被改名绕过),已在 analysis 注记,未夸大。
- [ok] 固定大小上限 500KB — compress_file 内 MAX_FILE_SIZE = 500_000 且在任何 API 调用之前检查;SECURITY.md 亦声明 'Files larger than 500KB are rejected before any API call is made'。
- [ok] 「校验不过则原文件不动」 — 压缩候选先写 <file>.caveman-staged 并对其跑 validate;只有 is_valid 才 _write_target(filepath, ...),两次重试用尽后 unlink 暂存与备份并打印 'Failed after retries: original left untouched'。
- [ok] SKILL.md 压缩规则 vs 脚本提示词是否一致(有无文档吹牛) — SKILL.md 的 Remove/Preserve/Compress 规则与 build_compress_prompt 的 STRICT RULES 同向(保代码块、保行内代码、保 URL、保标题、保路径命令),脚本还把「不要给整体套一层 ```markdown 围栏」写进提示词,并有 strip_llm_wrapper 兜底剥离。无夸大。
6結論
52e12dda463f9c55…