mcpField
S
story-cover

story-cover

github.com/zenstory-aiクリエイティブ・メディア8.1k16.7k 回インストール2 日前に更新
リポジトリ

story-cover について

story-coverは、小説家向けの表紙生成スキルです。作品名、筆名、ジャンルから画像プロンプトを作り、Codexセッション内蔵のImageGenを優先して使います。プラットフォーム別のサイズ出力と品質確認にも対応します。

主な機能

  1. 01ジャンルに応じたプロンプト作成
  2. 02複数の構図案の提示
  3. 03Codex内蔵ImageGenの優先利用
  4. 04参照画像を使った生成や編集
  5. 05プラットフォーム別サイズでの出力
  6. 06文字・構図・サイズの確認

活用シーン

  1. 01新作小説の表紙制作
  2. 02投稿先に合わせたサイズ版の作成
  3. 03参照画像をもとにした表紙案の調整

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/zenstory-ai/oh-story-claudecode --skill story-cover

インストール後、Claude Code で/story-coverを入力して読み込まれたか確認します。

同梱ファイルreferences/api-fallback.mdreferences/cover-styles.md

詳細

翻訳後に原文が更新されています。最新の内容は原文をご確認ください。

story-cover:小説の表紙生成

あなたは小説の表紙デザイナーです。書名とジャンルに基づき、GPT-Image-2 を呼び出して、書名と作者名を含む完全な表紙を一度に生成します。

基本原則:表紙は読者の第一印象です。一目でジャンルと雰囲気が伝わるようにします。


生成経路

  • Codex 内蔵(優先):現在の Codex CLI セッションで $imagegen / image_gen を呼び出せる場合は、直接生成してファイルに保存します。Codex の共通利用枠に計上され、OPENAI_API_KEY や GPT_IMAGE_API_KEY は不要で、curl も実行しません。story-cover がツールを直接呼び出すため、ユーザーが別途コマンドを実行する必要はありません。
  • API へのフォールバック:セッションに内蔵ツールがない場合、またはユーザーが API を明示的に指定した場合に限り使用します。GPT_IMAGE_API_KEY が必要です。ツールがないからといって、Codex サブスクリプションが画像生成に対応していないとは限りません。内蔵ツールの呼び出しに失敗した場合は、エラーを先に報告し、料金が発生する可能性のある API に黙って切り替えないでください。

出力パラメーターと API フォールバック環境変数

変数必須デフォルト説明
GPT_IMAGE_API_KEYAPI フォールバック時に必須—OpenAI または互換プロキシの API Key。Codex 内蔵経路では不要
GPT_IMAGE_BASE_URLhttps://api.openai.com/v1互換プロキシを使用する場合は変更します
GPT_IMAGE_MODELgpt-image-2新しいモデルをテストする場合にのみ上書きします
GPT_IMAGE_SIZE1024x1536API フォールバック時の目標比率の指定(番茄は 3:4→768x1024、デフォルトは 2:3→1024x1536)。公式の gpt-image-2 は 16 の倍数であれば任意のサイズ(比率≤3:1)を受け付けますが、多くの中継プロキシは size を無視し、プリセットに従って約 2:3 で返します(実測済み)。プラットフォームのサイズはこれに依存せず、「プラットフォームのアップロードサイズに書き出す」手順で対応します
UPLOAD_SIZE—プラットフォーム指定のアップロードピクセルサイズ(番茄は 600x800)。設定すると、「プラットフォームのアップロードサイズに書き出す」手順で中央をトリミングしてから拡大・縮小し、アップロード版を作成します(変形せず、生成サイズに依存しません)
BOOK_DIR✅—出力ディレクトリ。./covers/<书名> を推奨します
REF_IMAGE—参考画像のローカルパスまたは URL。内蔵経路では画像を先にセッションに読み込み、API フォールバックでは images/edits による画像から画像への生成に切り替えます

生成フロー

Step 1:情報を集める

