novel-art
Create art bibles for AI short dramas: scenarios + narrative props. Core premise carved in stone: this is for AI generation, not live-action shooting — no location scouting, set building, set dressing, or prop purchasing. Both environments and props are assets that need to look identical even after being generated dozens of times, so all deliverables revolve around consistency:
| Deliverable | What it solves |
|---|
| Consistency anchors (3–5 per scenario) | Viewers use them to recognize scenarios; QC uses them to check if generated shots have drifted |
| Lighting time period variants | For AI, changing time periods means re-generating rather than re-lighting; each state is documented as a complete prompt |
| Empty scene generation prompts | Environments and characters are two separate asset layers; if people appear in reference images, consistency is completely ruined |
| Variant mechanism (variantOf) | Generating new scenarios is cheap, but variants that reuse parent scenario assets are more consistent |
| Prop state variants | A suitcase closed and open are two reference images — props have state arcs, scenarios do not |
| Prop scale references | AI often draws handheld props as furniture-sized; prompts must include scale phrases |
| White-background hand-free props | Prop images need to be composited into various shots, so they must be mattable; hands holding props are the most common contamination |
= the directory where this file is located. The script
{baseDir}/scripts/novel-art.mjs
has zero dependencies and runs directly with
.
Boundaries (what this does not do): No storyboarding, no scriptwriting, no character management (that's
' job), no outline arrangement (that's
' job).
Only narrative props are included (props with close-ups, appearing across episodes, carrying plot weight, usually 3–8 pieces) — scenario set dressing falls under scenario anchors, and one-time hand props are solved with shot-level prompts, no separate assets are created for them.
Step 0 — Define Inputs
Three types of inputs, in descending priority order:
- outline.json (output of novel-outline) — the best option, with ready-made scenario list, appearing episodes, carried payoff moments, and reuse plans
- Original novel text — you need to summarize the scenario list yourself (prioritize main stages, refer to novel-outline's main scenario limit logic: don't try to include too many)
- User-written scenario list
If you have cast.json (output of novel-characters), include it too — it's used to verify that "prompts do not contain character names".
Step 1 — Seed Skeleton (this step only applies if you have outline.json)
bash
node {baseDir}/scripts/novel-art.mjs seed <outline.json> > <workdir>/art.json
Deterministic migration: scenario ID/name/main scenario flag/appearing episodes/carried payoff moments. Scenarios with reuse plans will have a
prompting to make them variants.
Don't make the model re-derive these facts.
If there is no outline.json, create the list yourself according to
.
Step 2 — Fill in settings per scenario + extract narrative props
One task per scenario, run concurrently if possible. Each task receives:
{baseDir}/references/scene-pass.md
and {baseDir}/references/schema.md
(read them and follow the instructions)
- The skeleton of the scenario + all information about this space from the original text/outline
- Names of other scenarios in the same batch (the spatial vibe should be distinct, don't make them all the same kind of shabby)
Core requirements are all in scene-pass.md, the three most important ones: anchors must be drawable, recognizable, and verifiable ("patched boat awning" is an anchor, "old atmosphere" is an adjective); lighting states are derived backward from episode divisions, don't write a full set of unused states; make variants instead of creating new scenarios whenever possible.
Narrative props are prioritized from the outline:
has included
since version 1.1.0, and
will migrate the prop list along with "what it carries", "which payoff moments it supports", and "which episodes it appears in". At this stage, only design fields need to be filled (scale, anchors, state variants, white-background prompts).
If the outline has no props, extract them from the original text — in that case, this step is the model's job: only include props that
have close-ups, appear across episodes, and carry plot weight, usually 3–8 pieces, on the same order as the number of main characters. Fill in each prop according to
: dramatic function, anchors, state variants, scale, white-background hand-free prompts. "Portable props" like suitcases belong here — it's wrong to put them in scenario anchors or character profiles.
Step 3 — Validation ⛔ Cannot be skipped
bash
node {baseDir}/scripts/novel-art.mjs validate <art.json> --cast <cast.json>
All 10 quality gates are implemented in code. 6 shared gates for scenarios + general: 3–5 anchors, ≥1 lighting state, no people, prompts entirely in English, no character names (only checked if --cast is provided), complete variant references. 4 prop-specific gates: ≥1 state, scale phrases included in prompts, hands banned in negative prompts, pure white background for reference images.
Fix violations one by one, re-run after modifications, until all pass.
Step 4 — Output and Reporting
bash
cd <输出目录>
node {baseDir}/scripts/novel-art.mjs render <剧名>-art.json --md > <剧名>-art.md
node {baseDir}/scripts/novel-art.mjs render <剧名>-art.json --html > art-report.html
The report interface defaults to Chinese; if the user wants an English interface, add
(or write
at the top level of art.json,
takes precedence).
looks for images (both scenarios and props) in
in the same directory as art.json by default; if images are elsewhere, use
to specify the path —
this skill does not generate these files. After downstream image generation is complete, re-run render to embed them into the report. The report includes: KPI bar, scenario list, scenario setting cards, prop list, prop setting cards (with copy buttons for anchor checklists / state variants / prompt packages), quality gate panel, and exportable JSON (the downloaded file is exactly art.json).
Summarize the report in one sentence: number of scenarios (how many main / how many variants), number of props, total number of anchors, report path; clearly state any gates that failed.
Don't say "images have been generated" — that doesn't happen at this step; the deliverable is prompts.
Final deliverables:
<输出目录>/
├── <剧名>-art.json
├── <剧名>-art.md
├── art-report.html ← 双击就能开
└── images/ ← 本 skill 不写这个目录
└── <slug>-sheet.png ← 下游出完图放这儿,render 会捡起来
Three-skill Workflow
novel-outline → outline.json (什么:结构与分集)
novel-characters → cast.json (谁:角色资产)
novel-art → art.json (哪里 + 手里拿的:美术资产)
seed consumes both the scenario and prop sections of outline.json (if the outline has no
, the prop list is left empty and the model extracts them from the original text), and
consumes cast.json. The reports for all three JSON files each have an export button, and after modifications, they can be fed back to their respective render/validate commands.
Boundaries
- The report interface has built-in Chinese and English support (, defaults to Chinese, or follows the field of art.json); image generation prompts are always in English
- This skill does not generate images. is a layout instruction for downstream use; layout specifications can be found in
- There is no hard limit on the number of scenarios — the limit is managed by novel-outline's main scenario gate; what is managed here is the quality of each asset
- Only narrative props are included, 3–8 pieces is recommended — each additional piece adds more cross-episode consistency maintenance work
Self-test
bash
node {baseDir}/scripts/selftest.mjs
151 assertions, no model calls, no quota consumption. Each of the 10 quality gates has failure test cases. Run this first after modifying the script.
Built-in Example
{baseDir}/examples/渡口-art.json
: Complete settings for 3 scenarios + 2 narrative props (old suitcase, old yamen inkstone) from
Ferry Crossing, all quality gates passed (including character name check against the novel-characters sample cast). It serves as a quality benchmark and a self-test fixture.