1仕組みと動作原理
コアロジックは「ターゲット形式に応じたコンプレッサーの自動選択」:webp の場合は cwebp を最優先、次に ImageMagick の convert、最後に sharp;非 webp の場合は macOS で直接 sips を使用し、それ以外は convert、最終フォールバックとして sharp を使用。
if (await commandExists("cwebp")) return "cwebp";
可用性の検出は which + child_process.spawn に依存し、圧縮処理自体もシステム CLI を spawn して終了コード/stderr を解析。
const proc = spawn("which", [cmd], { stdio: "pipe" });
sharp は純粋な JS フォールバックとして機能し、動的 import により遅延読み込み(前の 3 つのパスがいずれもヒットしなかった場合にのみロードコストが発生)。
const sharp = (await import("sharp")).default;
ディスク書き込みには「一時ファイル + アトミックな名前変更」を採用:まず output + '.tmp' に書き込み、成功後にターゲット名へ rename することで、処理途中での失敗による不完全なファイルの残存を防止。
renameSync(tempOutput, output);
デフォルトは「別名保存ではなく変換」:同一ディレクトリ・同一ベース名で拡張子のみ変更。--keep が有効かつ同一拡張子の場合のみ {base}-compressed.{ext} を出力。
return join(dir, `${base}-compressed${ext}`);
ディレクトリモードでは拡張子ホワイトリストに基づいて再帰的に収集し、1 ファイルずつ処理して合計サイズを集計。単一ファイルが失敗してもエラーを出力するのみでバッチ全体は中断されない。
const SUPPORTED_EXTS = [".png", ".jpg", ".jpeg", ".webp", ".gif", ".tiff"];
設定の優先度は SKILL.md レイヤーでのみ宣言(EXTEND.md の 3 段階探索、見つからない場合はデフォルトの形式/品質/保持ポリシーを使用)。スクリプト自体は設定ファイルを読み込まない。
If none found, use defaults.
2コア機能
3外部依存関係
| Kind | Dependency / Endpoint |
|---|---|
| cli | sips(macOS 系统自带图像工具,非 webp 时的首选) |
| cli | cwebp(libwebp 官方 CLI,webp 首选) |
| cli | ImageMagick convert |
| cli | which(命令可用性探测) |
| package | sharp(动态 import 的纯 JS 兜底;skill 目录无 package.json,依赖运行环境解析) |
4推奨統制措置と判定根拠
- scripts/: ローカルスクリプトまたはコマンドの実行: scripts/main.ts(bun で実行。which / sips / cwebp / convert を spawn し、sharp を動的 import)
- 本地工作目录: ファイル読み書きとアーティファクト出力: 画像の出力(同一ディレクトリに新拡張子で保存、または -o でパス指定)、一時ファイル <output>.tmp、--keep 無効時の元画像の名前変更 {base}_original.{ext}
5二重目の独立検証
- [ok] 无网络调用 / 无凭证读取 — 全文无 fetch/http/curl/API key/cookie/process.env 命中;唯一子进程是 which 与四个图像 CLI。
- [ok] “默认覆盖原图”的初判修正 — 第一遍曾疑为删除原图;逐行读后确认为 renameSync(absInput, `${base}_original${ext}`)——原图被改名保留,结论已按此更正写进 risks。
- [ok] sharp 依赖可解析性 — skill 目录无 package.json;仓库根 dependencies 含 sharp ^0.34.5。非 workspace 环境需自行安装 sharp 或依赖 cwebp/convert/sips 分支。
- [ok] 四个压缩器的参数与退出码处理 — sips 用 -s format/-s formatOptions/--out;cwebp 用 -q/-o;convert 用 [-quality];sharp 走 pipeline.webp/png/jpeg。均检查 code!==0 并抛错。
- [ok] 批量容错与汇总 — 目录模式下 processFile 抛错被 catch 后仅 console.error 继续;--json 输出 files[] + summary(compressor/totals/ratio)。
- [ok] meta 元数据 — GitHub API:MIT、25926 stars、pushed_at 2026-09-10T15:13:43Z;本地 HEAD 与任务 pin 1567581c26ec… 一致。
6結論
5c0a427092d20497…