diff --git a/assets/prompt-templates/image/game-ui-ancient-china-open-world-mmo-hud.jpg b/assets/prompt-templates/image/game-ui-ancient-china-open-world-mmo-hud.jpg new file mode 100644 index 000000000..244ce3c3f Binary files /dev/null and b/assets/prompt-templates/image/game-ui-ancient-china-open-world-mmo-hud.jpg differ diff --git a/assets/prompt-templates/image/social-media-post-sensational-girl-dance-storyboard-8-shots.jpg b/assets/prompt-templates/image/social-media-post-sensational-girl-dance-storyboard-8-shots.jpg new file mode 100644 index 000000000..8ed6ec9c5 Binary files /dev/null and b/assets/prompt-templates/image/social-media-post-sensational-girl-dance-storyboard-8-shots.jpg differ diff --git a/prompt-templates/image/game-ui-ancient-china-open-world-mmo-hud.json b/prompt-templates/image/game-ui-ancient-china-open-world-mmo-hud.json new file mode 100644 index 000000000..7f89c7838 --- /dev/null +++ b/prompt-templates/image/game-ui-ancient-china-open-world-mmo-hud.json @@ -0,0 +1,26 @@ +{ + "id": "game-ui-ancient-china-open-world-mmo-hud", + "surface": "image", + "title": "Game UI - Ancient China Open-World MMO HUD", + "summary": "Generates an in-game HUD screenshot mockup for a AAA ancient-China open-world MMO, in the cinematic photoreal style of Black Myth: Wukong. A beautiful female swordswoman protagonist anchors the center of the frame in a misty mountain ancient-shrine scene, surrounded by a complete MMO HUD: top-left character portrait with HP/MP/stamina bars and buff icons, bottom-center skill hotbar with Chinese-calligraphy skill icons, top-right minimap with quest markers, right-side quest tracker panel, bottom-left scrolling chat window, floating world-space NPC nameplates and quest exclamation mark. Rendered as a realistic monitor screenshot, 16:9, suitable for pitch decks, gamescom-style key art, and Xiaohongshu/bilibili game teasers.", + "category": "Game UI", + "tags": [ + "game-ui", + "mmo", + "hud", + "ancient-china", + "open-world", + "cinematic", + "wuxia" + ], + "model": "gpt-image-2", + "aspect": "16:9", + "prompt": "A full-screen in-game HUD screenshot of a AAA ancient-China open-world MMO, rendered in the cinematic photoreal style of Black Myth: Wukong — Unreal Engine 5 level lighting, volumetric god rays, deep filmic color grading, subtle chromatic aberration, shallow depth of field on the background, razor-sharp foreground.\n\n# 3D scene (underneath the UI)\n- Center of frame: {argument name=\"protagonist\" default=\"a beautiful Chinese female swordswoman in her mid 20s, flowing ivory-white Hanfu robe with pale jade embroidery, long black hair tied with a silk ribbon, jade hairpin, elegant calm expression, holding a slender straight jian sword in a low guard stance, gentle wind lifting her sleeves and hair ribbon\"}, captured in a cinematic third-person over-the-shoulder framing, shot from slightly behind and above her right shoulder so the viewer sees both her profile and the world ahead.\n- Environment: {argument name=\"environment\" default=\"a cold-toned deep-mountain ancient shrine — towering weathered stone steles carved with faded sutras, a half-ruined Tang-dynasty wooden pavilion with curled eaves and peeling vermilion paint, a massive ancient gnarled peach tree with scattered falling petals, dense low-lying mist rolling along mossy stone steps, distant jagged mountain peaks fading into cold blue fog\"}.\n- Lighting: cold teal and desaturated blue base palette with warm amber rim light on the protagonist, faint god rays cutting through the mist, cinematic HDR contrast, filmic grain.\n\n# HUD overlay (drawn cleanly on top of the 3D scene, readable, game-screenshot accurate)\n- Top-left — Character status panel:\n - Circular portrait frame with ornate bronze Chinese cloud-pattern border, inside a stylized portrait of the same protagonist.\n - To the right of the portrait: character name \"{argument name=\"character_name\" default=\"云裳\"}\", level badge \"Lv.{argument name=\"level\" default=\"58\"}\", and a small sect crest tag \"{argument name=\"sect\" default=\"青冥剑宗\"}\" (Qingming Sword Sect).\n - Three stacked bars beneath: red HP bar labeled \"气血\", blue MP/internal-energy bar labeled \"内力\", yellow stamina bar labeled \"体力\". Each bar has crisp numeric readouts in small Song/serif Chinese typography.\n - A row of 5 small buff/debuff icons with faint Chinese seal-script labels and countdown timers.\n- Top-right — Minimap:\n - Round minimap with a brass compass-style frame etched with the 8 trigrams (bagua) around the rim, N/E/S/W marked in small seal-script characters.\n - Inside: a semi-transparent top-down terrain painted in ink-wash style, the player shown as a golden arrow in the center, nearby quest markers as yellow exclamation marks, a blue diamond waypoint, and a red skull for an elite monster.\n - Below the minimap: current region name \"{argument name=\"region\" default=\"天牙关 · 古祠林\"}\" and in-game time \"{argument name=\"in_game_time\" default=\"戌时 · 月明\"}\" in vertical Song typography.\n- Right edge — Quest tracker panel:\n - Semi-transparent parchment-textured vertical panel with faint ink-wash border.\n - Header: \"任务追踪\" in bold Song typography.\n - Active quest: \"{argument name=\"active_quest\" default=\"寻访古祠残卷\"}\" with a short one-line objective beneath in smaller type, e.g. \"前往古祠林深处查探异象 (1/3)\".\n - Two additional quest entries listed below in dimmer color, each with a small circular category icon (main / side / sect).\n- Bottom-center — Skill hotbar:\n - 10 square skill slots arranged horizontally, each with an ornate bronze Chinese-motif border and a dark inner background.\n - Each slot contains a painterly skill icon with a recognizable wuxia theme (sword qi arc, swirling internal-energy palm, stepping-on-snow lightfoot, ink-bird summon, ice-lotus burst, etc.).\n - Hotkey letters 1-0 in small crisp white numerals at the bottom-right of each slot.\n - Two skills are on cooldown with a faint radial sweep overlay and a small remaining-seconds number.\n - Flanking the hotbar on the left: a round \"普攻\" basic-attack button; on the right: a round \"绝技\" ultimate button with a subtle golden glow suggesting it is ready.\n- Bottom-left — Chat window:\n - Semi-transparent dark rounded-rectangle chat panel with a thin gold hairline border.\n - 4-5 recent chat lines in small Chinese typography, each prefixed by a channel tag: [世界], [门派], [队伍], [系统]. Examples: \"[世界] 逍遥子: 天牙关有BOSS刷新了,招人!\", \"[系统] 您已进入秘境「古祠林」,PVP 已开启\", \"[门派] 青冥剑宗 长老: 今晚酉时门派任务集合\".\n- World-space UI (floating in 3D, not screen-locked):\n - A distant NPC in front of the pavilion has a floating nameplate \"{argument name=\"npc_name\" default=\"守祠老人\"}\" with a golden exclamation mark above their head indicating an available quest.\n - A second NPC further back shows a small cyan question mark indicating an in-progress quest turn-in.\n - A faint golden guide-breeze particle trail drifts from the player toward the next objective, fading into the mist.\n\n# Typography & language rules\n- All in-UI text is rendered in clean, crisp Simplified or Traditional Chinese (Song/serif for headings, sans for body); no garbled glyphs, no Latin filler, no lorem.\n- Numbers are Western Arabic digits.\n- HUD elements are readable at a glance but never overpower the protagonist — UI takes no more than ~25% of total frame area in aggregate.\n\n# Final feel\nShould read as a real 4K in-game screenshot of a next-generation Chinese wuxia MMO, somewhere between a Black Myth: Wukong combat moment and a Jianwang 3 scenic screenshot. Cold mountain atmosphere, cinematic protagonist hero framing, precise game-HUD production quality, zero AI-artifact sloppiness on the UI widgets.\n\n# Negative prompt\nno warped Chinese characters, no fake gibberish glyphs, no Western medieval armor, no anime cel-shading, no low-res UI, no duplicated HUD widgets, no floating crooked text, no extra fingers on the protagonist, no modern clothing, no firearms, no generic fantasy elf look, no cluttered or overlapping UI panels, no watermark, no signature.", + "previewImageUrl": "https://raw.githubusercontent.com/nexu-io/open-design/main/assets/prompt-templates/image/game-ui-ancient-china-open-world-mmo-hud.jpg", + "source": { + "repo": "nexu-io/open-design", + "license": "Apache-2.0", + "author": "open-design contributors", + "url": "https://github.com/nexu-io/open-design" + } +} diff --git a/prompt-templates/image/social-media-post-sensational-girl-dance-storyboard-8-shots.json b/prompt-templates/image/social-media-post-sensational-girl-dance-storyboard-8-shots.json new file mode 100644 index 000000000..9b924c86c --- /dev/null +++ b/prompt-templates/image/social-media-post-sensational-girl-dance-storyboard-8-shots.json @@ -0,0 +1,25 @@ +{ + "id": "social-media-post-sensational-girl-dance-storyboard-8-shots", + "surface": "image", + "title": "Social Media Post - Sensational Girl Dance Storyboard (8 Shots)", + "summary": "A full 8-shot storyboard prompt set for generating a coherent frame-by-frame dance sequence of a stylish character. Includes shared global style tokens, a reusable negative prompt, and eight per-shot prompts (opening pose, hip groove, body wave, beat-drop waist twist, side hip sway, hair flick, power stance, finishing pose). Tuned for GPT-Image-2 tier models: concise vocabulary, no sensitive phrasing, consistent framing and lighting language across shots so the frames feel like one continuous choreography.", + "category": "Social Media Post", + "tags": [ + "storyboard", + "dance", + "portrait", + "cinematic", + "sequence", + "fashion" + ], + "model": "gpt-image-2", + "aspect": "3:4", + "prompt": "# Sensational Girl Dance — 8-Shot Storyboard for GPT-Image-2\n\nFor each shot, prepend the GLOBAL STYLE TOKENS and append the NEGATIVE PROMPT. Shots are choreographed to flow as a continuous short dance clip, so do not change the outfit, hair, body type, or lighting language between frames.\n\n## GLOBAL STYLE TOKENS (prepend to every shot)\nultra-high definition, 8K, crisp fine detail, textured skin, natural complexion, native ambient light, subtle street atmosphere, minimal backdrop, gentle motion blur, dance kinetic tension, natural posture, refined facial features, relaxed mood, filmic grain, low-saturation premium color grading, full-body or half-body framing, clean uncluttered frame, authentic human texture, candid dance-capture feel\n\n## NEGATIVE PROMPT (append to every shot, required)\ndeformed limbs, distorted hands or feet, warped face, motion smear, compression artifacts, stray clutter, text watermark, heavy occlusion, broken proportions, stiff posture, over-exposed skin, trashy texture, exaggerated deformity, duplicated elements, pixelated grain\n\n## SHARED CHARACTER LOCK (keep identical across all 8 shots)\n- Subject: {argument name=\"subject\" default=\"young stylish Asian woman in her early 20s\"}\n- Hair: {argument name=\"hair\" default=\"long dark wavy hair with soft highlights\"}\n- Outfit: {argument name=\"outfit\" default=\"fitted cropped top, high-waist slim pants, minimal modern streetwear accessories\"}\n- Expression baseline: cool, aloof, confident, subtly playful\n- Body language: loose athletic dancer frame, effortless posture\n\n---\n\n## SHOT 1 — Opening Pose / Preparation (Half-Body, Static Start)\nGLOBAL STYLE TOKENS, medium half-body shot, eye-level candid framing, stylish girl in an opening dance-ready stance, body slightly angled, languid cool expression, relaxed pre-beat posture, fitted cropped streetwear outfit, warm soft side light sculpting shoulder and waist line, pure black minimal backdrop, faint motion potential in fingertips, calm breath-hold moment before the beat drops. NEGATIVE PROMPT.\n\n## SHOT 2 — Hip Groove (Full-Body, Weight Shift Right)\nGLOBAL STYLE TOKENS, full-body wide shot, low eye-level framing, stylish girl mid-groove with hips shifted to her right side, one knee slightly bent, arms relaxed and bouncing to rhythm, loose athletic dancer posture, warm rim light separating silhouette from backdrop, subtle motion blur on trailing hand, pure dark minimal backdrop, confident rhythmic flow. NEGATIVE PROMPT.\n\n## SHOT 3 — Body Wave (Half-Body, Spine Undulation)\nGLOBAL STYLE TOKENS, medium half-body shot, eye-level framing, stylish girl mid body-wave with spine gently undulating forward, chest lifted, shoulders rolling through the wave, hair catching light as it moves, soft directional key light from the left, faint motion trail along the torso line, pure dark minimal backdrop, fluid kinetic tension across the frame. NEGATIVE PROMPT.\n\n## SHOT 4 — Beat-Drop Waist Twist (Full-Body, Sharp Accent)\nGLOBAL STYLE TOKENS, full-body three-quarter shot, slightly low angle, stylish girl snapping waist to her left on a sharp beat drop, arms flaring out for balance, hair fanning with the motion, crisp shutter-speed feel capturing the peak of the movement, warm key light with a cooler rim, pure dark minimal backdrop, decisive confident accent pose. NEGATIVE PROMPT.\n\n## SHOT 5 — Side Hip Sway (Full-Body, Profile)\nGLOBAL STYLE TOKENS, full-body profile shot, eye-level framing, stylish girl swaying hips to the side in a smooth lateral groove, weight on the back foot, front arm crossing the body, cool aloof expression, long silhouette emphasized against the backdrop, warm side light grazing the hip line, pure dark minimal backdrop, elegant lateral rhythm. NEGATIVE PROMPT.\n\n## SHOT 6 — Hair Flick (Half-Body, Head Turn)\nGLOBAL STYLE TOKENS, medium half-body shot, eye-level candid framing, stylish girl mid hair-flick with head turning and long wavy hair arcing across the frame, eyes closed or half-lidded in playful focus, shoulder lifted on the flick side, crisp frozen motion on individual hair strands, warm top light highlighting the hair arc, pure dark minimal backdrop, cinematic kinetic beauty shot. NEGATIVE PROMPT.\n\n## SHOT 7 — Power Stance (Full-Body, Peak Energy)\nGLOBAL STYLE TOKENS, full-body wide shot, low eye-level framing, stylish girl in a grounded wide power stance at the peak of the drop, knees bent, one arm extended downward with open palm, other arm coiled close to the body, chin down and eyes up with fierce confident expression, strong key light with dramatic rim, pure dark minimal backdrop, commanding stage-presence frame. NEGATIVE PROMPT.\n\n## SHOT 8 — Finishing Pose (Half-Body, Exhale)\nGLOBAL STYLE TOKENS, medium half-body shot, eye-level framing, stylish girl in the final resting pose as the beat fades, chest relaxed on a long exhale, shoulders dropped, faint satisfied half-smile, hair slightly disheveled from the choreography, soft warm key light only, pure dark minimal backdrop, quiet confident close-out of the sequence. NEGATIVE PROMPT.", + "previewImageUrl": "https://raw.githubusercontent.com/nexu-io/open-design/main/assets/prompt-templates/image/social-media-post-sensational-girl-dance-storyboard-8-shots.jpg", + "source": { + "repo": "nexu-io/open-design", + "license": "Apache-2.0", + "author": "open-design contributors", + "url": "https://github.com/nexu-io/open-design" + } +} diff --git a/scripts/import-prompt-templates.mjs b/scripts/import-prompt-templates.mjs index f796753c5..397279315 100755 --- a/scripts/import-prompt-templates.mjs +++ b/scripts/import-prompt-templates.mjs @@ -46,7 +46,7 @@ * All output JSON carries a `source` block so attribution stays intact. */ -import { mkdir, writeFile, readdir, unlink } from 'node:fs/promises'; +import { mkdir, writeFile, readdir, unlink, readFile } from 'node:fs/promises'; import path from 'node:path'; import { fileURLToPath } from 'node:url'; @@ -317,25 +317,46 @@ function inferTags(title, prompt, surface) { return Array.from(set).slice(0, lim); } -async function clearDir(dir) { +// Remove previously generated JSON files. Hand-authored templates (those +// whose `source.repo` is not the upstream CC-BY corpus we import from) are +// preserved so first-party curated prompts aren't wiped on re-run. +async function clearDir(dir, upstreamRepo) { try { const files = await readdir(dir); for (const f of files) { - if (f.endsWith('.json')) { - await unlink(path.join(dir, f)); + if (!f.endsWith('.json')) continue; + const filePath = path.join(dir, f); + let keep = false; + try { + const parsed = JSON.parse(await readFile(filePath, 'utf8')); + const repo = parsed?.source?.repo; + if (repo && repo !== upstreamRepo) keep = true; + } catch { + // Unparseable file — treat as generated and remove. } + if (!keep) await unlink(filePath); } } catch { // missing dir is fine — created below. } } -async function writeAll(entries, outDir) { +async function writeAll(entries, outDir, upstreamRepo) { await mkdir(outDir, { recursive: true }); - await clearDir(outDir); + await clearDir(outDir, upstreamRepo); // De-dup on slug; if two entries collide, keep the first (which is the - // featured one — always parsed before "All Prompts"). + // featured one — always parsed before "All Prompts"). Hand-authored + // templates already on disk (preserved by clearDir) also take priority + // so we never overwrite curated first-party prompts. const seen = new Set(); + try { + const existing = await readdir(outDir); + for (const f of existing) { + if (f.endsWith('.json')) seen.add(f.replace(/\.json$/, '')); + } + } catch { + // noop + } let count = 0; for (const entry of entries) { if (seen.has(entry.id)) continue; @@ -366,7 +387,7 @@ async function main() { continue; } const outDir = ctx.surface === 'image' ? OUT_IMAGE : OUT_VIDEO; - const written = await writeAll(entries, outDir); + const written = await writeAll(entries, outDir, ctx.repo); if (ctx.surface === 'image') totalImage += written; else totalVideo += written; console.log(