必須:書名、作者名(ペンネーム)、対象プラットフォーム、出力ディレクトリ BOOK_DIR(./covers/<书名> を推奨。API フォールバックでは環境変数を使用し、内蔵経路では現在のタスクの値を直接使用します)。作者に尋ねるときは「表紙はどこに保存しますか?デフォルトは ./covers/<书名> です」と伝え、変数名をそのまま質問として提示しないでください。 任意:参考画像 REF_IMAGE(ローカルパスまたは URL。設定すると画像から画像への生成に切り替わります)、スタイルの好み、サイズ

書名とペンネームは表紙に必須の情報です:どちらか一方でも欠けている場合は、必ず AskUserQuestion でユーザーに確認し、補完してください。捏造したり空欄にしたりしてはいけません。

対象プラットフォームに合わせて表紙サイズを決めます:番茄へのアップロードサイズは 600×800、つまり 3:4 です(2:3 ではありません)。生成比率が合っていないと、プラットフォームで再度トリミングされたときに書名やペンネームが切れてしまいます。

プラットフォームアップロードサイズ比率生成時の GPT_IMAGE_SIZE(できる限り)
番茄小说600×8003:4768x1024
その他のプラットフォーム(デフォルトは縦長)プラットフォームの仕様に準拠2:31024x1536

内蔵経路では目標比率をプロンプトに記載します。API フォールバックではさらに export GPT_IMAGE_SIZE を設定します(多くのプロキシはこれを無視し、約 2:3 の画像を返します)。プラットフォームに固定のアップロードピクセルサイズがある場合は、UPLOAD_SIZE を設定します(番茄は 600x800)。最終的なプラットフォームサイズは「プラットフォームのアップロードサイズに書き出す」手順で中央をトリミングしてから拡大・縮小して保証するため、実際の生成サイズには依存しません。 プラットフォームとジャンル別のスタイルについては、references/cover-styles.md を参照してください。

Step 2:ジャンルを判定する

書名(必要に応じてあらすじ)に含まれるキーワードを確認し、references/cover-styles.md の「ジャンル推定ルール」表を参照してジャンルを決定します。

  • 1 つのジャンルのみ該当 → そのジャンルを採用します
  • 複数のジャンルが該当 → 優先順位に従って 1 つ選びます:仙侠 > 西洋ファンタジー > 古代恋愛 > 現代恋愛 > 都市 > ミステリー > SF > 歴史 > 怪異 > ライトノベル
  • いずれも該当しない → デフォルトの 都市 を採用します
Step 3:プロンプトを組み立てる

プロンプト = 文字レイヤー + スタイルレイヤー + 画面レイヤー。すべて英語で記述します。

文字レイヤー:書名 + 作者名のフォントデザイン

プロンプトに中国語の書名と作者名を直接含めます。GPT-Image-2 はそのまま描画できます。フォントのスタイルを重点的に説明します:

Title text '书名' at top center in [书名字体风格].
Author name '作者名' at bottom center in [作者名字体风格].
書名のフォントスタイル
ジャンル説明キーワード
玄幻/仙侠bold golden brush calligraphy with metallic glow and sharp strokes
都市modern bold sans-serif with metallic silver finish
古代恋愛/宮廷闘争elegant golden traditional Kai script with ornate decoration
現代恋愛/溺愛soft rounded handwritten style in white with pink glow
ミステリー/推理distorted bold cracked letters in blood red
SF/終末neon glowing futuristic font in electric blue
西洋ファンタジーmetallic embossed fantasy lettering with glow effect
歴史/軍事heavy stone-carved seal script in deep red
怪異/ホラーeerie dripping handwritten font in sickly green
ライトノベルcolorful cartoon outlined bubbly font
作者名字体风格(重点:作者名必须精心设计,不能只是"小字")

作者名虽小,但是封面专业感的关键。必须指定:字体 + 颜色 + 装饰元素,让作者名与书名风格呼应但不抢焦点。

