Basic Cohub abilities. Most agents already have these mounted; listed here for reference.
Platform Published by the Neta team.
Official Made by the Neta team.
Verified Reviewed by the Neta team.
Community Shared by a Cohub user. Not reviewed — read SKILL.md before you use it.
novel-chapter-pages
Officialneta-search/novel-chapter-pages
Use it in Cohub
Paste this into your agent's chat — it fetches the skill and follows it.
Use the skill: novel-chapter-pages. Run `npx -y @neta-art/neta-search-cli@latest skills use neta-search/novel-chapter-pages --via site` and follow what it prints. Read its complete output, redirecting it to a temporary file first if necessary, and resolve relative paths from the skill directory it prints.
npx -y @neta-art/neta-search-cli@latest skills use neta-search/novel-chapter-pages
Summary
Turn your story into readable novel chapters with covers and elegant typography.
Each chapter becomes a web page: cover image at the top, story text in a centered reading column, clean layout.
The agent writes the chapter from your outline or world material, or polishes prose you provide.
Best for: serialized fiction, character arcs, or lore you want readers to experience as a novel.
Multiple chapters appear as separate cards in Works; you can add a table of contents page.
Covers match your world's visual style and reflect the chapter's mood and key scene.
SKILL.md
# Novel Chapter Pages
Create chapter reading pages for a novel — viewable in Studio Works and publicly previewable. Each chapter is a standalone directory-style web work.
Each page contains:
- An AI-generated atmospheric chapter cover image
- An immersive hero section
- Elegant long-form reading typography
- Chapter title, body text, footer
If the user only wants a plain-text story, do not build a web page.
## Output shape
- One directory-style web work per chapter: `works/web/<story-slug>-chapter-N/`
- Each chapter appears in Studio Works on its own
- When needed, add a separate table-of-contents / overview page: `works/web/<story-slug>-index/`
Recommended naming:
```text
works/web/<story-slug>-chapter-1/
works/web/<story-slug>-chapter-2/
works/web/<story-slug>-chapter-3/
```
## Workflow
### Step 1: Clarify the request
Confirm or infer:
- Story title
- Chapter number
- Chapter title
- Body source: prose provided by the user / a plot outline / a continuation grounded in the world's setting
- The chapter's emotional register: tender, oppressive, suspenseful, wartime, coming-of-age, historical, sci-fi, and so on
- Whether the story should be split into multiple chapters
When to ask vs. infer — decide this before any generation or `work init`:
- If the opening already gives what to write (the user's prose, an outline, or a named event / character arc in this world), infer every other item and start: story title from the work, story, or character named; chapter number 1 unless a continuation is asked for; register from the prose or the request; a single chapter when the given material is one scene or the user says "one chapter". Do not ask about items the opening already gave or that can be read off it.
- Ask only when an item cannot be inferred and the answer changes what gets written — typically there is no body source at all (no prose, no outline, no identifiable event), or a long arc's chapter split / count is genuinely open. Ask all such items in one round before generating anything, then stop and wait for the answer.
- Whatever you inferred, state it in one line in the handover so the user can correct it.
Each chapter should clearly cover one phase or one core event; do not cram an entire long-form story into a single chapter.
Chapter titles should be short and evocative, suitable as Studio Works card titles.
### Step 2: Determine the chapter content
If the chapter depends on the current world's setting, read first:
```text
world/WORLD.md
```
When specific characters, locations, or events are involved, also read the necessary atom files.
When the user asks for a continuation — "续写" / "下一章" / "第二章" / "接着上一章写" ("continue" / "next chapter" / "chapter two" / "pick up from the previous chapter") — find and read the existing chapter works to keep continuity.
When the user provides the body text:
- Treat the original text as primary
- Adjust only paragraphing, punctuation, and light polish
- Do not substantively rewrite unless the user asks for it
When the user provides an outline:
- Expand it into a novel chapter
- Keep world facts consistent
Recommended chapter body structure:
```text
Opening image → conflict escalation → detail close-up → emotional turn → core line → consequence lands → lingering hook
```
Writing requirements:
- Write novel prose, not a settings encyclopedia
- Focus on character action, scene, and emotion
- Keep continuity from chapter to chapter
### Step 3: Initialize the work (first step of the job)
The first step of every chapter is declaring the dir-work stub via the CLI. **Do not hand-write `meta.json`**:
```bash
node /mods/neta/neta work init web works/web/<story-slug>-chapter-1 --title "第一章 · 章节标题"
```
- Use kebab-case for the slug; run `ls works/web/` first to avoid duplicates. The positional argument passed to the CLI is the work-ref (the full directory path: `works/web/` + slug).
- The placeholder card is handled fully automatically: the CLI reads the `NETA_PLACEHOLDER_ITEM_ID` environment variable itself; do not pass `--placeholder-id`.
### Step 4: Generate the chapter cover image (synchronous, required)
The chapter page must use the image generation tool to produce one cover / atmosphere image as the hero background. The cover URL is written into the page, so it is an **internal dependency of this turn** — generate it **synchronously (do not use `--async`)** and obtain the URL before continuing:
```bash
node /mods/neta/neta generate image --prompt "..." --aspect 16:9
```
Requirements:
- The prompt combines the current world's visual style, the chapter title, the chapter mood, the main scene, and key imagery
- **Do not render title text inside the image** (no text)
- Aspect ratio `16:9` (for GPT image models use `--size 1792x1024`)
Take the image URL from `data.asset.url` in the returned JSON and write it into:
```html
<img class="hero" src="..." alt="Chapter atmospheric cover">
```
The cover is internal material for the chapter page only. Do not treat it as a standalone deliverable, and do not introduce it separately in the final reply.
Cover prompt template:
```text
Create an atmospheric novel chapter cover illustration for "{{STORY_TITLE}}".
Chapter: {{CHAPTER_NUMBER}} — {{CHAPTER_TITLE}}.
Scene: {{SCENE_DESCRIPTION}}.
Characters: {{CHARACTER_DESCRIPTIONS_WITH_AGE}}.
Mood: {{MOOD}}.
Composition: cinematic, emotionally focused, with a clear visual focal point and no embedded text.
Style: {{WORLD_VISUAL_STYLE}}.
Constraints: preserve each character's correct age and appearance; no watermark, no logo, no typography, no title text.
```
### Step 5: Write the chapter HTML
Write `works/web/<slug>/index.html`, using the shared template so all chapters stay visually consistent.
Template traits:
- Large cover image at the top
- Narrow centered reading column
- Generous whitespace
- Songti / serif reading feel
- Soft, restrained background color
- Minimal interaction, focused on reading
Replace in the template:
- `{{PAGE_TITLE}}`
- `{{HERO_IMAGE_URL}}`
- `{{HERO_ALT}}`
- `{{CHAPTER_NUMBER}}`
- `{{CHAPTER_TITLE}}`
- `{{STORY_HTML}}`
- `{{WORK_TITLE}}`
```html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{{PAGE_TITLE}}</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family:
"Noto Serif SC",
"Source Han Serif SC",
"STSong",
"Songti SC",
Georgia,
serif;
background: #faf8f5;
color: #2c2416;
line-height: 2;
}
.hero {
width: 100%;
max-height: 60vh;
object-fit: cover;
display: block;
}
.content {
max-width: 680px;
margin: 0 auto;
padding: 48px 24px 80px;
}
.chapter-num {
font-size: 13px;
letter-spacing: 4px;
color: #8b7355;
margin-bottom: 8px;
}
h1 {
font-size: 28px;
font-weight: 400;
color: #3d3226;
margin-bottom: 36px;
padding-bottom: 20px;
border-bottom: 1px solid #e0d5c7;
}
p {
font-size: 16px;
margin-bottom: 20px;
text-align: justify;
text-indent: 2em;
}
p.no-indent {
text-indent: 0;
}
.divider {
width: 48px;
height: 1px;
background: #d8cbbb;
margin: 36px auto;
}
.footer {
text-align: center;
color: #b8a898;
font-size: 13px;
margin-top: 48px;
padding-top: 24px;
border-top: 1px solid #e0d5c7;
}
@media (max-width: 640px) {
.content {
padding: 36px 20px 64px;
}
h1 {
font-size: 24px;
}
p {
font-size: 15px;
line-height: 1.95;
}
.hero {
max-height: 46vh;
}
}
</style>
</head>
<body>
<img class="hero" src="{{HERO_IMAGE_URL}}" alt="{{HERO_ALT}}">
<div class="content">
<div class="chapter-num">{{CHAPTER_NUMBER}}</div>
<h1>{{CHAPTER_TITLE}}</h1>
{{STORY_HTML}}
<div class="footer">{{WORK_TITLE}}</div>
</div>
</body>
</html>
```
Body HTML rule: wrap each prose paragraph in `<p>`.
```html
<p>齐城有一条种满梧桐的窄巷,巷子尽头立着一棵比所有人记忆都老的树。</p>
<p>树下曾有两个少年并肩长大——直到一场误会把他们送往相反的方向,都以为是对方先松开了手。</p>
<p>重逢那天他们才在树根间挖出那只玻璃瓶。里面是两张折好的字条,写着同一个答案,等了彼此很多年。</p>
```
When a small pause is needed, insert:
```html
<div class="divider"></div>
```
### Step 6: Publish (via the CLI, required)
After `index.html` is written, use the CLI to complete publishing and the `meta.json` ready write in one step. **Do not hand-write `/public`, do not hand-assemble `preview.url`, do not hand-write `meta.json`**:
```bash
node /mods/neta/neta work publish web works/web/<story-slug>-chapter-1
```
The CLI copies the static directory to `/public/works/<slug>/`, generates `preview.url`, and marks `works/web/<slug>/meta.json` as `ready`.
If the work has been initialized but you confirm it cannot be completed, run `node /mods/neta/neta work fail web <work-ref> --error "<failure reason>"` to settle the state; do not leave the card building forever.
### Step 7: Verify
At minimum confirm:
```bash
test -f "works/web/<slug>/index.html"
test -f "works/web/<slug>/meta.json"
test -f "/public/works/<slug>/index.html"
```
For multiple chapters, repeat Steps 3–7 for each chapter.
## Visual style rules
- Chapter pages follow the current world's `visualStyle` by default; when the user specifies a style, the user's style takes priority.
- `visualStyle` is read-only for this skill. If the world has none, describe a fitting style directly in the cover prompt's `Style:` line — do not run `neta config set` or otherwise write `worldConfig`; a chapter page never changes world settings that every later image in the world would inherit.
- Keep cover images consistent across chapters: same art style, same palette, same character designs.
- When a character appears at different ages across chapters, the imagery must clearly distinguish the age difference.
## Final reply
When done, hand over the delivered Work itself (REQUIRED) — prose or a Markdown link alone does not count. Following the **interaction-components** skill, emit one Link block on its own line for the main deliverable: the table-of-contents work when one was made, otherwise the chapter work (one block per chapter if only a few were made). Use a `studio-route` target, `"route": "work"`, with `worldId` from the `NETA_WORLD_ID` environment variable and `workId` read from `works/web/<slug>/meta.json` → `preview.workId` after Step 6 (never guessed or built from the slug). If `preview.workId` is missing, fall back to the `previewUrl` returned by `work publish`, shaped per interaction-components. Do not link `index.html` as a `world-file`.
Alongside the card, briefly state that the chapters have been created and published and can be viewed in Works, and list the chapters:
```text
小说章节页已创建并发布:
- 第一章 · 巷尾的梧桐
- 第二章 · 未寄出的信
- 第三章 · 旧站台的雨
```
Close following the **next-steps** skill (REQUIRED).
## Notes
- Do not put the entire novel into one work, unless the user explicitly wants a single-page collection
- Source files must stay in `works/web/<slug>/`; writing only to the public directory is not allowed
- `meta.json` is written by the CLI throughout (`work init` / `work publish` / `work fail`); never hand-write it at any point
- The cover must be generated with the image generation tool; do not substitute abstract CSS shapes
- Do not use `/p/` as the target path for new works
- Stay inside the chapter works this turn creates: do not edit `worldConfig`, do not delete, rewrite, or republish existing files or works, and do not add deliverables beyond the requested chapters / table of contents (the one cover per chapter in Step 4 is part of the page, not an extra)
- When a table-of-contents page is needed, create an additional `works/web/<story-slug>-index/` and run the same init → write page → publish flow