← back to Wallco Ai
scripts/drunk_animal_prompts.js
391 lines
#!/usr/bin/env node
/**
* Drunk-animals-in-a-forest, botanical-pop-Warhol prompt library + picker.
*
* Generates highly varied prompts for Steve's overnight wallco.ai run.
* Each prompt combines:
* - one animal (frog/elephant/giraffe/orangutan + a few wildcards)
* - one "drunk" tableau (passed out, holding martini, swaying, etc.)
* - one botanical-forest context (banana leaves, ferns, jungle vines, etc.)
* - one Warhol-pop palette (electric pink + lime, cobalt + neon orange, etc.)
* - one composition cue (silkscreen 4-panel color swap, half-drop repeat, etc.)
*
* Used by:
* - bin/drunk_animals_batch.js — initial batch of N
* - bin/drunk_animals_tick.js — single design per 4-min cron firing
*/
const { TONE_ON_TONE_SUFFIX } = require('./fashion_palettes');
const SHARED = require('./drunk_motif_shared');
// Re-export so external callers (tick scripts) still see ANIMALS/TABLEAUX etc.
// Local arrays below mirror SHARED for backwards compat; SHARED is canonical
// going forward.
const ANIMALS = [
'wide-eyed Amazonian tree frog',
'pink-cheeked drunken bullfrog',
'tipsy emerald glass frog',
'jolly grey African elephant calf',
'wobbly pink champagne elephant',
'reticulated giraffe with crooked smile',
'long-lashed Maasai giraffe sipping a daiquiri',
'shaggy orange orangutan clutching a banana cocktail',
'sleepy Bornean orangutan slumped against a fern',
'sloshed scarlet macaw',
'tipsy capybara holding a mint julep',
'drunken peacock with feathers half-fanned',
'plastered red panda',
'inebriated lemur swinging from a vine',
'starry-eyed sloth holding a wine glass',
];
// Every tableau has a drink IN HAND — bottle, glass, or both. Brand-color
// cues without using brand names (cobalt-blue vodka bottle, emerald-green
// beer bottle, jet-black stout glass, deep purple velvet whiskey decanter,
// frosted clear vodka, gold-labeled cognac).
// 2026-05-25 Steve directive — heavy on classic drinks, tiki/Hawaiian-umbrella
// drinks, Trader Vic's-style mai tai / zombie / scorpion bowls, cognac
// snifters, smoking dry-ice / bubbling cocktails, champagne bottles
// (popping corks, magnums), and whimsical/wild bottles in the background.
const TABLEAUX = [
// ── classic glassware ────────────────────────────────────────────────
'clutching a long-stemmed red wine glass, deep burgundy sloshing over the rim',
'cradling an emerald-green beer bottle, foam crowning the lip, content sigh',
'holding a frosted clear vodka bottle aloft, condensation beads, cheeks flushed',
'mid-pour from a cobalt-blue vodka bottle into a shot glass, eyes crossed',
'one paw around a jet-black stout pint, cream head, eyelids drooping',
'gripping a pale-gold pilsner glass in one paw, amber bottle in the other',
'holding a crystal whiskey tumbler, two melting ice cubes, deep amber whiskey',
'cradling a deep-purple velvet-bag whiskey decanter, label edge peeking',
'sipping from a coupe glass of rosé, eyes half-closed, pink liquid sloshing',
'martini glass in mid-spin, two olives skewered, vodka splashing',
'tequila shot in one paw, lime wedge in the other, salt rim on the glass',
'clear pale lager bottle with a lime wedge stuffed in its neck',
'mug of pilsner the size of its head, foam dripping down its chin',
'red-star amber-lager bottle gripped tight, head tipped back mid-swig',
'frosted vodka decanter etched with silhouettes, cradled to its chest',
'two paws on a hand-blown wine bottle, burgundy splashing onto a flower',
'long-neck amber beer bottle on its head like a hat, grin lopsided',
// ── cognac / brandy snifter ──────────────────────────────────────────
'gold-labeled cognac snifter cradled in both paws, swirling deliberately, deep amber liquor coating the inside of the bowl',
'oversized brandy snifter held in both arms, the animal nose-deep in the bouquet, eyes closed in bliss',
'wide-bowl cognac snifter resting on its belly, swirling pool of amber catching the light, lazy smile',
// ── tiki / Hawaiian-umbrella / Trader Vic\'s ──────────────────────────
'oversized ceramic tiki mug carved like a moai head, paper-parasol umbrella sticking out, pineapple wedge on the rim, sipping with crossed eyes',
'classic mai tai in a hurricane glass — coral-orange liquid, hibiscus blossom + paper Hawaiian umbrella + lime-wedge skewer, the animal sipping through a striped paper straw',
'zombie cocktail in a tall chimney glass — three-color sunset gradient, two paper umbrellas crossed at the top, cherries and mint, frothy crown',
'scorpion bowl shared from the center — giant ceramic tiki bowl, two long bendy straws, the animal leaning in with both paws gripping the rim, multiple paper umbrellas',
'piña colada in a coconut shell — striped straw, paper parasol, the animal cradling the coconut against its chest',
'tiki ceramic mug shaped like a hula dancer, the animal pretending to dance along, parasol garnish bouncing',
'singapore sling in a tall pilsner-style flute, pink liquid, cherry-and-pineapple skewer, paper umbrella tucked behind one ear',
'painkiller cocktail in a wide rocks glass with grated nutmeg dusting on top, the animal sneezing from the spice, drink mid-spill',
// ── smoking / bubbling / molecular ───────────────────────────────────
'smoking dry-ice cocktail in a crystal coupe — dense white smoke pouring over the rim and cascading down the stem like a slow waterfall, the animal peering in wide-eyed',
'bubbling absinthe fountain dripping into a slotted-spoon-and-sugar-cube setup over a tulip glass, the green liquor going milky-jade, the animal entranced',
'molecular cocktail in a flat-bottom rocks glass with floating caviar spheres of bitters and a single dry-ice cube hissing smoke off the surface, the animal poking at the bubbles with a swizzle stick',
'champagne flute with an effervescent sugar cube dropped in — bubbling violently over the rim, the animal recoiling with a goofy grin',
'gin fizz in a tall collins glass with a thick foamy head dome rising two inches above the rim, the animal carefully not touching it',
'flaming-rum tiki bowl with a real flame leaping out of a hollowed lime in the center, ribbons of smoke rolling off, the animal\'s eyebrows singed off in surprise',
// ── champagne bottles / popping corks ────────────────────────────────
'champagne bottle popping mid-celebration — cork shooting toward the corner of the panel, golden fizz erupting in a wide arc, the animal holding the bottle aloft like a trophy',
'magnum of champagne wedged under one arm, foil torn off, wire cage dangling, the animal mid-pour into a coupe in its other paw',
'jeroboam champagne bottle taller than the animal itself, the animal hugging the bottle like a friend, gold-foil neck label catching the light',
'champagne saber poised — vintage cavalry-style sabre about to slice the bottle neck off, the animal in dramatic stance with one eye squinted',
'pyramid-tower of stacked champagne coupes, the animal pouring from a magnum on top, golden fountain cascading down through the tower',
'spraying champagne bottle held above the head like a Formula-1 podium, the animal soaked but grinning, foam everywhere',
];
// Wild bottle backdrops — Steve 2026-05-25 followup: "wild bottles backdrops".
// Whimsical, exotic, decorative bottle shapes arranged in the background
// behind the animal — apothecary, etched crystal, ceramic tiki, hourglass,
// skull, hand-blown art-glass. Always solid-ink silhouettes (no labels with
// real brand names). One picked per prompt — mandatory.
const BOTTLE_BACKDROPS = [
'a whimsical backdrop of mismatched apothecary bottles in tall and squat silhouettes, lined up like a curio shelf, each with a hand-drawn cork',
'a wild backdrop of etched-crystal decanters in five different silhouettes — hexagonal, hourglass, teardrop, square-cut, footed — all sketched in line and washed flat',
'a backdrop row of ceramic tiki bottles carved as moai heads, hula dancers, and pufferfish, each with a tiny cork',
'a whimsical bar shelf backdrop crammed with hand-blown art-glass bottles in twisted, helical, and spiral forms, each catching a tiny highlight',
'a backdrop of vintage champagne bottles in graduated sizes (split, demi, standard, magnum, jeroboam, methuselah) lined up like russian dolls',
'a backdrop of skull-shaped vodka bottles in different sizes peering out at the viewer, each with a cork hat',
'a stacked-pyramid backdrop of cognac bottles, some on their sides, others upright, casting long flat shadows on the ground tone',
'a whimsical backdrop of weird-bottle silhouettes — a fish, a boot, a violin, a teapot, a hourglass — all functioning as liquor bottles, arrayed across the back of the panel',
'a backdrop of carved Murano-style art-glass bottles with twisted necks and bulbous bodies, in graduated sizes across the back',
'a backdrop of antique smuggler bottles half-buried in the ground, corks sticking up like little hats',
'a backdrop of saloon-style bottle rows on a back-bar shelf, mirrored back behind them, the animal reflected partially in the mirror',
'a backdrop of hot-air-balloon-shaped novelty bottles floating gently behind the animal, each with a tiny ribbon-tied label',
];
// Lit-cannabis-joint clauses — Steve directive 2026-05-25: every drunk-animal
// design must explicitly show a lit joint of cannabis (handrolled paper +
// smoke trail). Steve 2026-05-27: cannabis leaves / buds are also welcome as
// decorative motifs (the leaf is no longer banned). Pick one per prompt —
// guaranteed, never omitted.
const JOINTS = [
'a lit handrolled cannabis joint pinched between the other paw\'s fingers, white smoke trailing in a soft curl above',
'a smoldering joint dangling from its lips, a thin wisp of smoke rising in a backwards-S curl',
'a fat handrolled joint held aloft like a cigar, glowing red at the tip with a single curl of smoke',
'a half-smoked joint balanced on the rim of the cocktail glass, ribbon of smoke drifting upward',
'a freshly lit joint tucked behind one ear with a thin trail of smoke coming off the tip',
'a thick joint clenched in its teeth, two slow puffs of smoke escaping the nostrils',
'a glowing joint cradled between its claws, ember bright, smoke curling into a question mark',
'a hand-rolled joint mid-puff, smoke ring expanding around its head',
'a long elegant joint held between two pinched fingers, ash about to fall, smoke trail vertical',
'a stubby roach pinched in a tiny silver clip, ember glowing, single thread of smoke',
];
// Swinging-action clauses — Steve directive 2026-05-25: every drunk-animal
// design must show the animal SWINGING from something — vine, chandelier,
// rope, branch, swing, trapeze. Mandatory per-prompt, not optional.
const SWINGS = [
'mid-swing from a thick hanging garden vine, one paw gripping the vine, body arcing through the air',
'swinging from a crystal chandelier with the chain creaking, the other paw waving',
'gripping a knotted rope swing, mid-arc, hair/fur blown back by the motion',
'hanging upside-down from a curving tree branch, tail looped around for balance, mid-pendulum',
'mid-swing on a circus trapeze bar, legs kicked out, glass and joint somehow still in hand',
'one paw hooked around a hanging brass chandelier arm, body swinging in a wide pendulum',
'swinging from a flowering wisteria vine that bows under its weight, petals shaking loose',
'swinging from a porch-style wooden seat swing with rope sides, kicking its feet out',
'mid-swing from a thick braided tassel rope hanging from the ceiling, body angled like a pendulum',
'gripping a curved tree limb with both hands, swinging side-to-side, ground far below',
];
// FLOWER-ONLY botanicals. No leaves, no foliage, no jungle/tropical-coded
// plants. Mix of iconic garden-show flowers + rare / hard-to-find species
// pulled from US native-plant references (USDA PLANTS, Lady Bird Johnson
// Wildflower Center, US Botanic Garden). Per DW Legal Agent: NO monstera,
// palm, banana, philodendron, calathea, hostas, ferns.
const BOTANICALS = [
'cascading wisteria racemes, mauve and lilac, climbing trellis behind',
'sun-bleached field of sunflowers, golden disc faces packed edge-to-edge',
'french lavender field at golden hour, ranks of purple spikes to the horizon',
'crimson bougainvillea spilling over a stucco wall, papery bracts',
'magenta hibiscus, hot-pink dahlias, fuchsia peonies — saturated cottage garden',
'meadow of California poppies and lupine, deep orange and indigo',
'Texas hill country bluebonnets in flower, swept hillsides',
'antique heirloom rose garden — David Austin pinks, butter creams, burgundies',
'Black Bat Flower (Tacca chantrieri), inky violet with cascading whiskers',
'Ghost Orchid (Dendrophylax lindenii) suspended midair, white petals',
'Chocolate Cosmos (Cosmos atrosanguineus), velvet maroon discs in clusters',
"Snake's Head Fritillary (Fritillaria meleagris), checkered purple bells",
'Indian Paintbrush wildflower (Castilleja), vermillion bracts in a prairie',
'Foxglove (Digitalis purpurea) spires, freckled magenta throats',
'Bleeding Heart (Lamprocapnos), strings of rose-pink hearts dangling',
"Lady's Slipper Orchid (Cypripedium), translucent pouches of pink and ivory",
'Globe Amaranth (Gomphrena globosa), magenta button-flowers, papery and dense',
'Love-in-a-Mist (Nigella damascena), cobalt stars in feathery haze',
'Passion Flower (Passiflora incarnata), filament-haloed indigo discs',
'Beehive Ginger (Zingiber spectabile), torch-shaped scarlet cones',
'Voodoo Lily (Sauromatum venosum), speckled maroon spathes',
'Naked Man Orchid (Orchis italica), pink figurine-shaped blooms in spike',
'Parrot Tulips, frilled edges in flame red, viridian, and apricot',
'Cardinal Flower (Lobelia cardinalis), scarlet spires by a creek',
'Painted Desert wildflowers — globemallow, blanketflower, desert marigold',
];
const PALETTES = [
'Warhol electric pink + acid lime + cobalt blue + lemon yellow',
'silkscreen hot magenta + traffic-cone orange + emerald green + black',
'neon coral + spearmint + buttercream + jet black ink',
'shocking purple + sour apple green + Pepto pink + chrome',
'Day-Glo orange + ultramarine + chartreuse + ivory',
'Marilyn-era turquoise + persimmon + canary + slate',
'Velvet Underground crimson + neon green + cream + onyx',
'art-pop tangerine + grape + lime sherbet + white',
'Brillo-box red, blue, yellow primaries on bone-white',
'campbell-soup tomato red + sunshine yellow + grass green + matte black',
];
// Fashion-house-derived palettes pulled from the common-colors map of the
// top 20 fashion houses (~/Projects/fashion-style-guides/data/brands.json).
// Each entry is a deliberate 4-color combination of swatches that appear
// together across the luxury-fashion fleet. Names are descriptive of the
// COLOR FAMILY, NOT the brand — public-facing prompts must never name a
// brand (see [[feedback_never_expose_ai_software]] adjacent rule).
const FASHION_PALETTES = [
'deep forest emerald #0e5c2f + heritage red #9b1b1f + antique gold #b58a2a + warm ivory #f2ece1',
'saddle-leather orange #ff6900 + warm chocolate brown #6b4423 + gold leaf #c8a44a + french cream #f6efe2',
'pure jet black #000000 + crisp white #ffffff + warm beige #e6d6b8 + camellia red #b00020',
'tiffany robin\'s-egg blue #0abab5 + champagne gold #caa84a + bright white #ffffff + ink black #0a0a0a',
'baroque jet black + medusa antique gold #d4af37 + imperial red #b40000 + royal purple #4b1c5e',
'dark gallery green #22443a + ink black #0a0a0a + powder beige #d7c8a8 + lipstick red #c8102e',
'old-money ink black + champagne gold #c8a96a + oxblood maroon #5a1818 + warm bronze #8a6a3a',
'equestrian navy blue #0a2548 + polo red #bf2c2c + saddle tan #a8794a + crisp ivory #f5efe2',
'parakeet kelly green #5cb338 + dark chocolate brown #5b3a1d + caramel tan #c38a4d + warm ivory #f4ede0',
'heritage camel #c8a47a + check black #000000 + check red #b22234 + check white #ffffff',
'vintage powder pink #f3c7c4 + retro mint #b6dcc7 + powder blue #c8d8e6 + buttery cream #f4ecd8',
'rosso red #bc0030 + roman black #0a0a0a + warm ivory #f5efdf + pale rose pink #f7d6d0',
];
// Combined pool — fashion palettes mix into the regular rotation by default.
// 2026-05-25 Steve directive — DEFAULT mode is now SHARED tone-on-tone deep
// palettes (browns/greens/reds/golds, Gucci + Hermès anchored). Warhol-pop
// + local fashion arrays are kept for backwards-compat env overrides.
const ALL_PALETTES = [...PALETTES, ...FASHION_PALETTES, ...SHARED.TONE_ON_TONE_DEEP_PALETTES, ...SHARED.FASHION_PALETTES];
// 2026-05-27 Steve prompt-surgery — these are WALLPAPER styles, never posters.
// Removed the "1968 nightclub poster / Warhol album sleeve / 4-panel grid /
// lithograph plate / cut-paper collage" refs: SDXL was rendering literal poster
// borders, fake gibberish text, and single framed subjects. All entries now
// describe a dense, edge-to-edge, two-tone screen-printed wallpaper repeat.
const STYLES = [
'dense two-tone screen-printed wallpaper, tone-on-tone, ink bleed at edges, fine paper-grain texture',
'hand-pulled flat screen-print wallpaper, all-over coverage, slight misregister, no white margin',
'heritage damask-density wallpaper, flat silhouette motifs interlocked edge to edge',
'toile-style two-color wallpaper, fine engraved linework, motifs woven across the whole field',
'bold flat-color block-print wallpaper, confident shapes, full-bleed all-over repeat',
'archival botanical screen-print wallpaper, painterly brushwork, deliberate ink texture',
'chinoiserie-density scenic wallpaper, motifs and foliage filling the field corner to corner',
'vintage hand-stenciled wallpaper, two-tone, all-over dense scatter, no border',
];
// No "leaves", no "vines" — flowers only per DW Legal Agent. 2026-05-27 surgery:
// every composition is now a DENSE ALL-OVER repeat with MULTIPLE animals woven
// through botanicals — no "one hero animal centered", no "grid-of-portraits", no
// "breathing space" (those gave single framed subjects / sparse fields).
const COMPOSITIONS = [
'seamless half-drop repeat, multiple animals tessellated densely among blooms, full coverage',
'continuous all-over scatter, many animals and flowers filling the field edge to edge',
'striped column repeat, animals stacked in vertical bands of dense flower bouquets',
'mirrored axis repeat, kaleidoscopic dense floral-and-animal motif',
'damask-density allover, several animals interlocked with botanicals, no focal center',
'tossed-bouquet repeat, many animals interspersed with cut flower stems, dense coverage',
'tight 12-inch tile repeat, dense floral-and-animal scatter, full bleed',
'allover repeat with diagonal flow, animals and flower stems woven corner to corner',
];
// Source-pool picker — honors DRUNK_PALETTE env var:
// (default) → SHARED.DEFAULT_PALETTES (tone-on-tone deep — browns/greens/
// reds/golds, Gucci + Hermès anchored). Steve directive
// 2026-05-25.
// 'fashion' → SHARED.FASHION_PALETTES (20 fashion houses live from the
// style-guide agent at fashion-style-guides/data/brands.json)
// 'warhol' → original Warhol pop palettes (kept for backwards compat)
// 'mixed' → everything combined
//
// DRUNK_PALETTE_INDEX (0-based int) pins to a single specific palette within
// whichever pool DRUNK_PALETTE selects. Useful for "give me 50 designs in the
// Gucci palette" type batches without runtime variance.
function pickPaletteSource() {
const mode = (process.env.DRUNK_PALETTE || '').toLowerCase();
let pool;
if (mode === 'fashion') pool = SHARED.FASHION_PALETTES;
else if (mode === 'warhol' || mode === 'pop') pool = PALETTES;
else if (mode === 'mixed') pool = ALL_PALETTES;
else pool = SHARED.DEFAULT_PALETTES; // tone-on-tone deep
const pinIdx = parseInt(process.env.DRUNK_PALETTE_INDEX, 10);
if (Number.isInteger(pinIdx) && pinIdx >= 0 && pinIdx < pool.length) {
return [pool[pinIdx]]; // single-element array → pickRand always returns it
}
return pool;
}
// Pick a TEXTURE_GROUND voice — natural-fiber wallcovering ground description.
// Honors DRUNK_TEXTURE env var to pin to a specific slug.
function pickTextureGroundVoice() {
const pin = (process.env.DRUNK_TEXTURE || '').toLowerCase();
const list = SHARED.TEXTURE_GROUNDS;
if (pin) {
const hit = list.find(t => t.slug === pin);
if (hit) return hit.voice;
}
return list[Math.floor(Math.random() * list.length)].voice;
}
function pickRand(arr, exclude = new Set()) {
for (let tries = 0; tries < 50; tries++) {
const v = arr[Math.floor(Math.random() * arr.length)];
if (!exclude.has(v)) return v;
}
return arr[Math.floor(Math.random() * arr.length)];
}
function buildPrompt(seed = null) {
if (seed != null) {
// Deterministic when given a seed — for reproducibility from a 4-min cron
const rng = (() => {
let s = seed >>> 0;
return () => { s = (s * 1664525 + 1013904223) >>> 0; return s / 2**32; };
})();
const pick = arr => arr[Math.floor(rng() * arr.length)];
return [
pick(ANIMALS), pick(TABLEAUX),
// Mandatory motifs — Steve 2026-05-25; smoke prop = joint/cigar/pipe/bong (2026-05-26)
pick(SHARED.SMOKES),
pick(SWINGS),
pick(BOTTLE_BACKDROPS),
pick(SHARED.TEXTURE_GROUNDS).voice,
`set among ${pick(BOTANICALS)}`,
`palette: ${pick(pickPaletteSource())}`,
pick(STYLES),
pick(COMPOSITIONS),
SHARED.DRUNK_NEGATIVE_SUFFIX,
// 2026-05-25 — TONE_ON_TONE_SUFFIX removed for drunk-* chain. Its
// 25-hex whitelist fought the new Gucci/Hermès deep tone-on-tone
// palettes (#0e5c2f, #ff6900, #9b1b1f, etc. not on the list). Deep
// palette guidance now comes from SHARED.DEFAULT_PALETTES.
'deep tone-on-tone restraint, no neon, no fluorescent, no rainbow, no electric pink, low-saturation archival pigments'
].join(', ');
}
const refClause = SHARED.pickReferenceClause('drunk-animals');
return [
pickRand(ANIMALS), pickRand(TABLEAUX),
// Mandatory motifs — Steve 2026-05-25; smoke prop = joint/cigar/pipe/bong (2026-05-26)
pickRand(SHARED.SMOKES),
pickRand(SWINGS),
pickRand(BOTTLE_BACKDROPS),
pickTextureGroundVoice(),
refClause && `${refClause}`,
`set among ${pickRand(BOTANICALS)}`,
`palette: ${pickRand(pickPaletteSource())}`,
pickRand(STYLES),
pickRand(COMPOSITIONS),
SHARED.DRUNK_NEGATIVE_SUFFIX
].filter(Boolean).join(', ');
}
function buildN(n) {
// Try hard to avoid repeats across the batch — track used animals/styles
const usedAnimals = new Set();
const usedStyles = new Set();
const out = [];
for (let i = 0; i < n; i++) {
if (usedAnimals.size >= ANIMALS.length - 1) usedAnimals.clear();
if (usedStyles.size >= STYLES.length - 1) usedStyles.clear();
const animal = pickRand(ANIMALS, usedAnimals); usedAnimals.add(animal);
const style = pickRand(STYLES, usedStyles); usedStyles.add(style);
const refClause = SHARED.pickReferenceClause('drunk-animals');
const parts = [
animal,
pickRand(TABLEAUX),
// Mandatory motifs — Steve 2026-05-25 — every drunk-animal must show
// alcohol-in-hand + a smoke prop (joint/cigar/pipe/bong, Steve 2026-05-26)
// + swinging + wild-bottle backdrop + rendered on a natural-fiber texture
// ground (grasscloth/sisal/raffia/Madagascar etc.) + Met PD + prior ref.
pickRand(SHARED.SMOKES),
pickRand(SWINGS),
pickRand(BOTTLE_BACKDROPS),
pickTextureGroundVoice(),
refClause,
`set among ${pickRand(BOTANICALS)}`,
`palette: ${pickRand(pickPaletteSource())}`,
style,
pickRand(COMPOSITIONS),
SHARED.DRUNK_NEGATIVE_SUFFIX,
// 2026-05-25 — TONE_ON_TONE_SUFFIX removed for drunk-* chain. See note
// in buildPrompt() above. Deep palette guidance now comes from
// SHARED.DEFAULT_PALETTES.
'deep tone-on-tone restraint, no neon, no fluorescent, no rainbow, no electric pink, low-saturation archival pigments'
].filter(Boolean);
out.push(parts.join(', '));
}
return out;
}
module.exports = { buildPrompt, buildN, ANIMALS, TABLEAUX, JOINTS, SWINGS, BOTTLE_BACKDROPS, BOTANICALS, PALETTES, FASHION_PALETTES, ALL_PALETTES, STYLES, COMPOSITIONS };
if (require.main === module) {
const n = parseInt(process.argv[2] || '5', 10);
const prompts = buildN(n);
for (const p of prompts) console.log(p + '\n');
}