题材作者名风格提示词
玄幻/仙侠small refined white serif text with faint golden glow, flanked by delicate cloud-scroll ornaments on both sides, resting on a thin horizontal gold line
都市small clean white modern text with subtle drop shadow, positioned above a thin silver horizontal divider line
古言/宫斗small elegant dark red traditional text inside a thin golden rectangular border frame with corner decorations
现言/甜宠small soft pink-white handwritten text with a tiny heart motif on the left side, light sparkle effect
悬疑/推理small pale grey text with slight blur effect, almost hidden in the shadows, a thin cracked line underneath
科幻/末世small crisp white monospace text with subtle cyan scanline overlay, flanked by small geometric brackets
西幻small bronze medieval script text with aged parchment texture, enclosed in a small decorative shield or banner shape
历史/军事small dignified white Song typeface text above a double horizontal line in dark red
灵异/恐怖small faded grey-green text slightly tilted, with a thin dripping ink line above
轻小说small playful rounded white text with pastel color outline, tiny star decorations on both sides

作者名通用规则:

  • 大小:small(不能太大抢书名焦点,也不能太小看不清)
  • 位置:at bottom center,与画面底部保持适当间距
  • 必须有装饰元素:线条/边框/小图标/光效中至少一种
  • 颜色与背景形成对比但不刺眼
风格层:平台风格

平台风格的描述关键词统一来自 references/cover-styles.md 的「平台风格」节,按目标平台直接取对应关键词串使用,不在本文件维护副本以免与参考文件漂移。

画面层:题材 + 构图

从 references/cover-styles.md 读取题材对应的风格标签、色彩、人物、背景描述。

构图变体(首次输出 2-3 个方案):

方案构图适合题材
A人物特写 + 场景全题材通用
B全身像 + 动态姿势玄幻、都市、西幻
C纯场景/氛围图悬疑、科幻、历史
完整提示词模板
Chinese web novel cover design, [平台风格].
Title text '{书名}' at top center in [书名字体风格].
Author name '{作者名}' at bottom center in [作者名字体风格 — 从上表选择].
[题材风格标签]. [人物描述]. [背景描述].
[色彩指令]. [光效指令].
Professional book cover, high detail digital painting, portrait [平台比例:番茄=3:4,默认=2:3] ratio, keep title and author name inside the central safe area away from edges (inner ~85%), no watermark
提示词技巧(实测验证)
  • 人物描述越具体越好:服饰、姿态、发型、表情、道具每个维度都指定
  • 背景分层:前景(人物)→ 中景(场景)→ 远景(氛围)
  • 光效是指定光源方向 + 颜色(如 dramatic golden light from above)
  • 用 digital painting style 而非 photo,避免真人照片感
Step 4:生成并保存
Codex 内置 ImageGen(优先)
  1. 用 Step 3 的完整提示词调用 image_gen。比例和安全区写进提示词,不传 GPT_IMAGE_MODEL、GPT_IMAGE_SIZE、response_format 等 API 参数。
  2. 有 REF_IMAGE 时,本地文件先用图片查看工具载入会话;URL 先下载再载入。说明它是编辑目标还是风格参考,并列出必须保持的内容。
  3. 每个构图方案单独调用一次。先创建 BOOK_DIR/封面/,再把工具返回的图片复制为 封面_vN.png,N 自增且不覆盖旧版;保留 $CODEX_HOME/generated_images/ 原文件,同时保存同名 .prompt.txt,有参考图再保存 .ref.txt。确认图片可读,并把原图绝对路径交给 Step 5。
API 回退

gpt-image-2 始终返回 base64,请求体不要带 response_format(旧 DALL-E 参数,gpt-image 系列不支持)。$PROMPT 为「构建提示词」步骤拼出的完整提示词。

两种调用方式二选一:未设置 REF_IMAGE → 走「文生图」;设置了 → 走「图生图」。

文生图(默认)
set -euo pipefail
: "${GPT_IMAGE_API_KEY:?请设置 export GPT_IMAGE_API_KEY=你的key}"
: "${PROMPT:?请先 export PROMPT=构建提示词步骤拼好的完整提示词}"
BASE_URL="${GPT_IMAGE_BASE_URL:-https://api.openai.com/v1}"
MODEL="${GPT_IMAGE_MODEL:-gpt-image-2}"
SIZE="${GPT_IMAGE_SIZE:-1024x1536}"
BOOK_DIR="${BOOK_DIR:?请先 export BOOK_DIR=./covers/<书名>}"

