create-image-fal
Generate or edit an image via any FAL image model (nano-banana edit, gpt-image, flux, ...), ROUTED THROUGH THE fal-proxy so it bills the Ads agent. image_urls…
Given the path to a finished content-goose ad-run folder, extract everything that defines that ad — recipe shot list, VO script, characters, voices, world, atom-skills, master mp4 — and emit a `source-sample.json` in the exact shape the `upload-ad-sample` skill writes to the
$ npx -y skills add gooseworks-ai/goose-skills --skill extract-source-sample --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/extract-source-sampleContext preview
The summary Claude sees to decide when to auto-load this skill.
Given the path to a finished content-goose ad-run folder, extract everything that defines that ad — recipe shot list, VO script, characters, voices, world, atom-skills, master mp4 — and emit a `source-sample.json` in the exact shape the `upload-ad-sample` skill writes to the
name: extract-source-sample description: Given the path to a finished content-goose ad-run folder, extract everything that defines that ad — recipe shot list, VO script, characters, voices, world, atom-skills, master mp4 — and emit a `source-sample.json` in the exact shape the `upload-ad-sample` skill writes to the Goose Ads library. Also links every character and voice to the central character library at `<repo-root>/assets/character-library/` (repo-root derived from the run-dir, not a hardcoded path), and if a character isn't in the library yet, adds it first then links. Use when the user wants to remix one of their existing ads — this skill produces the source JSON that the script-rewriting step and `remix-ad` consume.
This is an **agent-executed** skill. There are no Python scripts. The agent reads the run folder, builds the JSON, and stamps catalog links by hand. The content-goose run folders aren't always cleanly structured (some have empty production/ JSON, some carry everything in working/) — an agent adapts, a script would brittle out.
Do NOT use to:
consumes this skill's output).
| Input | Required | Notes | |---|---|---| | `run-dir` | yes | Absolute path to a content-goose ad-run folder (e.g. `clients/ladder/ad-runs/run-02-podcast-skit`). | | `out` | no | Where to write the JSON. Default: `<run-dir>/remix/source-sample.json`. |
That's the entire interface.
Open each file if it exists; tolerate missing files (most production/*.json in older runs are empty stubs — fall back to `working/`):
points at the master mp4; per-asset `provider` + `metadata.model` produce the atom-skill rows.
carry them.
`render_clips.py`, `stitch.py`, `build_end_card.py`, etc.). These are the source's runnable code; the remix consumer ports them. Capture in `production_scripts[]` (step 2 below).
**For sources with character-pose stills** (any run with a `working/characters/` folder of `<character>-<pose>.png` files — podcast-skit, founder-led, testimonial, recreate-ugc, etc.), audit every PNG with `file`. Do NOT stop at the base portraits. The recipe shot list references variant expression PNGs (e.g. `brittney-eyebrow-up.png`, `brad-phone-up.png`) by filename; the consumer assumes they exist on disk and will spend real money on lipsync calls before discovering they don't.
For sources without character-pose stills (music-video b-roll, abstract animated, product-only) — skip this audit; `variant_assets[]` stays empty.
Record per file (when auditing):
{
"file": "brittney-eyebrow-up.png",
"pose_tag": "skeptical-eyebrow", // slug from filename stem
"kind": "real" | "lfs-pointer" | "missing",
"size_bytes": 142336
}`file <path>` says `PNG image data, …` for real binaries and `ASCII text` for LFS pointers. A real binary is `>10KB` in practice; an LFS pointer is `<200 bytes`.
**Materialize LFS pointers before reading any binary.** An LFS pointer is a tiny (<200 byte) ASCII file beginning with `version https://git-lfs.github.com`. If a PNG or mp4 looks like one, run:
cd <run-dir-or-repo-root> git lfs fetch --include=<relative path> git lfs checkout <relative path>
before referencing it. **If `git lfs pull` no-ops and the LFS endpoint returns 404** (objects committed as pointers but never pushed — common on content-goose), leave the entry as `kind: "lfs-pointer"` in `variant_assets[]`. The consumer will regenerate or scrape; this skill does NOT fabricate. See [[feedback_lfs_pointer_audit_before_paid_calls]] and [[feedback_fal_subscribe_error_envelope]] for the downstream cost when this audit is skipped — Hume run-03 lost ~$3 + 25 min to it.
Shape (every key always present, arrays may be empty):
{
"title": "<from script.json or video-project.json>",
"format": "video",
"ratio": "<aspect_ratio from script.json — e.g. 9:16>",
"formatProfile": "podcast-skit-fabricated", // enum, see below
"media_url": "file://<abs path to master mp4>",
"thumbnail_url": null,
"brand": "<derive from path: clients/<brand>/ad-runs/...>",
"tags": [],
"recipe": { "shots": [...], "total_duration_sec": <int> },
"extracted_script": "HER: …\nHIM: …\n…",
"skills_used": ["generate-voiceover", "..."], // atoms only
"skills_source": "measured" | "derived-from-production-scripts" | "inferred-canonical" | "guessed",
"how_to": "<contents of HOW_TO_MAKE_THIS_VIDEO.md or null>",
"production_scripts": [
{ "path": "working/render_vo.py", "role": "voiceover" },
{ "path": "working/render_variants.py", "role": "stills" },
{ "path": "working/render_clips.py", "role": "lipsync" },
{ "path": "working/stitch.py", "role": "stitch" },
{ "path": "working/build_end_card.py", "role": "end_card" }
],
"remix_spec": {
"version": 1,
"skills": [{"slug": "...", "provider": "...", "modePut your AI agent on the growth team. Research customers and competitors, analyze what is working, create the next campaign, and learn from the result.
Repo: gooseworks-ai/goose-skills
Generate or edit an image via any FAL image model (nano-banana edit, gpt-image, flux, ...), ROUTED THROUGH THE fal-proxy so it bills the Ads agent. image_urls…
Generate a single photoreal or designed image with OpenAI gpt-image via fal.ai. Supports gpt-image-1 (default, fixed sizes — the FAL fallback for Higgsfield's…
Generate an instrumental music bed via ElevenLabs Music, ROUTED THROUGH THE elevenlabs-proxy so it bills the Ads agent. Trims any sparse intro, loudnorm, fades…
Image-to-video (or text-to-video) via any FAL video model (Kling, Seedance, Veo), ROUTED THROUGH THE GooseWorks fal-proxy so the call bills the Ads agent. The…
Generate a voiceover (VO) clip via ElevenLabs text-to-speech, ROUTED THROUGH THE elevenlabs-proxy so it bills the Ads agent. Voice id + script text come from…
Scrape competitor ads from Google Ads by domain. Returns ad creatives, formats, and campaign details. Use for competitive ad research and messaging analysis.