byjimliu· 68 skills
Generates article cover images with 5 dimensions (type, palette, rendering, text, mood) combining 11 color palettes and 7 rendering styles. Supports cinematic (2.35:1), widescreen (16:9), and square (1:1) aspects. Use when user asks to "generate cover image", "create article cover", or "make cover".
$npx -y skills add jimliu/baoyu-skills --skill baoyu-cover-imageInstalls into the current project.
Run `npx skills use "https://github.com/jimliu/baoyu-skills" --skill "jimliu/baoyu-skills/baoyu-cover-image"` and follow the generated skill instructions now. Read its complete output, redirecting it to a temporary file first if necessary. Resolve relative paths from the supporting-files directory it provides.
Use the skills in "https://github.com/jimliu/baoyu-skills" that are relevant to the current task. Run `npx skills add "https://github.com/jimliu/baoyu-skills"` and select the relevant skills, then follow their instructions.
| 1 | # Cover Image Generator |
| 2 | |
| 3 | Generate elegant cover images for articles with 5-dimensional customization. |
| 4 | |
| 5 | ## User Input Tools |
| 6 | |
| 7 | When this skill prompts the user, follow this tool-selection rule (priority order): |
| 8 | |
| 9 | 1. **Prefer built-in user-input tools** exposed by the current agent runtime — e.g., `AskUserQuestion`, `request_user_input`, `clarify`, `ask_user`, or any equivalent. |
| 10 | 2. **Fallback**: if no such tool exists, emit a numbered plain-text message and ask the user to reply with the chosen number/answer for each question. |
| 11 | 3. **Batching**: if the tool supports multiple questions per call, combine all applicable questions into a single call; if only single-question, ask them one at a time in priority order. |
| 12 | |
| 13 | Concrete `AskUserQuestion` references below are examples — substitute the local equivalent in other runtimes. |
| 14 | |
| 15 | ## Image Generation Tools |
| 16 | |
| 17 | When this skill needs to render an image, resolve the backend in this order: |
| 18 | |
| 19 | 1. **Current-request override** — if the user names a specific backend in the current message, use it. |
| 20 | 2. **Saved preference** — if `EXTEND.md` sets `preferred_image_backend` to a backend available right now, use it. |
| 21 | 3. **Auto-select** (when the preference is `auto`, unset, or the pinned backend isn't available): |
| 22 | - **Codex (`imagegen`)** — first, inspect your available-skills / tool inventory. If a skill named `imagegen` is listed, you are running inside Codex and MUST use it: invoke via the `Skill` tool with `skill: "imagegen"`, passing the saved prompt file's content (plus output path and aspect ratio per Codex `imagegen`'s own args). Codex `imagegen` is the official raster backend in that runtime and outranks any non-native skill (e.g., `baoyu-image-gen`) unless the user has explicitly pinned a different `preferred_image_backend`. |
| 23 | - **Codex via `codex exec` (`codex-imagegen`)** — if the current runtime exposes no native `imagegen` skill but the `codex` CLI is on `PATH` with an active `codex login`, route through `baoyu-image-gen --provider codex-cli` (preferred), or — if baoyu-image-gen is unavailable — invoke the bundled wrapper directly. Details, parameters, and the runtime-discovery procedure live in [references/codex-imagegen.md](references/codex-imagegen.md) — load that file only when this branch is selected. |
| 24 | - **Cursor (`GenerateImage`)** — if the runtime exposes a native `GenerateImage` tool, you are running inside Cursor and it outranks any non-native skill the same way Codex `imagegen` does. Two hard caveats: (a) it has no aspect-ratio parameter — state the target aspect ratio / dimensions explicitly in the prompt text passed as `description`; (b) it does not accept an output directory — it saves to a tool-managed location, so after generation copy/move the file to the skill's expected output path (e.g., `outputs/.../NN-xxx.png`). Reference images go in `reference_image_paths`. |
| 25 | - **Other runtime-native tools** — if the runtime exposes a different native image tool (e.g., Hermes `image_generate`), use it the same way. |
| 26 | - Otherwise, if exactly one non-native backend is installed (e.g., `baoyu-image-gen`), use it. |
| 27 | - Otherwise (multiple non-native backends with no runtime-native tool), ask the user once — batch with any other initial questions. |
| 28 | 4. **If none are available**, tell the user and ask how to proceed. |
| 29 | |
| 30 | **⛔ Never substitute SVG, HTML, canvas, or other code-based rendering for raster image generation.** Codex `imagegen`'s own description says it should be used "when the output should be a bitmap asset rather than repo-native code or vector." If you cannot resolve a raster backend via step 3, fall through to step 4 and ask the user — do **not** silently emit SVG, write inline `<svg>` markup, or produce HTML/CSS art as a substitute. This applies even if the article/section seems "diagram-like": the consumer skill calling this rule has already decided that a raster image is what it needs. |
| 31 | |
| 32 | **⛔ Never repair rendered text by painting over a generated bitmap.** Do not use ImageMagick, Pillow, Canvas, SVG, HTML/CSS, OCR scripts, or any other programmatic overlay to cover, rewrite, erase, stroke, or replace title/subtitle text inside an already generated cover image. If text is wrong or unclear, regenerate from a corrected prompt, switch to a lower-text or no-title variant, or ask the user which imperfect candidate to keep. |
| 33 | |
| 34 | Setting `preferred_image_backend: ask` forces the step-3 prompt every run regardless of available backends. Users change the pinned backend via the `## Changing Preferences` section below. |
| 35 | |
| 36 | **Prompt file requirement (hard)**: write each image's full, final prompt to a standalone file under `prompts/` (naming: `NN-{type}-[slug].md`) BEFORE invoking any backend. The backend receives the prompt file (or its content); the file is the reproducibility record and lets you switch backends without regenerating prompts. |
| 37 | |
| 38 | Concrete tool names (`imagegen`, `GenerateImage`, `image_generate`, `baoyu-image-gen`) above are examples — substitute the local equivalents under the same rule. |
| 39 | |
| 40 | ## Confirmation Policy |
| 41 | |
| 42 | Default behavior: **confirm before generation**. |
| 43 | |
| 44 | - Treat explicit skill invocation, a file path, matched keywords/presets, `EXTEND.md` defaults, and any documented auto-selection as **recommendation inputs only**. None of them authorizes skipping confirmation. |
| 45 | - Do **not** start Step 3 or Step 4 until the user confirms the dimensions / aspect / language / backend choices. |
| 46 | - Skip confirmation only when the current request explicitly says to do so, for example: `--quick`, "直接生成", "不用确认", "跳过确认", "按默认出图", or equivalent wording. `quick_mode: true` in `EXTEND.md` counts as a standing explicit opt-out — set it only when you want every run to skip Step 2. |
| 47 | - If confirmation is skipped explicitly, state the assumed dimensions / aspect / language / backend in the next user-facing update before generating. |
| 48 | |
| 49 | ## Options |
| 50 | |
| 51 | | Option | Description | |
| 52 | |--------|-------------| |
| 53 | | `--type <name>` | hero, conceptual, typography, metaphor, scene, minimal | |
| 54 | | `--palette <name>` | warm, elegant, cool, dark, earth, vivid, pastel, mono, retro, duotone, macaron | |
| 55 | | `--rendering <name>` | flat-vector, hand-drawn, painterly, digital, pixel, chalk, screen-print | |
| 56 | | `--style <name>` | Preset shorthand (see [Style Presets](references/style-presets.md)) | |
| 57 | | `--text <level>` | none, title-only, title-subtitle, text-rich | |
| 58 | | `--mood <level>` | subtle, balanced, bold | |
| 59 | | `--font <name>` | clean, handwritten, serif, display | |
| 60 | | `--aspect <ratio>` | 16:9 (default), 2.35:1, 4:3, 3:2, 1:1, 3:4 | |
| 61 | | `--lang <code>` | Title language (en, zh, ja, etc.) | |
| 62 | | `--no-title` | Alias for `--text none` | |
| 63 | | `--quick` | Skip confirmation, use auto-selection | |
| 64 | | `--ref <files...>` | Reference images for style/composition guidance | |
| 65 | |
| 66 | ## Five Dimensions |
| 67 | |
| 68 | | Dimension | Values | Default | |
| 69 | |-----------|--------|---------| |
| 70 | | **Type** | hero, conceptual, typography, metaphor, scene, minimal | auto | |
| 71 | | **Palette** | warm, elegant, cool, dark, earth, vivid, pastel, mono, retro, duotone, macaron | auto | |
| 72 | | **Rendering** | flat-vector, hand-drawn, painterly, digital, pixel, chalk, screen-print | auto | |
| 73 | | **Text** | none, title-only, title-subtitle, text-rich | title-only | |
| 74 | | **Mood** | subtle, balanced, bold | balanced | |
| 75 | | **Font** | clean, handwritten, serif, display | clean | |
| 76 | |
| 77 | Auto-selection rules: [references/auto-selection.md](references/auto-selection.md) |
| 78 | |
| 79 | ## Galleries |
| 80 | |
| 81 | **Types**: hero, conceptual, typography, metaphor, scene, minimal |
| 82 | → Details: [references/types.md](references/types.md) |
| 83 | |
| 84 | **Palettes**: warm, elegant, cool, dark, earth, vivid, pastel, mono, retro, duotone, macaron |
| 85 | → Details: [references/palettes/](references/palettes/) |
| 86 | |
| 87 | **Renderings**: flat-vector, hand-drawn, painterly, digital, pixel, chalk, screen-print |
| 88 | → Details: [references/renderings/](references/renderings/) |
| 89 | |
| 90 | **Text Levels**: none (pure visual) | title-only (default) | title-subtitle | text-rich (with tags) |
| 91 | → Details: [references/dimensions/text.md](references/dimensions/text.md) |
| 92 | |
| 93 | **Mood Levels**: subtle (low contrast) | balanced (default) | bold (high contrast) |
| 94 | → Details: [references/dimensions/mood.md](references/dimensions/mood.md) |
| 95 | |
| 96 | **Fonts**: clean (sans-serif) | handwritten | serif | display (bold decorative) |
| 97 | → Details: [references/dimensions/font.md](references/dimensions/font.md) |
| 98 | |
| 99 | ## File Structure |
| 100 | |
| 101 | Output directory per `default_output_dir` preference: |
| 102 | - `same-dir`: `{article-dir}/` |
| 103 | - `imgs-subdir`: `{article-dir}/imgs/` |
| 104 | - `independent` (default): `cover-image/{topic-slug}/` |
| 105 | |
| 106 | ``` |
| 107 | <output-dir>/ |
| 108 | ├── source-{slug}.{ext} # Source files |
| 109 | ├── refs/ # Reference images (if provided) |
| 110 | │ ├── ref-01-{slug}.{ext} |
| 111 | │ └── ref-01-{slug}.md # Description file |
| 112 | ├── prompts/cover.md # Generation prompt |
| 113 | └── cover.png # Output image |
| 114 | ``` |
| 115 | |
| 116 | **Slug**: 2-4 words, kebab-case. Conflict: append `-YYYYMMDD-HHMMSS` |
| 117 | |
| 118 | ## Workflow |
| 119 | |
| 120 | ### Progress Checklist |
| 121 | |
| 122 | ``` |
| 123 | Cover Image Progress: |
| 124 | - [ ] Step 0: Check preferences (EXTEND.md) ⛔ BLOCKING |
| 125 | - [ ] Step 1: Analyze content + save refs + determine output dir |
| 126 | - [ ] Step 2: Confirm options (6 dimensions) ⚠️ unless --quick |
| 127 | - [ ] Step 3: Create prompt |
| 128 | - [ ] Step 4: Generate image |
| 129 | - [ ] Step 5: Completion report |
| 130 | ``` |
| 131 | |
| 132 | ### Flow |
| 133 | |
| 134 | ``` |
| 135 | Input → [Step 0: Preferences] ─┬─ Found → Continue |
| 136 | └─ Not found → First-Time Setup ⛔ BLOCKING → Save EXTEND.md → Continue |
| 137 | ↓ |
| 138 | Analyze + Save Refs → [Output Dir] → [Confirm: 6 Dimensions] → Prompt → Generate → Complete |
| 139 | ↓ |
| 140 | (skip if --quick or all specified) |
| 141 | ``` |
| 142 | |
| 143 | ### Step 0: Load Preferences ⛔ BLOCKING |
| 144 | |
| 145 | Check EXTEND.md in priority order — the first one found wins: |
| 146 | |
| 147 | | Priority | Path | Scope | |
| 148 | |----------|------|-------| |
| 149 | | 1 | `.baoyu-skills/baoyu-cover-image/EXTEND.md` | Project | |
| 150 | | 2 | `${XDG_CONFIG_HOME:-$HOME/.config}/baoyu-skills/baoyu-cover-image/EXTEND.md` | XDG | |
| 151 | | 3 | `$HOME/.baoyu-skills/baoyu-cover-image/EXTEND.md` | User home | |
| 152 | |
| 153 | | Result | Action | |
| 154 | |--------|--------| |
| 155 | | Found | Load, display summary → Continue | |
| 156 | | Not found | ⛔ Run first-time setup ([references/config/first-time-setup.md](references/config/first-time-setup.md)) → Save → Continue | |
| 157 | |
| 158 | **CRITICAL**: If not found, complete setup BEFORE any other steps or questions. |
| 159 | |
| 160 | ### Step 1: Analyze Content |
| 161 | |
| 162 | 1. **Save reference images** (if provided) → [references/workflow/reference-images.md](references/workflow/reference-images.md) |
| 163 | 2. **Save source content** (if pasted, save to `source.md`) |
| 164 | 3. **Analyze content**: topic, tone, keywords, visual metaphors |
| 165 | 4. **Deep analyze references** ⚠️: Extract specific, concrete elements (see reference-images.md) |
| 166 | 5. **Detect language**: Compare source, user input, EXTEND.md preference |
| 167 | 6. **Determine output directory**: Per File Structure rules |
| 168 | |
| 169 | **⚠️ People in Reference Images:** |
| 170 | |
| 171 | If reference images contain **people** who should appear in the cover: |
| 172 | |
| 173 | - **Model supports `--ref`** (default): Copy image to `refs/`, pass via `--ref` at generation. No description file needed — the model sees the face directly. |
| 174 | - **Model does NOT support `--ref`** (Jimeng, Seedream 3.0): Create `refs/ref-NN-{slug}.md` with per-character description (hair, glasses, skin tone, clothing). Embed as MUST/REQUIRED instructions in prompt text. |
| 175 | |
| 176 | See [reference-images.md](references/workflow/reference-images.md) for full decision table. |
| 177 | |
| 178 | ### Step 2: Confirm Options ⚠️ |
| 179 | |
| 180 | **Hard gate**: this step is mandatory per the [Confirmation Policy](#confirmation-policy) — Steps 3–4 cannot start until the user confirms here (or explicitly opts out with `--quick` / `quick_mode: true` / equivalent wording in the current request). |
| 181 | |
| 182 | **MUST use `AskUserQuestion` tool** to present options as interactive selection — NOT plain text tables. Present up to 4 questions in a single `AskUserQuestion` call (Type, Palette, Rendering, Font + Settings). Each question shows the recommended option first with reason, followed by alternatives. |
| 183 | |
| 184 | Full confirmation flow and question format: [references/workflow/confirm-options.md](references/workflow/confirm-options.md) |
| 185 | |
| 186 | | Condition | Skipped | Still Asked | |
| 187 | |-----------|---------|-------------| |
| 188 | | `--quick` or `quick_mode: true` | 6 dimensions | Aspect ratio (unless `--aspect`) | |
| 189 | | All 6 + `--aspect` specified | All | None | |
| 190 | |
| 191 | ### Step 3: Create Prompt |
| 192 | |
| 193 | Save to `prompts/cover.md`. Template: [references/workflow/prompt-template.md](references/workflow/prompt-template.md) |
| 194 | |
| 195 | **CRITICAL - References in Frontmatter**: |
| 196 | - Files saved to `refs/` → Add to frontmatter `references` list |
| 197 | - Style extracted verbally (no file) → Omit `references`, describe in body |
| 198 | - Before writing → Verify: `test -f refs/ref-NN-{slug}.{ext}` |
| 199 | |
| 200 | **Reference elements in body** MUST be detailed, prefixed with "MUST"/"REQUIRED", with integration approach. |
| 201 | |
| 202 | ### Step 4: Generate Image |
| 203 | |
| 204 | 1. **Backup existing** `cover.png` if regenerating |
| 205 | 2. **Select backend** via the `## Image Generation Tools` rule at the top: use whatever is available; if multiple, ask the user once. Do this once per session before any generation. |
| 206 | 3. **Write the full final prompt** to `prompts/01-cover-[slug].md` (hard requirement) BEFORE invoking the backend. |
| 207 | 4. **Process references** from prompt frontmatter: |
| 208 | - `direct` usage → pass via `--ref` (use ref-capable backend) |
| 209 | - `style`/`palette` → extract traits, append to prompt |
| 210 | 5. **Generate**: Call the chosen backend with the prompt file, output path, aspect ratio. |
| 211 | - **`codex-imagegen`**: see [references/codex-imagegen.md](references/codex-imagegen.md) for the invocation contract (preferred `baoyu-image-gen --provider codex-cli` path, runtime wrapper discovery, parameter notes, stdout schema, batch semantics). |
| 212 | - **Codex `imagegen` (native)** or other runtime-native tools / `baoyu-image-gen` skill: per the rule in `## Image Generation Tools` above. |
| 213 | 6. On failure: auto-retry once |
| 214 | |
| 215 | ### Step 5: Completion Report |
| 216 | |
| 217 | ``` |
| 218 | Cover Generated! |
| 219 | |
| 220 | Topic: [topic] |
| 221 | Type: [type] | Palette: [palette] | Rendering: [rendering] |
| 222 | Text: [text] | Mood: [mood] | Font: [font] | Aspect: [ratio] |
| 223 | Title: [title or "visual only"] |
| 224 | Language: [lang] | Watermark: [enabled/disabled] |
| 225 | References: [N images or "extracted style" or "none"] |
| 226 | Location: [directory path] |
| 227 | |
| 228 | Files: |
| 229 | ✓ source-{slug}.{ext} |
| 230 | ✓ prompts/cover.md |
| 231 | ✓ cover.png |
| 232 | ``` |
| 233 | |
| 234 | ## Image Modification |
| 235 | |
| 236 | | Action | Steps | |
| 237 | |--------|-------| |
| 238 | | **Regenerate** | Backup → Update prompt file FIRST → Regenerate | |
| 239 | | **Change dimension** | Backup → Confirm new value → Update prompt → Regenerate | |
| 240 | |
| 241 | Text correction policy: |
| 242 | |
| 243 | - If the title/subtitle is misspelled, garbled, hard to read, or visually weak, do not patch the bitmap with code. |
| 244 | - For text-correction regenerations, write a new prompt file and a new output path so the flawed candidate is preserved for comparison. |
| 245 | - Post-processing is limited to crop, resize, compression, or format conversion that does not alter text or the main composition. |
| 246 | |
| 247 | ## Composition Principles |
| 248 | |
| 249 | - **Whitespace**: 40-60% breathing room |
| 250 | - **Visual anchor**: Main element centered or offset left |
| 251 | - **Characters**: Simplified silhouettes; NO realistic humans |
| 252 | - **Title**: Use exact title from user/source; never invent |
| 253 | |
| 254 | ## Changing Preferences |
| 255 | |
| 256 | EXTEND.md lives at the path noted in **Step 0**. Three ways to change it: |
| 257 | |
| 258 | - **Edit directly** — open EXTEND.md and change fields. Full schema: [references/config/preferences-schema.md](references/config/preferences-schema.md). |
| 259 | - **Reconfigure interactively** — delete EXTEND.md (or ask "reconfigure baoyu-cover-image preferences" / "重新配置"). The next run re-triggers first-time setup. |
| 260 | - **Common one-line edits**: |
| 261 | - `preferred_image_backend: auto` — default; runtime-native tool wins, falls back to the only installed backend, asks only if multiple non-native are present. |
| 262 | - `preferred_image_backend: codex-imagegen` — pin to Codex's built-in. |
| 263 | - `preferred_image_backend: baoyu-image-gen` — pin to the baoyu-image-gen skill. |
| 264 | - `preferred_image_backend: ask` — confirm backend every run. |
| 265 | - `watermark.enabled: true`, `preferred_type`, `preferred_palette`, `preferred_rendering`, `default_aspect`, `quick_mode: true`, `language` — shift the auto-selection defaults and confirmation flow. |
| 266 | |
| 267 | ## References |
| 268 | |
| 269 | **Dimensions**: [text.md](references/dimensions/text.md) | [mood.md](references/dimensions/mood.md) | [font.md](references/dimensions/font.md) |
| 270 | **Palettes**: [references/palettes/](references/palettes/) |
| 271 | **Renderings**: [references/renderings/](references/renderings/) |
| 272 | **Types**: [references/types.md](references/types.md) |
| 273 | **Auto-Selection**: [references/auto-selection.md](references/auto-selection.md) |
| 274 | **Style Presets**: [references/style-presets.md](references/style-presets.md) |
| 275 | **Compatibility**: [references/compatibility.md](references/compatibility.md) |
| 276 | **Visual Elements**: [references/visual-elements.md](references/visual-elements.md) |
| 277 | **Workflow**: [confirm-options.md](references/workflow/confirm-options.md) | [prompt-template.md](references/workflow/prompt-template.md) | [reference-images.md](references/workflow/reference-images.md) |
| 278 | **Config**: [preferences-schema.md](references/config/preferences-schema.md) | [first-time-setup.md](references/config/first-time-setup.md) | [watermark-guide.md](references/config/watermark-guide.md) |