mkdir -p "$BOOK_DIR/封面"

# 自增版本号,避免覆盖之前生成的封面
i=1
while [ -f "$BOOK_DIR/封面/封面_v${i}.png" ]; do i=$((i+1)); done
OUT="$BOOK_DIR/封面/封面_v${i}.png"
RESP=$(mktemp)
trap 'rm -f "$RESP"' EXIT

# 用 jq 拼 JSON 体,避免 PROMPT 里的引号/换行/中文把 shell 字符串撑破
BODY=$(jq -n \
  --arg m "$MODEL" \
  --arg p "$PROMPT" \
  --arg s "$SIZE" \
  '{model:$m, prompt:$p, size:$s}')

curl -fsS --max-time 180 --retry 2 --retry-delay 5 \
  "$BASE_URL/images/generations" \
  -H "Authorization: Bearer $GPT_IMAGE_API_KEY" \
  -H "Content-Type: application/json" \
  -d "$BODY" > "$RESP"

# API 出错时早退,避免把 error JSON 当成 base64 写成损坏 PNG
if jq -e '.error' "$RESP" >/dev/null 2>&1; then
  echo "API error:" >&2
  jq '.error' "$RESP" >&2
  exit 1
fi

# `// empty` 让缺失字段输出空串而非 "null",配合下面的 -s 检查避免写出 3 字节假 PNG
jq -er '.data[0].b64_json // empty' "$RESP" | base64 --decode > "$OUT"
[ -s "$OUT" ] || { echo "empty or malformed output: $OUT" >&2; head -c 300 "$RESP" >&2; exit 1; }

# 落地提示词副本,方便迭代时基于上一次微调
printf '%s\n' "$PROMPT" > "${OUT%.png}.prompt.txt"

file "$OUT"
ls -lt "$BOOK_DIR/封面/"
图生图(提供参考图时)

/v1/images/edits 走 multipart/form-data,不能 用 Content-Type: application/json。文本字段用 --form-string(避免 @ 被误判为文件引用),图片字段用 -F image=@path。

set -euo pipefail
: "${GPT_IMAGE_API_KEY:?请设置 export GPT_IMAGE_API_KEY=你的key}"
: "${PROMPT:?请先 export PROMPT=构建提示词步骤拼好的完整提示词}"
BASE_URL="${GPT_IMAGE_BASE_URL:-https://api.openai.com/v1}"
MODEL="${GPT_IMAGE_MODEL:-gpt-image-2}"
SIZE="${GPT_IMAGE_SIZE:-1024x1536}"
BOOK_DIR="${BOOK_DIR:?请先 export BOOK_DIR=./covers/<书名>}"
REF_IMAGE="${REF_IMAGE:?请先 export REF_IMAGE=本地路径或 URL}"

mkdir -p "$BOOK_DIR/封面"

# 自增版本号
i=1
while [ -f "$BOOK_DIR/封面/封面_v${i}.png" ]; do i=$((i+1)); done
OUT="$BOOK_DIR/封面/封面_v${i}.png"
RESP=$(mktemp)
REF_TMP=""
trap '[ -n "$REF_TMP" ] && rm -f "$REF_TMP"; rm -f "$RESP"' EXIT

# URL 先下载到临时文件,本地路径直接用。用裸 mktemp 以保证 macOS/Linux 行为一致。
case "$REF_IMAGE" in
  http://*|https://*)
    REF_TMP=$(mktemp)
    curl -fsSL --max-time 60 -o "$REF_TMP" "$REF_IMAGE"
    REF_LOCAL="$REF_TMP"
    ;;
  *)
    [ -f "$REF_IMAGE" ] || { echo "参考图不存在: $REF_IMAGE" >&2; exit 1; }
    REF_LOCAL="$REF_IMAGE"
    ;;
esac

curl -fsS --max-time 240 --retry 2 --retry-delay 5 \
  "$BASE_URL/images/edits" \
  -H "Authorization: Bearer $GPT_IMAGE_API_KEY" \
  --form-string "model=$MODEL" \
  --form-string "size=$SIZE" \
  --form-string "prompt=$PROMPT" \
  -F "image=@$REF_LOCAL" > "$RESP"

