skills/ai-creatorship/laniameda-gallery-ingest/SKILL.md
Save prompts, images, tutorials, links, and design inspiration to the laniameda-gallery Convex knowledge base. Use when an agent needs to ingest prompts, files, URLs, or design references into the gallery and must stay aligned with the current repo ingest contract.
npx skillsauth add michailbul/laniameda-skills laniameda-gallery-ingestInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Use this skill to ingest content into laniameda.gallery through the canonical backend contract in this repo.
The skill now supports explicit create, update, and delete operations through the same script entrypoint.
Before constructing payloads or changing the ingest script, read these repo files:
convex/schema.tsconvex/validators.tsconvex/ingest.tsconvex/agent_ingest.tsapp/api/ingest/route.tsUse references/schema-contract.md for a quick map and references/ingest-examples.md for copy-ready examples.
skills/laniameda-gallery-ingest/~/.openclaw/skills/, ~/.codex/skills/, and ~/.agents/skills/ are disposable bunx skills installs.The script reads these env vars at runtime:
KB_OWNER_USER_ID — required. Keep this env-driven; do not hardcode the owner in payloads or wrappers.CONVEX_URL — required; falls back to NEXT_PUBLIC_CONVEX_URL if present.NEXT_PUBLIC_CONVEX_URL — optional browser/runtime mirror for app environments; keep it aligned with CONVEX_URL.Use a single active Convex deployment across OpenClaw, local dev, and Vercel. Do not hardcode deployment names in workflow docs; rotate the env values instead.
allowPromptOnly: truesourceTitle, userNote, captureKind, saveIntent, templateKey, and sourceFingerprint.mp4 / .mov / .webm outputAfter you create or update an asset/prompt/pack/design, the user can copy its ID from the gallery UI:
asset:<id> / pack:<id> / design:<id>asset:<id> chip sits next to the model/pillar/date badges and copies the same tokenWhen the user pastes one of these kind:<id> tokens to an agent, do not query via ingest. Hand off to the laniameda-gallery-query skill:
getById accepts any of asset:<id>, pack:<id>, design:<id> and returns the hydrated record (prompt text, tag names, resolved media URL, thumbnail URL, model, pillar, folder, pack membership, etc.).get / getPack / getDesign when the ID type is already known.download to pull raw bytes for local use.Agents should treat this as the canonical read path after an ingest. The ingest script intentionally exposes only create/update/delete — all reads live in laniameda-gallery-query.
All ingested assets and prompts are automatically indexed for semantic search using Gemini multimodal embeddings (gemini-embedding-2-preview).
semanticSearch:searchAssets (text → assets) or semanticSearch:findSimilarAssets (image → similar images).npx convex run semanticIndex:backfillBatch '{"sourceType": "asset", "batchSize": 25}' (loop until done: true).When Michael sends a screenshot of a prompt or image containing text/JSON:
imagePath or assetfinalPromptOnly use an image as imagePath/asset when it is a generated output (the result of a prompt), not when it contains text or code to be saved.
Video generations ingest through the same script and payload shape as images. The only differences:
imagePath / filePath / url pointing at a video file (.mp4, .mov, .webm). The server detects video/* content-type automatically and stores the asset with kind: "video".generationType: "video_gen" and promptType: "video_gen".modelName to "Seedance 2.0" when not specified. Pair with modelProvider: "other" unless a listed provider applies.update op on the asset with an imagePath pointing at a still frame to replace the thumbnail.allowPromptOnly: true.Example:
bun run ~/.agents/skills/laniameda-gallery-ingest/scripts/ingest.ts '{
"pillar": "creators",
"promptText": "cinematic dolly-in on a neon-lit alleyway, rain falling, 5 seconds",
"promptType": "video_gen",
"generationType": "video_gen",
"modelName": "Seedance 2.0",
"modelProvider": "other",
"imagePath": "/path/to/output.mp4",
"ingestKey": "creators:neon-alley-dolly:v1",
"tagNames": ["video", "cinematic", "neon"]
}'
Batched video prompt variations use the same promptIngestKey pattern as images — variants auto-group into an assetPack.
When a generation was produced from an earlier prompt or asset — e.g. a Seedance 2 video made from a GPT-Image-2 starting frame — capture the chain with upstreamInputs. Without this, the relationship is lost and agents cannot reproduce or remix the workflow.
Pattern:
ingestKeys so you can reference them.upstreamInputs array linking back to each upstream by ingestKey (or id).# Step 1: save the GPT-Image-2 starting-frame prompt
bun run ~/.agents/skills/laniameda-gallery-ingest/scripts/ingest.ts '{
"pillar": "creators",
"promptText": "cinematic neon start frame, rain-slick street, 35mm",
"promptType": "image_gen",
"generationType": "image_gen",
"modelName": "GPT-Image-2",
"modelProvider": "openai",
"imagePath": "/path/to/start-frame.png",
"ingestKey": "creators:neon-alley:startframe:v1"
}'
# Step 2: save the Seedance 2 prompt + video with upstream link
bun run ~/.agents/skills/laniameda-gallery-ingest/scripts/ingest.ts '{
"pillar": "creators",
"promptText": "dolly-in 5s, rain intensifies, neon flicker",
"promptType": "video_gen",
"generationType": "video_gen",
"modelName": "Seedance 2.0",
"modelProvider": "other",
"imagePath": "/path/to/output.mp4",
"ingestKey": "creators:neon-alley:seedance:v1",
"upstreamInputs": [
{
"type": "prompt",
"ingestKey": "creators:neon-alley:startframe:v1",
"role": "starting_image_prompt",
"stageOrder": 1
},
{
"type": "asset",
"ingestKey": "creators:neon-alley:startframe:v1",
"role": "starting_image_asset",
"stageOrder": 1
}
]
}'
Rules:
upstreamInputs[].type is "prompt" or "asset". One of id or ingestKey is required — prefer ingestKey for idempotency.role uses the lineageRoleValidator enum: starting_image_prompt, starting_image_asset, style_reference, motion_reference, upscale_source, variation_source, edit_source, other.(owner, target, source, role). Re-ingest with the same keys updates stageOrder/notes without duplicating rows.id/ingestKey fails the ingest rather than silently dropping the link — ingest the upstream step first.Do NOT use allowPromptOnly: true without explicit user approval. This is a hard rule — no exceptions, no silent fallbacks.
If you cannot attach an image (no file path, inline-only attachment, broken URL, extraction failure):
allowPromptOnly: true if the user explicitly says yes.When ingesting from PDFs, documents, websites, or any source that contains both prompts and images:
Common trap: user shares an image inline in a chat conversation. You cannot extract inline attachments to a file path. Ask the user for the local file path before ingesting. Do not save prompt-only and "attach later" — get the path first.
promptText, promptSections.finalPrompt, url, filePath / imagePath, or designInspiration.imagePath or filePath with every prompt. Never set allowPromptOnly: true without asking the user first.pillar when possible.typedTags when category and source are known.ingestKey values for retry safety.promptIngestKey when multiple assets should attach to one prompt.promptIngestKey across multiple media ingests now creates or updates an assetPack automatically.ownerUserId env-driven; callers never pass it directly.ingestKey is only an idempotency key for create; it does not patch existing records.update and delete, pass target plus either id or ingestKey.sourceTitle, userNote, captureKind, saveIntent, templateKey, sourceFingerprint, and status when the source carries that metadata.update supports media attachment for prompts (target: "prompt" + imagePath/filePath) and media replacement for assets (target: "asset" + imagePath/filePath).assetIngestKey is derived as ${ingestKey}:img by default, or can be set explicitly.assetIngestKey replaces the existing asset's file rather than creating a duplicate.assetPacks:consolidateOwnerPromptPacks.Repo-local development:
bun run skills:install:local
GitHub-backed install:
bun run skills:install:github
Refresh installed GitHub-backed skills:
bun run skills:update
These repo scripts now install/update both maintained gallery skills:
laniameda-gallery-ingestlaniameda-gallery-queryThese are the valid enum values the Convex schema enforces — use these or ingest will fail:
modelProvider: openai, anthropic, google, xai, meta, flux, midjourney, runway, other
→ Use other for Kora Reality / Enhancor and any non-listed providers.
workflowType: component_prompt, page_prompt, system_prompt, asset_recipe, other
typedTags[].category: model_name, style, content_type, platform, color, camera_angle, lighting, composition, car_make, car_model, car_angle, environment, design_style, design_type, workflow_type, component_type, custom
→ No subject — use content_type instead.
promptSections fields: finalPrompt (required), generationNotes (optional), negativePrompt (optional)
→ No other keys — extra fields cause validation errors.
Always edit the canonical source first:
~/work/laniameda/laniameda.gallery/skills/laniameda-gallery-ingest/SKILL.md
Then push to GitHub:
cd ~/work/laniameda/laniameda.gallery
git add skills/laniameda-gallery-ingest/
git commit -m "update laniameda-gallery-ingest skill"
git push
Then refresh installed copies across all agents:
bun run skills:update
# or manually:
bunx skills add https://github.com/laniamedaHQ/laniameda-gallery/tree/main/skills/laniameda-gallery-ingest -g -a openclaw -a codex -a cline -y
bunx skills add https://github.com/laniamedaHQ/laniameda-gallery/tree/main/skills/laniameda-gallery-query -g -a openclaw -a codex -a cline -y
When Michael says he pushed updates to the gallery repo: Run this immediately:
cd ~/work/laniameda/laniameda.gallery && git pull && bun run skills:update
No need to ask — just pull and update.
Installed copies at ~/.openclaw/skills/, ~/.codex/skills/, ~/.agents/skills/ are disposable — source of truth is always the repo.
Example invocation:
CONVEX_URL=https://<your-laniameda-deployment>.convex.cloud KB_OWNER_USER_ID=278674008 \
bun run ~/.agents/skills/laniameda-gallery-ingest/scripts/ingest.ts '{"promptText":"cinematic portrait","pillar":"creators","allowPromptOnly":true}'
If env vars are already set in .env, you can omit the inline prefix.
If the installed path is different for your agent runtime, use that runtime's installed laniameda-gallery-ingest/scripts/ingest.ts path instead.
development
Seedance 2.0 video prompt director. Converts plain-text scene descriptions into production-ready bilingual EN+ZH video prompts optimized for the Seedance 2.0 video generator. Handles all Seedance work — action (combat, pursuit, stunts), general (landscapes, journeys, atmosphere), dialogue (confrontations, negotiations, interrogations), and non-narrative commercial work (ad spots, music videos, fashion films, automotive inserts, product shots, pet/character demos, cutaway montages, social reels for TikTok / Reels / YouTube Shorts). Use whenever the user wants to create a Seedance video prompt, mentions Seedance, or describes a cinematic scene for video generation. For NARRATIVE screenplay-integrated work, use seedance-screenwriter instead.
development
Write Seedance 2.0 prompts in screenplay format for narrative storytelling — when the prompts will be cut into a film, short, or scene. Use whenever you're generating shots that will be edited into a continuous story with dialogue, character beats, scene continuity, or coverage. Pairs with the screenwriter skill — read the scene's screenplay first (or the project's `scene.md` if it exists), then translate each shot into a Seedance prompt that reads as a screenplay page, not as an engineering spec.
documentation
Скилл-инструмент для сценариста полнометражного фильма или сериала. Используй всегда, когда пользователь хочет писать сценарий, поэпизодник, разрабатывать сцены, бит-шит, диалоги, делать ревизии, считать экранное время, резать длину, работать с персонажами или мифологией истории. Скилл работает на основе методологий Макки, Кэмпбелла и Аристотеля, выдаёт Hollywood-формат .docx, поддерживает билингвальные сценарии (диалог на одном языке + перевод в скобках под ним), и помогает аудитировать структуру по причинности и движению ценности. Скилл не привязан к конкретной истории — пользователь приносит свою.
development
Extract shot composition DNA from any car photograph into structured JSON — camera angle, lens, framing, lighting — stripped of car-specific details. Then reuse extracted angles with any car identity to generate new images at scale. Use when: extracting angles from reference photos, building a shot library, batch-analyzing car photography, replicating a great angle with a different car, running extraction pipelines in Freepik or Flora. Triggers: "extract this angle", "steal this composition", "shot DNA", "analyze this car photo", "replicate this shot with my car", "batch extract angles", "car photography analysis", "angle extraction", "build a shot library".