ワークフロー&基本ツール · JimLiu/baoyu-skills

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.

L4 高権限 · 段階的認可と監査V1 コミット固定コマンド実行ファイル書き込みDual-pass Audit
Author JimLiuGitHub JimLiu/baoyu-skills ↗Stars 25926License MIT(仓库根 LICENSE,Copyright (c) 2026 Jim Liu;GitHub API license.spdx_id=MIT)Commit 1567581c26
管理レベルは Skill の能力と推奨統制措置を示すものであり、品質や安全性の認証、利用可否の判定ではありません。使用の可否はユーザーおよび管理者が決定します。Agent 環境によって制約が異なるため、自動保護を仮定しないでください。第三者製 Skill の著作権は原著作者に帰属し、利用リスクは利用者が負います。

1仕組みと動作原理

コアロジックは「ターゲット形式に応じたコンプレッサーの自動選択」:webp の場合は cwebp を最優先、次に ImageMagick の convert、最後に sharp;非 webp の場合は macOS で直接 sips を使用し、それ以外は convert、最終フォールバックとして sharp を使用。

skills/baoyu-compress-image/scripts/main.ts
if (await commandExists("cwebp")) return "cwebp";
判定基準は npm 依存リストではなく実行プラットフォームと PATH 上のコマンドであるため、node_modules がなくても実行可能(cwebp/convert/sips のいずれかがあれば動作)。

可用性の検出は which + child_process.spawn に依存し、圧縮処理自体もシステム CLI を spawn して終了コード/stderr を解析。

skills/baoyu-compress-image/scripts/main.ts
const proc = spawn("which", [cmd], { stdio: "pipe" });
runCmd が stderr を一括収集し、0 以外の終了時に 'sips failed/cwebp failed/convert failed' をスロー。エラー情報は外部ツールに由来。

sharp は純粋な JS フォールバックとして機能し、動的 import により遅延読み込み(前の 3 つのパスがいずれもヒットしなかった場合にのみロードコストが発生)。

skills/baoyu-compress-image/scripts/main.ts
const sharp = (await import("sharp")).default;
3 つの形式はそれぞれ pipeline.webp/png/jpeg({ quality }) を経由。sharp は欠落時に実行失敗の原因となり得る唯一の依存関係。

ディスク書き込みには「一時ファイル + アトミックな名前変更」を採用:まず output + '.tmp' に書き込み、成功後にターゲット名へ rename することで、処理途中での失敗による不完全なファイルの残存を防止。

skills/baoyu-compress-image/scripts/main.ts
renameSync(tempOutput, output);
同一関数内で --keep が無効かつ入力と出力の名前が異なる場合、新規ファイルの書き込み前に元画像が {base}_original{ext} に rename され、デフォルトで元画像のコピーが保持される(名前のみ変更)。

デフォルトは「別名保存ではなく変換」:同一ディレクトリ・同一ベース名で拡張子のみ変更。--keep が有効かつ同一拡張子の場合のみ {base}-compressed.{ext} を出力。

skills/baoyu-compress-image/scripts/main.ts
return join(dir, `${base}-compressed${ext}`);
-o/--output を併用することで任意のターゲットパスを指定可能。その場合、元画像の名前変更は行われない(absInput !== output の場合のみ名前変更)。

ディレクトリモードでは拡張子ホワイトリストに基づいて再帰的に収集し、1 ファイルずつ処理して合計サイズを集計。単一ファイルが失敗してもエラーを出力するのみでバッチ全体は中断されない。

skills/baoyu-compress-image/scripts/main.ts
const SUPPORTED_EXTS = [".png", ".jpg", ".jpeg", ".webp", ".gif", ".tiff"];
集計出力は 'Processed N files: 12MB → 4.1MB (66% reduction)' の形式となり、--json 指定時は files[] + summary を出力。

設定の優先度は SKILL.md レイヤーでのみ宣言(EXTEND.md の 3 段階探索、見つからない場合はデフォルトの形式/品質/保持ポリシーを使用)。スクリプト自体は設定ファイルを読み込まない。

skills/baoyu-compress-image/SKILL.md
If none found, use defaults.
そのため、純粋な CLI での使用と agent 経由での動作は一致し、agent が設定に応じてデフォルト引数を補完する点のみが異なる。

2コア機能

