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で遅延読み込みされます(先行するパスがいずれもヒットしなかった場合にのみ読み込みコストが発生します)。
const sharp = (await import("sharp")).default;
ディスク書き込みには「一時ファイル + アトミックな名前変更」を採用:まずoutput + '.tmp'に書き込み、成功後にターゲット名へrenameします。
renameSync(tempOutput, output);
デフォルトは「別名保存ではなく変換」:同一ディレクトリ・同一ベース名で拡張子のみ変更。--keepが有効かつ拡張子が同じ場合のみ{base}-compressed.{ext}を出力します。
return join(dir, `${base}-compressed${ext}`);
--keepが無効な場合、元画像は{base}_original.{ext}に名前を変更して保持されます。
renameSync(absInput, `${base}_original${ext}`);
ディレクトリモードでは拡張子のホワイトリストに基づいて再帰的にファイルを収集し、1ファイルずつ処理して合計サイズを集計します。
const SUPPORTED_EXTS = [".png", ".jpg", ".jpeg", ".webp", ".gif", ".tiff"];
設定の宣言はSKILL.md層でのみ行われ(EXTEND.mdの3段階検索でヒットした場合に読み込み適用)、スクリプト自体は設定ファイルを読み込みません。
Read, parse, apply settings
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] 自带脚本只有 scripts/main.ts,且仅本地行为 — 扫描“网络请求”0 命中;唯一执行面是 spawn which/sips/cwebp/convert 与动态 import sharp;无 fetch/http 调用。
- [ok] 原图改名副作用 — processFile 中当 !keep 且 absInput !== output 时 renameSync 原图为 *_original.{ext};已在 risks 提示,批量前建议试跑或 -o。
- [ok] sharp 依赖来源(无自带 package.json) — skill 目录确无 package.json;sharp 靠运行环境解析,缺失时仅在前几条 CLI 路径都不命中才会失败。
- [ok] 选项表与脚本参数一致 — SKILL.md 的 7 个 option 与 parseArgs 处理的分支完全对应,默认值 format=webp、quality=80、keep/recursive/json=false。
- [ok] 安全面与档位 — 零网络、零凭证、零配置解析;仅本地文件读写与系统 CLI 调用,判 blue 与前例一致。
- [ok] meta 元数据 — commit dd0bf355…、path skills/canghe-compress-image、license MIT 与 bundle §0 核定值一致。
6結論
346c02cfdb2597bb…