novel-art
Create for AI short dramas anart setting collection: scenes + narrative props.The premise is etched into your bones: this is AI generation, not live action—there is no location scouting, set building, set dressing, or purchasing; environments and props are assets that must be generated dozens of times and still look the same, so all deliverables revolve around consistency:
| Deliverable | What it solves |
|---|---|
| Consistency anchors (3–5 per scene) | The audience relies on them to recognize the scene, and QC relies on them to check whether generated shots have drifted |
| Lighting time-of-day variants | For AI, changing the time of day is regeneration, not relighting; each state becomes a complete prompt |
| Empty-scene image generation prompts | Environments and characters are two layers of assets; if people are mixed into a reference image, consistency is completely ruined |
| Variant mechanism (variantOf) | Generating a new scene is cheap, but variants reusing the parent scene's assets are more consistent |
| Prop state variants | A suitcase closed and opened are two reference images—props have state arcs, scenes do not |
| Prop scale reference | AI often draws handheld props at furniture size, so prompts must include a scale phrase |
| Props on white background without hands | Prop images need to be pasted into various shots, so they must be cuttable; hands holding props are the most common contamination |
{baseDir} = the directory containing this file. Script {baseDir}/scripts/novel-art.mjs, zero dependencies,node run directly.
Boundaries (things not done): no storyboarding, no script writing, no character work (novel-characters 's job), no outline arrangement (novel-outline 's job).Props only include narrative props(those with close-ups, spanning episodes, and carrying the plot, usually 3–8 items)—scene furnishings belong to scene anchors, one-off hand-prop shots are handled by shot-level prompts, and none of these become separate assets.
Step 0 — Determine inputs
Three kinds of input, in descending priority:
- outline.json(output of novel-outline)—best, since the scene list, appearing episodes, carried excitement points, and reuse plan are all ready-made
- Novel original text—summarize the scene list yourself (main stages first; refer to novel-outline's idea of a main-scene cap: don't be greedy)
- A user-written scene list
If there is a cast.json (output of novel-characters), bring it too—it is needed to verify that "prompts contain no character names."
Step 1 — seed skeleton (only if outline.json exists)
node {baseDir}/scripts/novel-art.mjs seed <outline.json> > <workdir>/art.json
Deterministic transfer: scene id/name/main-scene marker/appearing episodes/carried excitement points; scenes with a reuse plan will have seedNote prompts to make variants.Do not make the model rethink these facts.
If there is no outline.json, build the list yourself according to references/schema.md .
Step 2 — Fill in settings scene by scene + extract narrative props
One per scene; parallelize if possible. Each task gets:
{baseDir}/references/scene-pass.mdand{baseDir}/references/schema.md(read them and follow them)- That scene's skeleton + all information about this space in the original text/outline
- Names of the other scenes in the same batch(the spatial character must be differentiated; don't write them all as the same kind of shabbiness)
The core requirements are all in scene-pass.md; the three most important: anchors must bedrawable, recognizable, verifiable(「patched boat canopy」 is an anchor, 「shabby atmosphere」 is an adjective); lighting stateinferred back from the episode breakdown, don't write an unused whole-family bucket;if a variant works, don't open a new scene。
Narrative props take priority from the outline:outline.json since 1.1.0 it carries props,seed which brings over the props table along with 「what it carries」「which payoffs it supports」「which episodes it appears in」; this layer only fills in the design fields (scale, anchor, state variants, white-background prompt).If the outline has no props, extract from the source text; then this step is the model's job: only takeones with close-ups, cross-episode appearances, plot-bearing, usually 3–8 items, on the same order of magnitude as the number of protagonists. Each item follows references/prop-pass.md to fill in: dramatic function, anchor, state variants, scale, white-background no-hands prompt. Something like a suitcase, a 「prop that follows the person」, belongs here—cramming it into scene anchors or character portraits is wrong.
Step 3 — Validation ⛔ cannot be skipped
node {baseDir}/scripts/novel-art.mjs validate <art.json> --cast <cast.json>
All 10 quality gates are code. Scenes + shared 6 gates: anchors 3–5, lighting states ≥1,no people, all prompts in English, no character names (only checked when --cast is given), variant references complete. Prop-specific 4 gates:states ≥1、scale phrase written into the prompt、negative words: no hands、design sheet pure white background。
Fix violations one by one, rerun after fixing, until it passes.
Step 4 — Output and reporting
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 UI is Chinese by default; if the user wants an English UI, add --lang en(or write at the top level of art.json "lang": "en",--lang takes priority).render By default it looks for images in the images/<slug>-sheet.png at the same level as art.json (looking for both scenes and props); if the images are elsewhere, use --images <目录> to point there——this skill does not produce these files, after the downstream finishes generating images, rerun render once and they can be embedded in the report. The report includes: KPI band, scene list, scene design cards, prop list, prop design cards (anchor checklist / state variants / prompt pack all with copy buttons), quality gate panel, export JSON (what is downloaded is art.json exactly as-is).
In one sentence, make the report clear: how many scenes (main scenes/variants each), how many props, total anchors, report path; explicitly state any gates that did not pass.
Don't say 「images generated」——this step no longer exists; what is delivered is prompts.
Final delivery:
<输出目录>/
├── <剧名>-art.json
├── <剧名>-art.md
├── art-report.html ← 双击就能开
└── images/ ← 本 skill 不写这个目录
└── <slug>-sheet.png ← 下游出完图放这儿,render 会捡起来
The relay of three skills
novel-outline → outline.json (什么:结构与分集)
novel-characters → cast.json (谁:角色资产)
novel-art → art.json (哪里 + 手里拿的:美术资产)
seed takes the scene and prop sections of outline.json (when the outline has no props , props are left empty and the model extracts them from the source text),--cast takes cast.json. The reports for the three JSON files each have an export button, and after editing they can all be fed back into their respective render/validate.
Boundaries
- The report UI has built-in Chinese and English (
--lang, Chinese by default, or follows art.json'slangfield); image-generation prompts are always English - This skill does not generate images.
image.sheetis a layout instruction for downstream; for layout specs seereferences/sheet.md - There is no hard upper limit on the number of scenes—the upper limit is managed at novel-outline's main-scene gate; what is managed here is the quality of each asset
- Props should only include narrative props, ideally 3–8 items—each additional item adds one more layer of cross-episode consistency maintenance.
Self-test
node {baseDir}/scripts/selftest.mjs
151 assertions, no model calls, no quota usage. Each of the 10 quality gates has a breaking test case. Run this first after modifying the script.
Built-in sample
{baseDir}/examples/渡口-art.json: The complete settings for the three scenes of "Ferry Crossing" + two narrative props (an old leather suitcase and an old inkstone from the county office), all passing every quality gate (including the character name check against the novel-characters sample cast). It serves as the quality baseline and also as a self-test fixture.