mirror of
https://github.com/JimLiu/baoyu-skills.git
synced 2026-07-13 22:29:48 +08:00
Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 080f2eff48 | |||
| bb4f0dc52c |
@@ -6,7 +6,7 @@
|
|||||||
},
|
},
|
||||||
"metadata": {
|
"metadata": {
|
||||||
"description": "Skills shared by Baoyu for improving daily work efficiency",
|
"description": "Skills shared by Baoyu for improving daily work efficiency",
|
||||||
"version": "0.6.0"
|
"version": "0.7.0"
|
||||||
},
|
},
|
||||||
"plugins": [
|
"plugins": [
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -0,0 +1,179 @@
|
|||||||
|
---
|
||||||
|
name: release-skills
|
||||||
|
description: Release workflow for baoyu-skills plugin. This skill should be used when the user wants to create a new release version. It analyzes changes since the last version tag, updates changelogs (EN/CN), bumps the version in marketplace.json, commits changes, and creates a version tag. Supports dry-run mode and breaking change detection.
|
||||||
|
---
|
||||||
|
|
||||||
|
# Release Skills
|
||||||
|
|
||||||
|
Automate the release process for baoyu-skills plugin: analyze changes, update changelogs, bump version, commit, and tag.
|
||||||
|
|
||||||
|
## When to Use
|
||||||
|
|
||||||
|
Trigger this skill when user requests:
|
||||||
|
- "release", "发布", "create release", "new version"
|
||||||
|
- "bump version", "update version"
|
||||||
|
- "prepare release"
|
||||||
|
|
||||||
|
## Workflow
|
||||||
|
|
||||||
|
### Step 1: Analyze Changes Since Last Tag
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Get the latest version tag
|
||||||
|
LAST_TAG=$(git tag --sort=-v:refname | head -1)
|
||||||
|
|
||||||
|
# Show changes since last tag
|
||||||
|
git log ${LAST_TAG}..HEAD --oneline
|
||||||
|
git diff ${LAST_TAG}..HEAD --stat
|
||||||
|
```
|
||||||
|
|
||||||
|
Categorize changes by type based on commit messages and file changes:
|
||||||
|
|
||||||
|
| Type | Prefix | Description |
|
||||||
|
|------|--------|-------------|
|
||||||
|
| feat | `feat:` | New features, new skills |
|
||||||
|
| fix | `fix:` | Bug fixes |
|
||||||
|
| docs | `docs:` | Documentation only |
|
||||||
|
| refactor | `refactor:` | Code refactoring |
|
||||||
|
| style | `style:` | Formatting, styling |
|
||||||
|
| chore | `chore:` | Build, tooling, maintenance |
|
||||||
|
|
||||||
|
**Breaking Change Detection**: If changes include:
|
||||||
|
- Removed skills or scripts
|
||||||
|
- Changed API/interfaces
|
||||||
|
- Renamed public functions/options
|
||||||
|
|
||||||
|
Warn user: "Breaking changes detected. Consider major version bump (--major flag)."
|
||||||
|
|
||||||
|
### Step 2: Determine Version Bump
|
||||||
|
|
||||||
|
Current version location: `.claude-plugin/marketplace.json` → `metadata.version`
|
||||||
|
|
||||||
|
Version rules:
|
||||||
|
- **Patch** (0.6.1 → 0.6.2): Bug fixes, docs updates, minor improvements
|
||||||
|
- **Minor** (0.6.x → 0.7.0): New features, new skills, significant enhancements
|
||||||
|
- **Major** (0.x → 1.0): Breaking changes, only when user explicitly requests with `--major`
|
||||||
|
|
||||||
|
Default behavior:
|
||||||
|
- If changes include `feat:` or new skills → Minor bump
|
||||||
|
- Otherwise → Patch bump
|
||||||
|
|
||||||
|
### Step 3: Update Changelogs
|
||||||
|
|
||||||
|
Files to update:
|
||||||
|
- `CHANGELOG.md` (English)
|
||||||
|
- `CHANGELOG.zh.md` (Chinese)
|
||||||
|
|
||||||
|
Format (insert after header, before previous version):
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
## {NEW_VERSION} - {YYYY-MM-DD}
|
||||||
|
|
||||||
|
### Features
|
||||||
|
- `skill-name`: description of new feature
|
||||||
|
|
||||||
|
### Fixes
|
||||||
|
- `skill-name`: description of fix
|
||||||
|
|
||||||
|
### Documentation
|
||||||
|
- description of docs changes
|
||||||
|
|
||||||
|
### Other
|
||||||
|
- description of other changes
|
||||||
|
```
|
||||||
|
|
||||||
|
Only include sections that have changes. Omit empty sections.
|
||||||
|
|
||||||
|
For Chinese changelog, translate the content maintaining the same structure.
|
||||||
|
|
||||||
|
### Step 4: Update marketplace.json
|
||||||
|
|
||||||
|
Update `.claude-plugin/marketplace.json`:
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"metadata": {
|
||||||
|
"version": "{NEW_VERSION}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 5: Commit Changes
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git add CHANGELOG.md CHANGELOG.zh.md .claude-plugin/marketplace.json
|
||||||
|
git commit -m "chore: release v{NEW_VERSION}"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 6: Create Version Tag
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git tag v{NEW_VERSION}
|
||||||
|
```
|
||||||
|
|
||||||
|
**Important**: Do NOT push to remote. User will push manually when ready.
|
||||||
|
|
||||||
|
## Options
|
||||||
|
|
||||||
|
| Flag | Description |
|
||||||
|
|------|-------------|
|
||||||
|
| `--dry-run` | Preview changes without executing. Show what would be updated. |
|
||||||
|
| `--major` | Force major version bump (0.x → 1.0 or 1.x → 2.0) |
|
||||||
|
| `--minor` | Force minor version bump |
|
||||||
|
| `--patch` | Force patch version bump |
|
||||||
|
| `--pre <tag>` | (Reserved) Create pre-release version, e.g., `--pre beta` → `0.7.0-beta.1` |
|
||||||
|
|
||||||
|
## Dry-Run Mode
|
||||||
|
|
||||||
|
When `--dry-run` is specified:
|
||||||
|
1. Show all changes since last tag
|
||||||
|
2. Show proposed version bump (current → new)
|
||||||
|
3. Show draft changelog entries (EN and CN)
|
||||||
|
4. Show files that would be modified
|
||||||
|
5. Do NOT make any actual changes
|
||||||
|
|
||||||
|
Output format:
|
||||||
|
```
|
||||||
|
=== DRY RUN MODE ===
|
||||||
|
|
||||||
|
Last tag: v0.6.1
|
||||||
|
Proposed version: v0.7.0
|
||||||
|
|
||||||
|
Changes detected:
|
||||||
|
- feat: new skill baoyu-foo added
|
||||||
|
- fix: baoyu-bar timeout issue
|
||||||
|
- docs: updated README
|
||||||
|
|
||||||
|
Changelog preview (EN):
|
||||||
|
## 0.7.0 - 2026-01-17
|
||||||
|
### Features
|
||||||
|
- `baoyu-foo`: new skill for ...
|
||||||
|
### Fixes
|
||||||
|
- `baoyu-bar`: fixed timeout issue
|
||||||
|
|
||||||
|
Files to modify:
|
||||||
|
- CHANGELOG.md
|
||||||
|
- CHANGELOG.zh.md
|
||||||
|
- .claude-plugin/marketplace.json
|
||||||
|
|
||||||
|
No changes made. Run without --dry-run to execute.
|
||||||
|
```
|
||||||
|
|
||||||
|
## Example Usage
|
||||||
|
|
||||||
|
```
|
||||||
|
/release-skills # Auto-detect version bump
|
||||||
|
/release-skills --dry-run # Preview only
|
||||||
|
/release-skills --minor # Force minor bump
|
||||||
|
/release-skills --major # Force major bump (with confirmation)
|
||||||
|
```
|
||||||
|
|
||||||
|
## Post-Release Reminder
|
||||||
|
|
||||||
|
After successful release, remind user:
|
||||||
|
```
|
||||||
|
Release v{NEW_VERSION} created locally.
|
||||||
|
|
||||||
|
To publish:
|
||||||
|
git push origin main
|
||||||
|
git push origin v{NEW_VERSION}
|
||||||
|
```
|
||||||
@@ -0,0 +1,96 @@
|
|||||||
|
# Changelog
|
||||||
|
|
||||||
|
English | [中文](./CHANGELOG.zh.md)
|
||||||
|
|
||||||
|
## 0.7.0 - 2026-01-17
|
||||||
|
|
||||||
|
### Features
|
||||||
|
- `baoyu-comic`: adds `--aspect` (3:4, 4:3, 16:9) and `--lang` options; introduces multi-variant storyboard workflow (chronological, thematic, character-centric) with user selection.
|
||||||
|
|
||||||
|
### Enhancements
|
||||||
|
- `baoyu-comic`: adds `analysis-framework.md` and `storyboard-template.md` for structured content analysis and variant generation.
|
||||||
|
- `baoyu-slide-deck`: adds `analysis-framework.md`, `content-rules.md`, `modification-guide.md`, and `outline-template.md` references for improved outline quality.
|
||||||
|
- `baoyu-article-illustrator`, `baoyu-cover-image`, `baoyu-xhs-images`: enhanced SKILL.md documentation with clearer workflows.
|
||||||
|
|
||||||
|
### Documentation
|
||||||
|
- Multiple skills: restructured SKILL.md files—moved detailed content to `references/` directory for maintainability.
|
||||||
|
- `baoyu-slide-deck`: simplified SKILL.md, consolidated style descriptions.
|
||||||
|
|
||||||
|
## 0.6.1 - 2026-01-17
|
||||||
|
|
||||||
|
- `baoyu-slide-deck`: adds `scripts/merge-to-pdf.ts` to export generated slides into a single PDF; docs updated with pptx/pdf outputs.
|
||||||
|
- `baoyu-comic`: adds `scripts/merge-to-pdf.ts` to merge cover/pages into a PDF; docs clarify character reference handling (image vs text).
|
||||||
|
- Docs conventions: adds a “Script Directory” template to `CLAUDE.md`; aligns `baoyu-gemini-web` / `baoyu-slide-deck` / `baoyu-comic` docs to use `${SKILL_DIR}` in commands so agents can run scripts from any install location.
|
||||||
|
|
||||||
|
## 0.6.0 - 2026-01-17
|
||||||
|
|
||||||
|
- `baoyu-slide-deck`: adds `scripts/merge-to-pptx.ts` to merge slide images into a PPTX and attach `prompts/` content as speaker notes.
|
||||||
|
- `baoyu-slide-deck`: reshapes/expands the style library (adds `blueprint` / `bold-editorial` / `sketch-notes` / `vector-illustration`, and adjusts/replaces some older styles).
|
||||||
|
- `baoyu-comic`: adds a `realistic` style reference.
|
||||||
|
- Docs: refreshes `README.md` / `README.zh.md`.
|
||||||
|
|
||||||
|
## 0.5.3 - 2026-01-17
|
||||||
|
|
||||||
|
- `baoyu-post-to-x` (X Articles): makes image placeholder replacement more reliable (selection retry + verification; deletes via Backspace and verifies deletion before pasting), reducing mis-insertions/failures.
|
||||||
|
|
||||||
|
## 0.5.2 - 2026-01-16
|
||||||
|
|
||||||
|
- `baoyu-gemini-web`: adds `--sessionId` (local persisted sessions, plus `--list-sessions`) for multi-turn conversations and consistent multi-image generation.
|
||||||
|
- `baoyu-gemini-web`: adds `--reference/--ref` for reference images (vision input), plus stronger timeout handling and cookie refresh recovery.
|
||||||
|
- Docs: `baoyu-xhs-images` / `baoyu-slide-deck` / `baoyu-comic` document session usage (reuse one `sessionId` per set) to improve visual consistency.
|
||||||
|
|
||||||
|
## 0.5.1 - 2026-01-16
|
||||||
|
|
||||||
|
- `baoyu-comic`: adds creation templates/references (character template, Ohmsha guide, outline template) to speed up “characters → storyboard → generation”.
|
||||||
|
|
||||||
|
## 0.5.0 - 2026-01-16
|
||||||
|
|
||||||
|
- Adds `baoyu-comic`: a knowledge-comic generator with `style × layout` and a full set of style/layout references for more stable output.
|
||||||
|
- `baoyu-xhs-images`: moves style/layout details into `references/styles/*` and `references/layouts/*`, and migrates the base prompt into `references/base-prompt.md` for easier maintenance/reuse.
|
||||||
|
- `baoyu-slide-deck` / `baoyu-cover-image`: similarly split base prompt and style references into `references/`, reducing SKILL.md complexity and making style expansion easier.
|
||||||
|
- Docs: updates `README.md` / `README.zh.md` skill list and examples.
|
||||||
|
|
||||||
|
## 0.4.2 - 2026-01-15
|
||||||
|
|
||||||
|
- `baoyu-gemini-web`: updates description to clarify it as the image-generation backend for other skills (e.g. `cover-image`, `xhs-images`, `article-illustrator`).
|
||||||
|
|
||||||
|
## 0.4.1 - 2026-01-15
|
||||||
|
|
||||||
|
- `baoyu-post-to-x` / `baoyu-post-to-wechat`: adds `scripts/paste-from-clipboard.ts` to send a “real paste” keystroke (Cmd/Ctrl+V), avoiding sites ignoring CDP synthetic events.
|
||||||
|
- `baoyu-post-to-x`: adds docs for X Articles/regular posts, and switches image upload to prefer real paste (with a CDP fallback).
|
||||||
|
- `baoyu-post-to-wechat`: docs add script-location guidance and `${SKILL_DIR}` path usage for reliable agent execution.
|
||||||
|
- Docs: adds `screenshots/update-plugins.png` for the marketplace update flow.
|
||||||
|
|
||||||
|
## 0.4.0 - 2026-01-15
|
||||||
|
|
||||||
|
- Adds `baoyu-` prefix to skill directories and updates marketplace paths/docs accordingly to reduce naming collisions.
|
||||||
|
|
||||||
|
## 0.3.1 - 2026-01-15
|
||||||
|
|
||||||
|
- `xhs-images`: upgrades docs to a Style × Layout system (adds `--layout`, auto layout selection, and a `notion` style), with more complete usage examples.
|
||||||
|
- `article-illustrator` / `cover-image`: docs no longer hard-code `gemini-web`; instead they instruct the agent to pick an available image-generation skill.
|
||||||
|
- `slide-deck`: docs add the `notion` style and update auto-style mapping.
|
||||||
|
- Tooling/docs: adds `.DS_Store` to `.gitignore`; refreshes `README.md` / `README.zh.md`.
|
||||||
|
|
||||||
|
## 0.3.0 - 2026-01-14
|
||||||
|
|
||||||
|
- Adds `post-to-wechat`: Chrome CDP automation for WeChat Official Account posting (image-text + full article), including Markdown → WeChat HTML conversion and multiple themes.
|
||||||
|
- Adds `CLAUDE.md`: repository structure, running conventions, and “add new skill” guidelines.
|
||||||
|
- Docs: updates `README.md` / `README.zh.md` install/update/usage instructions.
|
||||||
|
|
||||||
|
## 0.2.0 - 2026-01-13
|
||||||
|
|
||||||
|
- Adds new skills: `post-to-x` (real Chrome/CDP automation for posts and X Articles), `article-illustrator`, `cover-image`, and `slide-deck`.
|
||||||
|
- `xhs-images`: adds multi-style support (`--style`) with auto style selection and updates the base prompt (e.g. language follows input, hand-drawn infographic constraints).
|
||||||
|
- Docs: adds `README.zh.md` and improves `README.md` and `.gitignore`.
|
||||||
|
|
||||||
|
## 0.1.1 - 2026-01-13
|
||||||
|
|
||||||
|
- Marketplace refactor: introduces `metadata` (including `version`), renames the plugin entry to `content-skills` and explicitly lists installable skills; removes legacy `.claude-plugin/plugin.json`.
|
||||||
|
- Adds `xhs-images`: Xiaohongshu infographic series generator (outline + per-image prompts).
|
||||||
|
- `gemini-web`: adds `--promptfiles` to build prompts from multiple files (system/content separation).
|
||||||
|
- Docs: adds `README.md`.
|
||||||
|
|
||||||
|
## 0.1.0 - 2026-01-13
|
||||||
|
|
||||||
|
- Initial release: `.claude-plugin/marketplace.json` plus `gemini-web` (text/image generation, browser login + cookie cache).
|
||||||
@@ -0,0 +1,95 @@
|
|||||||
|
# Changelog
|
||||||
|
|
||||||
|
[English](./CHANGELOG.md) | 中文
|
||||||
|
|
||||||
|
## 0.7.0 - 2026-01-17
|
||||||
|
|
||||||
|
### 新功能
|
||||||
|
- `baoyu-comic`:新增 `--aspect`(3:4、4:3、16:9)和 `--lang` 选项;引入多变体分镜工作流(时间线、主题、人物视角),支持用户选择最佳方案。
|
||||||
|
|
||||||
|
### 增强
|
||||||
|
- `baoyu-comic`:新增 `analysis-framework.md` 和 `storyboard-template.md`,提供结构化内容分析与变体生成框架。
|
||||||
|
- `baoyu-slide-deck`:新增 `analysis-framework.md`、`content-rules.md`、`modification-guide.md`、`outline-template.md` 参考文档,提升大纲质量。
|
||||||
|
- `baoyu-article-illustrator`、`baoyu-cover-image`、`baoyu-xhs-images`:SKILL.md 文档增强,工作流程更清晰。
|
||||||
|
|
||||||
|
### 文档
|
||||||
|
- 多个技能:重构 SKILL.md 结构,将详细内容移至 `references/` 目录,便于维护。
|
||||||
|
- `baoyu-slide-deck`:精简 SKILL.md,整合风格描述。
|
||||||
|
|
||||||
|
## 0.6.1 - 2026-01-17
|
||||||
|
|
||||||
|
- `baoyu-slide-deck`:新增 `scripts/merge-to-pdf.ts`,可将生成的 slide 图片一键合并为 PDF;文档补充导出步骤与产物命名(pptx/pdf)。
|
||||||
|
- `baoyu-comic`:新增 `scripts/merge-to-pdf.ts`,将封面/分页图片合并为 PDF;补充角色参考(图片/文本)处理说明。
|
||||||
|
- 文档规范:在 `CLAUDE.md` 中补充“Script Directory”模板;`baoyu-gemini-web` / `baoyu-slide-deck` / `baoyu-comic` 文档统一用 `${SKILL_DIR}` 引用脚本路径,方便 agent 在任意安装目录运行。
|
||||||
|
|
||||||
|
## 0.6.0 - 2026-01-17
|
||||||
|
|
||||||
|
- `baoyu-slide-deck`:新增 `scripts/merge-to-pptx.ts`,将生成的 slide 图片合并为 PPTX,并可把 `prompts/` 写入 speaker notes。
|
||||||
|
- `baoyu-slide-deck`:风格库重组与扩充(新增 `blueprint` / `bold-editorial` / `sketch-notes` / `vector-illustration`,并调整/替换部分旧风格定义)。
|
||||||
|
- `baoyu-comic`:新增 `realistic` 风格参考文件。
|
||||||
|
- 文档:README / README.zh 同步更新技能说明与用法示例。
|
||||||
|
|
||||||
|
## 0.5.3 - 2026-01-17
|
||||||
|
|
||||||
|
- `baoyu-post-to-x`(X Articles):插图占位符替换更稳定——选中占位符增加重试与校验,改用 Backspace 删除并确认删除后再粘贴图片,降低插图错位/替换失败概率。
|
||||||
|
|
||||||
|
## 0.5.2 - 2026-01-16
|
||||||
|
|
||||||
|
- `baoyu-gemini-web`:新增 `--sessionId`(本地持久化会话,支持 `--list-sessions`),用于多轮对话/多图生成保持上下文一致。
|
||||||
|
- `baoyu-gemini-web`:新增 `--reference/--ref` 传入参考图片(vision 输入),并增强超时与 cookie 失效自动恢复逻辑。
|
||||||
|
- `baoyu-xhs-images` / `baoyu-slide-deck` / `baoyu-comic`:文档补充 session 约定(整套图使用同一 `sessionId`,增强风格一致性)。
|
||||||
|
|
||||||
|
## 0.5.1 - 2026-01-16
|
||||||
|
|
||||||
|
- `baoyu-comic`:补齐创作模板与参考(角色模板、Ohmsha 教学漫画指南、大纲模板),更适合从“设定 → 分镜 → 生成”快速落地。
|
||||||
|
|
||||||
|
## 0.5.0 - 2026-01-16
|
||||||
|
|
||||||
|
- 新增 `baoyu-comic`:知识漫画生成器,支持 `style × layout` 组合,并提供风格/布局参考文件用于稳定出图。
|
||||||
|
- `baoyu-xhs-images`:将 Style/Layout 的细节从 SKILL.md 拆分到 `references/styles/*` 与 `references/layouts/*`,并将基础提示词迁移到 `references/base-prompt.md`,便于维护和复用。
|
||||||
|
- `baoyu-slide-deck` / `baoyu-cover-image`:同样将基础提示词与风格拆分到 `references/`,降低 SKILL.md 复杂度,便于扩展更多风格。
|
||||||
|
- 文档:README / README.zh 更新技能清单与用法示例。
|
||||||
|
|
||||||
|
## 0.4.2 - 2026-01-15
|
||||||
|
|
||||||
|
- `baoyu-gemini-web`:描述信息更新,明确其作为 `cover-image` / `xhs-images` / `article-illustrator` 等技能的图片生成后端。
|
||||||
|
|
||||||
|
## 0.4.1 - 2026-01-15
|
||||||
|
|
||||||
|
- `baoyu-post-to-x` / `baoyu-post-to-wechat`:新增 `scripts/paste-from-clipboard.ts`,通过系统级 Cmd/Ctrl+V 发送“真实粘贴”按键,规避 CDP 合成事件在站点侧被忽略的问题。
|
||||||
|
- `baoyu-post-to-x`:补充 X Articles/普通推文的操作文档(`references/articles.md`、`references/regular-posts.md`),并将发图流程改为优先使用“真实粘贴”(保留 CDP 兜底)。
|
||||||
|
- `baoyu-post-to-wechat`:文档补充脚本目录说明与 `${SKILL_DIR}` 路径写法,便于 agent 可靠定位脚本。
|
||||||
|
- 文档:新增插件更新流程截图 `screenshots/update-plugins.png`。
|
||||||
|
|
||||||
|
## 0.4.0 - 2026-01-15
|
||||||
|
|
||||||
|
- 技能命名统一加 `baoyu-` 前缀:目录结构、marketplace 清单与文档示例命令同步更新,减少与其它插件技能的命名冲突。
|
||||||
|
|
||||||
|
## 0.3.1 - 2026-01-15
|
||||||
|
|
||||||
|
- `xhs-images`:升级为 Style × Layout 二维系统(新增 `--layout`、自动布局选择与 Notion 风格),文档示例更完整。
|
||||||
|
- `article-illustrator` / `slide-deck` / `cover-image`:文档改为“选择可用的图片生成技能”而非强绑定 `gemini-web`,并补充 Notion 风格相关说明。
|
||||||
|
- 工程化:`.gitignore` 增加 `.DS_Store` 忽略;README / README.zh 同步调整。
|
||||||
|
|
||||||
|
## 0.3.0 - 2026-01-14
|
||||||
|
|
||||||
|
- 新增 `post-to-wechat`:基于 Chrome CDP 自动化发布公众号图文/文章,包含 Markdown → 微信 HTML 转换与多主题样式支持。
|
||||||
|
- 新增 `CLAUDE.md`:补充仓库结构、运行方式与添加新技能的约定,方便协作与二次开发。
|
||||||
|
- 文档:README / README.zh 更新安装、更新与使用说明。
|
||||||
|
|
||||||
|
## 0.2.0 - 2026-01-13
|
||||||
|
|
||||||
|
- 新增技能:`post-to-x`(真实 Chrome/CDP 自动化发布推文与 X Articles)、`article-illustrator`(文章智能插图规划)、`cover-image`(文章封面图生成)、`slide-deck`(幻灯片大纲与图片生成)。
|
||||||
|
- `xhs-images`:新增 `--style` 多风格与自动风格选择,并更新基础提示词(例如语言随内容、强调手绘信息图等)。
|
||||||
|
- 文档:新增 `README.zh.md`,并完善 README 与 `.gitignore`。
|
||||||
|
|
||||||
|
## 0.1.1 - 2026-01-13
|
||||||
|
|
||||||
|
- marketplace 结构重构:引入 `metadata`(含 `version`),插件名调整为 `content-skills` 并显式列出可安装 skills;移除旧 `.claude-plugin/plugin.json`。
|
||||||
|
- 新增 `xhs-images`:小红书信息图系列生成技能(拆解内容、生成 outline 与提示词)。
|
||||||
|
- `gemini-web`:新增 `--promptfiles`,支持从多个文件拼接 prompt(便于 system/content 分离)。
|
||||||
|
- 文档:新增 `README.md`。
|
||||||
|
|
||||||
|
## 0.1.0 - 2026-01-13
|
||||||
|
|
||||||
|
- 初始发布:提供 `.claude-plugin/marketplace.json` 与 `gemini-web`(文本/图片生成、cookie 登录与缓存流程)。
|
||||||
@@ -71,6 +71,30 @@ npx -y bun skills/baoyu-gemini-web/scripts/main.ts --promptfiles system.md conte
|
|||||||
2. Add TypeScript in `skills/baoyu-<name>/scripts/`
|
2. Add TypeScript in `skills/baoyu-<name>/scripts/`
|
||||||
3. Add prompt templates in `skills/baoyu-<name>/prompts/` if needed
|
3. Add prompt templates in `skills/baoyu-<name>/prompts/` if needed
|
||||||
4. Register in `marketplace.json` plugins[0].skills array as `./skills/baoyu-<name>`
|
4. Register in `marketplace.json` plugins[0].skills array as `./skills/baoyu-<name>`
|
||||||
|
5. **Add Script Directory section** to SKILL.md (see template below)
|
||||||
|
|
||||||
|
### Script Directory Template
|
||||||
|
|
||||||
|
Every SKILL.md with scripts MUST include this section after Usage:
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
## Script Directory
|
||||||
|
|
||||||
|
**Important**: All scripts are located in the `scripts/` subdirectory of this skill.
|
||||||
|
|
||||||
|
**Agent Execution Instructions**:
|
||||||
|
1. Determine this SKILL.md file's directory path as `SKILL_DIR`
|
||||||
|
2. Script path = `${SKILL_DIR}/scripts/<script-name>.ts`
|
||||||
|
3. Replace all `${SKILL_DIR}` in this document with the actual path
|
||||||
|
|
||||||
|
**Script Reference**:
|
||||||
|
| Script | Purpose |
|
||||||
|
|--------|---------|
|
||||||
|
| `scripts/main.ts` | Main entry point |
|
||||||
|
| `scripts/other.ts` | Other functionality |
|
||||||
|
```
|
||||||
|
|
||||||
|
When referencing scripts in workflow sections, use `${SKILL_DIR}/scripts/<name>.ts` so agents can resolve the correct path.
|
||||||
|
|
||||||
## Code Style
|
## Code Style
|
||||||
|
|
||||||
|
|||||||
@@ -125,7 +125,11 @@ path/to/
|
|||||||
1. Read article content
|
1. Read article content
|
||||||
2. If `--style` specified, use that style
|
2. If `--style` specified, use that style
|
||||||
3. Otherwise, scan for style signals and auto-select
|
3. Otherwise, scan for style signals and auto-select
|
||||||
4. Extract key information:
|
4. **Language detection**:
|
||||||
|
- Detect **source language** from article content
|
||||||
|
- Detect **user language** from conversation context
|
||||||
|
- Note if source_language ≠ user_language (will ask in Step 4)
|
||||||
|
5. Extract key information:
|
||||||
- Main topic and themes
|
- Main topic and themes
|
||||||
- Core messages per section
|
- Core messages per section
|
||||||
- Abstract concepts needing visualization
|
- Abstract concepts needing visualization
|
||||||
@@ -173,10 +177,55 @@ path/to/
|
|||||||
...
|
...
|
||||||
```
|
```
|
||||||
|
|
||||||
### Step 4: Create Prompt Files
|
### Step 4: Review & Confirm
|
||||||
|
|
||||||
|
**Purpose**: Let user confirm all options in a single step before image generation.
|
||||||
|
|
||||||
|
**IMPORTANT**: Present ALL options in a single confirmation step using AskUserQuestion. Do NOT interrupt workflow with multiple separate confirmations.
|
||||||
|
|
||||||
|
1. **Generate 3 style variants**:
|
||||||
|
- Analyze content to select 3 most suitable styles
|
||||||
|
- Generate complete illustration plan for each style variant
|
||||||
|
- Save as `outline-{style}.md` (e.g., `outline-notion.md`, `outline-tech.md`, `outline-warm.md`)
|
||||||
|
|
||||||
|
2. **Determine which questions to ask**:
|
||||||
|
|
||||||
|
| Question | When to Ask |
|
||||||
|
|----------|-------------|
|
||||||
|
| Style variant | Always (required) |
|
||||||
|
| Language | Only if `source_language ≠ user_language` |
|
||||||
|
|
||||||
|
3. **Present options** (use AskUserQuestion with all applicable questions):
|
||||||
|
|
||||||
|
**Question 1 (Style)** - always:
|
||||||
|
- Style A (recommended): [style name] - [brief description]
|
||||||
|
- Style B: [style name] - [brief description]
|
||||||
|
- Style C: [style name] - [brief description]
|
||||||
|
- Custom: Provide custom style reference
|
||||||
|
|
||||||
|
**Question 2 (Language)** - only if source ≠ user language:
|
||||||
|
- [Source language] (matches article language)
|
||||||
|
- [User language] (your preference)
|
||||||
|
|
||||||
|
**Language handling**:
|
||||||
|
- If source language = user language: Just inform user (e.g., "Prompts will be in Chinese")
|
||||||
|
- If different: Ask which language to use for prompts
|
||||||
|
|
||||||
|
4. **Apply selection**:
|
||||||
|
- Copy selected `outline-{style}.md` to `outline.md`
|
||||||
|
- If custom style provided, generate new plan with that style
|
||||||
|
- If different language selected, regenerate outline in that language
|
||||||
|
- User may edit `outline.md` directly for fine-tuning
|
||||||
|
- If modified, reload plan before proceeding
|
||||||
|
|
||||||
|
5. **Proceed only after explicit user confirmation**
|
||||||
|
|
||||||
|
### Step 5: Create Prompt Files
|
||||||
|
|
||||||
Save prompts to `prompts/` directory with style-specific details.
|
Save prompts to `prompts/` directory with style-specific details.
|
||||||
|
|
||||||
|
**All prompts are written in the user's confirmed language preference.**
|
||||||
|
|
||||||
**Prompt Format**:
|
**Prompt Format**:
|
||||||
|
|
||||||
```markdown
|
```markdown
|
||||||
@@ -199,7 +248,7 @@ Text content (if any):
|
|||||||
Style notes: [specific style characteristics]
|
Style notes: [specific style characteristics]
|
||||||
```
|
```
|
||||||
|
|
||||||
### Step 5: Generate Images
|
### Step 6: Generate Images
|
||||||
|
|
||||||
**Image Generation Skill Selection**:
|
**Image Generation Skill Selection**:
|
||||||
1. Check available image generation skills
|
1. Check available image generation skills
|
||||||
@@ -212,7 +261,7 @@ Style notes: [specific style characteristics]
|
|||||||
4. On failure, auto-retry once
|
4. On failure, auto-retry once
|
||||||
5. If retry fails, log reason, continue to next
|
5. If retry fails, log reason, continue to next
|
||||||
|
|
||||||
### Step 6: Update Article
|
### Step 7: Update Article
|
||||||
|
|
||||||
Insert generated images at corresponding positions:
|
Insert generated images at corresponding positions:
|
||||||
|
|
||||||
@@ -225,7 +274,7 @@ Insert generated images at corresponding positions:
|
|||||||
- Leave one blank line before and after image
|
- Leave one blank line before and after image
|
||||||
- Alt text uses concise description in article's language
|
- Alt text uses concise description in article's language
|
||||||
|
|
||||||
### Step 7: Output Summary
|
### Step 8: Output Summary
|
||||||
|
|
||||||
```
|
```
|
||||||
Article Illustration Complete!
|
Article Illustration Complete!
|
||||||
@@ -244,6 +293,57 @@ Failed:
|
|||||||
- illustration-zzz.png: [failure reason]
|
- illustration-zzz.png: [failure reason]
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Illustration Modification
|
||||||
|
|
||||||
|
Support for modifying individual illustrations after initial generation.
|
||||||
|
|
||||||
|
### Edit Single Illustration
|
||||||
|
|
||||||
|
Regenerate a specific illustration with modified prompt:
|
||||||
|
|
||||||
|
1. Identify illustration to edit (e.g., `illustration-concept-overview.png`)
|
||||||
|
2. Update prompt in `prompts/illustration-concept-overview.md` if needed
|
||||||
|
3. If content changes significantly, update slug in filename
|
||||||
|
4. Regenerate image
|
||||||
|
5. Update article if image reference changed
|
||||||
|
|
||||||
|
### Add New Illustration
|
||||||
|
|
||||||
|
Add a new illustration to the article:
|
||||||
|
|
||||||
|
1. Identify insertion position in article
|
||||||
|
2. Create new prompt with appropriate slug (e.g., `illustration-new-concept.md`)
|
||||||
|
3. Generate new illustration image
|
||||||
|
4. Update `outline.md` with new illustration entry
|
||||||
|
5. Insert image reference in article at the specified position
|
||||||
|
|
||||||
|
### Delete Illustration
|
||||||
|
|
||||||
|
Remove an illustration from the article:
|
||||||
|
|
||||||
|
1. Identify illustration to delete (e.g., `illustration-concept-overview.png`)
|
||||||
|
2. Remove image file and prompt file
|
||||||
|
3. Remove image reference from article
|
||||||
|
4. Update `outline.md` to remove illustration entry
|
||||||
|
|
||||||
|
### File Naming Convention
|
||||||
|
|
||||||
|
Files use meaningful slugs for better readability:
|
||||||
|
```
|
||||||
|
illustration-[slug].png
|
||||||
|
illustration-[slug].md (in prompts/)
|
||||||
|
```
|
||||||
|
|
||||||
|
Examples:
|
||||||
|
- `illustration-concept-overview.png`
|
||||||
|
- `illustration-workflow-diagram.png`
|
||||||
|
- `illustration-key-benefits.png`
|
||||||
|
|
||||||
|
**Slug rules**:
|
||||||
|
- Derived from illustration purpose/content (kebab-case)
|
||||||
|
- Must be unique within the article
|
||||||
|
- When content changes significantly, update slug accordingly
|
||||||
|
|
||||||
## Style Reference Details
|
## Style Reference Details
|
||||||
|
|
||||||
### elegant
|
### elegant
|
||||||
@@ -325,4 +425,5 @@ Typography: Clean hand-drawn lettering, simple sans-serif labels
|
|||||||
- Maintain selected style consistency across all illustrations in one article
|
- Maintain selected style consistency across all illustrations in one article
|
||||||
- Image generation typically takes 10-30 seconds per image
|
- Image generation typically takes 10-30 seconds per image
|
||||||
- Sensitive figures should use cartoon alternatives
|
- Sensitive figures should use cartoon alternatives
|
||||||
- Prompt and illustration text language should match article language
|
- Prompts written in user's confirmed language preference
|
||||||
|
- Illustration text (labels, captions) should match article language
|
||||||
|
|||||||
+297
-56
@@ -11,7 +11,6 @@ Create original knowledge comics with multiple visual styles.
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
/baoyu-comic posts/turing-story/source.md
|
/baoyu-comic posts/turing-story/source.md
|
||||||
/baoyu-comic posts/turing-story/source.md --style dramatic --layout cinematic
|
|
||||||
/baoyu-comic # then paste content
|
/baoyu-comic # then paste content
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -19,10 +18,14 @@ Create original knowledge comics with multiple visual styles.
|
|||||||
|
|
||||||
| Option | Values |
|
| Option | Values |
|
||||||
|--------|--------|
|
|--------|--------|
|
||||||
| `--style` | classic (default), dramatic, warm, tech, sepia, vibrant, ohmsha, realistic |
|
| `--style` | classic (default), dramatic, warm, tech, sepia, vibrant, ohmsha, realistic, or custom description |
|
||||||
| `--layout` | standard (default), cinematic, dense, splash, mixed, webtoon |
|
| `--layout` | standard (default), cinematic, dense, splash, mixed, webtoon |
|
||||||
|
| `--aspect` | 3:4 (default, portrait), 4:3 (landscape), 16:9 (widescreen) |
|
||||||
|
| `--lang` | auto (default), zh, en, ja, etc. |
|
||||||
|
|
||||||
Style × Layout can be freely combined.
|
Style × Layout × Aspect can be freely combined. Custom styles can be described in natural language.
|
||||||
|
|
||||||
|
**Aspect ratio is consistent across all pages in a comic.**
|
||||||
|
|
||||||
## Auto Selection
|
## Auto Selection
|
||||||
|
|
||||||
@@ -36,19 +39,48 @@ Style × Layout can be freely combined.
|
|||||||
| Wine, food, business, lifestyle, professional | realistic | cinematic |
|
| Wine, food, business, lifestyle, professional | realistic | cinematic |
|
||||||
| Biography, balanced | classic | mixed |
|
| Biography, balanced | classic | mixed |
|
||||||
|
|
||||||
|
## Script Directory
|
||||||
|
|
||||||
|
**Important**: All scripts are located in the `scripts/` subdirectory of this skill.
|
||||||
|
|
||||||
|
**Agent Execution Instructions**:
|
||||||
|
1. Determine this SKILL.md file's directory path as `SKILL_DIR`
|
||||||
|
2. Script path = `${SKILL_DIR}/scripts/<script-name>.ts`
|
||||||
|
3. Replace all `${SKILL_DIR}` in this document with the actual path
|
||||||
|
|
||||||
|
**Script Reference**:
|
||||||
|
| Script | Purpose |
|
||||||
|
|--------|---------|
|
||||||
|
| `scripts/merge-to-pdf.ts` | Merge comic pages into PDF |
|
||||||
|
|
||||||
## File Structure
|
## File Structure
|
||||||
|
|
||||||
```
|
```
|
||||||
[target]/
|
[target]/
|
||||||
├── outline.md
|
├── source.md # Source content (if pasted, not file)
|
||||||
├── characters/
|
├── analysis.md # Deep analysis results (YAML+MD)
|
||||||
│ ├── characters.md # Character definitions
|
├── storyboard-chronological.md # Variant A (preserved)
|
||||||
│ └── characters.png # Character reference sheet
|
├── storyboard-thematic.md # Variant B (preserved)
|
||||||
|
├── storyboard-character.md # Variant C (preserved)
|
||||||
|
├── characters-chronological/ # Variant A chars (preserved)
|
||||||
|
│ ├── characters.md
|
||||||
|
│ └── characters.png
|
||||||
|
├── characters-thematic/ # Variant B chars (preserved)
|
||||||
|
│ ├── characters.md
|
||||||
|
│ └── characters.png
|
||||||
|
├── characters-character/ # Variant C chars (preserved)
|
||||||
|
│ ├── characters.md
|
||||||
|
│ └── characters.png
|
||||||
|
├── storyboard.md # Final selected
|
||||||
|
├── characters/ # Final selected
|
||||||
|
│ ├── characters.md
|
||||||
|
│ └── characters.png
|
||||||
├── prompts/
|
├── prompts/
|
||||||
│ ├── 00-cover.md
|
│ ├── 00-cover-[slug].md
|
||||||
│ └── XX-page.md
|
│ └── NN-page-[slug].md
|
||||||
├── 00-cover.png
|
├── 00-cover-[slug].png
|
||||||
└── XX-page.png
|
├── NN-page-[slug].png
|
||||||
|
└── {topic-slug}.pdf
|
||||||
```
|
```
|
||||||
|
|
||||||
**Target directory**:
|
**Target directory**:
|
||||||
@@ -57,79 +89,287 @@ Style × Layout can be freely combined.
|
|||||||
|
|
||||||
## Workflow
|
## Workflow
|
||||||
|
|
||||||
### Step 1: Analyze Content
|
### Step 1: Analyze Content → `analysis.md`
|
||||||
|
|
||||||
1. Read source content
|
Read source content, save it if needed, and perform deep analysis.
|
||||||
2. Select style (from `--style` or auto-detect)
|
|
||||||
3. Select layout (from `--layout` or auto-detect per page)
|
**Actions**:
|
||||||
4. Determine page count:
|
1. **Save source content** (if not already a file):
|
||||||
|
- If user provides a file path: use as-is
|
||||||
|
- If user pastes content: save to `source.md` in target directory
|
||||||
|
2. Read source content
|
||||||
|
3. **Deep analysis** following `references/analysis-framework.md`:
|
||||||
|
- Target audience identification
|
||||||
|
- Value proposition for readers
|
||||||
|
- Core themes and narrative potential
|
||||||
|
- Key figures and their story arcs
|
||||||
|
4. Detect source language
|
||||||
|
5. Determine recommended page count:
|
||||||
- Short story: 5-8 pages
|
- Short story: 5-8 pages
|
||||||
- Medium complexity: 9-15 pages
|
- Medium complexity: 9-15 pages
|
||||||
- Full biography: 16-25 pages
|
- Full biography: 16-25 pages
|
||||||
|
6. Analyze content signals for style/layout recommendations
|
||||||
|
7. **Save to `analysis.md`**
|
||||||
|
|
||||||
### Step 2: Define Characters
|
**analysis.md Format**:
|
||||||
|
|
||||||
**Purpose**: Establish visual consistency across all pages.
|
```yaml
|
||||||
|
---
|
||||||
|
title: "Alan Turing: Father of Computing"
|
||||||
|
topic: Biography
|
||||||
|
time_span: 1912-1954
|
||||||
|
source_language: en
|
||||||
|
user_language: zh
|
||||||
|
aspect_ratio: "3:4"
|
||||||
|
recommended_page_count: 12
|
||||||
|
---
|
||||||
|
|
||||||
1. Extract all characters from content (protagonist, supporting, antagonist, narrator)
|
## Target Audience
|
||||||
2. Create `characters/characters.md` with visual specs for each character
|
|
||||||
3. Generate `characters/characters.png` (character reference sheet)
|
|
||||||
|
|
||||||
**Reference**: `references/character-template.md` for detailed format and examples.
|
- **Primary**: Tech enthusiasts curious about computing history
|
||||||
|
- **Secondary**: Students learning about scientific breakthroughs
|
||||||
|
- **Tertiary**: General readers interested in biographical stories
|
||||||
|
|
||||||
### Step 3: Generate Outline
|
## Value Proposition
|
||||||
|
|
||||||
Create `outline.md` with:
|
What readers will gain:
|
||||||
- Metadata (title, style, layout, page count, character reference path)
|
1. Understanding of how modern computing was born
|
||||||
- Cover design
|
2. Emotional connection to a brilliant but tragic figure
|
||||||
- Each page: layout, panel breakdown, visual prompts
|
3. Appreciation for the human cost of innovation
|
||||||
|
|
||||||
**Reference**: `references/outline-template.md` for detailed format.
|
## Core Themes
|
||||||
|
|
||||||
|
| Theme | Narrative Potential | Visual Opportunity |
|
||||||
|
|-------|--------------------|--------------------|
|
||||||
|
| Genius vs. Society | High conflict, dramatic arcs | Contrast scenes |
|
||||||
|
| Code-breaking | Mystery, tension | Technical diagrams as art |
|
||||||
|
| Personal tragedy | Emotional depth | Intimate, somber panels |
|
||||||
|
|
||||||
|
## Key Figures & Story Arcs
|
||||||
|
|
||||||
|
### Alan Turing (Protagonist)
|
||||||
|
- **Arc**: Misunderstood genius → War hero → Tragic end
|
||||||
|
- **Visual identity**: Disheveled academic, intense eyes
|
||||||
|
- **Key moments**: Enigma breakthrough, arrest, final days
|
||||||
|
|
||||||
|
### Christopher Morcom (Catalyst)
|
||||||
|
- **Role**: Early friend whose death shaped Turing
|
||||||
|
- **Visual identity**: Youthful, bright
|
||||||
|
- **Key moments**: School friendship, sudden death
|
||||||
|
|
||||||
|
## Content Signals
|
||||||
|
|
||||||
|
- "biography" → classic + mixed
|
||||||
|
- "computing history" → tech + dense
|
||||||
|
- "personal tragedy" → dramatic + splash
|
||||||
|
|
||||||
|
## Recommended Approaches
|
||||||
|
|
||||||
|
1. **Chronological** - follow life timeline (recommended for biography)
|
||||||
|
2. **Thematic** - organize by contributions (good for educational focus)
|
||||||
|
3. **Character-focused** - relationships drive narrative (good for emotional impact)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 2: Generate 3 Storyboard Variants
|
||||||
|
|
||||||
|
Create three distinct variants, each combining a narrative approach with a recommended style.
|
||||||
|
|
||||||
|
| Variant | Narrative Approach | Recommended Style | Layout |
|
||||||
|
|---------|-------------------|-------------------|--------|
|
||||||
|
| A | Chronological | sepia | cinematic |
|
||||||
|
| B | Thematic | tech | dense |
|
||||||
|
| C | Character-focused | warm | standard |
|
||||||
|
|
||||||
|
**For each variant**:
|
||||||
|
|
||||||
|
1. **Generate storyboard** (`storyboard-{approach}.md`):
|
||||||
|
- YAML front matter with narrative_approach, recommended_style, recommended_layout, aspect_ratio
|
||||||
|
- Cover design
|
||||||
|
- Each page: layout, panel breakdown, visual prompts
|
||||||
|
- **Written in user's preferred language**
|
||||||
|
- Reference: `references/storyboard-template.md`
|
||||||
|
|
||||||
|
2. **Generate matching characters** (`characters-{approach}/`):
|
||||||
|
- `characters.md` - visual specs matching the recommended style (in user's preferred language)
|
||||||
|
- `characters.png` - character reference sheet
|
||||||
|
- Reference: `references/character-template.md`
|
||||||
|
|
||||||
|
**All variants are preserved after selection for reference.**
|
||||||
|
|
||||||
|
### Step 3: User Confirms All Options
|
||||||
|
|
||||||
|
**IMPORTANT**: Present ALL options in a single confirmation step using AskUserQuestion. Do NOT interrupt workflow with multiple separate confirmations.
|
||||||
|
|
||||||
|
**Determine which questions to ask**:
|
||||||
|
|
||||||
|
| Question | When to Ask |
|
||||||
|
|----------|-------------|
|
||||||
|
| Storyboard variant | Always (required) |
|
||||||
|
| Visual style | Always (required) |
|
||||||
|
| Language | Only if `source_language ≠ user_language` |
|
||||||
|
| Aspect ratio | Only if user might prefer non-default (e.g., landscape content) |
|
||||||
|
|
||||||
|
**Language handling**:
|
||||||
|
- If source language = user language: Just inform user (e.g., "Comic will be in Chinese")
|
||||||
|
- If different: Ask which language to use
|
||||||
|
|
||||||
|
**All storyboards and prompts are generated in the user's selected/preferred language.**
|
||||||
|
|
||||||
|
**Aspect ratio handling**:
|
||||||
|
- Default: 3:4 (portrait) - standard comic format
|
||||||
|
- Offer 4:3 (landscape) if content suits it (e.g., panoramic scenes, technical diagrams)
|
||||||
|
- Offer 16:9 (widescreen) for cinematic content
|
||||||
|
|
||||||
|
**AskUserQuestion format** (example with all questions):
|
||||||
|
|
||||||
|
```
|
||||||
|
Question 1 (Storyboard): Which storyboard variant?
|
||||||
|
- A: Chronological + sepia (Recommended)
|
||||||
|
- B: Thematic + tech
|
||||||
|
- C: Character-focused + warm
|
||||||
|
- Custom
|
||||||
|
|
||||||
|
Question 2 (Style): Which visual style?
|
||||||
|
- sepia (Recommended from variant)
|
||||||
|
- classic / dramatic / warm / tech / vibrant / ohmsha / realistic
|
||||||
|
- Custom description
|
||||||
|
|
||||||
|
Question 3 (Language) - only if mismatch:
|
||||||
|
- Chinese (source material language)
|
||||||
|
- English (your preference)
|
||||||
|
|
||||||
|
Question 4 (Aspect) - only if relevant:
|
||||||
|
- 3:4 Portrait (Recommended)
|
||||||
|
- 4:3 Landscape
|
||||||
|
- 16:9 Widescreen
|
||||||
|
```
|
||||||
|
|
||||||
|
**After confirmation**:
|
||||||
|
1. Copy selected storyboard → `storyboard.md`
|
||||||
|
2. Copy selected characters → `characters/`
|
||||||
|
3. Update YAML front matter with confirmed style, language, aspect_ratio
|
||||||
|
4. If style differs from variant's recommended: regenerate `characters/characters.png`
|
||||||
|
5. User may edit files directly for fine-tuning
|
||||||
|
|
||||||
### Step 4: Generate Images
|
### Step 4: Generate Images
|
||||||
|
|
||||||
For each page (cover + pages):
|
With confirmed storyboard + style + aspect ratio:
|
||||||
|
|
||||||
1. Save prompt to `prompts/XX-page.md`
|
|
||||||
2. Call image generation skill with:
|
|
||||||
- Base prompt: `references/base-prompt.md`
|
|
||||||
- Character reference (text or image, depending on skill capability)
|
|
||||||
- Page prompt
|
|
||||||
- Output path
|
|
||||||
|
|
||||||
**Image Generation Skill Selection**:
|
|
||||||
- Check available image generation skills in the environment
|
|
||||||
- Adapt parameters based on skill capabilities:
|
|
||||||
- If supports `--promptfiles`: pass prompt files
|
|
||||||
- If supports reference image: pass `characters/characters.png`
|
|
||||||
- If text-only: concatenate prompts into single text
|
|
||||||
- If multiple skills available, ask user preference
|
|
||||||
|
|
||||||
**Session Management**:
|
|
||||||
If the image generation skill supports `--sessionId`:
|
|
||||||
1. Generate a unique session ID at the start (e.g., `comic-{topic-slug}-{timestamp}`)
|
|
||||||
2. Use the same session ID for character sheet and all pages
|
|
||||||
3. This ensures visual consistency (character appearance, style) across all generated images
|
|
||||||
|
|
||||||
|
**For each page (cover + pages)**:
|
||||||
|
1. Save prompt to `prompts/NN-{cover|page}-[slug].md` (in user's preferred language)
|
||||||
|
2. Generate image using confirmed style and aspect ratio
|
||||||
3. Report progress after each generation
|
3. Report progress after each generation
|
||||||
|
|
||||||
### Step 5: Completion Report
|
**Image Generation Skill Selection**:
|
||||||
|
- Check available image generation skills
|
||||||
|
- If multiple skills available, ask user preference
|
||||||
|
|
||||||
|
**Character Reference Handling**:
|
||||||
|
- If skill supports reference image: pass `characters/characters.png`
|
||||||
|
- If skill does NOT support reference image: include `characters/characters.md` content in prompt
|
||||||
|
|
||||||
|
**Session Management**:
|
||||||
|
If image generation skill supports `--sessionId`:
|
||||||
|
1. Generate unique session ID: `comic-{topic-slug}-{timestamp}`
|
||||||
|
2. Use same session ID for all pages
|
||||||
|
3. Ensures visual consistency across generated images
|
||||||
|
|
||||||
|
### Step 5: Merge to PDF
|
||||||
|
|
||||||
|
After all images generated:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npx -y bun ${SKILL_DIR}/scripts/merge-to-pdf.ts <comic-dir>
|
||||||
|
```
|
||||||
|
|
||||||
|
Creates `{topic-slug}.pdf` with all pages as full-page images.
|
||||||
|
|
||||||
|
### Step 6: Completion Report
|
||||||
|
|
||||||
```
|
```
|
||||||
Comic Complete!
|
Comic Complete!
|
||||||
Title: [title] | Style: [style] | Pages: [count]
|
Title: [title] | Style: [style] | Pages: [count] | Aspect: [ratio] | Language: [lang]
|
||||||
Location: [path]
|
Location: [path]
|
||||||
|
✓ analysis.md
|
||||||
✓ characters.png
|
✓ characters.png
|
||||||
✓ 00-cover.png ... XX-page.png
|
✓ 00-cover-[slug].png ... NN-page-[slug].png
|
||||||
|
✓ {topic-slug}.pdf
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Page Modification
|
||||||
|
|
||||||
|
Support for modifying individual pages after initial generation.
|
||||||
|
|
||||||
|
### Edit Single Page
|
||||||
|
|
||||||
|
Regenerate a specific page with modified prompt:
|
||||||
|
|
||||||
|
1. Identify page to edit (e.g., `03-page-enigma-machine.png`)
|
||||||
|
2. Update prompt in `prompts/03-page-enigma-machine.md` if needed
|
||||||
|
3. If content changes significantly, update slug in filename
|
||||||
|
4. Regenerate image using same session ID and aspect ratio
|
||||||
|
5. Regenerate PDF
|
||||||
|
|
||||||
|
### Add New Page
|
||||||
|
|
||||||
|
Insert a new page at specified position:
|
||||||
|
|
||||||
|
1. Specify insertion position (e.g., after page 3)
|
||||||
|
2. Create new prompt with appropriate slug (e.g., `04-page-bletchley-park.md`)
|
||||||
|
3. Generate new page image (same aspect ratio)
|
||||||
|
4. **Renumber files**: All subsequent pages increment NN by 1
|
||||||
|
- `04-page-tragedy.png` → `05-page-tragedy.png`
|
||||||
|
- Slugs remain unchanged
|
||||||
|
5. Update `storyboard.md` with new page entry
|
||||||
|
6. Regenerate PDF
|
||||||
|
|
||||||
|
### Delete Page
|
||||||
|
|
||||||
|
Remove a page and renumber:
|
||||||
|
|
||||||
|
1. Identify page to delete (e.g., `03-page-enigma-machine.png`)
|
||||||
|
2. Remove image file and prompt file
|
||||||
|
3. **Renumber files**: All subsequent pages decrement NN by 1
|
||||||
|
- `04-page-tragedy.png` → `03-page-tragedy.png`
|
||||||
|
- Slugs remain unchanged
|
||||||
|
4. Update `storyboard.md` to remove page entry
|
||||||
|
5. Regenerate PDF
|
||||||
|
|
||||||
|
### File Naming Convention
|
||||||
|
|
||||||
|
Files use meaningful slugs for better readability:
|
||||||
|
```
|
||||||
|
NN-cover-[slug].png / NN-page-[slug].png
|
||||||
|
NN-cover-[slug].md / NN-page-[slug].md (in prompts/)
|
||||||
|
```
|
||||||
|
|
||||||
|
Examples:
|
||||||
|
- `00-cover-turing-story.png`
|
||||||
|
- `01-page-early-life.png`
|
||||||
|
- `02-page-cambridge-years.png`
|
||||||
|
- `03-page-enigma-machine.png`
|
||||||
|
|
||||||
|
**Slug rules**:
|
||||||
|
- Derived from page title/content (kebab-case)
|
||||||
|
- Must be unique within the comic
|
||||||
|
- When page content changes significantly, update slug accordingly
|
||||||
|
|
||||||
|
**Renumbering**:
|
||||||
|
- After add/delete, update NN prefix for affected pages
|
||||||
|
- Slug remains unchanged unless content changes
|
||||||
|
- Maintain sequential numbering with no gaps
|
||||||
|
|
||||||
## Style-Specific Guidelines
|
## Style-Specific Guidelines
|
||||||
|
|
||||||
### Ohmsha Style (`--style ohmsha`)
|
### Ohmsha Style (`--style ohmsha`)
|
||||||
|
|
||||||
Additional requirements for educational manga:
|
Additional requirements for educational manga:
|
||||||
- Default characters: Student (大雄), Mentor (哆啦A梦), Antagonist (胖虎)
|
- **Default: Use Doraemon characters directly** - No need to create new characters
|
||||||
- Custom: `--characters "Student:小明,Mentor:教授"`
|
- 大雄 (Nobita): Student role, curious learner
|
||||||
|
- 哆啦A梦 (Doraemon): Mentor role, explains concepts with gadgets
|
||||||
|
- 胖虎 (Gian): Antagonist/challenge role, represents obstacles or misconceptions
|
||||||
|
- 静香 (Shizuka): Supporting role, asks clarifying questions
|
||||||
|
- Custom characters only if explicitly requested: `--characters "Student:小明,Mentor:教授"`
|
||||||
- Must use visual metaphors (gadgets, action scenes) - NO talking heads
|
- Must use visual metaphors (gadgets, action scenes) - NO talking heads
|
||||||
- Page titles: narrative style, not "Page X: Topic"
|
- Page titles: narrative style, not "Page X: Topic"
|
||||||
|
|
||||||
@@ -138,8 +378,9 @@ Additional requirements for educational manga:
|
|||||||
## References
|
## References
|
||||||
|
|
||||||
Detailed templates and guidelines in `references/` directory:
|
Detailed templates and guidelines in `references/` directory:
|
||||||
|
- `analysis-framework.md` - Deep content analysis for comic adaptation
|
||||||
- `character-template.md` - Character definition format and examples
|
- `character-template.md` - Character definition format and examples
|
||||||
- `outline-template.md` - Outline structure and panel breakdown
|
- `storyboard-template.md` - Storyboard structure and panel breakdown
|
||||||
- `ohmsha-guide.md` - Ohmsha manga style specifics
|
- `ohmsha-guide.md` - Ohmsha manga style specifics
|
||||||
- `styles/` - Detailed style definitions
|
- `styles/` - Detailed style definitions
|
||||||
- `layouts/` - Detailed layout definitions
|
- `layouts/` - Detailed layout definitions
|
||||||
|
|||||||
@@ -0,0 +1,152 @@
|
|||||||
|
# Comic Content Analysis Framework
|
||||||
|
|
||||||
|
Deep analysis framework for transforming source content into effective visual storytelling.
|
||||||
|
|
||||||
|
## Purpose
|
||||||
|
|
||||||
|
Before creating a comic, thoroughly analyze the source material to:
|
||||||
|
- Identify the target audience and their needs
|
||||||
|
- Determine what value the comic will deliver
|
||||||
|
- Extract narrative potential for visual storytelling
|
||||||
|
- Plan character arcs and key moments
|
||||||
|
|
||||||
|
## Analysis Dimensions
|
||||||
|
|
||||||
|
### 1. Core Content (Understanding "What")
|
||||||
|
|
||||||
|
**Central Message**
|
||||||
|
- What is the single most important idea readers should take away?
|
||||||
|
- Can you express it in one sentence?
|
||||||
|
|
||||||
|
**Key Concepts**
|
||||||
|
- What are the essential concepts readers must understand?
|
||||||
|
- How should these concepts be visualized?
|
||||||
|
- Which concepts need simplified explanations?
|
||||||
|
|
||||||
|
**Content Structure**
|
||||||
|
- How is the source material organized?
|
||||||
|
- What is the natural narrative arc?
|
||||||
|
- Where are the climax and turning points?
|
||||||
|
|
||||||
|
**Evidence & Examples**
|
||||||
|
- What concrete examples, data, or stories support the main ideas?
|
||||||
|
- Which examples translate well to visual panels?
|
||||||
|
- What can be shown rather than told?
|
||||||
|
|
||||||
|
### 2. Context & Background (Understanding "Why")
|
||||||
|
|
||||||
|
**Source Origin**
|
||||||
|
- Who created this content? What is their perspective?
|
||||||
|
- What was the original purpose?
|
||||||
|
- Is there bias to be aware of?
|
||||||
|
|
||||||
|
**Historical/Cultural Context**
|
||||||
|
- When and where does the story take place?
|
||||||
|
- What background knowledge do readers need?
|
||||||
|
- What period-specific visual elements are required?
|
||||||
|
|
||||||
|
**Underlying Assumptions**
|
||||||
|
- What does the source assume readers already know?
|
||||||
|
- What implicit beliefs or values are present?
|
||||||
|
- Should the comic challenge or reinforce these?
|
||||||
|
|
||||||
|
### 3. Audience Analysis
|
||||||
|
|
||||||
|
**Primary Audience**
|
||||||
|
- Who will read this comic?
|
||||||
|
- What is their existing knowledge level?
|
||||||
|
- What are their interests and motivations?
|
||||||
|
|
||||||
|
**Secondary Audiences**
|
||||||
|
- Who else might benefit from this comic?
|
||||||
|
- How might their needs differ?
|
||||||
|
|
||||||
|
**Reader Questions**
|
||||||
|
- What questions will readers have?
|
||||||
|
- What misconceptions might they bring?
|
||||||
|
- What "aha moments" can we create?
|
||||||
|
|
||||||
|
### 4. Value Proposition
|
||||||
|
|
||||||
|
**Knowledge Value**
|
||||||
|
- What will readers learn?
|
||||||
|
- What new perspectives will they gain?
|
||||||
|
- How will this change their understanding?
|
||||||
|
|
||||||
|
**Emotional Value**
|
||||||
|
- What emotions should readers feel?
|
||||||
|
- What connections will they make with characters?
|
||||||
|
- What will make this memorable?
|
||||||
|
|
||||||
|
**Practical Value**
|
||||||
|
- Can readers apply what they learn?
|
||||||
|
- What actions might this inspire?
|
||||||
|
- What conversations might it spark?
|
||||||
|
|
||||||
|
### 5. Narrative Potential
|
||||||
|
|
||||||
|
**Story Arc Candidates**
|
||||||
|
- What natural narratives exist in the content?
|
||||||
|
- Where is the conflict or tension?
|
||||||
|
- What transformations occur?
|
||||||
|
|
||||||
|
**Character Potential**
|
||||||
|
- Who are the key figures?
|
||||||
|
- What are their motivations and obstacles?
|
||||||
|
- How do they change throughout?
|
||||||
|
|
||||||
|
**Visual Opportunities**
|
||||||
|
- What scenes have strong visual potential?
|
||||||
|
- Where can abstract concepts become concrete images?
|
||||||
|
- What metaphors can be visualized?
|
||||||
|
|
||||||
|
**Dramatic Moments**
|
||||||
|
- What are the breakthrough/revelation moments?
|
||||||
|
- Where are the emotional peaks?
|
||||||
|
- What creates tension and release?
|
||||||
|
|
||||||
|
### 6. Adaptation Considerations
|
||||||
|
|
||||||
|
**What to Keep**
|
||||||
|
- Essential facts and ideas
|
||||||
|
- Key quotes or moments
|
||||||
|
- Core emotional beats
|
||||||
|
|
||||||
|
**What to Simplify**
|
||||||
|
- Complex explanations
|
||||||
|
- Dense technical details
|
||||||
|
- Lengthy descriptions
|
||||||
|
|
||||||
|
**What to Expand**
|
||||||
|
- Brief mentions that deserve more attention
|
||||||
|
- Implied emotions or relationships
|
||||||
|
- Visual details not in source
|
||||||
|
|
||||||
|
**What to Omit**
|
||||||
|
- Tangential information
|
||||||
|
- Redundant examples
|
||||||
|
- Content that doesn't serve the narrative
|
||||||
|
|
||||||
|
## Output Format
|
||||||
|
|
||||||
|
Analysis results should be saved to `analysis.md` with:
|
||||||
|
|
||||||
|
1. **YAML Front Matter**: Metadata (title, topic, time_span, languages, aspect_ratio, page_count)
|
||||||
|
2. **Target Audience**: Primary, secondary, tertiary audiences with their needs
|
||||||
|
3. **Value Proposition**: What readers will gain (knowledge, emotional, practical)
|
||||||
|
4. **Core Themes**: Table with theme, narrative potential, visual opportunity
|
||||||
|
5. **Key Figures & Story Arcs**: Character profiles with arcs, visual identity, key moments
|
||||||
|
6. **Content Signals**: Style and layout recommendations based on content type
|
||||||
|
7. **Recommended Approaches**: Narrative approaches ranked by suitability
|
||||||
|
|
||||||
|
## Analysis Checklist
|
||||||
|
|
||||||
|
Before proceeding to storyboard:
|
||||||
|
|
||||||
|
- [ ] Can I state the core message in one sentence?
|
||||||
|
- [ ] Do I know exactly who will read this comic?
|
||||||
|
- [ ] Have I identified at least 3 ways this comic provides value?
|
||||||
|
- [ ] Are there clear protagonists with compelling arcs?
|
||||||
|
- [ ] Have I found at least 5 visually powerful moments?
|
||||||
|
- [ ] Do I understand what to keep, simplify, expand, and omit?
|
||||||
|
- [ ] Have I identified the emotional peaks and valleys?
|
||||||
+18
-11
@@ -1,23 +1,30 @@
|
|||||||
# Outline Template
|
# Storyboard Template
|
||||||
|
|
||||||
## Outline Document Format
|
## Storyboard Document Format
|
||||||
|
|
||||||
```markdown
|
```markdown
|
||||||
# [Comic Title] - Knowledge Comic Outline
|
---
|
||||||
|
title: "[Comic Title]"
|
||||||
|
topic: "[topic description]"
|
||||||
|
time_span: "[e.g., 1912-1954]"
|
||||||
|
narrative_approach: "[chronological/thematic/character-focused]"
|
||||||
|
recommended_style: "[style name]"
|
||||||
|
recommended_layout: "[layout name or varies]"
|
||||||
|
aspect_ratio: "3:4" # 3:4 (portrait), 4:3 (landscape), 16:9 (widescreen)
|
||||||
|
language: "[zh/en/ja/etc.]"
|
||||||
|
page_count: [N]
|
||||||
|
generated: "YYYY-MM-DD HH:mm"
|
||||||
|
---
|
||||||
|
|
||||||
|
# [Comic Title] - Knowledge Comic Storyboard
|
||||||
|
|
||||||
**Topic**: [topic description]
|
|
||||||
**Time Span**: [e.g., 1912-1954]
|
|
||||||
**Style**: [selected style]
|
|
||||||
**Default Layout**: [selected layout or "varies"]
|
|
||||||
**Page Count**: Cover + N pages
|
|
||||||
**Character Reference**: characters/characters.png
|
**Character Reference**: characters/characters.png
|
||||||
**Generated**: YYYY-MM-DD HH:mm
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Cover
|
## Cover
|
||||||
|
|
||||||
**Filename**: 00-cover.png
|
**Filename**: 00-cover-[slug].png
|
||||||
**Core Message**: [one-liner]
|
**Core Message**: [one-liner]
|
||||||
|
|
||||||
**Visual Design**:
|
**Visual Design**:
|
||||||
@@ -33,7 +40,7 @@
|
|||||||
|
|
||||||
## Page 1 / N
|
## Page 1 / N
|
||||||
|
|
||||||
**Filename**: 01-page.png
|
**Filename**: 01-page-[slug].png
|
||||||
**Layout**: [standard/cinematic/dense/splash/mixed]
|
**Layout**: [standard/cinematic/dense/splash/mixed]
|
||||||
**Narrative Layer**: [Main narrative / Narrator layer / Mixed]
|
**Narrative Layer**: [Main narrative / Narrator layer / Mixed]
|
||||||
**Core Message**: [What this page conveys]
|
**Core Message**: [What this page conveys]
|
||||||
@@ -0,0 +1,116 @@
|
|||||||
|
import { existsSync, readdirSync, readFileSync } from "fs";
|
||||||
|
import { join, basename } from "path";
|
||||||
|
import { PDFDocument } from "pdf-lib";
|
||||||
|
|
||||||
|
interface PageInfo {
|
||||||
|
filename: string;
|
||||||
|
path: string;
|
||||||
|
index: number;
|
||||||
|
promptPath?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
function parseArgs(): { dir: string; output?: string } {
|
||||||
|
const args = process.argv.slice(2);
|
||||||
|
let dir = "";
|
||||||
|
let output: string | undefined;
|
||||||
|
|
||||||
|
for (let i = 0; i < args.length; i++) {
|
||||||
|
if (args[i] === "--output" || args[i] === "-o") {
|
||||||
|
output = args[++i];
|
||||||
|
} else if (!args[i].startsWith("-")) {
|
||||||
|
dir = args[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!dir) {
|
||||||
|
console.error("Usage: bun merge-to-pdf.ts <comic-dir> [--output filename.pdf]");
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
return { dir, output };
|
||||||
|
}
|
||||||
|
|
||||||
|
function findComicPages(dir: string): PageInfo[] {
|
||||||
|
if (!existsSync(dir)) {
|
||||||
|
console.error(`Directory not found: ${dir}`);
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
const files = readdirSync(dir);
|
||||||
|
const pagePattern = /^(\d+)-(cover|page)(-[\w-]+)?\.(png|jpg|jpeg)$/i;
|
||||||
|
const promptsDir = join(dir, "prompts");
|
||||||
|
const hasPrompts = existsSync(promptsDir);
|
||||||
|
|
||||||
|
const pages: PageInfo[] = files
|
||||||
|
.filter((f) => pagePattern.test(f))
|
||||||
|
.map((f) => {
|
||||||
|
const match = f.match(pagePattern);
|
||||||
|
const baseName = f.replace(/\.(png|jpg|jpeg)$/i, "");
|
||||||
|
const promptPath = hasPrompts ? join(promptsDir, `${baseName}.md`) : undefined;
|
||||||
|
|
||||||
|
return {
|
||||||
|
filename: f,
|
||||||
|
path: join(dir, f),
|
||||||
|
index: parseInt(match![1], 10),
|
||||||
|
promptPath: promptPath && existsSync(promptPath) ? promptPath : undefined,
|
||||||
|
};
|
||||||
|
})
|
||||||
|
.sort((a, b) => a.index - b.index);
|
||||||
|
|
||||||
|
if (pages.length === 0) {
|
||||||
|
console.error(`No comic pages found in: ${dir}`);
|
||||||
|
console.error("Expected format: 00-cover-slug.png, 01-page-slug.png, etc.");
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
return pages;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function createPdf(pages: PageInfo[], outputPath: string) {
|
||||||
|
const pdfDoc = await PDFDocument.create();
|
||||||
|
pdfDoc.setAuthor("baoyu-comic");
|
||||||
|
pdfDoc.setSubject("Generated Comic");
|
||||||
|
|
||||||
|
for (const page of pages) {
|
||||||
|
const imageData = readFileSync(page.path);
|
||||||
|
const ext = page.filename.toLowerCase();
|
||||||
|
const image = ext.endsWith(".png")
|
||||||
|
? await pdfDoc.embedPng(imageData)
|
||||||
|
: await pdfDoc.embedJpg(imageData);
|
||||||
|
|
||||||
|
const { width, height } = image;
|
||||||
|
const pdfPage = pdfDoc.addPage([width, height]);
|
||||||
|
|
||||||
|
pdfPage.drawImage(image, {
|
||||||
|
x: 0,
|
||||||
|
y: 0,
|
||||||
|
width,
|
||||||
|
height,
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log(`Added: ${page.filename}${page.promptPath ? " (prompt available)" : ""}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
const pdfBytes = await pdfDoc.save();
|
||||||
|
await Bun.write(outputPath, pdfBytes);
|
||||||
|
|
||||||
|
console.log(`\nCreated: ${outputPath}`);
|
||||||
|
console.log(`Total pages: ${pages.length}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
async function main() {
|
||||||
|
const { dir, output } = parseArgs();
|
||||||
|
const pages = findComicPages(dir);
|
||||||
|
|
||||||
|
const dirName = basename(dir) === "comic" ? basename(join(dir, "..")) : basename(dir);
|
||||||
|
const outputPath = output || join(dir, `${dirName}.pdf`);
|
||||||
|
|
||||||
|
console.log(`Found ${pages.length} pages in: ${dir}\n`);
|
||||||
|
|
||||||
|
await createPdf(pages, outputPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
main().catch((err) => {
|
||||||
|
console.error("Error:", err.message);
|
||||||
|
process.exit(1);
|
||||||
|
});
|
||||||
@@ -38,6 +38,8 @@ Generate hand-drawn style cover images for articles with multiple style options.
|
|||||||
| Option | Description |
|
| Option | Description |
|
||||||
|--------|-------------|
|
|--------|-------------|
|
||||||
| `--style <name>` | Specify cover style (see Style Gallery below) |
|
| `--style <name>` | Specify cover style (see Style Gallery below) |
|
||||||
|
| `--aspect <ratio>` | Aspect ratio: 2.35:1 (cinematic, default), 16:9 (widescreen), 1:1 (social) |
|
||||||
|
| `--lang <code>` | Output language for title text (en, zh, ja, etc.) |
|
||||||
| `--no-title` | Generate cover without title text (visual only) |
|
| `--no-title` | Generate cover without title text (visual only) |
|
||||||
|
|
||||||
## Style Gallery
|
## Style Gallery
|
||||||
@@ -85,34 +87,86 @@ path/to/
|
|||||||
└── cover.png
|
└── cover.png
|
||||||
```
|
```
|
||||||
|
|
||||||
### Without Article Path
|
### Without Article Path (Pasted Content)
|
||||||
|
|
||||||
Save to current working directory:
|
Save to `cover-outputs/YYYY-MM-DD/[topic-slug]/`:
|
||||||
|
|
||||||
```
|
```
|
||||||
./
|
cover-outputs/
|
||||||
├── cover-prompt.md
|
└── 2026-01-17/
|
||||||
└── cover.png
|
└── ai-future/
|
||||||
|
├── source.md # Saved pasted content
|
||||||
|
├── prompts/
|
||||||
|
│ └── cover.md
|
||||||
|
└── cover.png
|
||||||
```
|
```
|
||||||
|
|
||||||
## Workflow
|
## Workflow
|
||||||
|
|
||||||
### Step 1: Analyze Content
|
### Step 1: Analyze Content
|
||||||
|
|
||||||
Extract key information:
|
1. **Save source content** (if not already a file):
|
||||||
- **Main topic**: What is the article about?
|
- If user provides a file path: use as-is
|
||||||
- **Core message**: What's the key takeaway?
|
- If user pastes content: save to `source.md` in target directory
|
||||||
- **Tone**: Serious, playful, inspiring, educational?
|
|
||||||
- **Keywords**: Identify style-signaling words
|
|
||||||
|
|
||||||
### Step 2: Select Style
|
2. **Extract key information**:
|
||||||
|
- **Main topic**: What is the article about?
|
||||||
|
- **Core message**: What's the key takeaway?
|
||||||
|
- **Tone**: Serious, playful, inspiring, educational?
|
||||||
|
- **Keywords**: Identify style-signaling words
|
||||||
|
|
||||||
If `--style` specified, use that style. Otherwise:
|
3. **Language detection**:
|
||||||
1. Scan content for style signals (see Auto Style Selection table)
|
- Detect **source language** from content
|
||||||
2. Match signals to most appropriate style
|
- Detect **user language** from conversation context
|
||||||
3. Default to `elegant` if no clear signals
|
- Note if source_language ≠ user_language (will ask in Step 3)
|
||||||
|
|
||||||
### Step 3: Generate Cover Concept
|
### Step 2: Determine Options
|
||||||
|
|
||||||
|
1. **Style selection**:
|
||||||
|
- If `--style` specified, use that style
|
||||||
|
- Otherwise, scan content for style signals and auto-select 3 candidates
|
||||||
|
- Default to `elegant` if no clear signals
|
||||||
|
|
||||||
|
2. **Aspect ratio**:
|
||||||
|
- If `--aspect` specified, use that ratio
|
||||||
|
- Otherwise, prepare options: 2.35:1 (cinematic), 16:9 (widescreen), 1:1 (social)
|
||||||
|
|
||||||
|
### Step 3: Confirm Options
|
||||||
|
|
||||||
|
**Purpose**: Let user confirm all options in a single step before generation.
|
||||||
|
|
||||||
|
**IMPORTANT**: Present ALL options in a single confirmation step using AskUserQuestion. Do NOT interrupt workflow with multiple separate confirmations.
|
||||||
|
|
||||||
|
**Determine which questions to ask**:
|
||||||
|
|
||||||
|
| Question | When to Ask |
|
||||||
|
|----------|-------------|
|
||||||
|
| Style | Always (required) |
|
||||||
|
| Aspect ratio | Always (offer common options) |
|
||||||
|
| Language | Only if `source_language ≠ user_language` |
|
||||||
|
|
||||||
|
**Present options** (use AskUserQuestion with all applicable questions):
|
||||||
|
|
||||||
|
**Question 1 (Style)** - always:
|
||||||
|
- Style A (recommended): [style name] - [brief description]
|
||||||
|
- Style B: [style name] - [brief description]
|
||||||
|
- Style C: [style name] - [brief description]
|
||||||
|
- Custom: Provide custom style reference
|
||||||
|
|
||||||
|
**Question 2 (Aspect)** - always:
|
||||||
|
- 2.35:1 Cinematic (Recommended) - ultra-wide, dramatic
|
||||||
|
- 16:9 Widescreen - standard video/presentation
|
||||||
|
- 1:1 Square - social media optimized
|
||||||
|
|
||||||
|
**Question 3 (Language)** - only if source ≠ user language:
|
||||||
|
- [Source language] (matches content)
|
||||||
|
- [User language] (your preference)
|
||||||
|
|
||||||
|
**Language handling**:
|
||||||
|
- If source language = user language: Just inform user (e.g., "Title will be in Chinese")
|
||||||
|
- If different: Ask which language to use for title text
|
||||||
|
|
||||||
|
### Step 4: Generate Cover Concept
|
||||||
|
|
||||||
Create a cover image concept based on selected style:
|
Create a cover image concept based on selected style:
|
||||||
|
|
||||||
@@ -126,21 +180,26 @@ Create a cover image concept based on selected style:
|
|||||||
- 1-2 symbolic elements representing the topic
|
- 1-2 symbolic elements representing the topic
|
||||||
- Metaphors or analogies that fit the style
|
- Metaphors or analogies that fit the style
|
||||||
|
|
||||||
### Step 4: Create Prompt File
|
### Step 5: Create Prompt File
|
||||||
|
|
||||||
|
Save prompt to `prompts/cover.md` with confirmed options.
|
||||||
|
|
||||||
|
**All prompts are written in the user's confirmed language preference.**
|
||||||
|
|
||||||
**Prompt Format**:
|
**Prompt Format**:
|
||||||
|
|
||||||
```markdown
|
```markdown
|
||||||
Cover theme: [topic in 2-3 words]
|
Cover theme: [topic in 2-3 words]
|
||||||
Style: [selected style name]
|
Style: [selected style name]
|
||||||
|
Aspect ratio: [confirmed aspect ratio]
|
||||||
|
|
||||||
[If title included:]
|
[If title included:]
|
||||||
Title text: [8 characters or less, in content language]
|
Title text: [8 characters or less, in confirmed language]
|
||||||
Subtitle: [optional, in content language]
|
Subtitle: [optional, in confirmed language]
|
||||||
|
|
||||||
Visual composition:
|
Visual composition:
|
||||||
- Main visual: [description matching style]
|
- Main visual: [description matching style]
|
||||||
- Layout: [positioning based on title inclusion]
|
- Layout: [positioning based on title inclusion and aspect ratio]
|
||||||
- Decorative elements: [style-appropriate elements]
|
- Decorative elements: [style-appropriate elements]
|
||||||
|
|
||||||
Color scheme:
|
Color scheme:
|
||||||
@@ -154,23 +213,25 @@ Style notes: [specific style characteristics to emphasize]
|
|||||||
Note: No title text, pure visual illustration only.
|
Note: No title text, pure visual illustration only.
|
||||||
```
|
```
|
||||||
|
|
||||||
### Step 5: Generate Image
|
### Step 6: Generate Image
|
||||||
|
|
||||||
**Image Generation Skill Selection**:
|
**Image Generation Skill Selection**:
|
||||||
1. Check available image generation skills
|
1. Check available image generation skills
|
||||||
2. If multiple skills available, ask user to choose
|
2. If multiple skills available, ask user to choose
|
||||||
|
|
||||||
**Generation**:
|
**Generation**:
|
||||||
Call selected image generation skill with prompt file and output path.
|
Call selected image generation skill with prompt file, output path, and confirmed aspect ratio.
|
||||||
|
|
||||||
### Step 6: Output Summary
|
### Step 7: Output Summary
|
||||||
|
|
||||||
```
|
```
|
||||||
Cover Image Generated!
|
Cover Image Generated!
|
||||||
|
|
||||||
Topic: [topic]
|
Topic: [topic]
|
||||||
Style: [style name]
|
Style: [style name]
|
||||||
|
Aspect: [aspect ratio]
|
||||||
Title: [cover title] (or "No title - visual only")
|
Title: [cover title] (or "No title - visual only")
|
||||||
|
Language: [confirmed language]
|
||||||
Location: [output path]
|
Location: [output path]
|
||||||
|
|
||||||
Preview the image to verify it matches your expectations.
|
Preview the image to verify it matches your expectations.
|
||||||
@@ -183,4 +244,5 @@ Preview the image to verify it matches your expectations.
|
|||||||
- Visual metaphors work better than literal representations
|
- Visual metaphors work better than literal representations
|
||||||
- Maintain style consistency throughout the cover
|
- Maintain style consistency throughout the cover
|
||||||
- Image generation typically takes 10-30 seconds
|
- Image generation typically takes 10-30 seconds
|
||||||
- Title text language should match content language
|
- Title text uses user's confirmed language preference
|
||||||
|
- Aspect ratio: 2.35:1 for cinematic/dramatic, 16:9 for widescreen, 1:1 for social media
|
||||||
|
|||||||
@@ -12,6 +12,21 @@ Supports:
|
|||||||
- Multi-turn conversations within the same executor instance (`keepSession`)
|
- Multi-turn conversations within the same executor instance (`keepSession`)
|
||||||
- Experimental video generation (`generateVideo`) — Gemini may return an async placeholder; download might require Gemini web UI
|
- Experimental video generation (`generateVideo`) — Gemini may return an async placeholder; download might require Gemini web UI
|
||||||
|
|
||||||
|
## Script Directory
|
||||||
|
|
||||||
|
**Important**: All scripts are located in the `scripts/` subdirectory of this skill.
|
||||||
|
|
||||||
|
**Agent Execution Instructions**:
|
||||||
|
1. Determine this SKILL.md file's directory path as `SKILL_DIR`
|
||||||
|
2. Script path = `${SKILL_DIR}/scripts/<script-name>.ts`
|
||||||
|
3. Replace all `${SKILL_DIR}` in this document with the actual path
|
||||||
|
|
||||||
|
**Script Reference**:
|
||||||
|
| Script | Purpose |
|
||||||
|
|--------|---------|
|
||||||
|
| `scripts/main.ts` | CLI entry point for text/image generation |
|
||||||
|
| `scripts/executor.ts` | Programmatic Gemini executor API |
|
||||||
|
|
||||||
## Quick start
|
## Quick start
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
|
|||||||
@@ -10,40 +10,37 @@ Transform content into professional slide deck images with flexible style option
|
|||||||
## Usage
|
## Usage
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Auto-select style based on content
|
|
||||||
/baoyu-slide-deck path/to/content.md
|
/baoyu-slide-deck path/to/content.md
|
||||||
|
|
||||||
# Specify a style
|
|
||||||
/baoyu-slide-deck path/to/content.md --style sketch-notes
|
/baoyu-slide-deck path/to/content.md --style sketch-notes
|
||||||
/baoyu-slide-deck path/to/content.md --style minimal
|
|
||||||
|
|
||||||
# Target specific audience
|
|
||||||
/baoyu-slide-deck path/to/content.md --audience executives
|
/baoyu-slide-deck path/to/content.md --audience executives
|
||||||
|
|
||||||
# Set output language
|
|
||||||
/baoyu-slide-deck path/to/content.md --lang zh
|
/baoyu-slide-deck path/to/content.md --lang zh
|
||||||
|
|
||||||
# Limit slide count
|
|
||||||
/baoyu-slide-deck path/to/content.md --slides 10
|
/baoyu-slide-deck path/to/content.md --slides 10
|
||||||
|
|
||||||
# Generate outline only (skip image generation)
|
|
||||||
/baoyu-slide-deck path/to/content.md --outline-only
|
/baoyu-slide-deck path/to/content.md --outline-only
|
||||||
|
/baoyu-slide-deck # Then paste content
|
||||||
# Direct content input
|
|
||||||
/baoyu-slide-deck
|
|
||||||
[paste content]
|
|
||||||
|
|
||||||
# Combine options
|
|
||||||
/baoyu-slide-deck path/to/content.md --style storytelling --audience experts --slides 15
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Script Directory
|
||||||
|
|
||||||
|
**Important**: All scripts are located in the `scripts/` subdirectory of this skill.
|
||||||
|
|
||||||
|
**Agent Execution Instructions**:
|
||||||
|
1. Determine this SKILL.md file's directory path as `SKILL_DIR`
|
||||||
|
2. Script path = `${SKILL_DIR}/scripts/<script-name>.ts`
|
||||||
|
3. Replace all `${SKILL_DIR}` in this document with the actual path
|
||||||
|
|
||||||
|
**Script Reference**:
|
||||||
|
| Script | Purpose |
|
||||||
|
|--------|---------|
|
||||||
|
| `scripts/merge-to-pptx.ts` | Merge slides into PowerPoint |
|
||||||
|
| `scripts/merge-to-pdf.ts` | Merge slides into PDF |
|
||||||
|
|
||||||
## Options
|
## Options
|
||||||
|
|
||||||
| Option | Description |
|
| Option | Description |
|
||||||
|--------|-------------|
|
|--------|-------------|
|
||||||
| `--style <name>` | Visual style (see Style Gallery) |
|
| `--style <name>` | Visual style (see Style Gallery) |
|
||||||
| `--audience <type>` | Target audience: beginners, intermediate, experts, executives, general |
|
| `--audience <type>` | Target audience: beginners, intermediate, experts, executives, general |
|
||||||
| `--lang <code>` | Output language for prompts and slides (en, zh, ja, etc.) |
|
| `--lang <code>` | Output language (en, zh, ja, etc.) |
|
||||||
| `--slides <number>` | Target slide count |
|
| `--slides <number>` | Target slide count |
|
||||||
| `--outline-only` | Generate outline only, skip image generation |
|
| `--outline-only` | Generate outline only, skip image generation |
|
||||||
|
|
||||||
@@ -51,33 +48,31 @@ Transform content into professional slide deck images with flexible style option
|
|||||||
|
|
||||||
| Style | Description | Best For |
|
| Style | Description | Best For |
|
||||||
|-------|-------------|----------|
|
|-------|-------------|----------|
|
||||||
| `sketch-notes` | Hand-drawn sketch notes, warm & friendly | Educational, tutorials, knowledge sharing |
|
| `sketch-notes` | Hand-drawn, warm & friendly | Educational, tutorials |
|
||||||
| `blueprint` | Technical blueprint, precise & analytical | Architecture, system design, data analysis |
|
| `blueprint` | Technical, precise & analytical | Architecture, system design |
|
||||||
| `bold-editorial` | Magazine editorial, high-impact & dynamic | Product launches, marketing, keynotes |
|
| `bold-editorial` | Magazine, high-impact & dynamic | Product launches, keynotes |
|
||||||
| `vector-illustration` | Flat vector with black outlines, retro & cute | Creative proposals, children's content, brand showcases |
|
| `vector-illustration` | Flat vector, retro & cute | Creative, children's content |
|
||||||
| `minimal` | Ultra-clean, maximum whitespace | Executive briefings, keynotes, premium brands |
|
| `minimal` | Ultra-clean, maximum whitespace | Executive briefings, premium |
|
||||||
| `storytelling` | Cinematic, full-bleed visuals | Narratives, case studies, emotional impact |
|
| `storytelling` | Cinematic, full-bleed visuals | Narratives, case studies |
|
||||||
| `warm` | Soft gradients, wellness aesthetic | Lifestyle, wellness, personal development |
|
| `warm` | Soft gradients, wellness aesthetic | Lifestyle, personal development |
|
||||||
| `notion` (Default) | SaaS dashboard, clean data focus | Product demos, SaaS, productivity tools |
|
| `notion` (Default) | SaaS dashboard, clean data focus | Product demos, productivity |
|
||||||
| `corporate` | Navy/gold, professional business | Investor decks, client proposals, quarterly reports |
|
| `corporate` | Navy/gold, professional | Investor decks, proposals |
|
||||||
| `playful` | Vibrant colors, dynamic rounded shapes | Workshops, training, creative pitches |
|
| `playful` | Vibrant, dynamic shapes | Workshops, training |
|
||||||
|
|
||||||
Detailed style definitions: `references/styles/<style>.md`
|
|
||||||
|
|
||||||
## Auto Style Selection
|
## Auto Style Selection
|
||||||
|
|
||||||
| Content Signals | Selected Style |
|
| Content Signals | Selected Style |
|
||||||
|-----------------|----------------|
|
|-----------------|----------------|
|
||||||
| tutorial, learn, education, guide, intro, beginner | `sketch-notes` |
|
| tutorial, learn, education, guide, intro, beginner | `sketch-notes` |
|
||||||
| architecture, system, data, analysis, technical, engineering | `blueprint` |
|
| architecture, system, data, analysis, technical | `blueprint` |
|
||||||
| launch, marketing, brand, keynote, impact, showcase | `bold-editorial` |
|
| launch, marketing, brand, keynote, impact | `bold-editorial` |
|
||||||
| creative, children, kids, cute, illustration, retro | `vector-illustration` |
|
| creative, children, kids, cute, illustration | `vector-illustration` |
|
||||||
| executive, minimal, clean, simple, elegant | `minimal` |
|
| executive, minimal, clean, simple, elegant | `minimal` |
|
||||||
| story, journey, case study, narrative, emotional | `storytelling` |
|
| story, journey, case study, narrative, emotional | `storytelling` |
|
||||||
| wellness, lifestyle, personal, growth, mindfulness | `warm` |
|
| wellness, lifestyle, personal, growth, mindfulness | `warm` |
|
||||||
| saas, product, dashboard, metrics, productivity | `notion` |
|
| saas, product, dashboard, metrics, productivity | `notion` |
|
||||||
| investor, quarterly, business, corporate, proposal, client | `corporate` |
|
| investor, quarterly, business, corporate, proposal | `corporate` |
|
||||||
| workshop, training, fun, playful, energetic, team | `playful` |
|
| workshop, training, fun, playful, energetic | `playful` |
|
||||||
| Default | `notion` |
|
| Default | `notion` |
|
||||||
|
|
||||||
## Design Philosophy
|
## Design Philosophy
|
||||||
@@ -91,209 +86,82 @@ This deck is designed for **reading and sharing**, not live presentation:
|
|||||||
## File Management
|
## File Management
|
||||||
|
|
||||||
### With Content Path
|
### With Content Path
|
||||||
|
|
||||||
Save to `slide-deck/` subdirectory in the same folder as the content:
|
|
||||||
|
|
||||||
```
|
```
|
||||||
content-dir/
|
content-dir/
|
||||||
├── source-content.md
|
├── source-content.md
|
||||||
└── slide-deck/
|
└── slide-deck/
|
||||||
├── outline.md
|
├── outline.md
|
||||||
├── prompts/
|
├── prompts/
|
||||||
│ ├── 01-slide-cover.md
|
│ └── 01-slide-cover.md, 02-slide-{slug}.md, ...
|
||||||
│ ├── 02-slide-{slug}.md
|
├── 01-slide-cover.png, 02-slide-{slug}.png, ...
|
||||||
│ └── ...
|
├── {topic-slug}.pptx
|
||||||
├── 01-slide-cover.png
|
└── {topic-slug}.pdf
|
||||||
├── 02-slide-{slug}.png
|
|
||||||
└── ...
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### Without Content Path
|
### Without Content Path (Pasted Content)
|
||||||
|
|
||||||
Save to `slide-outputs/YYYY-MM-DD/[topic-slug]/`:
|
|
||||||
|
|
||||||
```
|
```
|
||||||
slide-outputs/
|
slide-outputs/YYYY-MM-DD/{topic-slug}/
|
||||||
└── 2026-01-17/
|
├── source.md
|
||||||
└── ai-future-trends/
|
├── outline.md
|
||||||
├── outline.md
|
├── prompts/
|
||||||
├── prompts/
|
├── *.png
|
||||||
│ ├── 01-slide-cover.md
|
├── {topic-slug}.pptx
|
||||||
│ └── ...
|
└── {topic-slug}.pdf
|
||||||
├── 01-slide-cover.png
|
|
||||||
└── ...
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## Workflow
|
## Workflow
|
||||||
|
|
||||||
### Step 1: Analyze Content & Determine Settings
|
### Step 1: Analyze Content
|
||||||
|
|
||||||
1. Read source material
|
1. Save source content (if pasted, save as `source.md`)
|
||||||
2. **Style selection**:
|
2. Follow `references/analysis-framework.md` for deep content analysis
|
||||||
- If `--style` specified, use that style
|
3. Determine style (use `--style` or auto-select from signals)
|
||||||
- Otherwise, scan for style signals and auto-select
|
4. Detect languages (source vs. user preference)
|
||||||
3. **Language detection**:
|
5. Plan slide count (`--slides` or dynamic)
|
||||||
- If `--lang` specified, use that language for all prompts and slide text
|
|
||||||
- Otherwise, detect language from source material
|
|
||||||
- If uncertain (mixed languages or unclear), ask user to confirm
|
|
||||||
4. **Slide count**:
|
|
||||||
- If `--slides` specified, use that count
|
|
||||||
- Otherwise, dynamic based on content structure
|
|
||||||
|
|
||||||
### Step 2: Generate Outline with Style Instructions
|
### Step 2: Generate Outline Variants
|
||||||
|
|
||||||
Create outline with structured STYLE_INSTRUCTIONS block:
|
1. Generate 3 style variant outlines based on content analysis
|
||||||
|
2. Follow `references/outline-template.md` for structure
|
||||||
|
3. Save as `outline-{style}.md` for each variant
|
||||||
|
|
||||||
```markdown
|
### Step 3: User Confirmation
|
||||||
# Slide Deck Outline
|
|
||||||
|
|
||||||
**Topic**: [topic description]
|
**Single AskUserQuestion with all applicable options:**
|
||||||
**Style**: [selected style]
|
|
||||||
**Audience**: [target audience]
|
|
||||||
**Language**: [output language]
|
|
||||||
**Slide Count**: N slides
|
|
||||||
**Generated**: YYYY-MM-DD HH:mm
|
|
||||||
|
|
||||||
---
|
| Question | When to Ask |
|
||||||
|
|----------|-------------|
|
||||||
|
| Style variant | Always (3 options + custom) |
|
||||||
|
| Language | Only if source ≠ user language |
|
||||||
|
|
||||||
<STYLE_INSTRUCTIONS>
|
After selection:
|
||||||
Design Aesthetic: [2-3 sentence description from style file]
|
- Copy selected `outline-{style}.md` to `outline.md`
|
||||||
|
- Regenerate in different language if requested
|
||||||
|
- User may edit `outline.md` for fine-tuning
|
||||||
|
|
||||||
Background:
|
If `--outline-only`, stop here.
|
||||||
Color: [Name] ([Hex])
|
|
||||||
Texture: [description]
|
|
||||||
|
|
||||||
Typography:
|
|
||||||
Primary Font: [detailed description for image generation]
|
|
||||||
Secondary Font: [detailed description for image generation]
|
|
||||||
|
|
||||||
Color Palette:
|
|
||||||
Primary Text: [Name] ([Hex]) - [usage]
|
|
||||||
Background: [Name] ([Hex]) - [usage]
|
|
||||||
Accent 1: [Name] ([Hex]) - [usage]
|
|
||||||
Accent 2: [Name] ([Hex]) - [usage]
|
|
||||||
|
|
||||||
Visual Elements:
|
|
||||||
- [element 1 with rendering guidance]
|
|
||||||
- [element 2 with rendering guidance]
|
|
||||||
- ...
|
|
||||||
|
|
||||||
Style Rules:
|
|
||||||
Do: [guidelines from style file]
|
|
||||||
Don't: [anti-patterns from style file]
|
|
||||||
</STYLE_INSTRUCTIONS>
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Slide 1 of N
|
|
||||||
|
|
||||||
**Type**: Cover
|
|
||||||
**Filename**: 01-slide-cover.png
|
|
||||||
|
|
||||||
// NARRATIVE GOAL
|
|
||||||
[What this slide achieves in the story arc]
|
|
||||||
|
|
||||||
// KEY CONTENT
|
|
||||||
Headline: [main title]
|
|
||||||
Sub-headline: [supporting tagline]
|
|
||||||
|
|
||||||
// VISUAL
|
|
||||||
[Detailed visual description - specific elements, composition, mood]
|
|
||||||
|
|
||||||
// LAYOUT
|
|
||||||
[Composition, hierarchy, spatial arrangement]
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Slide 2 of N
|
|
||||||
|
|
||||||
**Type**: Content
|
|
||||||
**Filename**: 02-slide-{slug}.png
|
|
||||||
|
|
||||||
// NARRATIVE GOAL
|
|
||||||
[What this slide achieves in the story arc]
|
|
||||||
|
|
||||||
// KEY CONTENT
|
|
||||||
Headline: [main message - narrative, not label]
|
|
||||||
Sub-headline: [supporting context]
|
|
||||||
Body:
|
|
||||||
- [point 1 with specific detail]
|
|
||||||
- [point 2 with specific detail]
|
|
||||||
- [point 3 with specific detail]
|
|
||||||
|
|
||||||
// VISUAL
|
|
||||||
[Detailed visual description]
|
|
||||||
|
|
||||||
// LAYOUT
|
|
||||||
[Composition, hierarchy, spatial arrangement]
|
|
||||||
|
|
||||||
---
|
|
||||||
...
|
|
||||||
|
|
||||||
## Slide N of N
|
|
||||||
|
|
||||||
**Type**: Back Cover
|
|
||||||
**Filename**: {NN}-slide-back-cover.png
|
|
||||||
|
|
||||||
// NARRATIVE GOAL
|
|
||||||
[Meaningful closing - not just "thank you"]
|
|
||||||
|
|
||||||
// KEY CONTENT
|
|
||||||
Headline: [memorable closing statement or call-to-action]
|
|
||||||
Body: [optional summary points or next steps]
|
|
||||||
|
|
||||||
// VISUAL
|
|
||||||
[Visual that reinforces the core message]
|
|
||||||
|
|
||||||
// LAYOUT
|
|
||||||
[Clean, impactful composition]
|
|
||||||
```
|
|
||||||
|
|
||||||
### Step 3: Save Outline
|
|
||||||
|
|
||||||
Save outline as `outline.md` in the output directory.
|
|
||||||
|
|
||||||
If `--outline-only` is specified, stop here.
|
|
||||||
|
|
||||||
### Step 4: Generate Prompts
|
### Step 4: Generate Prompts
|
||||||
|
|
||||||
Create prompt file per slide in `prompts/` directory:
|
|
||||||
|
|
||||||
1. Read `references/base-prompt.md`
|
1. Read `references/base-prompt.md`
|
||||||
2. Combine with style-specific instructions from outline
|
2. Combine with style instructions from outline
|
||||||
3. Add slide-specific content from outline
|
3. Add slide-specific content
|
||||||
4. Save as `01-slide-cover.md`, `02-slide-{slug}.md`, etc.
|
4. Save to `prompts/` directory
|
||||||
|
|
||||||
### Step 5: Generate Images
|
### Step 5: Generate Images
|
||||||
|
|
||||||
**Image Generation Skill Selection**:
|
1. Select available image generation skill
|
||||||
1. Check available image generation skills
|
2. Generate session ID: `slides-{topic-slug}-{timestamp}`
|
||||||
2. If multiple skills available, ask user to choose
|
3. Generate each slide with same session ID
|
||||||
|
4. Report progress: "Generated X/N"
|
||||||
|
|
||||||
**Session Management**:
|
### Step 6: Merge to PPTX and PDF
|
||||||
If the image generation skill supports `--sessionId`:
|
|
||||||
1. Generate a unique session ID at the start (e.g., `slides-{topic-slug}-{timestamp}`)
|
|
||||||
2. Use the same session ID for all slides in the series
|
|
||||||
3. This ensures style consistency across all generated slides
|
|
||||||
|
|
||||||
**Generation Flow**:
|
|
||||||
1. Call selected image generation skill with prompt file, output path, and session ID
|
|
||||||
2. Confirm generation success
|
|
||||||
3. Report progress: "Generated X/N"
|
|
||||||
4. Continue to next
|
|
||||||
|
|
||||||
### Step 6: Merge to PPTX
|
|
||||||
|
|
||||||
After all images are generated, merge them into a PowerPoint file:
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
npx -y bun skills/baoyu-slide-deck/scripts/merge-to-pptx.ts <slide-deck-dir>
|
npx -y bun ${SKILL_DIR}/scripts/merge-to-pptx.ts <slide-deck-dir>
|
||||||
|
npx -y bun ${SKILL_DIR}/scripts/merge-to-pdf.ts <slide-deck-dir>
|
||||||
```
|
```
|
||||||
|
|
||||||
This creates `{topic-slug}.pptx` in the slide deck directory with:
|
|
||||||
- All images as full-bleed 16:9 slides
|
|
||||||
- Prompt content added as speaker notes (from `prompts/` directory)
|
|
||||||
|
|
||||||
### Step 7: Output Summary
|
### Step 7: Output Summary
|
||||||
|
|
||||||
```
|
```
|
||||||
@@ -301,76 +169,41 @@ Slide Deck Complete!
|
|||||||
|
|
||||||
Topic: [topic]
|
Topic: [topic]
|
||||||
Style: [style name]
|
Style: [style name]
|
||||||
Audience: [audience type]
|
|
||||||
Location: [directory path]
|
Location: [directory path]
|
||||||
Slides: N total
|
Slides: N total
|
||||||
|
|
||||||
- 01-slide-cover.png ✓ Cover
|
- 01-slide-cover.png ✓ Cover
|
||||||
- 02-slide-intro.png ✓ Content
|
- 02-slide-intro.png ✓ Content
|
||||||
- 03-slide-main-point.png ✓ Content
|
|
||||||
- ...
|
- ...
|
||||||
- {NN}-slide-back-cover.png ✓ Back Cover
|
- {NN}-slide-back-cover.png ✓ Back Cover
|
||||||
|
|
||||||
Outline: outline.md
|
Outline: outline.md
|
||||||
PPTX: {topic-slug}.pptx
|
PPTX: {topic-slug}.pptx
|
||||||
|
PDF: {topic-slug}.pdf
|
||||||
```
|
```
|
||||||
|
|
||||||
## Content Rules
|
## Slide Modification
|
||||||
|
|
||||||
1. **Respect reader attention** -
|
See `references/modification-guide.md` for:
|
||||||
2. **Data traceability** - All statistics must include source attribution
|
- Edit single slide workflow
|
||||||
3. **Self-contained prompts** - Every detail in the image prompt, no external references
|
- Add new slide (with renumbering)
|
||||||
4. **No placeholders** - Every element must be fully specified
|
- Delete slide (with renumbering)
|
||||||
|
- File naming conventions
|
||||||
|
|
||||||
## Style Rules
|
## References
|
||||||
|
|
||||||
1. **Narrative headlines** - Headlines tell the story, not label the content
|
| File | Content |
|
||||||
- Bad: "Key Statistics"
|
|------|---------|
|
||||||
- Good: "Usage doubled in 6 months"
|
| `references/analysis-framework.md` | Deep content analysis for presentations |
|
||||||
|
| `references/outline-template.md` | Outline structure and STYLE_INSTRUCTIONS format |
|
||||||
2. **Avoid AI clichés** - No "dive into", "explore", "journey", "let's"
|
| `references/modification-guide.md` | Edit, add, delete slide workflows |
|
||||||
|
| `references/content-rules.md` | Content and style guidelines |
|
||||||
3. **Meaningful back cover** - Not just "Thank you"
|
| `references/base-prompt.md` | Base prompt for image generation |
|
||||||
- Include call-to-action, key takeaway, or memorable closing
|
| `references/styles/<style>.md` | Full style specifications |
|
||||||
|
|
||||||
4. **Consistent visual language** - Same icons, colors, layouts throughout
|
|
||||||
|
|
||||||
## Slide Structure
|
|
||||||
|
|
||||||
1. **Cover (Slide 1)**: Title, visual hook, topic introduction
|
|
||||||
2. **Content (Middle)**: Key points, data, explanations - dynamic count based on content
|
|
||||||
3. **Back Cover (Final)**: Summary, call-to-action, or memorable closing
|
|
||||||
|
|
||||||
## Key Specifications
|
|
||||||
|
|
||||||
- **Aspect Ratio**: 16:9 (landscape)
|
|
||||||
- **Slide Count**: Dynamic based on content
|
|
||||||
- **Required Slides**: Cover + Back Cover minimum
|
|
||||||
- **No slide numbers, footers, or logos**
|
|
||||||
- **Language**: Priority order: `--lang` option → source material language → ask user if uncertain
|
|
||||||
- **Tone**: Direct, confident language (avoid AI-sounding phrases)
|
|
||||||
|
|
||||||
## Style Reference Details
|
|
||||||
|
|
||||||
| Style | Description |
|
|
||||||
|-------|-------------|
|
|
||||||
| `sketch-notes` | Hand-drawn feel, soft brush strokes, warm off-white background, conceptual icons |
|
|
||||||
| `blueprint` | Technical schematics, grid texture, precise lines, engineering blue tones |
|
|
||||||
| `bold-editorial` | High contrast, bold typography, dark backgrounds, magazine-level impact |
|
|
||||||
| `vector-illustration` | Flat vector, black outlines, retro colors, toy model aesthetic |
|
|
||||||
| `minimal` | Maximum whitespace, single accent color, clean sans-serif, zen-like |
|
|
||||||
| `storytelling` | Full-bleed imagery, cinematic compositions, emotional photography |
|
|
||||||
| `warm` | Soft gradients, rounded shapes, wellness palette, approachable |
|
|
||||||
| `notion` | Dashboard aesthetic, clean data viz, SaaS-inspired, productivity focus |
|
|
||||||
| `corporate` | Navy/gold palette, structured layouts, professional iconography, business polish |
|
|
||||||
| `playful` | Vibrant coral/teal/yellow, rounded shapes, dynamic layouts, energetic |
|
|
||||||
|
|
||||||
Full style specifications: `references/styles/<style>.md`
|
|
||||||
|
|
||||||
## Notes
|
## Notes
|
||||||
|
|
||||||
- Image generation typically takes 10-30 seconds per slide
|
- Image generation: 10-30 seconds per slide
|
||||||
- Auto-retry once on generation failure
|
- Auto-retry once on generation failure
|
||||||
- Use stylized alternatives for sensitive public figures
|
- Use stylized alternatives for sensitive public figures
|
||||||
- Output language matches input content language (or `--lang`)
|
- Maintain style consistency via session ID
|
||||||
- Maintain style consistency across all slides in deck
|
|
||||||
|
|||||||
@@ -0,0 +1,161 @@
|
|||||||
|
# Presentation Analysis Framework
|
||||||
|
|
||||||
|
Deep content analysis for effective slide deck creation.
|
||||||
|
|
||||||
|
## 1. Message Hierarchy
|
||||||
|
|
||||||
|
Identify the core message structure before designing slides.
|
||||||
|
|
||||||
|
### Core Message (One Sentence)
|
||||||
|
- What is the single most important takeaway?
|
||||||
|
- If the audience remembers only one thing, what should it be?
|
||||||
|
- Can you state it in ≤15 words?
|
||||||
|
|
||||||
|
### Supporting Points (3-5 Maximum)
|
||||||
|
- What evidence supports the core message?
|
||||||
|
- What sub-topics must be covered?
|
||||||
|
- Prioritize by audience relevance, not source order
|
||||||
|
|
||||||
|
### Call-to-Action
|
||||||
|
- What should the audience DO after viewing?
|
||||||
|
- Is it clear, specific, and achievable?
|
||||||
|
- Where does it appear (slide position)?
|
||||||
|
|
||||||
|
## 2. Audience Decision Matrix
|
||||||
|
|
||||||
|
| Question | Analysis |
|
||||||
|
|----------|----------|
|
||||||
|
| Who is the primary audience? | [Role, expertise level, relationship to topic] |
|
||||||
|
| What do they currently believe? | [Existing knowledge, assumptions, biases] |
|
||||||
|
| What decision do we want them to make? | [Specific action or conclusion] |
|
||||||
|
| What barriers exist? | [Objections, concerns, missing information] |
|
||||||
|
| What evidence will convince them? | [Data types, credibility sources, emotional hooks] |
|
||||||
|
|
||||||
|
### Audience Adaptation
|
||||||
|
|
||||||
|
| Audience Type | Content Focus | Visual Treatment |
|
||||||
|
|---------------|---------------|------------------|
|
||||||
|
| Executives | Outcomes, ROI, strategic impact | High-level, clean, data highlights |
|
||||||
|
| Technical | Architecture, implementation, specs | Detailed diagrams, code, schematics |
|
||||||
|
| General | Benefits, stories, relatability | Visual metaphors, simple charts |
|
||||||
|
| Investors | Market size, traction, team | Growth charts, milestones, comparisons |
|
||||||
|
| Learners | Step-by-step, examples, practice | Progressive reveals, exercises |
|
||||||
|
|
||||||
|
## 3. Visual Opportunity Map
|
||||||
|
|
||||||
|
Identify which content benefits from visualization.
|
||||||
|
|
||||||
|
### Content-to-Visual Mapping
|
||||||
|
|
||||||
|
| Content Type | Visual Treatment | Example |
|
||||||
|
|--------------|------------------|---------|
|
||||||
|
| Comparisons | Side-by-side, before/after | Feature comparison table |
|
||||||
|
| Processes | Flow diagrams, numbered steps | Workflow illustration |
|
||||||
|
| Hierarchies | Org charts, pyramids, trees | Organizational structure |
|
||||||
|
| Timelines | Horizontal/vertical timelines | Project milestones |
|
||||||
|
| Statistics | Charts, highlighted numbers | Key metrics with context |
|
||||||
|
| Concepts | Icons, metaphors, illustrations | Abstract idea visualization |
|
||||||
|
| Relationships | Venn diagrams, networks | Ecosystem or dependencies |
|
||||||
|
| Lists | Structured grids, icon rows | Feature bullets with icons |
|
||||||
|
|
||||||
|
### Visual Priority
|
||||||
|
|
||||||
|
Rate each piece of content:
|
||||||
|
- **Must Visualize**: Complex data, key differentiators, memorable moments
|
||||||
|
- **Should Visualize**: Supporting evidence, secondary points
|
||||||
|
- **Text Only**: Simple statements, transitions, minor details
|
||||||
|
|
||||||
|
## 4. Presentation Flow
|
||||||
|
|
||||||
|
Structure for impact and retention.
|
||||||
|
|
||||||
|
### Opening (First 2-3 Slides)
|
||||||
|
|
||||||
|
| Element | Purpose |
|
||||||
|
|---------|---------|
|
||||||
|
| Hook | Capture attention (surprising stat, question, story) |
|
||||||
|
| Context | Why this matters now |
|
||||||
|
| Preview | What audience will learn/gain |
|
||||||
|
|
||||||
|
### Middle (Content Slides)
|
||||||
|
|
||||||
|
| Pattern | When to Use |
|
||||||
|
|---------|-------------|
|
||||||
|
| Problem → Solution | Introducing new products/ideas |
|
||||||
|
| Situation → Complication → Resolution | Complex business cases |
|
||||||
|
| What → Why → How | Educational content |
|
||||||
|
| Past → Present → Future | Transformation stories |
|
||||||
|
| Claim → Evidence → Implication | Data-driven arguments |
|
||||||
|
|
||||||
|
### Closing (Final 2-3 Slides)
|
||||||
|
|
||||||
|
| Element | Purpose |
|
||||||
|
|---------|---------|
|
||||||
|
| Synthesis | Tie back to core message |
|
||||||
|
| Call-to-Action | Clear next steps |
|
||||||
|
| Memorable Close | Resonant quote, image, or statement |
|
||||||
|
|
||||||
|
### Transitions
|
||||||
|
|
||||||
|
- Each slide should answer: "What comes next?"
|
||||||
|
- Use narrative connectors between sections
|
||||||
|
- Build logical progression, not topic jumps
|
||||||
|
|
||||||
|
## 5. Content Adaptation
|
||||||
|
|
||||||
|
Decide what to keep, transform, or omit.
|
||||||
|
|
||||||
|
### Keep (High Value)
|
||||||
|
- Core arguments and evidence
|
||||||
|
- Unique insights or data
|
||||||
|
- Audience-relevant examples
|
||||||
|
- Memorable quotes or statistics
|
||||||
|
|
||||||
|
### Simplify (Medium Value)
|
||||||
|
- Technical details → Visual summaries
|
||||||
|
- Long explanations → Bullet hierarchies
|
||||||
|
- Multiple examples → Best 1-2 examples
|
||||||
|
- Background context → Brief framing
|
||||||
|
|
||||||
|
### Visualize (Transform)
|
||||||
|
- Data tables → Charts or highlighted numbers
|
||||||
|
- Process descriptions → Flow diagrams
|
||||||
|
- Comparisons in text → Side-by-side visuals
|
||||||
|
- Abstract concepts → Concrete metaphors
|
||||||
|
|
||||||
|
### Omit (Low Value)
|
||||||
|
- Tangential information
|
||||||
|
- Redundant examples
|
||||||
|
- Excessive caveats
|
||||||
|
- Background the audience already knows
|
||||||
|
|
||||||
|
## 6. Analysis Checklist
|
||||||
|
|
||||||
|
Before outline creation, confirm:
|
||||||
|
|
||||||
|
### Message Clarity
|
||||||
|
- [ ] Core message stated in one sentence
|
||||||
|
- [ ] 3-5 supporting points identified
|
||||||
|
- [ ] Call-to-action defined
|
||||||
|
|
||||||
|
### Audience Fit
|
||||||
|
- [ ] Primary audience identified
|
||||||
|
- [ ] Existing beliefs mapped
|
||||||
|
- [ ] Desired decision clear
|
||||||
|
- [ ] Evidence matches audience needs
|
||||||
|
|
||||||
|
### Visual Planning
|
||||||
|
- [ ] Key visualizations identified
|
||||||
|
- [ ] Chart/diagram types selected
|
||||||
|
- [ ] Visual priority assigned
|
||||||
|
|
||||||
|
### Flow Design
|
||||||
|
- [ ] Opening hook defined
|
||||||
|
- [ ] Middle pattern selected
|
||||||
|
- [ ] Closing approach planned
|
||||||
|
- [ ] Transitions considered
|
||||||
|
|
||||||
|
### Content Decisions
|
||||||
|
- [ ] Keep/simplify/visualize/omit applied
|
||||||
|
- [ ] Source material fully processed
|
||||||
|
- [ ] No important content overlooked
|
||||||
@@ -0,0 +1,95 @@
|
|||||||
|
# Content & Style Rules
|
||||||
|
|
||||||
|
Guidelines for slide deck content quality and style consistency.
|
||||||
|
|
||||||
|
## Content Rules
|
||||||
|
|
||||||
|
### 1. Respect Reader Attention
|
||||||
|
- Each slide should communicate ONE main idea
|
||||||
|
- Remove redundant information
|
||||||
|
- Prioritize clarity over comprehensiveness
|
||||||
|
|
||||||
|
### 2. Data Traceability
|
||||||
|
- All statistics must include source attribution
|
||||||
|
- Cite sources directly on slides with data
|
||||||
|
- Use specific numbers over vague claims
|
||||||
|
|
||||||
|
### 3. Self-Contained Prompts
|
||||||
|
- Every detail must be in the image prompt
|
||||||
|
- No external references (e.g., "like slide 2")
|
||||||
|
- Include all colors, layouts, and content explicitly
|
||||||
|
|
||||||
|
### 4. No Placeholders
|
||||||
|
- Every element must be fully specified
|
||||||
|
- No "[insert data here]" or "TBD"
|
||||||
|
- All text content finalized before generation
|
||||||
|
|
||||||
|
## Style Rules
|
||||||
|
|
||||||
|
### 1. Narrative Headlines
|
||||||
|
Headlines tell the story, not label the content.
|
||||||
|
|
||||||
|
| Bad | Good |
|
||||||
|
|-----|------|
|
||||||
|
| "Key Statistics" | "Usage doubled in 6 months" |
|
||||||
|
| "Our Solution" | "One platform replaces five tools" |
|
||||||
|
| "Benefits" | "Teams save 10 hours weekly" |
|
||||||
|
|
||||||
|
### 2. Avoid AI Clichés
|
||||||
|
Remove these patterns:
|
||||||
|
- "Dive into", "explore", "journey"
|
||||||
|
- "Let's look at", "let me show you"
|
||||||
|
- "Exciting", "amazing", "revolutionary"
|
||||||
|
- "In conclusion", "to summarize"
|
||||||
|
|
||||||
|
### 3. Meaningful Back Cover
|
||||||
|
Not just "Thank you" or "Questions?"
|
||||||
|
|
||||||
|
Include one of:
|
||||||
|
- Clear call-to-action
|
||||||
|
- Memorable key takeaway
|
||||||
|
- Thought-provoking closing statement
|
||||||
|
- Contact information with purpose
|
||||||
|
|
||||||
|
### 4. Consistent Visual Language
|
||||||
|
Throughout the deck:
|
||||||
|
- Same icon style
|
||||||
|
- Same color usage patterns
|
||||||
|
- Same layout grid system
|
||||||
|
- Same typography hierarchy
|
||||||
|
|
||||||
|
## Slide Structure
|
||||||
|
|
||||||
|
| Position | Type | Purpose |
|
||||||
|
|----------|------|---------|
|
||||||
|
| 1 | Cover | Title, visual hook, topic introduction |
|
||||||
|
| 2 to N-1 | Content | Key points, data, explanations |
|
||||||
|
| N | Back Cover | Summary, call-to-action, memorable close |
|
||||||
|
|
||||||
|
## Key Specifications
|
||||||
|
|
||||||
|
| Specification | Value |
|
||||||
|
|---------------|-------|
|
||||||
|
| Aspect Ratio | 16:9 (landscape) |
|
||||||
|
| Slide Count | Dynamic based on content |
|
||||||
|
| Required Slides | Cover + Back Cover minimum |
|
||||||
|
| Footers | None (no slide numbers, logos) |
|
||||||
|
| Language Priority | `--lang` → source language → ask user |
|
||||||
|
| Tone | Direct, confident (avoid AI phrases) |
|
||||||
|
|
||||||
|
## Style Quick Reference
|
||||||
|
|
||||||
|
| Style | Visual Summary |
|
||||||
|
|-------|----------------|
|
||||||
|
| `sketch-notes` | Hand-drawn, warm off-white, conceptual icons |
|
||||||
|
| `blueprint` | Technical schematics, grid texture, blue tones |
|
||||||
|
| `bold-editorial` | High contrast, dark backgrounds, magazine impact |
|
||||||
|
| `vector-illustration` | Flat vector, black outlines, retro colors |
|
||||||
|
| `minimal` | Maximum whitespace, single accent, zen-like |
|
||||||
|
| `storytelling` | Full-bleed imagery, cinematic, emotional |
|
||||||
|
| `warm` | Soft gradients, rounded shapes, wellness palette |
|
||||||
|
| `notion` | Dashboard aesthetic, clean data viz, SaaS-inspired |
|
||||||
|
| `corporate` | Navy/gold, structured layouts, business polish |
|
||||||
|
| `playful` | Vibrant coral/teal/yellow, dynamic, energetic |
|
||||||
|
|
||||||
|
Full style specifications: `references/styles/<style>.md`
|
||||||
@@ -0,0 +1,85 @@
|
|||||||
|
# Slide Modification Guide
|
||||||
|
|
||||||
|
Workflows for modifying individual slides after initial generation.
|
||||||
|
|
||||||
|
## Edit Single Slide
|
||||||
|
|
||||||
|
Regenerate a specific slide with modified content:
|
||||||
|
|
||||||
|
1. Identify slide to edit (e.g., `03-slide-key-findings.png`)
|
||||||
|
2. Update prompt in `prompts/03-slide-key-findings.md`
|
||||||
|
3. If content changes significantly, update slug in filename
|
||||||
|
4. Regenerate image using same session ID
|
||||||
|
5. Regenerate PPTX and PDF
|
||||||
|
|
||||||
|
## Add New Slide
|
||||||
|
|
||||||
|
Insert a new slide at specified position:
|
||||||
|
|
||||||
|
1. Specify insertion position (e.g., after slide 3)
|
||||||
|
2. Create new prompt with appropriate slug (e.g., `04-slide-new-section.md`)
|
||||||
|
3. Generate new slide image
|
||||||
|
4. **Renumber files**: All subsequent slides increment NN by 1
|
||||||
|
- `04-slide-conclusion.png` → `05-slide-conclusion.png`
|
||||||
|
- Slugs remain unchanged
|
||||||
|
5. Update `outline.md` with new slide entry
|
||||||
|
6. Regenerate PPTX and PDF
|
||||||
|
|
||||||
|
## Delete Slide
|
||||||
|
|
||||||
|
Remove a slide and renumber:
|
||||||
|
|
||||||
|
1. Identify slide to delete (e.g., `03-slide-key-findings.png`)
|
||||||
|
2. Remove image file and prompt file
|
||||||
|
3. **Renumber files**: All subsequent slides decrement NN by 1
|
||||||
|
- `04-slide-conclusion.png` → `03-slide-conclusion.png`
|
||||||
|
- Slugs remain unchanged
|
||||||
|
4. Update `outline.md` to remove slide entry
|
||||||
|
5. Regenerate PPTX and PDF
|
||||||
|
|
||||||
|
## File Naming Convention
|
||||||
|
|
||||||
|
Files use meaningful slugs for better readability:
|
||||||
|
|
||||||
|
```
|
||||||
|
NN-slide-[slug].png
|
||||||
|
NN-slide-[slug].md (in prompts/)
|
||||||
|
```
|
||||||
|
|
||||||
|
Examples:
|
||||||
|
- `01-slide-cover.png`
|
||||||
|
- `02-slide-problem-statement.png`
|
||||||
|
- `03-slide-key-findings.png`
|
||||||
|
- `04-slide-back-cover.png`
|
||||||
|
|
||||||
|
## Slug Rules
|
||||||
|
|
||||||
|
| Rule | Description |
|
||||||
|
|------|-------------|
|
||||||
|
| Format | Kebab-case (lowercase, hyphens) |
|
||||||
|
| Source | Derived from slide title/content |
|
||||||
|
| Uniqueness | Must be unique within the deck |
|
||||||
|
| Updates | Change slug when content changes significantly |
|
||||||
|
|
||||||
|
## Renumbering Rules
|
||||||
|
|
||||||
|
| Scenario | Action |
|
||||||
|
|----------|--------|
|
||||||
|
| Add slide | Increment NN for all subsequent slides |
|
||||||
|
| Delete slide | Decrement NN for all subsequent slides |
|
||||||
|
| Reorder slides | Update NN to match new positions |
|
||||||
|
| Edit slide | NN unchanged, update slug if needed |
|
||||||
|
|
||||||
|
**Important**: Slugs remain unchanged during renumbering. Only the NN prefix changes.
|
||||||
|
|
||||||
|
## Post-Modification Checklist
|
||||||
|
|
||||||
|
After any modification:
|
||||||
|
|
||||||
|
- [ ] Image file renamed/created correctly
|
||||||
|
- [ ] Prompt file renamed/created correctly
|
||||||
|
- [ ] Subsequent files renumbered (if add/delete)
|
||||||
|
- [ ] `outline.md` updated to reflect changes
|
||||||
|
- [ ] PPTX regenerated
|
||||||
|
- [ ] PDF regenerated
|
||||||
|
- [ ] Slide count in outline header updated
|
||||||
@@ -0,0 +1,164 @@
|
|||||||
|
# Outline Template
|
||||||
|
|
||||||
|
Standard structure for slide deck outlines with style instructions.
|
||||||
|
|
||||||
|
## Outline Format
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
# Slide Deck Outline
|
||||||
|
|
||||||
|
**Topic**: [topic description]
|
||||||
|
**Style**: [selected style]
|
||||||
|
**Audience**: [target audience]
|
||||||
|
**Language**: [output language]
|
||||||
|
**Slide Count**: N slides
|
||||||
|
**Generated**: YYYY-MM-DD HH:mm
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<STYLE_INSTRUCTIONS>
|
||||||
|
Design Aesthetic: [2-3 sentence description from style file]
|
||||||
|
|
||||||
|
Background:
|
||||||
|
Color: [Name] ([Hex])
|
||||||
|
Texture: [description]
|
||||||
|
|
||||||
|
Typography:
|
||||||
|
Primary Font: [detailed description for image generation]
|
||||||
|
Secondary Font: [detailed description for image generation]
|
||||||
|
|
||||||
|
Color Palette:
|
||||||
|
Primary Text: [Name] ([Hex]) - [usage]
|
||||||
|
Background: [Name] ([Hex]) - [usage]
|
||||||
|
Accent 1: [Name] ([Hex]) - [usage]
|
||||||
|
Accent 2: [Name] ([Hex]) - [usage]
|
||||||
|
|
||||||
|
Visual Elements:
|
||||||
|
- [element 1 with rendering guidance]
|
||||||
|
- [element 2 with rendering guidance]
|
||||||
|
- ...
|
||||||
|
|
||||||
|
Style Rules:
|
||||||
|
Do: [guidelines from style file]
|
||||||
|
Don't: [anti-patterns from style file]
|
||||||
|
</STYLE_INSTRUCTIONS>
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
[Slide entries follow...]
|
||||||
|
```
|
||||||
|
|
||||||
|
## Cover Slide Template
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
## Slide 1 of N
|
||||||
|
|
||||||
|
**Type**: Cover
|
||||||
|
**Filename**: 01-slide-cover.png
|
||||||
|
|
||||||
|
// NARRATIVE GOAL
|
||||||
|
[What this slide achieves in the story arc]
|
||||||
|
|
||||||
|
// KEY CONTENT
|
||||||
|
Headline: [main title]
|
||||||
|
Sub-headline: [supporting tagline]
|
||||||
|
|
||||||
|
// VISUAL
|
||||||
|
[Detailed visual description - specific elements, composition, mood]
|
||||||
|
|
||||||
|
// LAYOUT
|
||||||
|
[Composition, hierarchy, spatial arrangement]
|
||||||
|
```
|
||||||
|
|
||||||
|
## Content Slide Template
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
## Slide X of N
|
||||||
|
|
||||||
|
**Type**: Content
|
||||||
|
**Filename**: {NN}-slide-{slug}.png
|
||||||
|
|
||||||
|
// NARRATIVE GOAL
|
||||||
|
[What this slide achieves in the story arc]
|
||||||
|
|
||||||
|
// KEY CONTENT
|
||||||
|
Headline: [main message - narrative, not label]
|
||||||
|
Sub-headline: [supporting context]
|
||||||
|
Body:
|
||||||
|
- [point 1 with specific detail]
|
||||||
|
- [point 2 with specific detail]
|
||||||
|
- [point 3 with specific detail]
|
||||||
|
|
||||||
|
// VISUAL
|
||||||
|
[Detailed visual description]
|
||||||
|
|
||||||
|
// LAYOUT
|
||||||
|
[Composition, hierarchy, spatial arrangement]
|
||||||
|
```
|
||||||
|
|
||||||
|
## Back Cover Slide Template
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
## Slide N of N
|
||||||
|
|
||||||
|
**Type**: Back Cover
|
||||||
|
**Filename**: {NN}-slide-back-cover.png
|
||||||
|
|
||||||
|
// NARRATIVE GOAL
|
||||||
|
[Meaningful closing - not just "thank you"]
|
||||||
|
|
||||||
|
// KEY CONTENT
|
||||||
|
Headline: [memorable closing statement or call-to-action]
|
||||||
|
Body: [optional summary points or next steps]
|
||||||
|
|
||||||
|
// VISUAL
|
||||||
|
[Visual that reinforces the core message]
|
||||||
|
|
||||||
|
// LAYOUT
|
||||||
|
[Clean, impactful composition]
|
||||||
|
```
|
||||||
|
|
||||||
|
## STYLE_INSTRUCTIONS Block
|
||||||
|
|
||||||
|
The `<STYLE_INSTRUCTIONS>` block contains all style-specific guidance for image generation:
|
||||||
|
|
||||||
|
| Section | Content |
|
||||||
|
|---------|---------|
|
||||||
|
| Design Aesthetic | Overall visual direction from style file |
|
||||||
|
| Background | Base color and texture details |
|
||||||
|
| Typography | Font descriptions for Gemini (no font names, describe appearance) |
|
||||||
|
| Color Palette | Named colors with hex codes and usage guidance |
|
||||||
|
| Visual Elements | Specific graphic elements with rendering instructions |
|
||||||
|
| Style Rules | Do/Don't guidelines from style file |
|
||||||
|
|
||||||
|
**Important**: Typography descriptions must describe the visual appearance (e.g., "rounded sans-serif", "bold geometric") since image generators cannot use font names.
|
||||||
|
|
||||||
|
## Section Dividers
|
||||||
|
|
||||||
|
Use `---` (horizontal rule) between:
|
||||||
|
- Header metadata and STYLE_INSTRUCTIONS
|
||||||
|
- STYLE_INSTRUCTIONS and first slide
|
||||||
|
- Each slide entry
|
||||||
|
|
||||||
|
## Slide Numbering
|
||||||
|
|
||||||
|
- Cover is always Slide 1
|
||||||
|
- Content slides use sequential numbers
|
||||||
|
- Back Cover is always final slide (N)
|
||||||
|
- Filename prefix matches slide position: `01-`, `02-`, etc.
|
||||||
|
|
||||||
|
## Filename Slugs
|
||||||
|
|
||||||
|
Generate meaningful slugs from slide content:
|
||||||
|
|
||||||
|
| Slide Type | Slug Pattern | Example |
|
||||||
|
|------------|--------------|---------|
|
||||||
|
| Cover | `cover` | `01-slide-cover.png` |
|
||||||
|
| Content | `{topic-slug}` | `02-slide-problem-statement.png` |
|
||||||
|
| Back Cover | `back-cover` | `10-slide-back-cover.png` |
|
||||||
|
|
||||||
|
Slug rules:
|
||||||
|
- Kebab-case (lowercase, hyphens)
|
||||||
|
- Derived from headline or main topic
|
||||||
|
- Maximum 30 characters
|
||||||
|
- Unique within deck
|
||||||
@@ -0,0 +1,116 @@
|
|||||||
|
import { existsSync, readdirSync, readFileSync } from "fs";
|
||||||
|
import { join, basename } from "path";
|
||||||
|
import { PDFDocument, rgb } from "pdf-lib";
|
||||||
|
|
||||||
|
interface SlideInfo {
|
||||||
|
filename: string;
|
||||||
|
path: string;
|
||||||
|
index: number;
|
||||||
|
promptPath?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
function parseArgs(): { dir: string; output?: string } {
|
||||||
|
const args = process.argv.slice(2);
|
||||||
|
let dir = "";
|
||||||
|
let output: string | undefined;
|
||||||
|
|
||||||
|
for (let i = 0; i < args.length; i++) {
|
||||||
|
if (args[i] === "--output" || args[i] === "-o") {
|
||||||
|
output = args[++i];
|
||||||
|
} else if (!args[i].startsWith("-")) {
|
||||||
|
dir = args[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!dir) {
|
||||||
|
console.error("Usage: bun merge-to-pdf.ts <slide-deck-dir> [--output filename.pdf]");
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
return { dir, output };
|
||||||
|
}
|
||||||
|
|
||||||
|
function findSlideImages(dir: string): SlideInfo[] {
|
||||||
|
if (!existsSync(dir)) {
|
||||||
|
console.error(`Directory not found: ${dir}`);
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
const files = readdirSync(dir);
|
||||||
|
const slidePattern = /^(\d+)-slide-.*\.(png|jpg|jpeg)$/i;
|
||||||
|
const promptsDir = join(dir, "prompts");
|
||||||
|
const hasPrompts = existsSync(promptsDir);
|
||||||
|
|
||||||
|
const slides: SlideInfo[] = files
|
||||||
|
.filter((f) => slidePattern.test(f))
|
||||||
|
.map((f) => {
|
||||||
|
const match = f.match(slidePattern);
|
||||||
|
const baseName = f.replace(/\.(png|jpg|jpeg)$/i, "");
|
||||||
|
const promptPath = hasPrompts ? join(promptsDir, `${baseName}.md`) : undefined;
|
||||||
|
|
||||||
|
return {
|
||||||
|
filename: f,
|
||||||
|
path: join(dir, f),
|
||||||
|
index: parseInt(match![1], 10),
|
||||||
|
promptPath: promptPath && existsSync(promptPath) ? promptPath : undefined,
|
||||||
|
};
|
||||||
|
})
|
||||||
|
.sort((a, b) => a.index - b.index);
|
||||||
|
|
||||||
|
if (slides.length === 0) {
|
||||||
|
console.error(`No slide images found in: ${dir}`);
|
||||||
|
console.error("Expected format: 01-slide-*.png, 02-slide-*.png, etc.");
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
return slides;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function createPdf(slides: SlideInfo[], outputPath: string) {
|
||||||
|
const pdfDoc = await PDFDocument.create();
|
||||||
|
pdfDoc.setAuthor("baoyu-slide-deck");
|
||||||
|
pdfDoc.setSubject("Generated Slide Deck");
|
||||||
|
|
||||||
|
for (const slide of slides) {
|
||||||
|
const imageData = readFileSync(slide.path);
|
||||||
|
const ext = slide.filename.toLowerCase();
|
||||||
|
const image = ext.endsWith(".png")
|
||||||
|
? await pdfDoc.embedPng(imageData)
|
||||||
|
: await pdfDoc.embedJpg(imageData);
|
||||||
|
|
||||||
|
const { width, height } = image;
|
||||||
|
const page = pdfDoc.addPage([width, height]);
|
||||||
|
|
||||||
|
page.drawImage(image, {
|
||||||
|
x: 0,
|
||||||
|
y: 0,
|
||||||
|
width,
|
||||||
|
height,
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log(`Added: ${slide.filename}${slide.promptPath ? " (prompt available)" : ""}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
const pdfBytes = await pdfDoc.save();
|
||||||
|
await Bun.write(outputPath, pdfBytes);
|
||||||
|
|
||||||
|
console.log(`\nCreated: ${outputPath}`);
|
||||||
|
console.log(`Total pages: ${slides.length}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
async function main() {
|
||||||
|
const { dir, output } = parseArgs();
|
||||||
|
const slides = findSlideImages(dir);
|
||||||
|
|
||||||
|
const dirName = basename(dir) === "slide-deck" ? basename(join(dir, "..")) : basename(dir);
|
||||||
|
const outputPath = output || join(dir, `${dirName}.pdf`);
|
||||||
|
|
||||||
|
console.log(`Found ${slides.length} slides in: ${dir}\n`);
|
||||||
|
|
||||||
|
await createPdf(slides, outputPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
main().catch((err) => {
|
||||||
|
console.error("Error:", err.message);
|
||||||
|
process.exit(1);
|
||||||
|
});
|
||||||
@@ -132,7 +132,7 @@ posts/ai-future/
|
|||||||
└── 03-ending.png
|
└── 03-ending.png
|
||||||
```
|
```
|
||||||
|
|
||||||
### Without Article Path
|
### Without Article Path (Pasted Content)
|
||||||
|
|
||||||
Save to `xhs-outputs/YYYY-MM-DD/[topic-slug]/`:
|
Save to `xhs-outputs/YYYY-MM-DD/[topic-slug]/`:
|
||||||
|
|
||||||
@@ -140,6 +140,7 @@ Save to `xhs-outputs/YYYY-MM-DD/[topic-slug]/`:
|
|||||||
xhs-outputs/
|
xhs-outputs/
|
||||||
└── 2026-01-13/
|
└── 2026-01-13/
|
||||||
└── ai-agent-guide/
|
└── ai-agent-guide/
|
||||||
|
├── source.md # Saved pasted content
|
||||||
├── outline.md
|
├── outline.md
|
||||||
├── prompts/
|
├── prompts/
|
||||||
│ ├── 01-cover.md
|
│ ├── 01-cover.md
|
||||||
@@ -152,10 +153,17 @@ xhs-outputs/
|
|||||||
|
|
||||||
### Step 1: Analyze Content & Select Style/Layout
|
### Step 1: Analyze Content & Select Style/Layout
|
||||||
|
|
||||||
1. Read content
|
1. **Save source content** (if not already a file):
|
||||||
2. If `--style` specified, use that style; otherwise auto-select
|
- If user provides a file path: use as-is
|
||||||
3. If `--layout` specified, use that layout; otherwise auto-select per image
|
- If user pastes content: save to `source.md` in target directory
|
||||||
4. Determine image count based on content complexity:
|
2. Read content
|
||||||
|
3. If `--style` specified, use that style; otherwise auto-select 3 candidates
|
||||||
|
4. If `--layout` specified, use that layout; otherwise auto-select per image
|
||||||
|
5. **Language detection**:
|
||||||
|
- Detect **source language** from content
|
||||||
|
- Detect **user language** from conversation context
|
||||||
|
- Note if source_language ≠ user_language (will ask in Step 4)
|
||||||
|
6. Determine image count based on content complexity:
|
||||||
|
|
||||||
| Content Type | Image Count |
|
| Content Type | Image Count |
|
||||||
|-------------|-------------|
|
|-------------|-------------|
|
||||||
@@ -216,7 +224,57 @@ Plan for each image with style and layout specifications:
|
|||||||
|
|
||||||
Save outline as `outline.md`.
|
Save outline as `outline.md`.
|
||||||
|
|
||||||
### Step 4: Generate Images One by One
|
### Step 4: Review & Confirm
|
||||||
|
|
||||||
|
**Purpose**: Let user confirm all options in a single step before image generation.
|
||||||
|
|
||||||
|
**IMPORTANT**: Present ALL options in a single confirmation step using AskUserQuestion. Do NOT interrupt workflow with multiple separate confirmations.
|
||||||
|
|
||||||
|
1. **Generate 3 style variants** (if style not specified):
|
||||||
|
- Analyze content to select 3 most suitable styles
|
||||||
|
- Generate complete outline for each style variant
|
||||||
|
- Save as `outline-{style}.md` (e.g., `outline-cute.md`, `outline-notion.md`, `outline-tech.md`)
|
||||||
|
|
||||||
|
2. **Determine which questions to ask**:
|
||||||
|
|
||||||
|
| Question | When to Ask |
|
||||||
|
|----------|-------------|
|
||||||
|
| Style variant | Always (required) |
|
||||||
|
| Default layout | Always (offer common options) |
|
||||||
|
| Language | Only if `source_language ≠ user_language` |
|
||||||
|
|
||||||
|
3. **Present options** (use AskUserQuestion with all applicable questions):
|
||||||
|
|
||||||
|
**Question 1 (Style)** - always:
|
||||||
|
- Style A (recommended): [style name] - [brief description]
|
||||||
|
- Style B: [style name] - [brief description]
|
||||||
|
- Style C: [style name] - [brief description]
|
||||||
|
- Custom: Provide custom style reference
|
||||||
|
|
||||||
|
**Question 2 (Layout)** - always:
|
||||||
|
- sparse (Recommended for cover) - minimal info, maximum impact
|
||||||
|
- balanced - standard 3-4 points
|
||||||
|
- dense - high info density, knowledge cards
|
||||||
|
- list / comparison / flow - special formats
|
||||||
|
|
||||||
|
**Question 3 (Language)** - only if source ≠ user language:
|
||||||
|
- [Source language] (matches content)
|
||||||
|
- [User language] (your preference)
|
||||||
|
|
||||||
|
**Language handling**:
|
||||||
|
- If source language = user language: Just inform user (e.g., "Images will be in Chinese")
|
||||||
|
- If different: Ask which language to use
|
||||||
|
|
||||||
|
4. **Apply selection**:
|
||||||
|
- Copy selected `outline-{style}.md` to `outline.md`
|
||||||
|
- If custom style provided, generate new outline with that style
|
||||||
|
- If different language selected, regenerate outline in that language
|
||||||
|
- User may edit `outline.md` directly for fine-tuning
|
||||||
|
- If modified, reload outline before proceeding
|
||||||
|
|
||||||
|
5. **Proceed only after explicit user confirmation**
|
||||||
|
|
||||||
|
### Step 5: Generate Images One by One
|
||||||
|
|
||||||
For each image, create a prompt file with style and layout specifications.
|
For each image, create a prompt file with style and layout specifications.
|
||||||
|
|
||||||
@@ -273,7 +331,9 @@ If the image generation skill supports `--sessionId`:
|
|||||||
3. Report progress: "Generated X/N"
|
3. Report progress: "Generated X/N"
|
||||||
4. Continue to next
|
4. Continue to next
|
||||||
|
|
||||||
### Step 5: Completion Report
|
**All prompts are written in the user's confirmed language preference.**
|
||||||
|
|
||||||
|
### Step 6: Completion Report
|
||||||
|
|
||||||
```
|
```
|
||||||
Xiaohongshu Infographic Series Complete!
|
Xiaohongshu Infographic Series Complete!
|
||||||
@@ -319,5 +379,6 @@ Outline: outline.md
|
|||||||
- Image generation typically takes 10-30 seconds per image
|
- Image generation typically takes 10-30 seconds per image
|
||||||
- Auto-retry once on generation failure
|
- Auto-retry once on generation failure
|
||||||
- Use cartoon alternatives for sensitive public figures
|
- Use cartoon alternatives for sensitive public figures
|
||||||
- Output language matches input content language
|
- Prompts written in user's confirmed language preference
|
||||||
|
- Text on images uses confirmed language
|
||||||
- Maintain selected style consistency across all images in series
|
- Maintain selected style consistency across all images in series
|
||||||
|
|||||||
Reference in New Issue
Block a user