baoyu-compress-image
Compresses images to WebP (default) or PNG with automatic tool selection. Use when user asks to "compress image", "optimize image", "convert to webp", or reduce image file size.
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…