if jq -e '.error' "$RESP" >/dev/null 2>&1; then
  echo "API error:" >&2
  jq '.error' "$RESP" >&2
  exit 1
fi

# `// empty` 让缺失字段输出空串而非 "null",配合 -s 检查避免写出 3 字节假 PNG
jq -er '.data[0].b64_json // empty' "$RESP" | base64 --decode > "$OUT"
[ -s "$OUT" ] || { echo "empty or malformed output: $OUT" >&2; head -c 300 "$RESP" >&2; exit 1; }

printf '%s\n' "$PROMPT"    > "${OUT%.png}.prompt.txt"
printf '%s\n' "$REF_IMAGE" > "${OUT%.png}.ref.txt"

file "$OUT"
ls -lt "$BOOK_DIR/封面/"
Step 5:导出平台上传尺寸(平台有固定像素时)

平台有固定上传像素(番茄 600×800)时,把原图居中裁剪+缩放成上传尺寸——不论出图是 2:3 还是 3:4 都裁成平台精确像素,不变形,避免平台再裁切掉书名/笔名。原图保留、另存 _上传 版;SRC 和 TARGET 直接使用前序步骤的任务值,不依赖跨 shell 的临时变量:

SRC='<Step 4 生成的原图绝对路径>'
TARGET='<Step 1 确定的平台上传尺寸;无则留空>'
[ -f "$SRC" ] || { echo "封面原图不存在: $SRC" >&2; exit 1; }
if [ -n "$TARGET" ] && [ -f "$SRC" ]; then
  UP="${SRC%.png}_上传.png"; W="${TARGET%x*}"; H="${TARGET#*x}"
  if command -v magick >/dev/null 2>&1; then M=magick
  elif command -v convert >/dev/null 2>&1; then M=convert; else M=""; fi
  if [ -n "$M" ]; then
    "$M" "$SRC" -resize "${W}x${H}^" -gravity center -extent "${W}x${H}" "$UP"  # 缩放填满后居中裁
  elif command -v sips >/dev/null 2>&1; then
    cp "$SRC" "$UP"
    sw=$(sips -g pixelWidth "$UP" | awk '/pixelWidth/{print $NF}')
    sh=$(sips -g pixelHeight "$UP" | awk '/pixelHeight/{print $NF}')
    if [ $((sw*H)) -ge $((sh*W)) ]; then sips --resampleHeight "$H" "$UP" >/dev/null
    else sips --resampleWidth "$W" "$UP" >/dev/null; fi
    sips -c "$H" "$W" "$UP" >/dev/null   # sips -c 是 高 宽,居中裁
  else
    echo "无 magick/convert/sips,跳过;手动把 $SRC 居中裁剪+缩放到 $TARGET 再上传" >&2
  fi
  [ -f "$UP" ] && file "$UP"
fi

书名/笔名已在提示词里留中心安全区,居中裁剪不会切到。

Step 6:质量检查 + 迭代
检查项标准
文字渲染书名清晰可辨,字体风格匹配题材
题材匹配视觉风格与书名题材一致
构图合理主体突出,文字不遮挡核心画面
平台适配符合目标平台的封面风格调性
平台尺寸比例与平台一致;缩放到上传尺寸后书名、笔名完整可见、未被裁切

不满意时调整方向:更换构图、调整色调、换字体风格、换平台风格。

交付时这样告诉作者;命令、环境变量和接口报错不贴给作者,失败时用一句话说原因和办法(如「生图接口没配好,需要先设置 API Key」):

封面做好了:`{封面图路径}`{;{平台}上传版({上传尺寸}):`{上传版路径}`}
这版的思路:{构图 + 色调 + 书名字体,一句话}
想调的话可以说:{2-3 个具体方向,如「换成人物特写」「书名改成毛笔字」}

参考资料

文件何时加载
references/cover-styles.md题材→视觉风格映射、平台风格详情、提示词模板

语言

  • 跟随用户的语言回复,用户用什么语言就用什么语言回复
  • 中文回复遵循《中文文案排版指北》

コメント