1仕組みと動作原理
本スキルを実行する実体はBun/TypeScript CLI(scripts/main.ts)であり、agentはSKILL.mdに従ってnpx -y bunで起動します。引数の解析、設定のマージ、プロバイダーの選択、および結果の保存はすべてこのエントリポイントで行われます。
npx -y bun ${SKILL_DIR}/scripts/main.ts --prompt "A cat" --image cat.png
プロバイダーの自動選択:明示的な--providerが優先されます。--refがある場合はGoogle→OpenAI→Cangheの順序で選択され、--refがない場合は環境に存在するキーのうち最初のものが採用されます(複数キー存在時はGoogleが優先)。
const hasGoogle = !!(process.env.GOOGLE_API_KEY || process.env.GEMINI_API_KEY);
4つのバックエンドは個別のモジュールとしてProviderModuleインターフェース(getDefaultModel / generateImage)を統一していますが、プロトコルはそれぞれ異なります:OpenAIはimages/generationsおよびedits、GoogleはGemini generateContentまたはImagen predict、DashScopeはTongyi Wanxiangエンドポイント、CangheはOpenAI互換のchat/completionsを使用します。
const res = await fetch(`${getBaseUrl()}/chat/completions`, {
参照画像のサポートはバックエンドごとに異なります:Googleマルチモーダルは参照画像をbase64として読み込みinlineDataに格納、OpenAIは/images/editsフォームを使用、Cangheはimage_urlで送信(ローカルファイルはdata URIに変換、http URLは直接送信)。DashScopeとImagenは非対応として明示的にエラーをスローします。
const { data, mimeType } = await readImageAsBase64(refPath);
設定の階層優先順位は CLI args > EXTEND.md > 環境変数 > cwd/.canghe-skills/.env > ~/.canghe-skills/.env に固定されており、main.tsはdotenvに依存せずEXTEND.mdのYAML front matterと.envのキー・バリューを独自に解析します。
**Load Priority**: CLI args > EXTEND.md > env vars > `<cwd>/.canghe-skills/.env` > `~/.canghe-skills/.env`
生成結果はユーザーが指定した--imageパスにバイナリとして書き込まれ(拡張子がない場合は自動で.pngを付与)、書き込み前にディレクトリを再帰的に作成します。生成失敗時の自動リトライは1回のみで、「参照画像非対応/キー不足」などのエラーはリトライされません。
await writeFile(outputPath, imageData);
バッチと並列は2つの異なるモードです:デフォルトでは1枚ずつ順番に生成されます。並列生成はユーザーが明示的に要求した場合のみ有効になり、ホストの複数のバックグラウンドサブエージェント(推奨4、上限8)によって実行されます。スクリプト自体には並列ロジックは含まれていません。
**Parallel Generation**: Only use when user explicitly requests parallel/concurrent generation.
2コア機能
3外部依存関係
| Kind | Dependency / Endpoint |
|---|---|
| cli | bun(经 npx -y bun 运行 TS 入口,会联网获取包) |
| api | OpenAI Images API |
| api | Google Generative Language API(Gemini / Imagen) |
| api | DashScope(阿里通义万象) |
| api | Canghe 第三方网关 |
| package | Node 内建模块 node:fs/promises、node:path、node:os(经 Bun 运行) |
4推奨統制措置と判定根拠
- scripts/: ローカルスクリプトまたはコマンドの実行: npx -y bun ${SKILL_DIR}/scripts/main.ts(SKILL.mdに従ってエージェントが実行する唯一のエントリポイントCLI)
- 网络端点: 外部ネットワークアクセスの宣言: POST https://api.openai.com/v1/images/generations(openai.ts)
- 本地工作目录: ファイルの読み書きおよび成果物の出力: ユーザーが--imageで指定したパスへの画像ファイル(拡張子がない場合は.pngを補完。main.tsがmkdir -pを実行後にwriteFile)
5二重目の独立検証
- [ok] 执行入口是否唯一且真实存在 — SKILL.md 的调用示例与 main.ts 的 printUsage 一致(npx -y bun scripts/main.ts --prompt ... --image ...),main.ts 末尾 main().catch 会 process.exit(1),证明它是 CLI;目录仅 8 个档(SKILL.md + preferences-schema.md + main.ts + 4 个 provider + types.ts),无其它可执行文件。
- [ok] 四家 provider 端点与凭证读取点 — openai.ts→api.openai.com/v1 + OPENAI_API_KEY;google.ts→generativelanguage.googleapis.com + GOOGLE_API_KEY/GEMINI_API_KEY;dashscope.ts→dashscope.aliyuncs.com + DASHSCOPE_API_KEY;canghe.ts→api.canghe.ai/v1 + CANGHE_API_KEY。均可用对应 *_BASE_URL 覆盖。
- [ok] 是否漏掉网络外发 — 全目录除 providers/*.ts 的 fetch 外无网络能力:main.ts 只做 IO 与编排,types.ts / preferences-schema.md 无网络代码;未见 socket/child_process/exec/urllib。
- [ok] TLS 是否被降级 — 四家后端都用 Node/Bun 原生 fetch(默认校验证书),未见 ssl.CERT_NONE / rejectUnauthorized=false / --no-verify,因此不触发红档。
- [discrepancy] 「并行生成」宣称是否有代码支撑 — SKILL.md 的 Parallel Generation 段描述用宿主 Task 子代理 run_in_background=true 并发并给并发建议,但 scripts/main.ts 只有单次 --n 的串行生成,未实现任何并发;该能力完全依赖 agent 编排层,脚本不提供。
- [ok] 默认 provider 与质量口径 — SKILL.md 写 default provider google、quality 2k;detectProvider 多 key 时返回 available[0](google 排第一),main.ts 对空 quality 置 '2k',与文档一致。
- [ok] 参考图 provider 限制 — SKILL.md 称 --ref 受 Google 多模态 / OpenAI edits / Canghe 支持;google.ts 对 Imagen、openai.ts 对 dall-e、main.ts 对 dashscope+ref 均抛错,与文档相符。
6結論
6d47e36b6c02f891…