01圧縮バックエンドの自動選択(sips / cwebp / ImageMagick / sharp の 4 段階フォールバック)
02webp/png/jpeg への形式変換 + 品質パラメータ(0-100、デフォルト 80)
03単一ファイルおよびディレクトリの一括処理(-r 再帰、拡張子ホワイトリスト)
04元画像の保持ポリシー(-k は -compressed 命名を使用、デフォルトは元画像を *_original に名前変更)
05アトミックなディスク書き込み(.tmp 経由で rename)、失敗時にも不完全なファイルが残らない
06ファイルサイズ比較レポート + --json 構造化出力
07EXTEND.md 設定(デフォルト形式/品質/元画像保持)と 3 段階のパス探索

3外部依存関係

KindDependency / Endpoint
clisips(macOS 系统自带图像工具,非 webp 时的首选)
clicwebp(libwebp 官方 CLI,webp 首选)
cliImageMagick convert
cliwhich(命令可用性探测)
packagesharp(动态 import 的纯 JS 兜底;skill 目录无 package.json,依赖运行环境解析)

4推奨統制措置と判定根拠

安全運用のための推奨統制措置
Agent 向け
段階的・都度認可、サンドボックス推奨
管理者向け
承認フロー、ロールバック可能、全履歴監査
判定根拠(ファイルパスと抜粋)
  • scripts/: ローカルスクリプトまたはコマンドの実行: scripts/main.ts(bun で実行。which / sips / cwebp / convert を spawn し、sharp を動的 import)
  • 本地工作目录: ファイル読み書きとアーティファクト出力: 画像の出力(同一ディレクトリに新拡張子で保存、または -o でパス指定)、一時ファイル <output>.tmp、--keep 無効時の元画像の名前変更 {base}_original.{ext}
監査ノート: (a) すべての動作がローカルで完結:検出用の 'which' の spawn、sips/cwebp/convert による圧縮呼び出し、sharp のフォールバック、ローカル画像の読み込みとローカルファイルの書き込みのみで、ネットワークエンドポイントへのアクセス、クレデンシャル読み取り、設定ファイル解析は一切なし(EXTEND.md は agent のみが読み取り)。(b) 注意すべきファイルの副作用:--keep が無効な場合、スクリプトは renameSync で元画像を {base}_original.{ext} にリネームしてから新規ファイルを書き込むため、バッチディレクトリモードでは影響範囲が大きい。小規模でテストするか、-o で明示的に出力を指定することを推奨。(c) 実行環境に imagemagick/cwebp/sips/sharp のいずれかが存在することに依存。CLI も sharp もない場合は失敗する。先行事例との比較:canvas-design や writing-fragments などのローカル読み書き系スキルと同様に blue 判定。

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結論

  • 環境への適応性:インストール済みのツール(cwebp/ImageMagick/sips/sharp)を自動利用するため、sharp を必須とする構成に比べて初動で成功しやすい。
  • 安全なディスク書き込み:.tmp + rename によるアトミック置換により、処理失敗時でも中途半端なファイルが残らない。
  • 手軽なバッチ処理:ディレクトリの -r 再帰 + ホワイトリストフィルタリング + 全体集計により、ブログやドキュメントサイトの一括軽量化に最適。
  • ネットワーク・クレデンシャル不要:ローカルのファイル権限のみで動作し、外部通信が制限された環境にも適している。
  • --json 出力によりパイプラインへの統合が容易。
  • 最適な用途: Web サイト/ブログで大きな画像を一括で WebP に変換したり成果物を軽量化したりする自動化シナリオや、エージェントワークフローに組み込んで「生成後の画像圧縮」ステップとして利用する用途(他の baoyu スキルからの呼び出しなど)に適している。
    不向きな用途: EXIF/ICC の精密な保持制御や lossless/AVIF などの高度なエンコーディングが必要なシナリオには不向き。元ファイル名に対する厳格なバリデーションがあり、リネームが許可されていないパイプラインには適さない。
    Install Agent-Ready
    ① Verified Mirror 2026-09-15
    Option A · Direct DownloadDownload baoyu-compress-image.tar.gz
    sha256: 5c0a427092d20497…
    Option B · Copy Guide for Agent
    install.json
    Agent はこの JSON ガイドから自動的にダウンロードして検証します。
    ② Upstream GitHub
    GitHub Repo ↗
    Pinned to commit 1567581c26.