[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-openai-heygen-avatar":3,"mdc--j5kcri-key":33,"related-repo-openai-heygen-avatar":3602,"related-org-openai-heygen-avatar":3722},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":22,"repoUrl":23,"updatedAt":24,"license":25,"forks":26,"topics":27,"repo":28,"sourceUrl":31,"mdContent":32},"heygen-avatar","create persistent HeyGen AI avatars","Create a persistent HeyGen avatar — a reusable face + voice identity for the agent,\nthe user, or any named character — powered by HeyGen Avatar V technology.\nPrompt-based creation by default (description → HeyGen builds it); photo upload is\noptional for real-person digital twins.\nUse when: (1) giving the agent a face + voice so it can present videos\n(\"bring yourself to life\", \"create your avatar\", \"give yourself an avatar\",\n\"design a presenter\", \"set up an avatar\", \"let's make an avatar\"),\n(2) the user wants to appear in videos as themselves (\"create my avatar\",\n\"I want my face in a video\", \"digital twin of me\", \"build me an avatar\"),\n(3) building a named character presenter (\"create an avatar called Cleo\",\n\"design a character named X\"), (4) establishing HeyGen identity before making videos —\nthe correct FIRST step when no avatar exists yet.\nChain signal: when the user says both an identity\u002Favatar action AND a video action in the same\nrequest (\"create an avatar AND make a video\", \"set up identity THEN create a video\",\n\"design a presenter AND immediately record\"), run heygen-avatar first, then heygen-video.\nReturns avatar_id + voice_id — pass directly to heygen-video to create HeyGen videos.\nNOT for: generating videos (use heygen-video), translating videos, or TTS-only tasks.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"openai","OpenAI","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fopenai.png",[12,16,19],{"name":13,"slug":14,"type":15},"Creative","creative","tag",{"name":17,"slug":18,"type":15},"Agents","agents",{"name":20,"slug":21,"type":15},"Video","video",3992,"https:\u002F\u002Fgithub.com\u002Fopenai\u002Fplugins","2026-06-30T19:00:57.102",null,465,[],{"repoUrl":23,"stars":22,"forks":26,"topics":29,"description":30},[],"OpenAI Plugins","https:\u002F\u002Fgithub.com\u002Fopenai\u002Fplugins\u002Ftree\u002FHEAD\u002Fplugins\u002Fheygen\u002Fskills\u002Fheygen-avatar","---\nversion: 3.1.0 # x-release-please-version\nname: heygen-avatar\ndescription: |\n  Create a persistent HeyGen avatar — a reusable face + voice identity for the agent,\n  the user, or any named character — powered by HeyGen Avatar V technology.\n  Prompt-based creation by default (description → HeyGen builds it); photo upload is\n  optional for real-person digital twins.\n  Use when: (1) giving the agent a face + voice so it can present videos\n  (\"bring yourself to life\", \"create your avatar\", \"give yourself an avatar\",\n  \"design a presenter\", \"set up an avatar\", \"let's make an avatar\"),\n  (2) the user wants to appear in videos as themselves (\"create my avatar\",\n  \"I want my face in a video\", \"digital twin of me\", \"build me an avatar\"),\n  (3) building a named character presenter (\"create an avatar called Cleo\",\n  \"design a character named X\"), (4) establishing HeyGen identity before making videos —\n  the correct FIRST step when no avatar exists yet.\n  Chain signal: when the user says both an identity\u002Favatar action AND a video action in the same\n  request (\"create an avatar AND make a video\", \"set up identity THEN create a video\",\n  \"design a presenter AND immediately record\"), run heygen-avatar first, then heygen-video.\n  Returns avatar_id + voice_id — pass directly to heygen-video to create HeyGen videos.\n  NOT for: generating videos (use heygen-video), translating videos, or TTS-only tasks.\nargument-hint: \"[name_or_description]\"\n---\n\n# HeyGen Avatar Designer\n\nCreate and manage HeyGen avatars for anyone: the agent, the user, or named characters. Handles identity extraction, avatar generation, voice selection, and saves everything to `AVATAR-\u003CNAME>.md` for consistent reuse.\n\n## Files & Paths\n\nThis skill reads and writes the following. No other files are accessed without explicit user instruction.\n\n| Operation | Path | Purpose |\n|-----------|------|---------|\n| Read | `SOUL.md`, `IDENTITY.md` | Extract identity details when creating an avatar for the agent |\n| Read | `AVATAR-\u003CNAME>.md` | Load existing avatar identity (for variant looks, voice updates) |\n| Write | `AVATAR-\u003CNAME>.md` | Save new avatar identity after creation |\n| Write | `AVATAR-AGENT.md`, `AVATAR-USER.md` (symlinks) | Role aliases, see Phase 5 |\n| Temp write | `\u002Ftmp\u002Fheygen\u002Fuploads\u002F` | Voice preview audio (downloaded for user playback, deleted after session) |\n| Remote upload | HeyGen (via CLI\u002FAPI asset upload) | Local photos\u002Fvideos uploaded to HeyGen before avatar creation |\n\nAssets are only uploaded to HeyGen when the user explicitly provides them.\n\n## Language Awareness\n\n**Detect the user's language from their first message.** Store as `user_language` (e.g., `en`, `ja`, `es`, `ko`, `zh`, `fr`, `de`, `pt`).\n\n1. **Communicate with the user in their language.** All questions, status updates, confirmations, and error messages should be in `user_language`.\n2. **Voice design prompts and selection respect `user_language`.** When designing or selecting a voice, specify the target language so the voice library returns matches that speak it.\n3. **Technical directives stay in English** — enum values (`Young Adult`, `Realistic`, `landscape`, etc.) are API-level and not translated.\n\n## UX Rules\n\n1. **Be concise.** No avatar IDs, group IDs, or raw API payloads in chat. Report the result (avatar created, ready to use) not the plumbing.\n2. **No internal jargon.** Never mention internal phase names (\"Phase 0\", \"Phase 5 Symlink Maintenance\") to the user. The user sees natural conversation: \"Setting up your avatar\\u2026\" not \"Running Phase 2 avatar creation.\"\n3. **One or two questions per phase.** Don't batch-ask. Walk phases in order, ask the smallest set of questions needed to proceed.\n4. **Read workspace files before asking.** `SOUL.md`, `IDENTITY.md`, `AVATAR-*.md` at the workspace root contain identity. Check them first. Only ask the user for what's genuinely missing.\n5. **Don't narrate skill internals.** Never say \"let me read the workflow,\" \"checking the reference files,\" \"loading the avatar discovery guide.\" Read silently. The user sees questions and results, not internal navigation.\n6. **Don't announce what you're about to do.** Skip meta-commentary like \"Creating the avatar now.\" Just do the work. If a step takes time, the next thing the user hears should be the result (or a checkpoint question).\n7. **Never narrate transport choice.** App vs CLI is internal. Pick the transport silently and never mention it. If both are unavailable, ask the user to configure one without explaining why.\n\n## Start Here (Critical)\n\n**Default target = the agent.** The primary use of this skill is giving the agent a face + voice so it can present videos. Route to \"user\" only on explicit \"my avatar\" \u002F \"me\" \u002F \"my photo\" language. When in doubt, make the agent's avatar.\n\n**Do NOT batch-ask questions.** No \"give me a photo, voice preference, duration, target platform, tone, key message\" all at once. Walk phases in order. Each phase asks at most one or two things at a time.\n\n**For agent avatars: read SOUL.md and IDENTITY.md first, then go straight to prompt-based creation.** Do NOT ask the user for a photo or appearance details first. The agent's identity lives in those workspace files. Only ask the user for traits that are genuinely missing.\n\n**Prompt-based is the default creation path.** Photo is opt-in, only relevant when the user explicitly wants a real-person digital twin of themselves. Agents and named characters almost always use prompt-based creation.\n\n## Before You Start (environment detection)\n\nTry to read `SOUL.md` from the workspace root.\n\n- **Found** → Workspace-native identity files are available. Skip this entire section and go straight to Phase 0. `SOUL.md` and `IDENTITY.md` will drive agent onboarding.\n- **Not found** → No workspace identity files are available. Still go to Phase 0 next — do NOT skip ahead to listing user avatars or asking the user for a photo.\n\n**⚠️ AVATAR file caveat:** Ignore any AVATAR-*.md files found in the workspace that belong to a *different* person or agent (e.g., `AVATAR-Eve.md` when creating an avatar for a different subject). Only use an AVATAR file if its name matches the subject you're creating for right now.\n\n**⚠️ Do NOT fetch HeyGen avatars yet.** That's a Phase 0 sub-step (only after target detection). Fetching before Phase 0 causes the agent to frame the conversation around \"your existing avatars\" when the default should be creating one for the agent itself.\n\n## API Mode Detection\n\n**Mode selection is silent.** Detect once at the start of the session, pick a mode, move on. Never narrate transport choice (\"CLI is broken\", \"switching to the app\") — the user doesn't care how calls are made.\n\n**HeyGen app (preferred):** If the HeyGen app is available through the installed app integration, use it. The app authenticates via OAuth and runs against the user's existing HeyGen plan credits.\n\n**Auth triage (run immediately):** run `command -v heygen` and `heygen auth status`. If app\u002FMCP auth fails but CLI auth is valid, continue in CLI mode for this run.\n\n**Local media limitation:** The current HeyGen app connector does NOT upload local files. Its photo\u002Fvideo\u002Favatar tools accept only hosted HTTPS URLs or existing HeyGen `asset_id` values. Never pass `file:\u002F\u002F`, absolute local paths, or Codex attachment paths directly to app tools. For local photos\u002Fvideos, first upload with `heygen asset create --file \u003Cpath>` or `POST https:\u002F\u002Fapi.heygen.com\u002Fv3\u002Fassets` using `multipart\u002Fform-data`; then pass `{ \"type\": \"asset_id\", \"asset_id\": \"...\" }` to the app or CLI creation call. If no CLI\u002FAPI upload path is available, ask the user for an HTTPS image URL or permission to continue with prompt-only creation.\n\n**CLI fallback:** If the app is not available AND the `heygen` binary runs cleanly (`heygen --version` exits 0), use it. Auth: `HEYGEN_API_KEY` env OR `heygen auth login` (persists to `~\u002F.heygen\u002Fcredentials`). If the CLI is missing, errors on `--version`, or auth is not set, silently skip it.\n\nIn Codex desktop\u002Fsandboxed runs, CLI network calls may fail with DNS\u002Fnetwork errors until network approval\u002Fescalation is granted. Retry with escalation when needed.\n\n**Neither available:** Only if the app is unavailable AND the CLI doesn't work, tell the user once: \"To use this skill, connect the HeyGen app or install the HeyGen CLI: `curl -fsSL https:\u002F\u002Fstatic.heygen.ai\u002Fcli\u002Finstall.sh | bash` then `heygen auth login`.\" If the only missing capability is local media upload, say that local photos need an HTTPS URL or a CLI\u002FAPI asset upload first.\n\n**API:** v3 only. Never call v1 or v2 endpoints.\n\n**Docs-first rule:** Before calling any endpoint you're unsure about:\n- **Index:** `GET https:\u002F\u002Fdevelopers.heygen.com\u002Fllms.txt` — full sitemap\n- **Any page:** Append `.md` to the URL for clean markdown\n- Or run `heygen \u003Cnoun> \u003Cverb> --help`\n- Read the spec, THEN build your request. Never guess field names.\n\n## Avatar File Convention\n\nEvery avatar gets one file: `AVATAR-\u003CNAME>.md` at the workspace root.\n\n```\nAVATAR-EVE.md      ← agent      (named, canonical)\nAVATAR-KEN.md      ← user       (named, canonical)\nAVATAR-CLEO.md     ← character  (named, canonical)\n```\n\nThe skill also maintains two **role-based symlinks** alongside the named\nfiles, for generic lookups by consumer skills (e.g., heygen-video) when the\nrequest doesn't carry a specific name (\"make a video of yourself\" → read\nthe agent alias; \"make a video of me\" → read the user alias):\n\n```\nAVATAR-AGENT.md → AVATAR-\u003CCURRENT-AGENT-NAME>.md   (symlink)\nAVATAR-USER.md  → AVATAR-\u003CCURRENT-USER-NAME>.md    (symlink)\n```\n\nNamed files are the single source of truth; aliases are pointers and never\ndrift. Phase 5 of the workflow maintains them. Named characters get NO\nrole alias — they are referenced by name only.\n\nFormat:\n```markdown\n# Avatar: \u003CName>\n\n## Appearance\n- Age: \u003Cnatural language>\n- Gender: \u003Cnatural language>\n- Ethnicity: \u003Cnatural language>\n- Hair: \u003Cnatural language>\n- Build: \u003Cnatural language>\n- Features: \u003Cnatural language>\n- Style: \u003Cnatural language>\n- Reference: \u003Coptional workspace-relative path or URL>\n\n## Voice\n- Tone: \u003Cnatural language>\n- Accent: \u003Cnatural language>\n- Energy: \u003Cnatural language>\n- Think: \u003Cone-line analogy>\n\n## HeyGen\n- Group ID: \u003Ccharacter identity anchor — THE stable reference, never changes>\n- Voice ID: \u003Cmatched or designed voice>\n- Voice Name: \u003Chuman-readable>\n- Voice Designed: \u003Ctrue if custom-designed, false if picked from catalog>\n- Voice Seed: \u003Cseed value used, if designed>\n- Looks: landscape=\u003Clook_id>, portrait=\u003Clook_id>, square=\u003Clook_id>\n- Last Synced: \u003CISO timestamp>\n\n⚠️ look_ids are ephemeral — always resolve fresh from group_id at runtime via `heygen avatar looks list --group-id \u003Cid>` (or the corresponding HeyGen app tool). Never hardcode look_id as the primary avatar reference.\n```\n\n**Top sections** (Appearance, Voice) are portable natural language. Any platform can use them.\n**HeyGen section** is runtime config with API IDs. Skills read this to make API calls.\n\n## Skill Announcement\n\nStart every invocation with:\n\n> 🎭 **Using: heygen-avatar** — creating an avatar for [name]\n\n## Workflow\n\n**DO NOT batch-ask questions upfront.** Walk phases in order. Each phase asks at most one thing at a time, and only if needed.\n\n### Phase 0 — Who Are We Creating?\n\nSee the Start Here block above for the default-to-agent rule. Only route to \"user\" or \"named character\" when the phrasing is unambiguous.\n\nRouting signals (in priority order):\n\n1. **User** (explicit only) — \"create **my** avatar\", \"make **me** an avatar\", \"I want my face in a video\", \"a digital twin of **me**\", \"based on **my** photo\". Requires a possessive pronoun referring to the user OR explicit mention of their photo. Ask for their name if not obvious.\n2. **Named character** (explicit only) — \"create an avatar called Cleo\", \"design a character named X\", \"build a presenter named Y\" → use the given name.\n3. **Agent** (default) — everything else: \"create your avatar\", \"bring yourself to life\", \"set up an avatar\", \"let's make an avatar\", \"create an avatar\", \"design a presenter\", \"I want you to appear in videos\", or any ambiguous phrasing. Read `IDENTITY.md` for name.\n\n**When unsure, default to agent.** Do NOT ask the user for their name, appearance, or voice on an ambiguous request — that's the wrong first move. If after reading IDENTITY.md + SOUL.md the intent still feels ambiguous, ask one short clarifying question to disambiguate (phrase it naturally — something like \"quick check: this avatar is for you, or for me?\").\n\nThen check `AVATAR-\u003CNAME>.md` at the workspace root:\n\n- **AVATAR file exists + HeyGen section filled in** → \"You already have an avatar set up. Want to add a new look, update it, or start fresh?\" Wait for answer.\n- **AVATAR file exists but HeyGen section empty** → skip to Phase 2.\n- **No AVATAR file** → proceed to Phase 1.\n\n**Role alias staleness check.** Before proceeding, also check whether the\nrole alias for this target is already pointing at the right named file:\n\n- For **agent target**: read `AVATAR-AGENT.md` (follow symlink) and\n  compare to `AVATAR-\u003CCURRENT-AGENT-NAME>.md`. If they differ (e.g.,\n  `AVATAR-AGENT.md` → `AVATAR-OLD-NAME.md` because the agent identity\n  changed since the last run), re-link in Phase 5 even if no other\n  changes are made. The named file is canonical, but the alias must\n  match the *current* identity, not the historical one.\n- For **user target**: same check on `AVATAR-USER.md`.\n- For **named character**: no alias to check.\n\n**Optional existing-avatar check** (only useful on the user path when the user might already have avatars in their HeyGen account). If Phase 0 target = **user** AND no `AVATAR-\u003CUSER>.md` exists, list their HeyGen avatars first:\n\n**App:** use the HeyGen app to list private avatar groups\n**CLI:** `heygen avatar list --ownership private`\n\nIf the list is non-empty, present the options and ask which to use or whether to create new. If empty, proceed to Phase 1. Skip this check entirely for agent and named-character targets — those live in AVATAR-*.md, not the HeyGen catalog.\n\n### Phase 1 — Identity Extraction\n\n**Order matters. Files first, questions second. Prompt-based creation is the default path — photo is an opt-in upgrade.**\n\n**For the agent** (Phase 0 target = agent):\n1. Read `SOUL.md`, `IDENTITY.md`, and any existing `AVATAR-\u003CNAME>.md` from the workspace root.\n2. If SOUL.md or IDENTITY.md is found → extract appearance and voice traits silently. Do NOT ask the user \"describe your appearance\" — the agent IS the subject, and its identity lives in those files. **If the files describe only personality \u002F values with no physical description, do NOT hallucinate traits.** Ask the user conversationally for the missing appearance traits only (one or two at a time).\n3. If neither file is found (for example, in a workspace with no identity files) → ask the user to describe the agent's appearance and voice conversationally.\n4. Proceed directly to **Type A (prompt) creation** in Phase 2 by default. Do NOT ask for a photo unless the user volunteers one or explicitly asks for photo realism — agents almost always use prompt-based creation.\n\n**For users\u002Fnamed characters** (Phase 0 target = user or named):\n- Conversational onboarding. Ask naturally about appearance and voice — one or two questions at a time, not a form. Communicate in `user_language`.\n- **User path only:** after the onboarding Q&A, run the Reference Photo Nudge below.\n- **Named character path:** skip the nudge, go straight to Type A (prompt) creation.\n\nWrite `AVATAR-\u003CNAME>.md` with the Appearance and Voice sections filled in. Leave the HeyGen section empty until Phase 2 succeeds.\n\n### Reference Photo Nudge (user path only)\n\nOnly run this step when Phase 0 target = **user** (real-person digital twin) OR when the user explicitly asks for photo realism.\n\n- Check AVATAR file's Appearance → Reference field first. If a photo is already on file, skip asking and use it.\n- Otherwise, ask one sentence: *\"Got a headshot? It gives better face consistency for videos of you. I can also generate from your description — just say 'skip.'\"*\n\nBranch:\n- **Photo provided as local file\u002Fpath** → upload via `heygen asset create --file \u003Cpath>` or `POST https:\u002F\u002Fapi.heygen.com\u002Fv3\u002Fassets`, then Type B (photo) creation with the returned `asset_id`.\n- **Photo provided as HTTPS URL or asset_id** → Type B (photo) creation in Phase 2.\n- **Local photo but no upload path available** → ask for an HTTPS image URL or offer prompt-only creation. Do not pass the local path into the app connector.\n- **Skip** → Type A (prompt) creation in Phase 2.\n\nFor agents and named characters, skip this entire step — go straight to Type A (prompt) creation.\n\n\n### Phase 2 — Avatar Creation\n\n📖 **Full creation API surface (photo \u002F prompt \u002F digital twin), file input formats, identity field → enum mapping, response shape → [references\u002Favatar-creation.md](references\u002Favatar-creation.md)**\n\nTwo modes:\n\n**Mode 1 — New character** (omit `avatar_group_id`):\nCreates a brand new character with its own group.\n\n**Mode 2 — New look** (include `avatar_group_id`):\nAdds a variation to an existing character. Read the Group ID from the AVATAR file.\n\nTwo creation types:\n\n**Type A — From prompt (AI-generated appearance):**\n\n**App:** use the HeyGen app flow for prompt-based avatar creation.\n**CLI:** `heygen avatar create -d '{\"type\":\"prompt\",\"name\":\"...\",\"prompt\":\"...\",\"avatar_group_id\":\"...\"}'` (accepts inline JSON, a file path, or `-` for stdin)\n\nPrompt limit is 1000 characters. Be descriptive — include style, features, expression, lighting. The API spec says 200 but the actual enforced limit is 1000.\n\n**Type B — From reference image:**\n\n**App:** use the HeyGen app flow for photo avatar creation only with an HTTPS URL or pre-uploaded `asset_id`.\n**CLI:** `heygen avatar create -d '{\"type\":\"photo\",\"name\":\"...\",\"file\":{\"type\":\"asset_id\",\"asset_id\":\"...\"},\"avatar_group_id\":\"...\"}'`\n\nFile options for Type B:\n- `{ \"type\": \"url\", \"url\": \"https:\u002F\u002F...\" }` — public image URL\n- `{ \"type\": \"asset_id\", \"asset_id\": \"\u003Cid>\" }` — from `heygen asset create --file \u003Cpath>`\n\nDo not pass local paths or `file:\u002F\u002F` URLs to the app connector. Upload local files to an `asset_id` first.\n\nRaw API upload example:\n```bash\nASSET_ID=$(curl -s -X POST \"https:\u002F\u002Fapi.heygen.com\u002Fv3\u002Fassets\" \\\n  -H \"X-Api-Key: $HEYGEN_API_KEY\" \\\n  -F \"file=@\u002Fpath\u002Fto\u002Fheadshot.jpg\" | jq -r '.data.asset_id')\n```\n\nThe v3 upload endpoint accepts `multipart\u002Fform-data`, auto-detects MIME type from file bytes, and returns `data.asset_id`.\n\n📖 **When to use each (URL vs asset_id), upload routing, and edge cases → [references\u002Fasset-routing.md](references\u002Fasset-routing.md)**\n\n**Response:** Returns `avatar_item.id` (look ID) and `avatar_item.group_id` (character identity).\n\nMap identity fields to HeyGen enums for the prompt:\n- **age**: Young Adult | Early Middle Age | Late Middle Age | Senior | Unspecified\n- **gender**: Man | Woman | Unspecified\n- **ethnicity**: White | Black | Asian American | East Asian | South East Asian | South Asian | Middle Eastern | Pacific | Hispanic | Unspecified\n- **style**: Realistic | Pixar | Cinematic | Vintage | Noir | Cyberpunk | Unspecified\n- **orientation**: square | horizontal | vertical\n- **pose**: half_body | close_up | full_body\n\nShow the prompt to the user before creating:\n> **Appearance:** \"[prompt]\"\n> **Settings:** Young Adult | Woman | East Asian | Realistic\n> Look good? (yes \u002F adjust \u002F completely different)\n\n⛔ **STOP. Wait for the user to approve or adjust. Do NOT call the avatar creation API until the user confirms.**\n\n### Phase 3 — Voice\n\nTwo paths: **Design** (describe what you want, get matched voices) or **Browse** (filter the catalog manually).\n\nAsk whether they want voice design (describe what they want) or catalog browsing. Communicate in `user_language`.\n\nDefault to **Design** if the AVATAR file has a Voice section with personality traits.\n\n#### Path A — Voice Design (preferred)\n\nFind matching voices via semantic search using the Voice section from the AVATAR file. This searches HeyGen's full voice library. No new voices are generated and no quota is consumed.\n\n**Language matching:** The voice design prompt should specify the target language from `user_language`. Example for Japanese: `\"A calm, warm female voice. Professional but approachable. Japanese speaker.\"` This ensures semantic search returns voices in the correct language.\n\n**App:** use the HeyGen app flow for voice selection or design.\n**CLI:** `heygen voice create --prompt \"...\" --seed 0` (also accepts `--gender`, `--locale`)\n\nReturns 3 voice options per seed. Present all 3 with inline audio previews:\n- Download each `preview_audio_url` to a temp path (any standard download method works — no HeyGen auth needed, these are public S3 URLs)\n- Send as audio attachment: `message(action:send, media:\"\u003Cpath>\", caption:\"Option \u003Cn>: \u003Cvoice_name> — \u003Cgender>, \u003Clanguage>\")` so it plays inline in Telegram\u002FDiscord\n- After all previews sent, present selection buttons\n\n⛔ **STOP. Wait for the user to pick a voice via buttons or text. Do NOT select a voice yourself or proceed to Phase 4 until the user explicitly chooses.**\n\nIf none match:\n> \"None of these hitting right? I can try a different set (same description, different variations) or you can tweak the description.\"\n\nIncrement `seed` and call again. Different seeds give completely different voice options from the same prompt.\n\n- Clean up \u002Ftmp files after user picks\n\n#### Path B — Voice Browse (fallback)\n\nBrowse HeyGen's existing voice library:\n\n**App:** browse available voices in the HeyGen app, filtered to the target language and voice characteristics when possible.\n**CLI:** `heygen voice list --type private` \u002F `heygen voice list --type public --language \u003Clang> --gender \u003Cgender>`\n\n1. Read the Voice section from the AVATAR file\n2. Filter by gender and language\n3. Pick top 3 candidates based on personality match\n4. Present with inline audio previews (same download + send pattern as Path A)\n5. ⛔ **STOP. Wait for the user to pick. Do NOT auto-select.**\n\n### Phase 4 — Save to AVATAR File\n\nUpdate the HeyGen section of `AVATAR-\u003CNAME>.md` to match the canonical format:\n\n```markdown\n## HeyGen\n- Group ID: \u003Cavatar_item.group_id — THE stable reference, never changes>\n- Voice ID: \u003Cchosen voice_id>\n- Voice Name: \u003Cvoice name>\n- Voice Designed: \u003Ctrue if custom-designed, false if picked from catalog>\n- Voice Seed: \u003Cseed value used, if designed>\n- Looks: \u003Corientation>=\u003Cavatar_item.id> (e.g., landscape=\u003Clook_id>, portrait=\u003Clook_id>)\n- Last Synced: \u003CISO timestamp>\n\n⚠️ look_ids are ephemeral — always resolve fresh from group_id at runtime via `heygen avatar looks list --group-id \u003Cid>` (or the corresponding look picker in the HeyGen app). Never hardcode look_id as the primary avatar reference.\n```\n\nConfirm the avatar is saved and that other skills (like heygen-video) will pick it up automatically. Communicate in `user_language`.\n\n### Phase 5 — Maintain Role Alias\n\nAfter writing the named `AVATAR-\u003CNAME>.md`, create or update a role-based\nsymlink alongside it so other skills can do generic lookups without\nresolving the agent \u002F user name first.\n\nBased on the Phase 0 target:\n\n- **Agent target** → symlink `AVATAR-AGENT.md` → `AVATAR-\u003CNAME>.md`\n- **User target** → symlink `AVATAR-USER.md` → `AVATAR-\u003CNAME>.md`\n- **Named character** → no role alias. Named characters are referenced by\n  name only (e.g., `AVATAR-CLEO.md`); they are not the agent or the user.\n\n**Implementation (run from the workspace root, with fs-fallback):**\n\nThe `cd` to workspace root is mandatory — bare relative paths in `ln -s`\nresolve from the agent's current working directory, not where SOUL.md\nlives. The `|| echo` clause handles filesystems that reject symlinks\n(Windows without dev mode, some cloud-mounted storage) without aborting\nPhase 5.\n\n```bash\n# Agent\ncd \"$WORKSPACE_ROOT\" && ln -sf AVATAR-\u003CNAME>.md AVATAR-AGENT.md \\\n  || echo \"role alias skipped: fs doesn't support symlinks\"\n\n# User\ncd \"$WORKSPACE_ROOT\" && ln -sf AVATAR-\u003CNAME>.md AVATAR-USER.md \\\n  || echo \"role alias skipped: fs doesn't support symlinks\"\n```\n\nUse a relative link target (just the filename, no path prefix) so the\nalias survives if the workspace is moved or copied.\n\n`ln -sf` is unlink-then-symlink under the hood, not strictly atomic.\nFine for single-user workspaces; if concurrent agents ever write the\nsame alias, expect interleaving and add explicit locking then.\n\n**Why symlink, not copy:** removes the duplicate-file drift class\n(content can never diverge between named file and alias). It does NOT\nremove staleness drift — if `IDENTITY.md` changes the agent name without\nre-running heygen-avatar, `AVATAR-AGENT.md` keeps pointing at the *old*\nnamed file. Phase 0 mismatch-and-re-alias handles this on the next\ninvocation; until then, the alias is stale-but-pointing-somewhere-valid,\nnot broken.\n\n**Multi-agent workspace caveat:** one role alias per workspace is\nlast-writer-wins. If two agents ever share a workspace and both run\nheygen-avatar, only the most recent run's identity is reachable via\n`AVATAR-AGENT.md`. Named files for both still exist. We accept this\nlimit — multi-agent shared workspaces are out of scope for v1.\n\n### Phase 6 — Test (Optional)\n\nIf the user wants to see their avatar in action:\n\n**App:** use the HeyGen app's video-generation flow with the selected avatar and voice.\n**CLI:** `heygen video-agent create --avatar-id \u003Cid> --voice-id \u003Cid> --prompt \"...\" --wait`\n\nGenerate a natural greeting in the video language (from `user_language`). Examples: English \"Hi, I'm [name]. Nice to meet you!\", Japanese \"[name]です。はじめまして！\", Spanish \"Hola, soy [name]. ¡Mucho gusto!\", Korean \"안녕하세요, [name]입니다. 만나서 반갑습니다!\"\n\n## Iteration Flow\n\nWhen the user wants to refine:\n\n- **\"Adjust the prompt\"** → Mode 2 with existing group_id (keeps the character, adds a new look). Only Mode 1 if they say \"start completely over.\"\n- **\"Add a new look\"** \u002F **\"different outfit\"** → Mode 2 with existing group_id. Add to Looks in AVATAR file.\n- **\"Try a different voice\"** → back to Phase 3\n- **\"Start completely over\"** → Mode 1, new character. Overwrite HeyGen section.\n\n**Default to Mode 2 (new look under same group).** Only create a new group when the user explicitly wants a different character identity. This keeps the account clean and makes looks reusable across skills.\n\nEach iteration updates the AVATAR file. The file is always the source of truth.\n\n## UX Rules\n\n**Be interactive at checkpoints, silent everywhere else.** Stop and wait at avatar approval and voice selection. Between checkpoints, work silently — don't narrate reasoning or explain next steps. After voice pick: save + confirm in one message.\n\n## Video Producer Integration\n\n`heygen-video` reads AVATAR files for group_id and voice_id. Resolution\norder:\n\n1. **Named request** (\"Make a video with Eve\") → read `AVATAR-EVE.md`.\n2. **Agent self-reference** (\"make a video of yourself\", \"give us a video\nupdate\") → read `AVATAR-AGENT.md` (symlink to current agent's named file).\n3. **User self-reference** (\"make a video of me\", \"my video update\") → read\n`AVATAR-USER.md` (symlink to current user's named file).\n4. **No AVATAR file or symlink** → fall back to stock avatars or ask user.\n\nThe alias targets are resolved by the OS at read time, so consumer skills\nsimply `cat AVATAR-AGENT.md` and get whatever the current agent's avatar is.\n\n## Error Handling\n\n- Missing SOUL.md\u002FIDENTITY.md → conversational onboarding, write AVATAR file from answers\n- API fails → retry once, then ask user to check API key\n- Voice match poor → show all available voices, let user browse\n- Asset upload unavailable or fails → ask for an HTTPS URL or skip reference image and try prompt-only creation\n- Existing avatar file with stale HeyGen IDs → offer to regenerate or keep\n\n📖 **Known issues, retry patterns, broken voice previews, error → action mapping → [references\u002Ftroubleshooting.md](references\u002Ftroubleshooting.md)**\n",{"data":34,"body":37},{"version":35,"name":4,"description":6,"argument-hint":36},"3.1.0","[name_or_description]",{"type":38,"children":39},"root",[40,49,64,71,76,250,255,261,337,407,413,506,512,522,532,542,552,558,570,608,634,644,650,660,670,695,753,811,816,841,851,861,915,921,933,945,957,966,971,976,1355,1372,1378,1383,1404,1410,1420,1427,1432,1437,1503,1513,1525,1558,1568,1648,1673,1695,1700,1706,1714,1724,1780,1790,1824,1836,1842,1853,1871,1876,1938,1943,1949,1965,1970,1988,2005,2010,2018,2047,2052,2060,2087,2092,2122,2141,2146,2294,2313,2327,2353,2358,2421,2426,2452,2462,2468,2487,2498,2509,2516,2521,2546,2583,2588,2622,2631,2636,2644,2657,2665,2671,2676,2704,2736,2742,2754,2884,2895,2901,2913,2918,2979,2987,3016,3234,3239,3250,3281,3298,3304,3309,3329,3365,3371,3376,3425,3435,3440,3445,3455,3461,3472,3536,3549,3555,3583,3597],{"type":41,"tag":42,"props":43,"children":45},"element","h1",{"id":44},"heygen-avatar-designer",[46],{"type":47,"value":48},"text","HeyGen Avatar Designer",{"type":41,"tag":50,"props":51,"children":52},"p",{},[53,55,62],{"type":47,"value":54},"Create and manage HeyGen avatars for anyone: the agent, the user, or named characters. Handles identity extraction, avatar generation, voice selection, and saves everything to ",{"type":41,"tag":56,"props":57,"children":59},"code",{"className":58},[],[60],{"type":47,"value":61},"AVATAR-\u003CNAME>.md",{"type":47,"value":63}," for consistent reuse.",{"type":41,"tag":65,"props":66,"children":68},"h2",{"id":67},"files-paths",[69],{"type":47,"value":70},"Files & Paths",{"type":41,"tag":50,"props":72,"children":73},{},[74],{"type":47,"value":75},"This skill reads and writes the following. No other files are accessed without explicit user instruction.",{"type":41,"tag":77,"props":78,"children":79},"table",{},[80,104],{"type":41,"tag":81,"props":82,"children":83},"thead",{},[84],{"type":41,"tag":85,"props":86,"children":87},"tr",{},[88,94,99],{"type":41,"tag":89,"props":90,"children":91},"th",{},[92],{"type":47,"value":93},"Operation",{"type":41,"tag":89,"props":95,"children":96},{},[97],{"type":47,"value":98},"Path",{"type":41,"tag":89,"props":100,"children":101},{},[102],{"type":47,"value":103},"Purpose",{"type":41,"tag":105,"props":106,"children":107},"tbody",{},[108,139,159,180,210,232],{"type":41,"tag":85,"props":109,"children":110},{},[111,117,134],{"type":41,"tag":112,"props":113,"children":114},"td",{},[115],{"type":47,"value":116},"Read",{"type":41,"tag":112,"props":118,"children":119},{},[120,126,128],{"type":41,"tag":56,"props":121,"children":123},{"className":122},[],[124],{"type":47,"value":125},"SOUL.md",{"type":47,"value":127},", ",{"type":41,"tag":56,"props":129,"children":131},{"className":130},[],[132],{"type":47,"value":133},"IDENTITY.md",{"type":41,"tag":112,"props":135,"children":136},{},[137],{"type":47,"value":138},"Extract identity details when creating an avatar for the agent",{"type":41,"tag":85,"props":140,"children":141},{},[142,146,154],{"type":41,"tag":112,"props":143,"children":144},{},[145],{"type":47,"value":116},{"type":41,"tag":112,"props":147,"children":148},{},[149],{"type":41,"tag":56,"props":150,"children":152},{"className":151},[],[153],{"type":47,"value":61},{"type":41,"tag":112,"props":155,"children":156},{},[157],{"type":47,"value":158},"Load existing avatar identity (for variant looks, voice updates)",{"type":41,"tag":85,"props":160,"children":161},{},[162,167,175],{"type":41,"tag":112,"props":163,"children":164},{},[165],{"type":47,"value":166},"Write",{"type":41,"tag":112,"props":168,"children":169},{},[170],{"type":41,"tag":56,"props":171,"children":173},{"className":172},[],[174],{"type":47,"value":61},{"type":41,"tag":112,"props":176,"children":177},{},[178],{"type":47,"value":179},"Save new avatar identity after creation",{"type":41,"tag":85,"props":181,"children":182},{},[183,187,205],{"type":41,"tag":112,"props":184,"children":185},{},[186],{"type":47,"value":166},{"type":41,"tag":112,"props":188,"children":189},{},[190,196,197,203],{"type":41,"tag":56,"props":191,"children":193},{"className":192},[],[194],{"type":47,"value":195},"AVATAR-AGENT.md",{"type":47,"value":127},{"type":41,"tag":56,"props":198,"children":200},{"className":199},[],[201],{"type":47,"value":202},"AVATAR-USER.md",{"type":47,"value":204}," (symlinks)",{"type":41,"tag":112,"props":206,"children":207},{},[208],{"type":47,"value":209},"Role aliases, see Phase 5",{"type":41,"tag":85,"props":211,"children":212},{},[213,218,227],{"type":41,"tag":112,"props":214,"children":215},{},[216],{"type":47,"value":217},"Temp write",{"type":41,"tag":112,"props":219,"children":220},{},[221],{"type":41,"tag":56,"props":222,"children":224},{"className":223},[],[225],{"type":47,"value":226},"\u002Ftmp\u002Fheygen\u002Fuploads\u002F",{"type":41,"tag":112,"props":228,"children":229},{},[230],{"type":47,"value":231},"Voice preview audio (downloaded for user playback, deleted after session)",{"type":41,"tag":85,"props":233,"children":234},{},[235,240,245],{"type":41,"tag":112,"props":236,"children":237},{},[238],{"type":47,"value":239},"Remote upload",{"type":41,"tag":112,"props":241,"children":242},{},[243],{"type":47,"value":244},"HeyGen (via CLI\u002FAPI asset upload)",{"type":41,"tag":112,"props":246,"children":247},{},[248],{"type":47,"value":249},"Local photos\u002Fvideos uploaded to HeyGen before avatar creation",{"type":41,"tag":50,"props":251,"children":252},{},[253],{"type":47,"value":254},"Assets are only uploaded to HeyGen when the user explicitly provides them.",{"type":41,"tag":65,"props":256,"children":258},{"id":257},"language-awareness",[259],{"type":47,"value":260},"Language Awareness",{"type":41,"tag":50,"props":262,"children":263},{},[264,270,272,278,280,286,287,293,294,300,301,307,308,314,315,321,322,328,329,335],{"type":41,"tag":265,"props":266,"children":267},"strong",{},[268],{"type":47,"value":269},"Detect the user's language from their first message.",{"type":47,"value":271}," Store as ",{"type":41,"tag":56,"props":273,"children":275},{"className":274},[],[276],{"type":47,"value":277},"user_language",{"type":47,"value":279}," (e.g., ",{"type":41,"tag":56,"props":281,"children":283},{"className":282},[],[284],{"type":47,"value":285},"en",{"type":47,"value":127},{"type":41,"tag":56,"props":288,"children":290},{"className":289},[],[291],{"type":47,"value":292},"ja",{"type":47,"value":127},{"type":41,"tag":56,"props":295,"children":297},{"className":296},[],[298],{"type":47,"value":299},"es",{"type":47,"value":127},{"type":41,"tag":56,"props":302,"children":304},{"className":303},[],[305],{"type":47,"value":306},"ko",{"type":47,"value":127},{"type":41,"tag":56,"props":309,"children":311},{"className":310},[],[312],{"type":47,"value":313},"zh",{"type":47,"value":127},{"type":41,"tag":56,"props":316,"children":318},{"className":317},[],[319],{"type":47,"value":320},"fr",{"type":47,"value":127},{"type":41,"tag":56,"props":323,"children":325},{"className":324},[],[326],{"type":47,"value":327},"de",{"type":47,"value":127},{"type":41,"tag":56,"props":330,"children":332},{"className":331},[],[333],{"type":47,"value":334},"pt",{"type":47,"value":336},").",{"type":41,"tag":338,"props":339,"children":340},"ol",{},[341,359,375],{"type":41,"tag":342,"props":343,"children":344},"li",{},[345,350,352,357],{"type":41,"tag":265,"props":346,"children":347},{},[348],{"type":47,"value":349},"Communicate with the user in their language.",{"type":47,"value":351}," All questions, status updates, confirmations, and error messages should be in ",{"type":41,"tag":56,"props":353,"children":355},{"className":354},[],[356],{"type":47,"value":277},{"type":47,"value":358},".",{"type":41,"tag":342,"props":360,"children":361},{},[362,373],{"type":41,"tag":265,"props":363,"children":364},{},[365,367,372],{"type":47,"value":366},"Voice design prompts and selection respect ",{"type":41,"tag":56,"props":368,"children":370},{"className":369},[],[371],{"type":47,"value":277},{"type":47,"value":358},{"type":47,"value":374}," When designing or selecting a voice, specify the target language so the voice library returns matches that speak it.",{"type":41,"tag":342,"props":376,"children":377},{},[378,383,385,391,392,398,399,405],{"type":41,"tag":265,"props":379,"children":380},{},[381],{"type":47,"value":382},"Technical directives stay in English",{"type":47,"value":384}," — enum values (",{"type":41,"tag":56,"props":386,"children":388},{"className":387},[],[389],{"type":47,"value":390},"Young Adult",{"type":47,"value":127},{"type":41,"tag":56,"props":393,"children":395},{"className":394},[],[396],{"type":47,"value":397},"Realistic",{"type":47,"value":127},{"type":41,"tag":56,"props":400,"children":402},{"className":401},[],[403],{"type":47,"value":404},"landscape",{"type":47,"value":406},", etc.) are API-level and not translated.",{"type":41,"tag":65,"props":408,"children":410},{"id":409},"ux-rules",[411],{"type":47,"value":412},"UX Rules",{"type":41,"tag":338,"props":414,"children":415},{},[416,426,436,446,476,486,496],{"type":41,"tag":342,"props":417,"children":418},{},[419,424],{"type":41,"tag":265,"props":420,"children":421},{},[422],{"type":47,"value":423},"Be concise.",{"type":47,"value":425}," No avatar IDs, group IDs, or raw API payloads in chat. Report the result (avatar created, ready to use) not the plumbing.",{"type":41,"tag":342,"props":427,"children":428},{},[429,434],{"type":41,"tag":265,"props":430,"children":431},{},[432],{"type":47,"value":433},"No internal jargon.",{"type":47,"value":435}," Never mention internal phase names (\"Phase 0\", \"Phase 5 Symlink Maintenance\") to the user. The user sees natural conversation: \"Setting up your avatar\\u2026\" not \"Running Phase 2 avatar creation.\"",{"type":41,"tag":342,"props":437,"children":438},{},[439,444],{"type":41,"tag":265,"props":440,"children":441},{},[442],{"type":47,"value":443},"One or two questions per phase.",{"type":47,"value":445}," Don't batch-ask. Walk phases in order, ask the smallest set of questions needed to proceed.",{"type":41,"tag":342,"props":447,"children":448},{},[449,454,456,461,462,467,468,474],{"type":41,"tag":265,"props":450,"children":451},{},[452],{"type":47,"value":453},"Read workspace files before asking.",{"type":47,"value":455}," ",{"type":41,"tag":56,"props":457,"children":459},{"className":458},[],[460],{"type":47,"value":125},{"type":47,"value":127},{"type":41,"tag":56,"props":463,"children":465},{"className":464},[],[466],{"type":47,"value":133},{"type":47,"value":127},{"type":41,"tag":56,"props":469,"children":471},{"className":470},[],[472],{"type":47,"value":473},"AVATAR-*.md",{"type":47,"value":475}," at the workspace root contain identity. Check them first. Only ask the user for what's genuinely missing.",{"type":41,"tag":342,"props":477,"children":478},{},[479,484],{"type":41,"tag":265,"props":480,"children":481},{},[482],{"type":47,"value":483},"Don't narrate skill internals.",{"type":47,"value":485}," Never say \"let me read the workflow,\" \"checking the reference files,\" \"loading the avatar discovery guide.\" Read silently. The user sees questions and results, not internal navigation.",{"type":41,"tag":342,"props":487,"children":488},{},[489,494],{"type":41,"tag":265,"props":490,"children":491},{},[492],{"type":47,"value":493},"Don't announce what you're about to do.",{"type":47,"value":495}," Skip meta-commentary like \"Creating the avatar now.\" Just do the work. If a step takes time, the next thing the user hears should be the result (or a checkpoint question).",{"type":41,"tag":342,"props":497,"children":498},{},[499,504],{"type":41,"tag":265,"props":500,"children":501},{},[502],{"type":47,"value":503},"Never narrate transport choice.",{"type":47,"value":505}," App vs CLI is internal. Pick the transport silently and never mention it. If both are unavailable, ask the user to configure one without explaining why.",{"type":41,"tag":65,"props":507,"children":509},{"id":508},"start-here-critical",[510],{"type":47,"value":511},"Start Here (Critical)",{"type":41,"tag":50,"props":513,"children":514},{},[515,520],{"type":41,"tag":265,"props":516,"children":517},{},[518],{"type":47,"value":519},"Default target = the agent.",{"type":47,"value":521}," The primary use of this skill is giving the agent a face + voice so it can present videos. Route to \"user\" only on explicit \"my avatar\" \u002F \"me\" \u002F \"my photo\" language. When in doubt, make the agent's avatar.",{"type":41,"tag":50,"props":523,"children":524},{},[525,530],{"type":41,"tag":265,"props":526,"children":527},{},[528],{"type":47,"value":529},"Do NOT batch-ask questions.",{"type":47,"value":531}," No \"give me a photo, voice preference, duration, target platform, tone, key message\" all at once. Walk phases in order. Each phase asks at most one or two things at a time.",{"type":41,"tag":50,"props":533,"children":534},{},[535,540],{"type":41,"tag":265,"props":536,"children":537},{},[538],{"type":47,"value":539},"For agent avatars: read SOUL.md and IDENTITY.md first, then go straight to prompt-based creation.",{"type":47,"value":541}," Do NOT ask the user for a photo or appearance details first. The agent's identity lives in those workspace files. Only ask the user for traits that are genuinely missing.",{"type":41,"tag":50,"props":543,"children":544},{},[545,550],{"type":41,"tag":265,"props":546,"children":547},{},[548],{"type":47,"value":549},"Prompt-based is the default creation path.",{"type":47,"value":551}," Photo is opt-in, only relevant when the user explicitly wants a real-person digital twin of themselves. Agents and named characters almost always use prompt-based creation.",{"type":41,"tag":65,"props":553,"children":555},{"id":554},"before-you-start-environment-detection",[556],{"type":47,"value":557},"Before You Start (environment detection)",{"type":41,"tag":50,"props":559,"children":560},{},[561,563,568],{"type":47,"value":562},"Try to read ",{"type":41,"tag":56,"props":564,"children":566},{"className":565},[],[567],{"type":47,"value":125},{"type":47,"value":569}," from the workspace root.",{"type":41,"tag":571,"props":572,"children":573},"ul",{},[574,598],{"type":41,"tag":342,"props":575,"children":576},{},[577,582,584,589,591,596],{"type":41,"tag":265,"props":578,"children":579},{},[580],{"type":47,"value":581},"Found",{"type":47,"value":583}," → Workspace-native identity files are available. Skip this entire section and go straight to Phase 0. ",{"type":41,"tag":56,"props":585,"children":587},{"className":586},[],[588],{"type":47,"value":125},{"type":47,"value":590}," and ",{"type":41,"tag":56,"props":592,"children":594},{"className":593},[],[595],{"type":47,"value":133},{"type":47,"value":597}," will drive agent onboarding.",{"type":41,"tag":342,"props":599,"children":600},{},[601,606],{"type":41,"tag":265,"props":602,"children":603},{},[604],{"type":47,"value":605},"Not found",{"type":47,"value":607}," → No workspace identity files are available. Still go to Phase 0 next — do NOT skip ahead to listing user avatars or asking the user for a photo.",{"type":41,"tag":50,"props":609,"children":610},{},[611,616,618,624,626,632],{"type":41,"tag":265,"props":612,"children":613},{},[614],{"type":47,"value":615},"⚠️ AVATAR file caveat:",{"type":47,"value":617}," Ignore any AVATAR-*.md files found in the workspace that belong to a ",{"type":41,"tag":619,"props":620,"children":621},"em",{},[622],{"type":47,"value":623},"different",{"type":47,"value":625}," person or agent (e.g., ",{"type":41,"tag":56,"props":627,"children":629},{"className":628},[],[630],{"type":47,"value":631},"AVATAR-Eve.md",{"type":47,"value":633}," when creating an avatar for a different subject). Only use an AVATAR file if its name matches the subject you're creating for right now.",{"type":41,"tag":50,"props":635,"children":636},{},[637,642],{"type":41,"tag":265,"props":638,"children":639},{},[640],{"type":47,"value":641},"⚠️ Do NOT fetch HeyGen avatars yet.",{"type":47,"value":643}," That's a Phase 0 sub-step (only after target detection). Fetching before Phase 0 causes the agent to frame the conversation around \"your existing avatars\" when the default should be creating one for the agent itself.",{"type":41,"tag":65,"props":645,"children":647},{"id":646},"api-mode-detection",[648],{"type":47,"value":649},"API Mode Detection",{"type":41,"tag":50,"props":651,"children":652},{},[653,658],{"type":41,"tag":265,"props":654,"children":655},{},[656],{"type":47,"value":657},"Mode selection is silent.",{"type":47,"value":659}," Detect once at the start of the session, pick a mode, move on. Never narrate transport choice (\"CLI is broken\", \"switching to the app\") — the user doesn't care how calls are made.",{"type":41,"tag":50,"props":661,"children":662},{},[663,668],{"type":41,"tag":265,"props":664,"children":665},{},[666],{"type":47,"value":667},"HeyGen app (preferred):",{"type":47,"value":669}," If the HeyGen app is available through the installed app integration, use it. The app authenticates via OAuth and runs against the user's existing HeyGen plan credits.",{"type":41,"tag":50,"props":671,"children":672},{},[673,678,680,686,687,693],{"type":41,"tag":265,"props":674,"children":675},{},[676],{"type":47,"value":677},"Auth triage (run immediately):",{"type":47,"value":679}," run ",{"type":41,"tag":56,"props":681,"children":683},{"className":682},[],[684],{"type":47,"value":685},"command -v heygen",{"type":47,"value":590},{"type":41,"tag":56,"props":688,"children":690},{"className":689},[],[691],{"type":47,"value":692},"heygen auth status",{"type":47,"value":694},". If app\u002FMCP auth fails but CLI auth is valid, continue in CLI mode for this run.",{"type":41,"tag":50,"props":696,"children":697},{},[698,703,705,711,713,719,721,727,729,735,737,743,745,751],{"type":41,"tag":265,"props":699,"children":700},{},[701],{"type":47,"value":702},"Local media limitation:",{"type":47,"value":704}," The current HeyGen app connector does NOT upload local files. Its photo\u002Fvideo\u002Favatar tools accept only hosted HTTPS URLs or existing HeyGen ",{"type":41,"tag":56,"props":706,"children":708},{"className":707},[],[709],{"type":47,"value":710},"asset_id",{"type":47,"value":712}," values. Never pass ",{"type":41,"tag":56,"props":714,"children":716},{"className":715},[],[717],{"type":47,"value":718},"file:\u002F\u002F",{"type":47,"value":720},", absolute local paths, or Codex attachment paths directly to app tools. For local photos\u002Fvideos, first upload with ",{"type":41,"tag":56,"props":722,"children":724},{"className":723},[],[725],{"type":47,"value":726},"heygen asset create --file \u003Cpath>",{"type":47,"value":728}," or ",{"type":41,"tag":56,"props":730,"children":732},{"className":731},[],[733],{"type":47,"value":734},"POST https:\u002F\u002Fapi.heygen.com\u002Fv3\u002Fassets",{"type":47,"value":736}," using ",{"type":41,"tag":56,"props":738,"children":740},{"className":739},[],[741],{"type":47,"value":742},"multipart\u002Fform-data",{"type":47,"value":744},"; then pass ",{"type":41,"tag":56,"props":746,"children":748},{"className":747},[],[749],{"type":47,"value":750},"{ \"type\": \"asset_id\", \"asset_id\": \"...\" }",{"type":47,"value":752}," to the app or CLI creation call. If no CLI\u002FAPI upload path is available, ask the user for an HTTPS image URL or permission to continue with prompt-only creation.",{"type":41,"tag":50,"props":754,"children":755},{},[756,761,763,769,771,777,779,785,787,793,795,801,803,809],{"type":41,"tag":265,"props":757,"children":758},{},[759],{"type":47,"value":760},"CLI fallback:",{"type":47,"value":762}," If the app is not available AND the ",{"type":41,"tag":56,"props":764,"children":766},{"className":765},[],[767],{"type":47,"value":768},"heygen",{"type":47,"value":770}," binary runs cleanly (",{"type":41,"tag":56,"props":772,"children":774},{"className":773},[],[775],{"type":47,"value":776},"heygen --version",{"type":47,"value":778}," exits 0), use it. Auth: ",{"type":41,"tag":56,"props":780,"children":782},{"className":781},[],[783],{"type":47,"value":784},"HEYGEN_API_KEY",{"type":47,"value":786}," env OR ",{"type":41,"tag":56,"props":788,"children":790},{"className":789},[],[791],{"type":47,"value":792},"heygen auth login",{"type":47,"value":794}," (persists to ",{"type":41,"tag":56,"props":796,"children":798},{"className":797},[],[799],{"type":47,"value":800},"~\u002F.heygen\u002Fcredentials",{"type":47,"value":802},"). If the CLI is missing, errors on ",{"type":41,"tag":56,"props":804,"children":806},{"className":805},[],[807],{"type":47,"value":808},"--version",{"type":47,"value":810},", or auth is not set, silently skip it.",{"type":41,"tag":50,"props":812,"children":813},{},[814],{"type":47,"value":815},"In Codex desktop\u002Fsandboxed runs, CLI network calls may fail with DNS\u002Fnetwork errors until network approval\u002Fescalation is granted. Retry with escalation when needed.",{"type":41,"tag":50,"props":817,"children":818},{},[819,824,826,832,834,839],{"type":41,"tag":265,"props":820,"children":821},{},[822],{"type":47,"value":823},"Neither available:",{"type":47,"value":825}," Only if the app is unavailable AND the CLI doesn't work, tell the user once: \"To use this skill, connect the HeyGen app or install the HeyGen CLI: ",{"type":41,"tag":56,"props":827,"children":829},{"className":828},[],[830],{"type":47,"value":831},"curl -fsSL https:\u002F\u002Fstatic.heygen.ai\u002Fcli\u002Finstall.sh | bash",{"type":47,"value":833}," then ",{"type":41,"tag":56,"props":835,"children":837},{"className":836},[],[838],{"type":47,"value":792},{"type":47,"value":840},".\" If the only missing capability is local media upload, say that local photos need an HTTPS URL or a CLI\u002FAPI asset upload first.",{"type":41,"tag":50,"props":842,"children":843},{},[844,849],{"type":41,"tag":265,"props":845,"children":846},{},[847],{"type":47,"value":848},"API:",{"type":47,"value":850}," v3 only. Never call v1 or v2 endpoints.",{"type":41,"tag":50,"props":852,"children":853},{},[854,859],{"type":41,"tag":265,"props":855,"children":856},{},[857],{"type":47,"value":858},"Docs-first rule:",{"type":47,"value":860}," Before calling any endpoint you're unsure about:",{"type":41,"tag":571,"props":862,"children":863},{},[864,881,899,910],{"type":41,"tag":342,"props":865,"children":866},{},[867,872,873,879],{"type":41,"tag":265,"props":868,"children":869},{},[870],{"type":47,"value":871},"Index:",{"type":47,"value":455},{"type":41,"tag":56,"props":874,"children":876},{"className":875},[],[877],{"type":47,"value":878},"GET https:\u002F\u002Fdevelopers.heygen.com\u002Fllms.txt",{"type":47,"value":880}," — full sitemap",{"type":41,"tag":342,"props":882,"children":883},{},[884,889,891,897],{"type":41,"tag":265,"props":885,"children":886},{},[887],{"type":47,"value":888},"Any page:",{"type":47,"value":890}," Append ",{"type":41,"tag":56,"props":892,"children":894},{"className":893},[],[895],{"type":47,"value":896},".md",{"type":47,"value":898}," to the URL for clean markdown",{"type":41,"tag":342,"props":900,"children":901},{},[902,904],{"type":47,"value":903},"Or run ",{"type":41,"tag":56,"props":905,"children":907},{"className":906},[],[908],{"type":47,"value":909},"heygen \u003Cnoun> \u003Cverb> --help",{"type":41,"tag":342,"props":911,"children":912},{},[913],{"type":47,"value":914},"Read the spec, THEN build your request. Never guess field names.",{"type":41,"tag":65,"props":916,"children":918},{"id":917},"avatar-file-convention",[919],{"type":47,"value":920},"Avatar File Convention",{"type":41,"tag":50,"props":922,"children":923},{},[924,926,931],{"type":47,"value":925},"Every avatar gets one file: ",{"type":41,"tag":56,"props":927,"children":929},{"className":928},[],[930],{"type":47,"value":61},{"type":47,"value":932}," at the workspace root.",{"type":41,"tag":934,"props":935,"children":939},"pre",{"className":936,"code":938,"language":47},[937],"language-text","AVATAR-EVE.md      ← agent      (named, canonical)\nAVATAR-KEN.md      ← user       (named, canonical)\nAVATAR-CLEO.md     ← character  (named, canonical)\n",[940],{"type":41,"tag":56,"props":941,"children":943},{"__ignoreMap":942},"",[944],{"type":47,"value":938},{"type":41,"tag":50,"props":946,"children":947},{},[948,950,955],{"type":47,"value":949},"The skill also maintains two ",{"type":41,"tag":265,"props":951,"children":952},{},[953],{"type":47,"value":954},"role-based symlinks",{"type":47,"value":956}," alongside the named\nfiles, for generic lookups by consumer skills (e.g., heygen-video) when the\nrequest doesn't carry a specific name (\"make a video of yourself\" → read\nthe agent alias; \"make a video of me\" → read the user alias):",{"type":41,"tag":934,"props":958,"children":961},{"className":959,"code":960,"language":47},[937],"AVATAR-AGENT.md → AVATAR-\u003CCURRENT-AGENT-NAME>.md   (symlink)\nAVATAR-USER.md  → AVATAR-\u003CCURRENT-USER-NAME>.md    (symlink)\n",[962],{"type":41,"tag":56,"props":963,"children":964},{"__ignoreMap":942},[965],{"type":47,"value":960},{"type":41,"tag":50,"props":967,"children":968},{},[969],{"type":47,"value":970},"Named files are the single source of truth; aliases are pointers and never\ndrift. Phase 5 of the workflow maintains them. Named characters get NO\nrole alias — they are referenced by name only.",{"type":41,"tag":50,"props":972,"children":973},{},[974],{"type":47,"value":975},"Format:",{"type":41,"tag":934,"props":977,"children":981},{"className":978,"code":979,"language":980,"meta":942,"style":942},"language-markdown shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# Avatar: \u003CName>\n\n## Appearance\n- Age: \u003Cnatural language>\n- Gender: \u003Cnatural language>\n- Ethnicity: \u003Cnatural language>\n- Hair: \u003Cnatural language>\n- Build: \u003Cnatural language>\n- Features: \u003Cnatural language>\n- Style: \u003Cnatural language>\n- Reference: \u003Coptional workspace-relative path or URL>\n\n## Voice\n- Tone: \u003Cnatural language>\n- Accent: \u003Cnatural language>\n- Energy: \u003Cnatural language>\n- Think: \u003Cone-line analogy>\n\n## HeyGen\n- Group ID: \u003Ccharacter identity anchor — THE stable reference, never changes>\n- Voice ID: \u003Cmatched or designed voice>\n- Voice Name: \u003Chuman-readable>\n- Voice Designed: \u003Ctrue if custom-designed, false if picked from catalog>\n- Voice Seed: \u003Cseed value used, if designed>\n- Looks: landscape=\u003Clook_id>, portrait=\u003Clook_id>, square=\u003Clook_id>\n- Last Synced: \u003CISO timestamp>\n\n⚠️ look_ids are ephemeral — always resolve fresh from group_id at runtime via `heygen avatar looks list --group-id \u003Cid>` (or the corresponding HeyGen app tool). Never hardcode look_id as the primary avatar reference.\n","markdown",[982],{"type":41,"tag":56,"props":983,"children":984},{"__ignoreMap":942},[985,1003,1013,1027,1042,1055,1068,1081,1094,1107,1120,1133,1141,1154,1167,1180,1193,1206,1214,1227,1240,1253,1266,1279,1292,1305,1318,1326],{"type":41,"tag":986,"props":987,"children":990},"span",{"class":988,"line":989},"line",1,[991,997],{"type":41,"tag":986,"props":992,"children":994},{"style":993},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[995],{"type":47,"value":996},"# ",{"type":41,"tag":986,"props":998,"children":1000},{"style":999},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[1001],{"type":47,"value":1002},"Avatar: \u003CName>\n",{"type":41,"tag":986,"props":1004,"children":1006},{"class":988,"line":1005},2,[1007],{"type":41,"tag":986,"props":1008,"children":1010},{"emptyLinePlaceholder":1009},true,[1011],{"type":47,"value":1012},"\n",{"type":41,"tag":986,"props":1014,"children":1016},{"class":988,"line":1015},3,[1017,1022],{"type":41,"tag":986,"props":1018,"children":1019},{"style":993},[1020],{"type":47,"value":1021},"## ",{"type":41,"tag":986,"props":1023,"children":1024},{"style":999},[1025],{"type":47,"value":1026},"Appearance\n",{"type":41,"tag":986,"props":1028,"children":1030},{"class":988,"line":1029},4,[1031,1036],{"type":41,"tag":986,"props":1032,"children":1033},{"style":993},[1034],{"type":47,"value":1035},"-",{"type":41,"tag":986,"props":1037,"children":1039},{"style":1038},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[1040],{"type":47,"value":1041}," Age: \u003Cnatural language>\n",{"type":41,"tag":986,"props":1043,"children":1045},{"class":988,"line":1044},5,[1046,1050],{"type":41,"tag":986,"props":1047,"children":1048},{"style":993},[1049],{"type":47,"value":1035},{"type":41,"tag":986,"props":1051,"children":1052},{"style":1038},[1053],{"type":47,"value":1054}," Gender: \u003Cnatural language>\n",{"type":41,"tag":986,"props":1056,"children":1058},{"class":988,"line":1057},6,[1059,1063],{"type":41,"tag":986,"props":1060,"children":1061},{"style":993},[1062],{"type":47,"value":1035},{"type":41,"tag":986,"props":1064,"children":1065},{"style":1038},[1066],{"type":47,"value":1067}," Ethnicity: \u003Cnatural language>\n",{"type":41,"tag":986,"props":1069,"children":1071},{"class":988,"line":1070},7,[1072,1076],{"type":41,"tag":986,"props":1073,"children":1074},{"style":993},[1075],{"type":47,"value":1035},{"type":41,"tag":986,"props":1077,"children":1078},{"style":1038},[1079],{"type":47,"value":1080}," Hair: \u003Cnatural language>\n",{"type":41,"tag":986,"props":1082,"children":1084},{"class":988,"line":1083},8,[1085,1089],{"type":41,"tag":986,"props":1086,"children":1087},{"style":993},[1088],{"type":47,"value":1035},{"type":41,"tag":986,"props":1090,"children":1091},{"style":1038},[1092],{"type":47,"value":1093}," Build: \u003Cnatural language>\n",{"type":41,"tag":986,"props":1095,"children":1097},{"class":988,"line":1096},9,[1098,1102],{"type":41,"tag":986,"props":1099,"children":1100},{"style":993},[1101],{"type":47,"value":1035},{"type":41,"tag":986,"props":1103,"children":1104},{"style":1038},[1105],{"type":47,"value":1106}," Features: \u003Cnatural language>\n",{"type":41,"tag":986,"props":1108,"children":1110},{"class":988,"line":1109},10,[1111,1115],{"type":41,"tag":986,"props":1112,"children":1113},{"style":993},[1114],{"type":47,"value":1035},{"type":41,"tag":986,"props":1116,"children":1117},{"style":1038},[1118],{"type":47,"value":1119}," Style: \u003Cnatural language>\n",{"type":41,"tag":986,"props":1121,"children":1123},{"class":988,"line":1122},11,[1124,1128],{"type":41,"tag":986,"props":1125,"children":1126},{"style":993},[1127],{"type":47,"value":1035},{"type":41,"tag":986,"props":1129,"children":1130},{"style":1038},[1131],{"type":47,"value":1132}," Reference: \u003Coptional workspace-relative path or URL>\n",{"type":41,"tag":986,"props":1134,"children":1136},{"class":988,"line":1135},12,[1137],{"type":41,"tag":986,"props":1138,"children":1139},{"emptyLinePlaceholder":1009},[1140],{"type":47,"value":1012},{"type":41,"tag":986,"props":1142,"children":1144},{"class":988,"line":1143},13,[1145,1149],{"type":41,"tag":986,"props":1146,"children":1147},{"style":993},[1148],{"type":47,"value":1021},{"type":41,"tag":986,"props":1150,"children":1151},{"style":999},[1152],{"type":47,"value":1153},"Voice\n",{"type":41,"tag":986,"props":1155,"children":1157},{"class":988,"line":1156},14,[1158,1162],{"type":41,"tag":986,"props":1159,"children":1160},{"style":993},[1161],{"type":47,"value":1035},{"type":41,"tag":986,"props":1163,"children":1164},{"style":1038},[1165],{"type":47,"value":1166}," Tone: \u003Cnatural language>\n",{"type":41,"tag":986,"props":1168,"children":1170},{"class":988,"line":1169},15,[1171,1175],{"type":41,"tag":986,"props":1172,"children":1173},{"style":993},[1174],{"type":47,"value":1035},{"type":41,"tag":986,"props":1176,"children":1177},{"style":1038},[1178],{"type":47,"value":1179}," Accent: \u003Cnatural language>\n",{"type":41,"tag":986,"props":1181,"children":1183},{"class":988,"line":1182},16,[1184,1188],{"type":41,"tag":986,"props":1185,"children":1186},{"style":993},[1187],{"type":47,"value":1035},{"type":41,"tag":986,"props":1189,"children":1190},{"style":1038},[1191],{"type":47,"value":1192}," Energy: \u003Cnatural language>\n",{"type":41,"tag":986,"props":1194,"children":1196},{"class":988,"line":1195},17,[1197,1201],{"type":41,"tag":986,"props":1198,"children":1199},{"style":993},[1200],{"type":47,"value":1035},{"type":41,"tag":986,"props":1202,"children":1203},{"style":1038},[1204],{"type":47,"value":1205}," Think: \u003Cone-line analogy>\n",{"type":41,"tag":986,"props":1207,"children":1209},{"class":988,"line":1208},18,[1210],{"type":41,"tag":986,"props":1211,"children":1212},{"emptyLinePlaceholder":1009},[1213],{"type":47,"value":1012},{"type":41,"tag":986,"props":1215,"children":1217},{"class":988,"line":1216},19,[1218,1222],{"type":41,"tag":986,"props":1219,"children":1220},{"style":993},[1221],{"type":47,"value":1021},{"type":41,"tag":986,"props":1223,"children":1224},{"style":999},[1225],{"type":47,"value":1226},"HeyGen\n",{"type":41,"tag":986,"props":1228,"children":1230},{"class":988,"line":1229},20,[1231,1235],{"type":41,"tag":986,"props":1232,"children":1233},{"style":993},[1234],{"type":47,"value":1035},{"type":41,"tag":986,"props":1236,"children":1237},{"style":1038},[1238],{"type":47,"value":1239}," Group ID: \u003Ccharacter identity anchor — THE stable reference, never changes>\n",{"type":41,"tag":986,"props":1241,"children":1243},{"class":988,"line":1242},21,[1244,1248],{"type":41,"tag":986,"props":1245,"children":1246},{"style":993},[1247],{"type":47,"value":1035},{"type":41,"tag":986,"props":1249,"children":1250},{"style":1038},[1251],{"type":47,"value":1252}," Voice ID: \u003Cmatched or designed voice>\n",{"type":41,"tag":986,"props":1254,"children":1256},{"class":988,"line":1255},22,[1257,1261],{"type":41,"tag":986,"props":1258,"children":1259},{"style":993},[1260],{"type":47,"value":1035},{"type":41,"tag":986,"props":1262,"children":1263},{"style":1038},[1264],{"type":47,"value":1265}," Voice Name: \u003Chuman-readable>\n",{"type":41,"tag":986,"props":1267,"children":1269},{"class":988,"line":1268},23,[1270,1274],{"type":41,"tag":986,"props":1271,"children":1272},{"style":993},[1273],{"type":47,"value":1035},{"type":41,"tag":986,"props":1275,"children":1276},{"style":1038},[1277],{"type":47,"value":1278}," Voice Designed: \u003Ctrue if custom-designed, false if picked from catalog>\n",{"type":41,"tag":986,"props":1280,"children":1282},{"class":988,"line":1281},24,[1283,1287],{"type":41,"tag":986,"props":1284,"children":1285},{"style":993},[1286],{"type":47,"value":1035},{"type":41,"tag":986,"props":1288,"children":1289},{"style":1038},[1290],{"type":47,"value":1291}," Voice Seed: \u003Cseed value used, if designed>\n",{"type":41,"tag":986,"props":1293,"children":1295},{"class":988,"line":1294},25,[1296,1300],{"type":41,"tag":986,"props":1297,"children":1298},{"style":993},[1299],{"type":47,"value":1035},{"type":41,"tag":986,"props":1301,"children":1302},{"style":1038},[1303],{"type":47,"value":1304}," Looks: landscape=\u003Clook_id>, portrait=\u003Clook_id>, square=\u003Clook_id>\n",{"type":41,"tag":986,"props":1306,"children":1308},{"class":988,"line":1307},26,[1309,1313],{"type":41,"tag":986,"props":1310,"children":1311},{"style":993},[1312],{"type":47,"value":1035},{"type":41,"tag":986,"props":1314,"children":1315},{"style":1038},[1316],{"type":47,"value":1317}," Last Synced: \u003CISO timestamp>\n",{"type":41,"tag":986,"props":1319,"children":1321},{"class":988,"line":1320},27,[1322],{"type":41,"tag":986,"props":1323,"children":1324},{"emptyLinePlaceholder":1009},[1325],{"type":47,"value":1012},{"type":41,"tag":986,"props":1327,"children":1329},{"class":988,"line":1328},28,[1330,1335,1340,1346,1350],{"type":41,"tag":986,"props":1331,"children":1332},{"style":1038},[1333],{"type":47,"value":1334},"⚠️ look_ids are ephemeral — always resolve fresh from group_id at runtime via ",{"type":41,"tag":986,"props":1336,"children":1337},{"style":993},[1338],{"type":47,"value":1339},"`",{"type":41,"tag":986,"props":1341,"children":1343},{"style":1342},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[1344],{"type":47,"value":1345},"heygen avatar looks list --group-id \u003Cid>",{"type":41,"tag":986,"props":1347,"children":1348},{"style":993},[1349],{"type":47,"value":1339},{"type":41,"tag":986,"props":1351,"children":1352},{"style":1038},[1353],{"type":47,"value":1354}," (or the corresponding HeyGen app tool). Never hardcode look_id as the primary avatar reference.\n",{"type":41,"tag":50,"props":1356,"children":1357},{},[1358,1363,1365,1370],{"type":41,"tag":265,"props":1359,"children":1360},{},[1361],{"type":47,"value":1362},"Top sections",{"type":47,"value":1364}," (Appearance, Voice) are portable natural language. Any platform can use them.\n",{"type":41,"tag":265,"props":1366,"children":1367},{},[1368],{"type":47,"value":1369},"HeyGen section",{"type":47,"value":1371}," is runtime config with API IDs. Skills read this to make API calls.",{"type":41,"tag":65,"props":1373,"children":1375},{"id":1374},"skill-announcement",[1376],{"type":47,"value":1377},"Skill Announcement",{"type":41,"tag":50,"props":1379,"children":1380},{},[1381],{"type":47,"value":1382},"Start every invocation with:",{"type":41,"tag":1384,"props":1385,"children":1386},"blockquote",{},[1387],{"type":41,"tag":50,"props":1388,"children":1389},{},[1390,1392,1397,1399],{"type":47,"value":1391},"🎭 ",{"type":41,"tag":265,"props":1393,"children":1394},{},[1395],{"type":47,"value":1396},"Using: heygen-avatar",{"type":47,"value":1398}," — creating an avatar for ",{"type":41,"tag":986,"props":1400,"children":1401},{},[1402],{"type":47,"value":1403},"name",{"type":41,"tag":65,"props":1405,"children":1407},{"id":1406},"workflow",[1408],{"type":47,"value":1409},"Workflow",{"type":41,"tag":50,"props":1411,"children":1412},{},[1413,1418],{"type":41,"tag":265,"props":1414,"children":1415},{},[1416],{"type":47,"value":1417},"DO NOT batch-ask questions upfront.",{"type":47,"value":1419}," Walk phases in order. Each phase asks at most one thing at a time, and only if needed.",{"type":41,"tag":1421,"props":1422,"children":1424},"h3",{"id":1423},"phase-0-who-are-we-creating",[1425],{"type":47,"value":1426},"Phase 0 — Who Are We Creating?",{"type":41,"tag":50,"props":1428,"children":1429},{},[1430],{"type":47,"value":1431},"See the Start Here block above for the default-to-agent rule. Only route to \"user\" or \"named character\" when the phrasing is unambiguous.",{"type":41,"tag":50,"props":1433,"children":1434},{},[1435],{"type":47,"value":1436},"Routing signals (in priority order):",{"type":41,"tag":338,"props":1438,"children":1439},{},[1440,1476,1486],{"type":41,"tag":342,"props":1441,"children":1442},{},[1443,1448,1450,1455,1457,1462,1464,1468,1470,1474],{"type":41,"tag":265,"props":1444,"children":1445},{},[1446],{"type":47,"value":1447},"User",{"type":47,"value":1449}," (explicit only) — \"create ",{"type":41,"tag":265,"props":1451,"children":1452},{},[1453],{"type":47,"value":1454},"my",{"type":47,"value":1456}," avatar\", \"make ",{"type":41,"tag":265,"props":1458,"children":1459},{},[1460],{"type":47,"value":1461},"me",{"type":47,"value":1463}," an avatar\", \"I want my face in a video\", \"a digital twin of ",{"type":41,"tag":265,"props":1465,"children":1466},{},[1467],{"type":47,"value":1461},{"type":47,"value":1469},"\", \"based on ",{"type":41,"tag":265,"props":1471,"children":1472},{},[1473],{"type":47,"value":1454},{"type":47,"value":1475}," photo\". Requires a possessive pronoun referring to the user OR explicit mention of their photo. Ask for their name if not obvious.",{"type":41,"tag":342,"props":1477,"children":1478},{},[1479,1484],{"type":41,"tag":265,"props":1480,"children":1481},{},[1482],{"type":47,"value":1483},"Named character",{"type":47,"value":1485}," (explicit only) — \"create an avatar called Cleo\", \"design a character named X\", \"build a presenter named Y\" → use the given name.",{"type":41,"tag":342,"props":1487,"children":1488},{},[1489,1494,1496,1501],{"type":41,"tag":265,"props":1490,"children":1491},{},[1492],{"type":47,"value":1493},"Agent",{"type":47,"value":1495}," (default) — everything else: \"create your avatar\", \"bring yourself to life\", \"set up an avatar\", \"let's make an avatar\", \"create an avatar\", \"design a presenter\", \"I want you to appear in videos\", or any ambiguous phrasing. Read ",{"type":41,"tag":56,"props":1497,"children":1499},{"className":1498},[],[1500],{"type":47,"value":133},{"type":47,"value":1502}," for name.",{"type":41,"tag":50,"props":1504,"children":1505},{},[1506,1511],{"type":41,"tag":265,"props":1507,"children":1508},{},[1509],{"type":47,"value":1510},"When unsure, default to agent.",{"type":47,"value":1512}," Do NOT ask the user for their name, appearance, or voice on an ambiguous request — that's the wrong first move. If after reading IDENTITY.md + SOUL.md the intent still feels ambiguous, ask one short clarifying question to disambiguate (phrase it naturally — something like \"quick check: this avatar is for you, or for me?\").",{"type":41,"tag":50,"props":1514,"children":1515},{},[1516,1518,1523],{"type":47,"value":1517},"Then check ",{"type":41,"tag":56,"props":1519,"children":1521},{"className":1520},[],[1522],{"type":47,"value":61},{"type":47,"value":1524}," at the workspace root:",{"type":41,"tag":571,"props":1526,"children":1527},{},[1528,1538,1548],{"type":41,"tag":342,"props":1529,"children":1530},{},[1531,1536],{"type":41,"tag":265,"props":1532,"children":1533},{},[1534],{"type":47,"value":1535},"AVATAR file exists + HeyGen section filled in",{"type":47,"value":1537}," → \"You already have an avatar set up. Want to add a new look, update it, or start fresh?\" Wait for answer.",{"type":41,"tag":342,"props":1539,"children":1540},{},[1541,1546],{"type":41,"tag":265,"props":1542,"children":1543},{},[1544],{"type":47,"value":1545},"AVATAR file exists but HeyGen section empty",{"type":47,"value":1547}," → skip to Phase 2.",{"type":41,"tag":342,"props":1549,"children":1550},{},[1551,1556],{"type":41,"tag":265,"props":1552,"children":1553},{},[1554],{"type":47,"value":1555},"No AVATAR file",{"type":47,"value":1557}," → proceed to Phase 1.",{"type":41,"tag":50,"props":1559,"children":1560},{},[1561,1566],{"type":41,"tag":265,"props":1562,"children":1563},{},[1564],{"type":47,"value":1565},"Role alias staleness check.",{"type":47,"value":1567}," Before proceeding, also check whether the\nrole alias for this target is already pointing at the right named file:",{"type":41,"tag":571,"props":1569,"children":1570},{},[1571,1620,1637],{"type":41,"tag":342,"props":1572,"children":1573},{},[1574,1576,1581,1583,1588,1590,1596,1598,1603,1605,1611,1613,1618],{"type":47,"value":1575},"For ",{"type":41,"tag":265,"props":1577,"children":1578},{},[1579],{"type":47,"value":1580},"agent target",{"type":47,"value":1582},": read ",{"type":41,"tag":56,"props":1584,"children":1586},{"className":1585},[],[1587],{"type":47,"value":195},{"type":47,"value":1589}," (follow symlink) and\ncompare to ",{"type":41,"tag":56,"props":1591,"children":1593},{"className":1592},[],[1594],{"type":47,"value":1595},"AVATAR-\u003CCURRENT-AGENT-NAME>.md",{"type":47,"value":1597},". If they differ (e.g.,\n",{"type":41,"tag":56,"props":1599,"children":1601},{"className":1600},[],[1602],{"type":47,"value":195},{"type":47,"value":1604}," → ",{"type":41,"tag":56,"props":1606,"children":1608},{"className":1607},[],[1609],{"type":47,"value":1610},"AVATAR-OLD-NAME.md",{"type":47,"value":1612}," because the agent identity\nchanged since the last run), re-link in Phase 5 even if no other\nchanges are made. The named file is canonical, but the alias must\nmatch the ",{"type":41,"tag":619,"props":1614,"children":1615},{},[1616],{"type":47,"value":1617},"current",{"type":47,"value":1619}," identity, not the historical one.",{"type":41,"tag":342,"props":1621,"children":1622},{},[1623,1624,1629,1631,1636],{"type":47,"value":1575},{"type":41,"tag":265,"props":1625,"children":1626},{},[1627],{"type":47,"value":1628},"user target",{"type":47,"value":1630},": same check on ",{"type":41,"tag":56,"props":1632,"children":1634},{"className":1633},[],[1635],{"type":47,"value":202},{"type":47,"value":358},{"type":41,"tag":342,"props":1638,"children":1639},{},[1640,1641,1646],{"type":47,"value":1575},{"type":41,"tag":265,"props":1642,"children":1643},{},[1644],{"type":47,"value":1645},"named character",{"type":47,"value":1647},": no alias to check.",{"type":41,"tag":50,"props":1649,"children":1650},{},[1651,1656,1658,1663,1665,1671],{"type":41,"tag":265,"props":1652,"children":1653},{},[1654],{"type":47,"value":1655},"Optional existing-avatar check",{"type":47,"value":1657}," (only useful on the user path when the user might already have avatars in their HeyGen account). If Phase 0 target = ",{"type":41,"tag":265,"props":1659,"children":1660},{},[1661],{"type":47,"value":1662},"user",{"type":47,"value":1664}," AND no ",{"type":41,"tag":56,"props":1666,"children":1668},{"className":1667},[],[1669],{"type":47,"value":1670},"AVATAR-\u003CUSER>.md",{"type":47,"value":1672}," exists, list their HeyGen avatars first:",{"type":41,"tag":50,"props":1674,"children":1675},{},[1676,1681,1683,1688,1689],{"type":41,"tag":265,"props":1677,"children":1678},{},[1679],{"type":47,"value":1680},"App:",{"type":47,"value":1682}," use the HeyGen app to list private avatar groups\n",{"type":41,"tag":265,"props":1684,"children":1685},{},[1686],{"type":47,"value":1687},"CLI:",{"type":47,"value":455},{"type":41,"tag":56,"props":1690,"children":1692},{"className":1691},[],[1693],{"type":47,"value":1694},"heygen avatar list --ownership private",{"type":41,"tag":50,"props":1696,"children":1697},{},[1698],{"type":47,"value":1699},"If the list is non-empty, present the options and ask which to use or whether to create new. If empty, proceed to Phase 1. Skip this check entirely for agent and named-character targets — those live in AVATAR-*.md, not the HeyGen catalog.",{"type":41,"tag":1421,"props":1701,"children":1703},{"id":1702},"phase-1-identity-extraction",[1704],{"type":47,"value":1705},"Phase 1 — Identity Extraction",{"type":41,"tag":50,"props":1707,"children":1708},{},[1709],{"type":41,"tag":265,"props":1710,"children":1711},{},[1712],{"type":47,"value":1713},"Order matters. Files first, questions second. Prompt-based creation is the default path — photo is an opt-in upgrade.",{"type":41,"tag":50,"props":1715,"children":1716},{},[1717,1722],{"type":41,"tag":265,"props":1718,"children":1719},{},[1720],{"type":47,"value":1721},"For the agent",{"type":47,"value":1723}," (Phase 0 target = agent):",{"type":41,"tag":338,"props":1725,"children":1726},{},[1727,1751,1763,1768],{"type":41,"tag":342,"props":1728,"children":1729},{},[1730,1732,1737,1738,1743,1745,1750],{"type":47,"value":1731},"Read ",{"type":41,"tag":56,"props":1733,"children":1735},{"className":1734},[],[1736],{"type":47,"value":125},{"type":47,"value":127},{"type":41,"tag":56,"props":1739,"children":1741},{"className":1740},[],[1742],{"type":47,"value":133},{"type":47,"value":1744},", and any existing ",{"type":41,"tag":56,"props":1746,"children":1748},{"className":1747},[],[1749],{"type":47,"value":61},{"type":47,"value":569},{"type":41,"tag":342,"props":1752,"children":1753},{},[1754,1756,1761],{"type":47,"value":1755},"If SOUL.md or IDENTITY.md is found → extract appearance and voice traits silently. Do NOT ask the user \"describe your appearance\" — the agent IS the subject, and its identity lives in those files. ",{"type":41,"tag":265,"props":1757,"children":1758},{},[1759],{"type":47,"value":1760},"If the files describe only personality \u002F values with no physical description, do NOT hallucinate traits.",{"type":47,"value":1762}," Ask the user conversationally for the missing appearance traits only (one or two at a time).",{"type":41,"tag":342,"props":1764,"children":1765},{},[1766],{"type":47,"value":1767},"If neither file is found (for example, in a workspace with no identity files) → ask the user to describe the agent's appearance and voice conversationally.",{"type":41,"tag":342,"props":1769,"children":1770},{},[1771,1773,1778],{"type":47,"value":1772},"Proceed directly to ",{"type":41,"tag":265,"props":1774,"children":1775},{},[1776],{"type":47,"value":1777},"Type A (prompt) creation",{"type":47,"value":1779}," in Phase 2 by default. Do NOT ask for a photo unless the user volunteers one or explicitly asks for photo realism — agents almost always use prompt-based creation.",{"type":41,"tag":50,"props":1781,"children":1782},{},[1783,1788],{"type":41,"tag":265,"props":1784,"children":1785},{},[1786],{"type":47,"value":1787},"For users\u002Fnamed characters",{"type":47,"value":1789}," (Phase 0 target = user or named):",{"type":41,"tag":571,"props":1791,"children":1792},{},[1793,1804,1814],{"type":41,"tag":342,"props":1794,"children":1795},{},[1796,1798,1803],{"type":47,"value":1797},"Conversational onboarding. Ask naturally about appearance and voice — one or two questions at a time, not a form. Communicate in ",{"type":41,"tag":56,"props":1799,"children":1801},{"className":1800},[],[1802],{"type":47,"value":277},{"type":47,"value":358},{"type":41,"tag":342,"props":1805,"children":1806},{},[1807,1812],{"type":41,"tag":265,"props":1808,"children":1809},{},[1810],{"type":47,"value":1811},"User path only:",{"type":47,"value":1813}," after the onboarding Q&A, run the Reference Photo Nudge below.",{"type":41,"tag":342,"props":1815,"children":1816},{},[1817,1822],{"type":41,"tag":265,"props":1818,"children":1819},{},[1820],{"type":47,"value":1821},"Named character path:",{"type":47,"value":1823}," skip the nudge, go straight to Type A (prompt) creation.",{"type":41,"tag":50,"props":1825,"children":1826},{},[1827,1829,1834],{"type":47,"value":1828},"Write ",{"type":41,"tag":56,"props":1830,"children":1832},{"className":1831},[],[1833],{"type":47,"value":61},{"type":47,"value":1835}," with the Appearance and Voice sections filled in. Leave the HeyGen section empty until Phase 2 succeeds.",{"type":41,"tag":1421,"props":1837,"children":1839},{"id":1838},"reference-photo-nudge-user-path-only",[1840],{"type":47,"value":1841},"Reference Photo Nudge (user path only)",{"type":41,"tag":50,"props":1843,"children":1844},{},[1845,1847,1851],{"type":47,"value":1846},"Only run this step when Phase 0 target = ",{"type":41,"tag":265,"props":1848,"children":1849},{},[1850],{"type":47,"value":1662},{"type":47,"value":1852}," (real-person digital twin) OR when the user explicitly asks for photo realism.",{"type":41,"tag":571,"props":1854,"children":1855},{},[1856,1861],{"type":41,"tag":342,"props":1857,"children":1858},{},[1859],{"type":47,"value":1860},"Check AVATAR file's Appearance → Reference field first. If a photo is already on file, skip asking and use it.",{"type":41,"tag":342,"props":1862,"children":1863},{},[1864,1866],{"type":47,"value":1865},"Otherwise, ask one sentence: ",{"type":41,"tag":619,"props":1867,"children":1868},{},[1869],{"type":47,"value":1870},"\"Got a headshot? It gives better face consistency for videos of you. I can also generate from your description — just say 'skip.'\"",{"type":41,"tag":50,"props":1872,"children":1873},{},[1874],{"type":47,"value":1875},"Branch:",{"type":41,"tag":571,"props":1877,"children":1878},{},[1879,1908,1918,1928],{"type":41,"tag":342,"props":1880,"children":1881},{},[1882,1887,1889,1894,1895,1900,1902,1907],{"type":41,"tag":265,"props":1883,"children":1884},{},[1885],{"type":47,"value":1886},"Photo provided as local file\u002Fpath",{"type":47,"value":1888}," → upload via ",{"type":41,"tag":56,"props":1890,"children":1892},{"className":1891},[],[1893],{"type":47,"value":726},{"type":47,"value":728},{"type":41,"tag":56,"props":1896,"children":1898},{"className":1897},[],[1899],{"type":47,"value":734},{"type":47,"value":1901},", then Type B (photo) creation with the returned ",{"type":41,"tag":56,"props":1903,"children":1905},{"className":1904},[],[1906],{"type":47,"value":710},{"type":47,"value":358},{"type":41,"tag":342,"props":1909,"children":1910},{},[1911,1916],{"type":41,"tag":265,"props":1912,"children":1913},{},[1914],{"type":47,"value":1915},"Photo provided as HTTPS URL or asset_id",{"type":47,"value":1917}," → Type B (photo) creation in Phase 2.",{"type":41,"tag":342,"props":1919,"children":1920},{},[1921,1926],{"type":41,"tag":265,"props":1922,"children":1923},{},[1924],{"type":47,"value":1925},"Local photo but no upload path available",{"type":47,"value":1927}," → ask for an HTTPS image URL or offer prompt-only creation. Do not pass the local path into the app connector.",{"type":41,"tag":342,"props":1929,"children":1930},{},[1931,1936],{"type":41,"tag":265,"props":1932,"children":1933},{},[1934],{"type":47,"value":1935},"Skip",{"type":47,"value":1937}," → Type A (prompt) creation in Phase 2.",{"type":41,"tag":50,"props":1939,"children":1940},{},[1941],{"type":47,"value":1942},"For agents and named characters, skip this entire step — go straight to Type A (prompt) creation.",{"type":41,"tag":1421,"props":1944,"children":1946},{"id":1945},"phase-2-avatar-creation",[1947],{"type":47,"value":1948},"Phase 2 — Avatar Creation",{"type":41,"tag":50,"props":1950,"children":1951},{},[1952,1954],{"type":47,"value":1953},"📖 ",{"type":41,"tag":265,"props":1955,"children":1956},{},[1957,1959],{"type":47,"value":1958},"Full creation API surface (photo \u002F prompt \u002F digital twin), file input formats, identity field → enum mapping, response shape → ",{"type":41,"tag":1960,"props":1961,"children":1963},"a",{"href":1962},"references\u002Favatar-creation.md",[1964],{"type":47,"value":1962},{"type":41,"tag":50,"props":1966,"children":1967},{},[1968],{"type":47,"value":1969},"Two modes:",{"type":41,"tag":50,"props":1971,"children":1972},{},[1973,1978,1980,1986],{"type":41,"tag":265,"props":1974,"children":1975},{},[1976],{"type":47,"value":1977},"Mode 1 — New character",{"type":47,"value":1979}," (omit ",{"type":41,"tag":56,"props":1981,"children":1983},{"className":1982},[],[1984],{"type":47,"value":1985},"avatar_group_id",{"type":47,"value":1987},"):\nCreates a brand new character with its own group.",{"type":41,"tag":50,"props":1989,"children":1990},{},[1991,1996,1998,2003],{"type":41,"tag":265,"props":1992,"children":1993},{},[1994],{"type":47,"value":1995},"Mode 2 — New look",{"type":47,"value":1997}," (include ",{"type":41,"tag":56,"props":1999,"children":2001},{"className":2000},[],[2002],{"type":47,"value":1985},{"type":47,"value":2004},"):\nAdds a variation to an existing character. Read the Group ID from the AVATAR file.",{"type":41,"tag":50,"props":2006,"children":2007},{},[2008],{"type":47,"value":2009},"Two creation types:",{"type":41,"tag":50,"props":2011,"children":2012},{},[2013],{"type":41,"tag":265,"props":2014,"children":2015},{},[2016],{"type":47,"value":2017},"Type A — From prompt (AI-generated appearance):",{"type":41,"tag":50,"props":2019,"children":2020},{},[2021,2025,2027,2031,2032,2038,2040,2045],{"type":41,"tag":265,"props":2022,"children":2023},{},[2024],{"type":47,"value":1680},{"type":47,"value":2026}," use the HeyGen app flow for prompt-based avatar creation.\n",{"type":41,"tag":265,"props":2028,"children":2029},{},[2030],{"type":47,"value":1687},{"type":47,"value":455},{"type":41,"tag":56,"props":2033,"children":2035},{"className":2034},[],[2036],{"type":47,"value":2037},"heygen avatar create -d '{\"type\":\"prompt\",\"name\":\"...\",\"prompt\":\"...\",\"avatar_group_id\":\"...\"}'",{"type":47,"value":2039}," (accepts inline JSON, a file path, or ",{"type":41,"tag":56,"props":2041,"children":2043},{"className":2042},[],[2044],{"type":47,"value":1035},{"type":47,"value":2046}," for stdin)",{"type":41,"tag":50,"props":2048,"children":2049},{},[2050],{"type":47,"value":2051},"Prompt limit is 1000 characters. Be descriptive — include style, features, expression, lighting. The API spec says 200 but the actual enforced limit is 1000.",{"type":41,"tag":50,"props":2053,"children":2054},{},[2055],{"type":41,"tag":265,"props":2056,"children":2057},{},[2058],{"type":47,"value":2059},"Type B — From reference image:",{"type":41,"tag":50,"props":2061,"children":2062},{},[2063,2067,2069,2074,2076,2080,2081],{"type":41,"tag":265,"props":2064,"children":2065},{},[2066],{"type":47,"value":1680},{"type":47,"value":2068}," use the HeyGen app flow for photo avatar creation only with an HTTPS URL or pre-uploaded ",{"type":41,"tag":56,"props":2070,"children":2072},{"className":2071},[],[2073],{"type":47,"value":710},{"type":47,"value":2075},".\n",{"type":41,"tag":265,"props":2077,"children":2078},{},[2079],{"type":47,"value":1687},{"type":47,"value":455},{"type":41,"tag":56,"props":2082,"children":2084},{"className":2083},[],[2085],{"type":47,"value":2086},"heygen avatar create -d '{\"type\":\"photo\",\"name\":\"...\",\"file\":{\"type\":\"asset_id\",\"asset_id\":\"...\"},\"avatar_group_id\":\"...\"}'",{"type":41,"tag":50,"props":2088,"children":2089},{},[2090],{"type":47,"value":2091},"File options for Type B:",{"type":41,"tag":571,"props":2093,"children":2094},{},[2095,2106],{"type":41,"tag":342,"props":2096,"children":2097},{},[2098,2104],{"type":41,"tag":56,"props":2099,"children":2101},{"className":2100},[],[2102],{"type":47,"value":2103},"{ \"type\": \"url\", \"url\": \"https:\u002F\u002F...\" }",{"type":47,"value":2105}," — public image URL",{"type":41,"tag":342,"props":2107,"children":2108},{},[2109,2115,2117],{"type":41,"tag":56,"props":2110,"children":2112},{"className":2111},[],[2113],{"type":47,"value":2114},"{ \"type\": \"asset_id\", \"asset_id\": \"\u003Cid>\" }",{"type":47,"value":2116}," — from ",{"type":41,"tag":56,"props":2118,"children":2120},{"className":2119},[],[2121],{"type":47,"value":726},{"type":41,"tag":50,"props":2123,"children":2124},{},[2125,2127,2132,2134,2139],{"type":47,"value":2126},"Do not pass local paths or ",{"type":41,"tag":56,"props":2128,"children":2130},{"className":2129},[],[2131],{"type":47,"value":718},{"type":47,"value":2133}," URLs to the app connector. Upload local files to an ",{"type":41,"tag":56,"props":2135,"children":2137},{"className":2136},[],[2138],{"type":47,"value":710},{"type":47,"value":2140}," first.",{"type":41,"tag":50,"props":2142,"children":2143},{},[2144],{"type":47,"value":2145},"Raw API upload example:",{"type":41,"tag":934,"props":2147,"children":2151},{"className":2148,"code":2149,"language":2150,"meta":942,"style":942},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","ASSET_ID=$(curl -s -X POST \"https:\u002F\u002Fapi.heygen.com\u002Fv3\u002Fassets\" \\\n  -H \"X-Api-Key: $HEYGEN_API_KEY\" \\\n  -F \"file=@\u002Fpath\u002Fto\u002Fheadshot.jpg\" | jq -r '.data.asset_id')\n","bash",[2152],{"type":41,"tag":56,"props":2153,"children":2154},{"__ignoreMap":942},[2155,2208,2238],{"type":41,"tag":986,"props":2156,"children":2157},{"class":988,"line":989},[2158,2163,2168,2173,2178,2183,2188,2193,2198,2203],{"type":41,"tag":986,"props":2159,"children":2160},{"style":1038},[2161],{"type":47,"value":2162},"ASSET_ID",{"type":41,"tag":986,"props":2164,"children":2165},{"style":993},[2166],{"type":47,"value":2167},"=$(",{"type":41,"tag":986,"props":2169,"children":2170},{"style":999},[2171],{"type":47,"value":2172},"curl",{"type":41,"tag":986,"props":2174,"children":2175},{"style":1342},[2176],{"type":47,"value":2177}," -s",{"type":41,"tag":986,"props":2179,"children":2180},{"style":1342},[2181],{"type":47,"value":2182}," -X",{"type":41,"tag":986,"props":2184,"children":2185},{"style":1342},[2186],{"type":47,"value":2187}," POST",{"type":41,"tag":986,"props":2189,"children":2190},{"style":993},[2191],{"type":47,"value":2192}," \"",{"type":41,"tag":986,"props":2194,"children":2195},{"style":1342},[2196],{"type":47,"value":2197},"https:\u002F\u002Fapi.heygen.com\u002Fv3\u002Fassets",{"type":41,"tag":986,"props":2199,"children":2200},{"style":993},[2201],{"type":47,"value":2202},"\"",{"type":41,"tag":986,"props":2204,"children":2205},{"style":1038},[2206],{"type":47,"value":2207}," \\\n",{"type":41,"tag":986,"props":2209,"children":2210},{"class":988,"line":1005},[2211,2216,2220,2225,2230,2234],{"type":41,"tag":986,"props":2212,"children":2213},{"style":1342},[2214],{"type":47,"value":2215},"  -H",{"type":41,"tag":986,"props":2217,"children":2218},{"style":993},[2219],{"type":47,"value":2192},{"type":41,"tag":986,"props":2221,"children":2222},{"style":1342},[2223],{"type":47,"value":2224},"X-Api-Key: ",{"type":41,"tag":986,"props":2226,"children":2227},{"style":1038},[2228],{"type":47,"value":2229},"$HEYGEN_API_KEY",{"type":41,"tag":986,"props":2231,"children":2232},{"style":993},[2233],{"type":47,"value":2202},{"type":41,"tag":986,"props":2235,"children":2236},{"style":1038},[2237],{"type":47,"value":2207},{"type":41,"tag":986,"props":2239,"children":2240},{"class":988,"line":1015},[2241,2246,2250,2255,2259,2264,2269,2274,2279,2284,2289],{"type":41,"tag":986,"props":2242,"children":2243},{"style":1342},[2244],{"type":47,"value":2245},"  -F",{"type":41,"tag":986,"props":2247,"children":2248},{"style":993},[2249],{"type":47,"value":2192},{"type":41,"tag":986,"props":2251,"children":2252},{"style":1342},[2253],{"type":47,"value":2254},"file=@\u002Fpath\u002Fto\u002Fheadshot.jpg",{"type":41,"tag":986,"props":2256,"children":2257},{"style":993},[2258],{"type":47,"value":2202},{"type":41,"tag":986,"props":2260,"children":2261},{"style":993},[2262],{"type":47,"value":2263}," |",{"type":41,"tag":986,"props":2265,"children":2266},{"style":999},[2267],{"type":47,"value":2268}," jq",{"type":41,"tag":986,"props":2270,"children":2271},{"style":1342},[2272],{"type":47,"value":2273}," -r",{"type":41,"tag":986,"props":2275,"children":2276},{"style":993},[2277],{"type":47,"value":2278}," '",{"type":41,"tag":986,"props":2280,"children":2281},{"style":1342},[2282],{"type":47,"value":2283},".data.asset_id",{"type":41,"tag":986,"props":2285,"children":2286},{"style":993},[2287],{"type":47,"value":2288},"'",{"type":41,"tag":986,"props":2290,"children":2291},{"style":993},[2292],{"type":47,"value":2293},")\n",{"type":41,"tag":50,"props":2295,"children":2296},{},[2297,2299,2304,2306,2312],{"type":47,"value":2298},"The v3 upload endpoint accepts ",{"type":41,"tag":56,"props":2300,"children":2302},{"className":2301},[],[2303],{"type":47,"value":742},{"type":47,"value":2305},", auto-detects MIME type from file bytes, and returns ",{"type":41,"tag":56,"props":2307,"children":2309},{"className":2308},[],[2310],{"type":47,"value":2311},"data.asset_id",{"type":47,"value":358},{"type":41,"tag":50,"props":2314,"children":2315},{},[2316,2317],{"type":47,"value":1953},{"type":41,"tag":265,"props":2318,"children":2319},{},[2320,2322],{"type":47,"value":2321},"When to use each (URL vs asset_id), upload routing, and edge cases → ",{"type":41,"tag":1960,"props":2323,"children":2325},{"href":2324},"references\u002Fasset-routing.md",[2326],{"type":47,"value":2324},{"type":41,"tag":50,"props":2328,"children":2329},{},[2330,2335,2337,2343,2345,2351],{"type":41,"tag":265,"props":2331,"children":2332},{},[2333],{"type":47,"value":2334},"Response:",{"type":47,"value":2336}," Returns ",{"type":41,"tag":56,"props":2338,"children":2340},{"className":2339},[],[2341],{"type":47,"value":2342},"avatar_item.id",{"type":47,"value":2344}," (look ID) and ",{"type":41,"tag":56,"props":2346,"children":2348},{"className":2347},[],[2349],{"type":47,"value":2350},"avatar_item.group_id",{"type":47,"value":2352}," (character identity).",{"type":41,"tag":50,"props":2354,"children":2355},{},[2356],{"type":47,"value":2357},"Map identity fields to HeyGen enums for the prompt:",{"type":41,"tag":571,"props":2359,"children":2360},{},[2361,2371,2381,2391,2401,2411],{"type":41,"tag":342,"props":2362,"children":2363},{},[2364,2369],{"type":41,"tag":265,"props":2365,"children":2366},{},[2367],{"type":47,"value":2368},"age",{"type":47,"value":2370},": Young Adult | Early Middle Age | Late Middle Age | Senior | Unspecified",{"type":41,"tag":342,"props":2372,"children":2373},{},[2374,2379],{"type":41,"tag":265,"props":2375,"children":2376},{},[2377],{"type":47,"value":2378},"gender",{"type":47,"value":2380},": Man | Woman | Unspecified",{"type":41,"tag":342,"props":2382,"children":2383},{},[2384,2389],{"type":41,"tag":265,"props":2385,"children":2386},{},[2387],{"type":47,"value":2388},"ethnicity",{"type":47,"value":2390},": White | Black | Asian American | East Asian | South East Asian | South Asian | Middle Eastern | Pacific | Hispanic | Unspecified",{"type":41,"tag":342,"props":2392,"children":2393},{},[2394,2399],{"type":41,"tag":265,"props":2395,"children":2396},{},[2397],{"type":47,"value":2398},"style",{"type":47,"value":2400},": Realistic | Pixar | Cinematic | Vintage | Noir | Cyberpunk | Unspecified",{"type":41,"tag":342,"props":2402,"children":2403},{},[2404,2409],{"type":41,"tag":265,"props":2405,"children":2406},{},[2407],{"type":47,"value":2408},"orientation",{"type":47,"value":2410},": square | horizontal | vertical",{"type":41,"tag":342,"props":2412,"children":2413},{},[2414,2419],{"type":41,"tag":265,"props":2415,"children":2416},{},[2417],{"type":47,"value":2418},"pose",{"type":47,"value":2420},": half_body | close_up | full_body",{"type":41,"tag":50,"props":2422,"children":2423},{},[2424],{"type":47,"value":2425},"Show the prompt to the user before creating:",{"type":41,"tag":1384,"props":2427,"children":2428},{},[2429],{"type":41,"tag":50,"props":2430,"children":2431},{},[2432,2437,2438,2443,2445,2450],{"type":41,"tag":265,"props":2433,"children":2434},{},[2435],{"type":47,"value":2436},"Appearance:",{"type":47,"value":2192},{"type":41,"tag":986,"props":2439,"children":2440},{},[2441],{"type":47,"value":2442},"prompt",{"type":47,"value":2444},"\"\n",{"type":41,"tag":265,"props":2446,"children":2447},{},[2448],{"type":47,"value":2449},"Settings:",{"type":47,"value":2451}," Young Adult | Woman | East Asian | Realistic\nLook good? (yes \u002F adjust \u002F completely different)",{"type":41,"tag":50,"props":2453,"children":2454},{},[2455,2457],{"type":47,"value":2456},"⛔ ",{"type":41,"tag":265,"props":2458,"children":2459},{},[2460],{"type":47,"value":2461},"STOP. Wait for the user to approve or adjust. Do NOT call the avatar creation API until the user confirms.",{"type":41,"tag":1421,"props":2463,"children":2465},{"id":2464},"phase-3-voice",[2466],{"type":47,"value":2467},"Phase 3 — Voice",{"type":41,"tag":50,"props":2469,"children":2470},{},[2471,2473,2478,2480,2485],{"type":47,"value":2472},"Two paths: ",{"type":41,"tag":265,"props":2474,"children":2475},{},[2476],{"type":47,"value":2477},"Design",{"type":47,"value":2479}," (describe what you want, get matched voices) or ",{"type":41,"tag":265,"props":2481,"children":2482},{},[2483],{"type":47,"value":2484},"Browse",{"type":47,"value":2486}," (filter the catalog manually).",{"type":41,"tag":50,"props":2488,"children":2489},{},[2490,2492,2497],{"type":47,"value":2491},"Ask whether they want voice design (describe what they want) or catalog browsing. Communicate in ",{"type":41,"tag":56,"props":2493,"children":2495},{"className":2494},[],[2496],{"type":47,"value":277},{"type":47,"value":358},{"type":41,"tag":50,"props":2499,"children":2500},{},[2501,2503,2507],{"type":47,"value":2502},"Default to ",{"type":41,"tag":265,"props":2504,"children":2505},{},[2506],{"type":47,"value":2477},{"type":47,"value":2508}," if the AVATAR file has a Voice section with personality traits.",{"type":41,"tag":2510,"props":2511,"children":2513},"h4",{"id":2512},"path-a-voice-design-preferred",[2514],{"type":47,"value":2515},"Path A — Voice Design (preferred)",{"type":41,"tag":50,"props":2517,"children":2518},{},[2519],{"type":47,"value":2520},"Find matching voices via semantic search using the Voice section from the AVATAR file. This searches HeyGen's full voice library. No new voices are generated and no quota is consumed.",{"type":41,"tag":50,"props":2522,"children":2523},{},[2524,2529,2531,2536,2538,2544],{"type":41,"tag":265,"props":2525,"children":2526},{},[2527],{"type":47,"value":2528},"Language matching:",{"type":47,"value":2530}," The voice design prompt should specify the target language from ",{"type":41,"tag":56,"props":2532,"children":2534},{"className":2533},[],[2535],{"type":47,"value":277},{"type":47,"value":2537},". Example for Japanese: ",{"type":41,"tag":56,"props":2539,"children":2541},{"className":2540},[],[2542],{"type":47,"value":2543},"\"A calm, warm female voice. Professional but approachable. Japanese speaker.\"",{"type":47,"value":2545}," This ensures semantic search returns voices in the correct language.",{"type":41,"tag":50,"props":2547,"children":2548},{},[2549,2553,2555,2559,2560,2566,2568,2574,2575,2581],{"type":41,"tag":265,"props":2550,"children":2551},{},[2552],{"type":47,"value":1680},{"type":47,"value":2554}," use the HeyGen app flow for voice selection or design.\n",{"type":41,"tag":265,"props":2556,"children":2557},{},[2558],{"type":47,"value":1687},{"type":47,"value":455},{"type":41,"tag":56,"props":2561,"children":2563},{"className":2562},[],[2564],{"type":47,"value":2565},"heygen voice create --prompt \"...\" --seed 0",{"type":47,"value":2567}," (also accepts ",{"type":41,"tag":56,"props":2569,"children":2571},{"className":2570},[],[2572],{"type":47,"value":2573},"--gender",{"type":47,"value":127},{"type":41,"tag":56,"props":2576,"children":2578},{"className":2577},[],[2579],{"type":47,"value":2580},"--locale",{"type":47,"value":2582},")",{"type":41,"tag":50,"props":2584,"children":2585},{},[2586],{"type":47,"value":2587},"Returns 3 voice options per seed. Present all 3 with inline audio previews:",{"type":41,"tag":571,"props":2589,"children":2590},{},[2591,2604,2617],{"type":41,"tag":342,"props":2592,"children":2593},{},[2594,2596,2602],{"type":47,"value":2595},"Download each ",{"type":41,"tag":56,"props":2597,"children":2599},{"className":2598},[],[2600],{"type":47,"value":2601},"preview_audio_url",{"type":47,"value":2603}," to a temp path (any standard download method works — no HeyGen auth needed, these are public S3 URLs)",{"type":41,"tag":342,"props":2605,"children":2606},{},[2607,2609,2615],{"type":47,"value":2608},"Send as audio attachment: ",{"type":41,"tag":56,"props":2610,"children":2612},{"className":2611},[],[2613],{"type":47,"value":2614},"message(action:send, media:\"\u003Cpath>\", caption:\"Option \u003Cn>: \u003Cvoice_name> — \u003Cgender>, \u003Clanguage>\")",{"type":47,"value":2616}," so it plays inline in Telegram\u002FDiscord",{"type":41,"tag":342,"props":2618,"children":2619},{},[2620],{"type":47,"value":2621},"After all previews sent, present selection buttons",{"type":41,"tag":50,"props":2623,"children":2624},{},[2625,2626],{"type":47,"value":2456},{"type":41,"tag":265,"props":2627,"children":2628},{},[2629],{"type":47,"value":2630},"STOP. Wait for the user to pick a voice via buttons or text. Do NOT select a voice yourself or proceed to Phase 4 until the user explicitly chooses.",{"type":41,"tag":50,"props":2632,"children":2633},{},[2634],{"type":47,"value":2635},"If none match:",{"type":41,"tag":1384,"props":2637,"children":2638},{},[2639],{"type":41,"tag":50,"props":2640,"children":2641},{},[2642],{"type":47,"value":2643},"\"None of these hitting right? I can try a different set (same description, different variations) or you can tweak the description.\"",{"type":41,"tag":50,"props":2645,"children":2646},{},[2647,2649,2655],{"type":47,"value":2648},"Increment ",{"type":41,"tag":56,"props":2650,"children":2652},{"className":2651},[],[2653],{"type":47,"value":2654},"seed",{"type":47,"value":2656}," and call again. Different seeds give completely different voice options from the same prompt.",{"type":41,"tag":571,"props":2658,"children":2659},{},[2660],{"type":41,"tag":342,"props":2661,"children":2662},{},[2663],{"type":47,"value":2664},"Clean up \u002Ftmp files after user picks",{"type":41,"tag":2510,"props":2666,"children":2668},{"id":2667},"path-b-voice-browse-fallback",[2669],{"type":47,"value":2670},"Path B — Voice Browse (fallback)",{"type":41,"tag":50,"props":2672,"children":2673},{},[2674],{"type":47,"value":2675},"Browse HeyGen's existing voice library:",{"type":41,"tag":50,"props":2677,"children":2678},{},[2679,2683,2685,2689,2690,2696,2698],{"type":41,"tag":265,"props":2680,"children":2681},{},[2682],{"type":47,"value":1680},{"type":47,"value":2684}," browse available voices in the HeyGen app, filtered to the target language and voice characteristics when possible.\n",{"type":41,"tag":265,"props":2686,"children":2687},{},[2688],{"type":47,"value":1687},{"type":47,"value":455},{"type":41,"tag":56,"props":2691,"children":2693},{"className":2692},[],[2694],{"type":47,"value":2695},"heygen voice list --type private",{"type":47,"value":2697}," \u002F ",{"type":41,"tag":56,"props":2699,"children":2701},{"className":2700},[],[2702],{"type":47,"value":2703},"heygen voice list --type public --language \u003Clang> --gender \u003Cgender>",{"type":41,"tag":338,"props":2705,"children":2706},{},[2707,2712,2717,2722,2727],{"type":41,"tag":342,"props":2708,"children":2709},{},[2710],{"type":47,"value":2711},"Read the Voice section from the AVATAR file",{"type":41,"tag":342,"props":2713,"children":2714},{},[2715],{"type":47,"value":2716},"Filter by gender and language",{"type":41,"tag":342,"props":2718,"children":2719},{},[2720],{"type":47,"value":2721},"Pick top 3 candidates based on personality match",{"type":41,"tag":342,"props":2723,"children":2724},{},[2725],{"type":47,"value":2726},"Present with inline audio previews (same download + send pattern as Path A)",{"type":41,"tag":342,"props":2728,"children":2729},{},[2730,2731],{"type":47,"value":2456},{"type":41,"tag":265,"props":2732,"children":2733},{},[2734],{"type":47,"value":2735},"STOP. Wait for the user to pick. Do NOT auto-select.",{"type":41,"tag":1421,"props":2737,"children":2739},{"id":2738},"phase-4-save-to-avatar-file",[2740],{"type":47,"value":2741},"Phase 4 — Save to AVATAR File",{"type":41,"tag":50,"props":2743,"children":2744},{},[2745,2747,2752],{"type":47,"value":2746},"Update the HeyGen section of ",{"type":41,"tag":56,"props":2748,"children":2750},{"className":2749},[],[2751],{"type":47,"value":61},{"type":47,"value":2753}," to match the canonical format:",{"type":41,"tag":934,"props":2755,"children":2757},{"className":978,"code":2756,"language":980,"meta":942,"style":942},"## HeyGen\n- Group ID: \u003Cavatar_item.group_id — THE stable reference, never changes>\n- Voice ID: \u003Cchosen voice_id>\n- Voice Name: \u003Cvoice name>\n- Voice Designed: \u003Ctrue if custom-designed, false if picked from catalog>\n- Voice Seed: \u003Cseed value used, if designed>\n- Looks: \u003Corientation>=\u003Cavatar_item.id> (e.g., landscape=\u003Clook_id>, portrait=\u003Clook_id>)\n- Last Synced: \u003CISO timestamp>\n\n⚠️ look_ids are ephemeral — always resolve fresh from group_id at runtime via `heygen avatar looks list --group-id \u003Cid>` (or the corresponding look picker in the HeyGen app). Never hardcode look_id as the primary avatar reference.\n",[2758],{"type":41,"tag":56,"props":2759,"children":2760},{"__ignoreMap":942},[2761,2772,2784,2796,2808,2819,2830,2842,2853,2860],{"type":41,"tag":986,"props":2762,"children":2763},{"class":988,"line":989},[2764,2768],{"type":41,"tag":986,"props":2765,"children":2766},{"style":993},[2767],{"type":47,"value":1021},{"type":41,"tag":986,"props":2769,"children":2770},{"style":999},[2771],{"type":47,"value":1226},{"type":41,"tag":986,"props":2773,"children":2774},{"class":988,"line":1005},[2775,2779],{"type":41,"tag":986,"props":2776,"children":2777},{"style":993},[2778],{"type":47,"value":1035},{"type":41,"tag":986,"props":2780,"children":2781},{"style":1038},[2782],{"type":47,"value":2783}," Group ID: \u003Cavatar_item.group_id — THE stable reference, never changes>\n",{"type":41,"tag":986,"props":2785,"children":2786},{"class":988,"line":1015},[2787,2791],{"type":41,"tag":986,"props":2788,"children":2789},{"style":993},[2790],{"type":47,"value":1035},{"type":41,"tag":986,"props":2792,"children":2793},{"style":1038},[2794],{"type":47,"value":2795}," Voice ID: \u003Cchosen voice_id>\n",{"type":41,"tag":986,"props":2797,"children":2798},{"class":988,"line":1029},[2799,2803],{"type":41,"tag":986,"props":2800,"children":2801},{"style":993},[2802],{"type":47,"value":1035},{"type":41,"tag":986,"props":2804,"children":2805},{"style":1038},[2806],{"type":47,"value":2807}," Voice Name: \u003Cvoice name>\n",{"type":41,"tag":986,"props":2809,"children":2810},{"class":988,"line":1044},[2811,2815],{"type":41,"tag":986,"props":2812,"children":2813},{"style":993},[2814],{"type":47,"value":1035},{"type":41,"tag":986,"props":2816,"children":2817},{"style":1038},[2818],{"type":47,"value":1278},{"type":41,"tag":986,"props":2820,"children":2821},{"class":988,"line":1057},[2822,2826],{"type":41,"tag":986,"props":2823,"children":2824},{"style":993},[2825],{"type":47,"value":1035},{"type":41,"tag":986,"props":2827,"children":2828},{"style":1038},[2829],{"type":47,"value":1291},{"type":41,"tag":986,"props":2831,"children":2832},{"class":988,"line":1070},[2833,2837],{"type":41,"tag":986,"props":2834,"children":2835},{"style":993},[2836],{"type":47,"value":1035},{"type":41,"tag":986,"props":2838,"children":2839},{"style":1038},[2840],{"type":47,"value":2841}," Looks: \u003Corientation>=\u003Cavatar_item.id> (e.g., landscape=\u003Clook_id>, portrait=\u003Clook_id>)\n",{"type":41,"tag":986,"props":2843,"children":2844},{"class":988,"line":1083},[2845,2849],{"type":41,"tag":986,"props":2846,"children":2847},{"style":993},[2848],{"type":47,"value":1035},{"type":41,"tag":986,"props":2850,"children":2851},{"style":1038},[2852],{"type":47,"value":1317},{"type":41,"tag":986,"props":2854,"children":2855},{"class":988,"line":1096},[2856],{"type":41,"tag":986,"props":2857,"children":2858},{"emptyLinePlaceholder":1009},[2859],{"type":47,"value":1012},{"type":41,"tag":986,"props":2861,"children":2862},{"class":988,"line":1109},[2863,2867,2871,2875,2879],{"type":41,"tag":986,"props":2864,"children":2865},{"style":1038},[2866],{"type":47,"value":1334},{"type":41,"tag":986,"props":2868,"children":2869},{"style":993},[2870],{"type":47,"value":1339},{"type":41,"tag":986,"props":2872,"children":2873},{"style":1342},[2874],{"type":47,"value":1345},{"type":41,"tag":986,"props":2876,"children":2877},{"style":993},[2878],{"type":47,"value":1339},{"type":41,"tag":986,"props":2880,"children":2881},{"style":1038},[2882],{"type":47,"value":2883}," (or the corresponding look picker in the HeyGen app). Never hardcode look_id as the primary avatar reference.\n",{"type":41,"tag":50,"props":2885,"children":2886},{},[2887,2889,2894],{"type":47,"value":2888},"Confirm the avatar is saved and that other skills (like heygen-video) will pick it up automatically. Communicate in ",{"type":41,"tag":56,"props":2890,"children":2892},{"className":2891},[],[2893],{"type":47,"value":277},{"type":47,"value":358},{"type":41,"tag":1421,"props":2896,"children":2898},{"id":2897},"phase-5-maintain-role-alias",[2899],{"type":47,"value":2900},"Phase 5 — Maintain Role Alias",{"type":41,"tag":50,"props":2902,"children":2903},{},[2904,2906,2911],{"type":47,"value":2905},"After writing the named ",{"type":41,"tag":56,"props":2907,"children":2909},{"className":2908},[],[2910],{"type":47,"value":61},{"type":47,"value":2912},", create or update a role-based\nsymlink alongside it so other skills can do generic lookups without\nresolving the agent \u002F user name first.",{"type":41,"tag":50,"props":2914,"children":2915},{},[2916],{"type":47,"value":2917},"Based on the Phase 0 target:",{"type":41,"tag":571,"props":2919,"children":2920},{},[2921,2942,2962],{"type":41,"tag":342,"props":2922,"children":2923},{},[2924,2929,2931,2936,2937],{"type":41,"tag":265,"props":2925,"children":2926},{},[2927],{"type":47,"value":2928},"Agent target",{"type":47,"value":2930}," → symlink ",{"type":41,"tag":56,"props":2932,"children":2934},{"className":2933},[],[2935],{"type":47,"value":195},{"type":47,"value":1604},{"type":41,"tag":56,"props":2938,"children":2940},{"className":2939},[],[2941],{"type":47,"value":61},{"type":41,"tag":342,"props":2943,"children":2944},{},[2945,2950,2951,2956,2957],{"type":41,"tag":265,"props":2946,"children":2947},{},[2948],{"type":47,"value":2949},"User target",{"type":47,"value":2930},{"type":41,"tag":56,"props":2952,"children":2954},{"className":2953},[],[2955],{"type":47,"value":202},{"type":47,"value":1604},{"type":41,"tag":56,"props":2958,"children":2960},{"className":2959},[],[2961],{"type":47,"value":61},{"type":41,"tag":342,"props":2963,"children":2964},{},[2965,2969,2971,2977],{"type":41,"tag":265,"props":2966,"children":2967},{},[2968],{"type":47,"value":1483},{"type":47,"value":2970}," → no role alias. Named characters are referenced by\nname only (e.g., ",{"type":41,"tag":56,"props":2972,"children":2974},{"className":2973},[],[2975],{"type":47,"value":2976},"AVATAR-CLEO.md",{"type":47,"value":2978},"); they are not the agent or the user.",{"type":41,"tag":50,"props":2980,"children":2981},{},[2982],{"type":41,"tag":265,"props":2983,"children":2984},{},[2985],{"type":47,"value":2986},"Implementation (run from the workspace root, with fs-fallback):",{"type":41,"tag":50,"props":2988,"children":2989},{},[2990,2992,2998,3000,3006,3008,3014],{"type":47,"value":2991},"The ",{"type":41,"tag":56,"props":2993,"children":2995},{"className":2994},[],[2996],{"type":47,"value":2997},"cd",{"type":47,"value":2999}," to workspace root is mandatory — bare relative paths in ",{"type":41,"tag":56,"props":3001,"children":3003},{"className":3002},[],[3004],{"type":47,"value":3005},"ln -s",{"type":47,"value":3007},"\nresolve from the agent's current working directory, not where SOUL.md\nlives. The ",{"type":41,"tag":56,"props":3009,"children":3011},{"className":3010},[],[3012],{"type":47,"value":3013},"|| echo",{"type":47,"value":3015}," clause handles filesystems that reject symlinks\n(Windows without dev mode, some cloud-mounted storage) without aborting\nPhase 5.",{"type":41,"tag":934,"props":3017,"children":3019},{"className":2148,"code":3018,"language":2150,"meta":942,"style":942},"# Agent\ncd \"$WORKSPACE_ROOT\" && ln -sf AVATAR-\u003CNAME>.md AVATAR-AGENT.md \\\n  || echo \"role alias skipped: fs doesn't support symlinks\"\n\n# User\ncd \"$WORKSPACE_ROOT\" && ln -sf AVATAR-\u003CNAME>.md AVATAR-USER.md \\\n  || echo \"role alias skipped: fs doesn't support symlinks\"\n",[3020],{"type":41,"tag":56,"props":3021,"children":3022},{"__ignoreMap":942},[3023,3032,3106,3132,3139,3147,3211],{"type":41,"tag":986,"props":3024,"children":3025},{"class":988,"line":989},[3026],{"type":41,"tag":986,"props":3027,"children":3029},{"style":3028},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic",[3030],{"type":47,"value":3031},"# Agent\n",{"type":41,"tag":986,"props":3033,"children":3034},{"class":988,"line":1005},[3035,3040,3044,3049,3053,3058,3063,3068,3073,3078,3083,3088,3093,3097,3102],{"type":41,"tag":986,"props":3036,"children":3038},{"style":3037},"--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF",[3039],{"type":47,"value":2997},{"type":41,"tag":986,"props":3041,"children":3042},{"style":993},[3043],{"type":47,"value":2192},{"type":41,"tag":986,"props":3045,"children":3046},{"style":1038},[3047],{"type":47,"value":3048},"$WORKSPACE_ROOT",{"type":41,"tag":986,"props":3050,"children":3051},{"style":993},[3052],{"type":47,"value":2202},{"type":41,"tag":986,"props":3054,"children":3055},{"style":993},[3056],{"type":47,"value":3057}," &&",{"type":41,"tag":986,"props":3059,"children":3060},{"style":999},[3061],{"type":47,"value":3062}," ln",{"type":41,"tag":986,"props":3064,"children":3065},{"style":1342},[3066],{"type":47,"value":3067}," -sf",{"type":41,"tag":986,"props":3069,"children":3070},{"style":1342},[3071],{"type":47,"value":3072}," AVATAR-",{"type":41,"tag":986,"props":3074,"children":3075},{"style":993},[3076],{"type":47,"value":3077},"\u003C",{"type":41,"tag":986,"props":3079,"children":3080},{"style":1342},[3081],{"type":47,"value":3082},"NAM",{"type":41,"tag":986,"props":3084,"children":3085},{"style":1038},[3086],{"type":47,"value":3087},"E",{"type":41,"tag":986,"props":3089,"children":3090},{"style":993},[3091],{"type":47,"value":3092},">",{"type":41,"tag":986,"props":3094,"children":3095},{"style":1342},[3096],{"type":47,"value":896},{"type":41,"tag":986,"props":3098,"children":3099},{"style":1342},[3100],{"type":47,"value":3101}," AVATAR-AGENT.md",{"type":41,"tag":986,"props":3103,"children":3104},{"style":1038},[3105],{"type":47,"value":2207},{"type":41,"tag":986,"props":3107,"children":3108},{"class":988,"line":1015},[3109,3114,3119,3123,3128],{"type":41,"tag":986,"props":3110,"children":3111},{"style":993},[3112],{"type":47,"value":3113},"  ||",{"type":41,"tag":986,"props":3115,"children":3116},{"style":3037},[3117],{"type":47,"value":3118}," echo",{"type":41,"tag":986,"props":3120,"children":3121},{"style":993},[3122],{"type":47,"value":2192},{"type":41,"tag":986,"props":3124,"children":3125},{"style":1342},[3126],{"type":47,"value":3127},"role alias skipped: fs doesn't support symlinks",{"type":41,"tag":986,"props":3129,"children":3130},{"style":993},[3131],{"type":47,"value":2444},{"type":41,"tag":986,"props":3133,"children":3134},{"class":988,"line":1029},[3135],{"type":41,"tag":986,"props":3136,"children":3137},{"emptyLinePlaceholder":1009},[3138],{"type":47,"value":1012},{"type":41,"tag":986,"props":3140,"children":3141},{"class":988,"line":1044},[3142],{"type":41,"tag":986,"props":3143,"children":3144},{"style":3028},[3145],{"type":47,"value":3146},"# User\n",{"type":41,"tag":986,"props":3148,"children":3149},{"class":988,"line":1057},[3150,3154,3158,3162,3166,3170,3174,3178,3182,3186,3190,3194,3198,3202,3207],{"type":41,"tag":986,"props":3151,"children":3152},{"style":3037},[3153],{"type":47,"value":2997},{"type":41,"tag":986,"props":3155,"children":3156},{"style":993},[3157],{"type":47,"value":2192},{"type":41,"tag":986,"props":3159,"children":3160},{"style":1038},[3161],{"type":47,"value":3048},{"type":41,"tag":986,"props":3163,"children":3164},{"style":993},[3165],{"type":47,"value":2202},{"type":41,"tag":986,"props":3167,"children":3168},{"style":993},[3169],{"type":47,"value":3057},{"type":41,"tag":986,"props":3171,"children":3172},{"style":999},[3173],{"type":47,"value":3062},{"type":41,"tag":986,"props":3175,"children":3176},{"style":1342},[3177],{"type":47,"value":3067},{"type":41,"tag":986,"props":3179,"children":3180},{"style":1342},[3181],{"type":47,"value":3072},{"type":41,"tag":986,"props":3183,"children":3184},{"style":993},[3185],{"type":47,"value":3077},{"type":41,"tag":986,"props":3187,"children":3188},{"style":1342},[3189],{"type":47,"value":3082},{"type":41,"tag":986,"props":3191,"children":3192},{"style":1038},[3193],{"type":47,"value":3087},{"type":41,"tag":986,"props":3195,"children":3196},{"style":993},[3197],{"type":47,"value":3092},{"type":41,"tag":986,"props":3199,"children":3200},{"style":1342},[3201],{"type":47,"value":896},{"type":41,"tag":986,"props":3203,"children":3204},{"style":1342},[3205],{"type":47,"value":3206}," AVATAR-USER.md",{"type":41,"tag":986,"props":3208,"children":3209},{"style":1038},[3210],{"type":47,"value":2207},{"type":41,"tag":986,"props":3212,"children":3213},{"class":988,"line":1070},[3214,3218,3222,3226,3230],{"type":41,"tag":986,"props":3215,"children":3216},{"style":993},[3217],{"type":47,"value":3113},{"type":41,"tag":986,"props":3219,"children":3220},{"style":3037},[3221],{"type":47,"value":3118},{"type":41,"tag":986,"props":3223,"children":3224},{"style":993},[3225],{"type":47,"value":2192},{"type":41,"tag":986,"props":3227,"children":3228},{"style":1342},[3229],{"type":47,"value":3127},{"type":41,"tag":986,"props":3231,"children":3232},{"style":993},[3233],{"type":47,"value":2444},{"type":41,"tag":50,"props":3235,"children":3236},{},[3237],{"type":47,"value":3238},"Use a relative link target (just the filename, no path prefix) so the\nalias survives if the workspace is moved or copied.",{"type":41,"tag":50,"props":3240,"children":3241},{},[3242,3248],{"type":41,"tag":56,"props":3243,"children":3245},{"className":3244},[],[3246],{"type":47,"value":3247},"ln -sf",{"type":47,"value":3249}," is unlink-then-symlink under the hood, not strictly atomic.\nFine for single-user workspaces; if concurrent agents ever write the\nsame alias, expect interleaving and add explicit locking then.",{"type":41,"tag":50,"props":3251,"children":3252},{},[3253,3258,3260,3265,3267,3272,3274,3279],{"type":41,"tag":265,"props":3254,"children":3255},{},[3256],{"type":47,"value":3257},"Why symlink, not copy:",{"type":47,"value":3259}," removes the duplicate-file drift class\n(content can never diverge between named file and alias). It does NOT\nremove staleness drift — if ",{"type":41,"tag":56,"props":3261,"children":3263},{"className":3262},[],[3264],{"type":47,"value":133},{"type":47,"value":3266}," changes the agent name without\nre-running heygen-avatar, ",{"type":41,"tag":56,"props":3268,"children":3270},{"className":3269},[],[3271],{"type":47,"value":195},{"type":47,"value":3273}," keeps pointing at the ",{"type":41,"tag":619,"props":3275,"children":3276},{},[3277],{"type":47,"value":3278},"old",{"type":47,"value":3280},"\nnamed file. Phase 0 mismatch-and-re-alias handles this on the next\ninvocation; until then, the alias is stale-but-pointing-somewhere-valid,\nnot broken.",{"type":41,"tag":50,"props":3282,"children":3283},{},[3284,3289,3291,3296],{"type":41,"tag":265,"props":3285,"children":3286},{},[3287],{"type":47,"value":3288},"Multi-agent workspace caveat:",{"type":47,"value":3290}," one role alias per workspace is\nlast-writer-wins. If two agents ever share a workspace and both run\nheygen-avatar, only the most recent run's identity is reachable via\n",{"type":41,"tag":56,"props":3292,"children":3294},{"className":3293},[],[3295],{"type":47,"value":195},{"type":47,"value":3297},". Named files for both still exist. We accept this\nlimit — multi-agent shared workspaces are out of scope for v1.",{"type":41,"tag":1421,"props":3299,"children":3301},{"id":3300},"phase-6-test-optional",[3302],{"type":47,"value":3303},"Phase 6 — Test (Optional)",{"type":41,"tag":50,"props":3305,"children":3306},{},[3307],{"type":47,"value":3308},"If the user wants to see their avatar in action:",{"type":41,"tag":50,"props":3310,"children":3311},{},[3312,3316,3318,3322,3323],{"type":41,"tag":265,"props":3313,"children":3314},{},[3315],{"type":47,"value":1680},{"type":47,"value":3317}," use the HeyGen app's video-generation flow with the selected avatar and voice.\n",{"type":41,"tag":265,"props":3319,"children":3320},{},[3321],{"type":47,"value":1687},{"type":47,"value":455},{"type":41,"tag":56,"props":3324,"children":3326},{"className":3325},[],[3327],{"type":47,"value":3328},"heygen video-agent create --avatar-id \u003Cid> --voice-id \u003Cid> --prompt \"...\" --wait",{"type":41,"tag":50,"props":3330,"children":3331},{},[3332,3334,3339,3341,3345,3347,3351,3353,3357,3359,3363],{"type":47,"value":3333},"Generate a natural greeting in the video language (from ",{"type":41,"tag":56,"props":3335,"children":3337},{"className":3336},[],[3338],{"type":47,"value":277},{"type":47,"value":3340},"). Examples: English \"Hi, I'm ",{"type":41,"tag":986,"props":3342,"children":3343},{},[3344],{"type":47,"value":1403},{"type":47,"value":3346},". Nice to meet you!\", Japanese \"",{"type":41,"tag":986,"props":3348,"children":3349},{},[3350],{"type":47,"value":1403},{"type":47,"value":3352},"です。はじめまして！\", Spanish \"Hola, soy ",{"type":41,"tag":986,"props":3354,"children":3355},{},[3356],{"type":47,"value":1403},{"type":47,"value":3358},". ¡Mucho gusto!\", Korean \"안녕하세요, ",{"type":41,"tag":986,"props":3360,"children":3361},{},[3362],{"type":47,"value":1403},{"type":47,"value":3364},"입니다. 만나서 반갑습니다!\"",{"type":41,"tag":65,"props":3366,"children":3368},{"id":3367},"iteration-flow",[3369],{"type":47,"value":3370},"Iteration Flow",{"type":41,"tag":50,"props":3372,"children":3373},{},[3374],{"type":47,"value":3375},"When the user wants to refine:",{"type":41,"tag":571,"props":3377,"children":3378},{},[3379,3389,3405,3415],{"type":41,"tag":342,"props":3380,"children":3381},{},[3382,3387],{"type":41,"tag":265,"props":3383,"children":3384},{},[3385],{"type":47,"value":3386},"\"Adjust the prompt\"",{"type":47,"value":3388}," → Mode 2 with existing group_id (keeps the character, adds a new look). Only Mode 1 if they say \"start completely over.\"",{"type":41,"tag":342,"props":3390,"children":3391},{},[3392,3397,3398,3403],{"type":41,"tag":265,"props":3393,"children":3394},{},[3395],{"type":47,"value":3396},"\"Add a new look\"",{"type":47,"value":2697},{"type":41,"tag":265,"props":3399,"children":3400},{},[3401],{"type":47,"value":3402},"\"different outfit\"",{"type":47,"value":3404}," → Mode 2 with existing group_id. Add to Looks in AVATAR file.",{"type":41,"tag":342,"props":3406,"children":3407},{},[3408,3413],{"type":41,"tag":265,"props":3409,"children":3410},{},[3411],{"type":47,"value":3412},"\"Try a different voice\"",{"type":47,"value":3414}," → back to Phase 3",{"type":41,"tag":342,"props":3416,"children":3417},{},[3418,3423],{"type":41,"tag":265,"props":3419,"children":3420},{},[3421],{"type":47,"value":3422},"\"Start completely over\"",{"type":47,"value":3424}," → Mode 1, new character. Overwrite HeyGen section.",{"type":41,"tag":50,"props":3426,"children":3427},{},[3428,3433],{"type":41,"tag":265,"props":3429,"children":3430},{},[3431],{"type":47,"value":3432},"Default to Mode 2 (new look under same group).",{"type":47,"value":3434}," Only create a new group when the user explicitly wants a different character identity. This keeps the account clean and makes looks reusable across skills.",{"type":41,"tag":50,"props":3436,"children":3437},{},[3438],{"type":47,"value":3439},"Each iteration updates the AVATAR file. The file is always the source of truth.",{"type":41,"tag":65,"props":3441,"children":3443},{"id":3442},"ux-rules-1",[3444],{"type":47,"value":412},{"type":41,"tag":50,"props":3446,"children":3447},{},[3448,3453],{"type":41,"tag":265,"props":3449,"children":3450},{},[3451],{"type":47,"value":3452},"Be interactive at checkpoints, silent everywhere else.",{"type":47,"value":3454}," Stop and wait at avatar approval and voice selection. Between checkpoints, work silently — don't narrate reasoning or explain next steps. After voice pick: save + confirm in one message.",{"type":41,"tag":65,"props":3456,"children":3458},{"id":3457},"video-producer-integration",[3459],{"type":47,"value":3460},"Video Producer Integration",{"type":41,"tag":50,"props":3462,"children":3463},{},[3464,3470],{"type":41,"tag":56,"props":3465,"children":3467},{"className":3466},[],[3468],{"type":47,"value":3469},"heygen-video",{"type":47,"value":3471}," reads AVATAR files for group_id and voice_id. Resolution\norder:",{"type":41,"tag":338,"props":3473,"children":3474},{},[3475,3492,3509,3526],{"type":41,"tag":342,"props":3476,"children":3477},{},[3478,3483,3485,3491],{"type":41,"tag":265,"props":3479,"children":3480},{},[3481],{"type":47,"value":3482},"Named request",{"type":47,"value":3484}," (\"Make a video with Eve\") → read ",{"type":41,"tag":56,"props":3486,"children":3488},{"className":3487},[],[3489],{"type":47,"value":3490},"AVATAR-EVE.md",{"type":47,"value":358},{"type":41,"tag":342,"props":3493,"children":3494},{},[3495,3500,3502,3507],{"type":41,"tag":265,"props":3496,"children":3497},{},[3498],{"type":47,"value":3499},"Agent self-reference",{"type":47,"value":3501}," (\"make a video of yourself\", \"give us a video\nupdate\") → read ",{"type":41,"tag":56,"props":3503,"children":3505},{"className":3504},[],[3506],{"type":47,"value":195},{"type":47,"value":3508}," (symlink to current agent's named file).",{"type":41,"tag":342,"props":3510,"children":3511},{},[3512,3517,3519,3524],{"type":41,"tag":265,"props":3513,"children":3514},{},[3515],{"type":47,"value":3516},"User self-reference",{"type":47,"value":3518}," (\"make a video of me\", \"my video update\") → read\n",{"type":41,"tag":56,"props":3520,"children":3522},{"className":3521},[],[3523],{"type":47,"value":202},{"type":47,"value":3525}," (symlink to current user's named file).",{"type":41,"tag":342,"props":3527,"children":3528},{},[3529,3534],{"type":41,"tag":265,"props":3530,"children":3531},{},[3532],{"type":47,"value":3533},"No AVATAR file or symlink",{"type":47,"value":3535}," → fall back to stock avatars or ask user.",{"type":41,"tag":50,"props":3537,"children":3538},{},[3539,3541,3547],{"type":47,"value":3540},"The alias targets are resolved by the OS at read time, so consumer skills\nsimply ",{"type":41,"tag":56,"props":3542,"children":3544},{"className":3543},[],[3545],{"type":47,"value":3546},"cat AVATAR-AGENT.md",{"type":47,"value":3548}," and get whatever the current agent's avatar is.",{"type":41,"tag":65,"props":3550,"children":3552},{"id":3551},"error-handling",[3553],{"type":47,"value":3554},"Error Handling",{"type":41,"tag":571,"props":3556,"children":3557},{},[3558,3563,3568,3573,3578],{"type":41,"tag":342,"props":3559,"children":3560},{},[3561],{"type":47,"value":3562},"Missing SOUL.md\u002FIDENTITY.md → conversational onboarding, write AVATAR file from answers",{"type":41,"tag":342,"props":3564,"children":3565},{},[3566],{"type":47,"value":3567},"API fails → retry once, then ask user to check API key",{"type":41,"tag":342,"props":3569,"children":3570},{},[3571],{"type":47,"value":3572},"Voice match poor → show all available voices, let user browse",{"type":41,"tag":342,"props":3574,"children":3575},{},[3576],{"type":47,"value":3577},"Asset upload unavailable or fails → ask for an HTTPS URL or skip reference image and try prompt-only creation",{"type":41,"tag":342,"props":3579,"children":3580},{},[3581],{"type":47,"value":3582},"Existing avatar file with stale HeyGen IDs → offer to regenerate or keep",{"type":41,"tag":50,"props":3584,"children":3585},{},[3586,3587],{"type":47,"value":1953},{"type":41,"tag":265,"props":3588,"children":3589},{},[3590,3592],{"type":47,"value":3591},"Known issues, retry patterns, broken voice previews, error → action mapping → ",{"type":41,"tag":1960,"props":3593,"children":3595},{"href":3594},"references\u002Ftroubleshooting.md",[3596],{"type":47,"value":3594},{"type":41,"tag":2398,"props":3598,"children":3599},{},[3600],{"type":47,"value":3601},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":3603,"total":3721},[3604,3621,3635,3647,3667,3689,3709],{"slug":3605,"name":3605,"fn":3606,"description":3607,"org":3608,"tags":3609,"stars":22,"repoUrl":23,"updatedAt":24},"accessibility-and-inclusive-visualization","make data visualizations accessible","Make data visualizations accessible and inclusive. Use when the user needs chart or diagram accessibility guidance, text alternatives for complex visuals, color and contrast review, keyboard support, reduced-motion behavior for animation or parallax, or an accessibility QA workflow for exported figures, UML-like diagrams, and dashboards.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3610,3613,3616,3619],{"name":3611,"slug":3612,"type":15},"Accessibility","accessibility",{"name":3614,"slug":3615,"type":15},"Charts","charts",{"name":3617,"slug":3618,"type":15},"Data Visualization","data-visualization",{"name":2477,"slug":3620,"type":15},"design",{"slug":3622,"name":3622,"fn":3623,"description":3624,"org":3625,"tags":3626,"stars":22,"repoUrl":23,"updatedAt":3634},"agent-browser","automate browser interactions for agents","Browser automation CLI for AI agents. Use when the user needs to interact with websites, verify dev server output, test web apps, navigate pages, fill forms, click buttons, take screenshots, extract data, or automate any browser task. Also triggers when a dev server starts so you can verify it visually.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3627,3628,3631],{"name":17,"slug":18,"type":15},{"name":3629,"slug":3630,"type":15},"Browser Automation","browser-automation",{"name":3632,"slug":3633,"type":15},"Testing","testing","2026-04-06T18:41:03.44016",{"slug":3636,"name":3636,"fn":3637,"description":3638,"org":3639,"tags":3640,"stars":22,"repoUrl":23,"updatedAt":3646},"agent-browser-verify","verify dev server output with automated browser","Automated browser verification for dev servers. Triggers when a dev server starts to run a visual gut-check with agent-browser — verifies the page loads, checks for console errors, validates key UI elements, and reports pass\u002Ffail before continuing.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3641,3642,3645],{"name":3629,"slug":3630,"type":15},{"name":3643,"slug":3644,"type":15},"Local Development","local-development",{"name":3632,"slug":3633,"type":15},"2026-04-06T18:41:17.526867",{"slug":3648,"name":3648,"fn":3649,"description":3650,"org":3651,"tags":3652,"stars":22,"repoUrl":23,"updatedAt":3666},"agents-sdk","build AI agents on Cloudflare Workers","Build AI agents on Cloudflare Workers using the Agents SDK. Load when creating stateful agents, durable workflows, real-time WebSocket apps, scheduled tasks, MCP servers, or chat applications. Covers Agent class, state management, callable RPC, Workflows integration, and React hooks. Biases towards retrieval from Cloudflare docs over pre-trained knowledge.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3653,3654,3657,3660,3663],{"name":17,"slug":18,"type":15},{"name":3655,"slug":3656,"type":15},"Cloudflare Workers","cloudflare-workers",{"name":3658,"slug":3659,"type":15},"SDK","sdk",{"name":3661,"slug":3662,"type":15},"Serverless","serverless",{"name":3664,"slug":3665,"type":15},"WebSockets","websockets","2026-04-06T18:39:51.717063",{"slug":3668,"name":3668,"fn":3669,"description":3670,"org":3671,"tags":3672,"stars":22,"repoUrl":23,"updatedAt":3688},"ai-elements","build chat UIs with AI Elements","AI Elements component library guidance — pre-built React components for AI interfaces built on shadcn\u002Fui. Use when building chat UIs, message displays, tool call rendering, streaming responses, reasoning panels, or any AI-native interface with the AI SDK.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3673,3676,3679,3682,3685],{"name":3674,"slug":3675,"type":15},"Frontend","frontend",{"name":3677,"slug":3678,"type":15},"React","react",{"name":3680,"slug":3681,"type":15},"shadcn\u002Fui","shadcn-ui",{"name":3683,"slug":3684,"type":15},"UI Components","ui-components",{"name":3686,"slug":3687,"type":15},"Vercel","vercel","2026-04-06T18:40:59.619419",{"slug":3690,"name":3690,"fn":3691,"description":3692,"org":3693,"tags":3694,"stars":22,"repoUrl":23,"updatedAt":3708},"ai-gateway","configure Vercel AI Gateway","Vercel AI Gateway expert guidance. Use when configuring model routing, provider failover, cost tracking, or managing multiple AI providers through a unified API.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3695,3698,3701,3704,3707],{"name":3696,"slug":3697,"type":15},"AI Infrastructure","ai-infrastructure",{"name":3699,"slug":3700,"type":15},"Cost Optimization","cost-optimization",{"name":3702,"slug":3703,"type":15},"LLM","llm",{"name":3705,"slug":3706,"type":15},"Performance","performance",{"name":3686,"slug":3687,"type":15},"2026-04-06T18:40:44.377464",{"slug":3710,"name":3710,"fn":3711,"description":3712,"org":3713,"tags":3714,"stars":22,"repoUrl":23,"updatedAt":3720},"ai-generation-persistence","implement persistence patterns for AI generations","AI generation persistence patterns — unique IDs, addressable URLs, database storage, and cost tracking for every LLM generation",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3715,3716,3719],{"name":3699,"slug":3700,"type":15},{"name":3717,"slug":3718,"type":15},"Database","database",{"name":3702,"slug":3703,"type":15},"2026-04-06T18:41:08.513425",600,{"items":3723,"total":3918},[3724,3745,3768,3785,3801,3818,3837,3849,3863,3877,3889,3902],{"slug":3725,"name":3725,"fn":3726,"description":3727,"org":3728,"tags":3729,"stars":3742,"repoUrl":3743,"updatedAt":3744},"prior-auth-packet-builder","build healthcare prior authorization packets","Build a concise prior authorization packet from local case files and payer policy docs.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3730,3733,3736,3739],{"name":3731,"slug":3732,"type":15},"Documents","documents",{"name":3734,"slug":3735,"type":15},"Healthcare","healthcare",{"name":3737,"slug":3738,"type":15},"Insurance","insurance",{"name":3740,"slug":3741,"type":15},"Regulatory Compliance","regulatory-compliance",28169,"https:\u002F\u002Fgithub.com\u002Fopenai\u002Fopenai-agents-python","2026-04-16T05:11:39.180399",{"slug":3746,"name":3746,"fn":3747,"description":3748,"org":3749,"tags":3750,"stars":3765,"repoUrl":3766,"updatedAt":3767},"aspnet-core","build ASP.NET Core web applications","Build, review, refactor, or architect ASP.NET Core web applications using current official guidance for .NET web development. Use when working on Blazor Web Apps, Razor Pages, MVC, Minimal APIs, controller-based Web APIs, SignalR, gRPC, middleware, dependency injection, configuration, authentication, authorization, testing, performance, deployment, or ASP.NET Core upgrades.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3751,3754,3756,3759,3762],{"name":3752,"slug":3753,"type":15},".NET","dotnet",{"name":3755,"slug":3746,"type":15},"ASP.NET Core",{"name":3757,"slug":3758,"type":15},"Blazor","blazor",{"name":3760,"slug":3761,"type":15},"C#","csharp",{"name":3763,"slug":3764,"type":15},"Web Development","web-development",23787,"https:\u002F\u002Fgithub.com\u002Fopenai\u002Fskills","2026-04-12T05:07:02.819491",{"slug":3769,"name":3769,"fn":3770,"description":3771,"org":3772,"tags":3773,"stars":3765,"repoUrl":3766,"updatedAt":3784},"chatgpt-apps","build ChatGPT Apps SDK applications","Build, scaffold, refactor, and troubleshoot ChatGPT Apps SDK applications that combine an MCP server and widget UI. Use when Codex needs to design tools, register UI resources, wire the MCP Apps bridge or ChatGPT compatibility APIs, apply Apps SDK metadata or CSP or domain settings, or produce a docs-aligned project scaffold. Prefer a docs-first workflow by invoking the openai-docs skill or OpenAI developer docs MCP tools before generating code.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3774,3777,3780,3783],{"name":3775,"slug":3776,"type":15},"Apps SDK","apps-sdk",{"name":3778,"slug":3779,"type":15},"ChatGPT","chatgpt",{"name":3781,"slug":3782,"type":15},"MCP","mcp",{"name":9,"slug":8,"type":15},"2026-04-12T05:07:05.468097",{"slug":3786,"name":3786,"fn":3787,"description":3788,"org":3789,"tags":3790,"stars":3765,"repoUrl":3766,"updatedAt":3800},"cli-creator","build CLIs from API docs","Build a composable CLI for Codex from API docs, an OpenAPI spec, existing curl examples, an SDK, a web app, an admin tool, or a local script. Use when the user wants Codex to create a command-line tool that can run from any repo, expose composable read\u002Fwrite commands, return stable JSON, manage auth, and pair with a companion skill.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3791,3794,3797],{"name":3792,"slug":3793,"type":15},"API Development","api-development",{"name":3795,"slug":3796,"type":15},"CLI","cli",{"name":3798,"slug":3799,"type":15},"Codex","codex","2026-04-12T05:07:04.132762",{"slug":3802,"name":3802,"fn":3803,"description":3804,"org":3805,"tags":3806,"stars":3765,"repoUrl":3766,"updatedAt":3817},"cloudflare-deploy","deploy projects to Cloudflare","Deploy applications and infrastructure to Cloudflare using Workers, Pages, and related platform services. Use when the user asks to deploy, host, publish, or set up a project on Cloudflare.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3807,3810,3813,3814],{"name":3808,"slug":3809,"type":15},"Cloudflare","cloudflare",{"name":3811,"slug":3812,"type":15},"Cloudflare Pages","cloudflare-pages",{"name":3655,"slug":3656,"type":15},{"name":3815,"slug":3816,"type":15},"Deployment","deployment","2026-04-12T05:07:14.275118",{"slug":3819,"name":3819,"fn":3820,"description":3821,"org":3822,"tags":3823,"stars":3765,"repoUrl":3766,"updatedAt":3836},"define-goal","define and set measurable project goals","Help the user define a concrete, measurable goal before starting work, especially when they ask to use the goal tool, create a goal, set an objective, clarify success criteria, or turn a fuzzy intention into a quantitative outcome. Use this skill for goal creation and goal refinement only; it does not manage durable snapshots, decision logs, or long-running execution artifacts.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3824,3827,3830,3833],{"name":3825,"slug":3826,"type":15},"Productivity","productivity",{"name":3828,"slug":3829,"type":15},"Project Management","project-management",{"name":3831,"slug":3832,"type":15},"Strategy","strategy",{"name":3834,"slug":3835,"type":15},"Task Management","task-management","2026-05-23T06:17:16.870838",{"slug":3838,"name":3838,"fn":3839,"description":3840,"org":3841,"tags":3842,"stars":3765,"repoUrl":3766,"updatedAt":3848},"figma","translate Figma designs into code","Use the Figma MCP server to fetch design context, screenshots, variables, and assets from Figma, and to translate Figma nodes into production code. Trigger when a task involves Figma URLs, node IDs, design-to-code implementation, or Figma MCP setup and troubleshooting.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3843,3844,3846,3847],{"name":2477,"slug":3620,"type":15},{"name":3845,"slug":3838,"type":15},"Figma",{"name":3674,"slug":3675,"type":15},{"name":3781,"slug":3782,"type":15},"2026-04-12T05:06:47.939943",{"slug":3850,"name":3850,"fn":3851,"description":3852,"org":3853,"tags":3854,"stars":3765,"repoUrl":3766,"updatedAt":3862},"figma-code-connect-components","connect Figma designs to code components","Connects Figma design components to code components using Code Connect mapping tools. Use when user says \"code connect\", \"connect this component to code\", \"map this component\", \"link component to code\", \"create code connect mapping\", or wants to establish mappings between Figma designs and code implementations. For canvas writes via `use_figma`, use `figma-use`.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3855,3856,3859,3860,3861],{"name":2477,"slug":3620,"type":15},{"name":3857,"slug":3858,"type":15},"Design System","design-system",{"name":3845,"slug":3838,"type":15},{"name":3674,"slug":3675,"type":15},{"name":3683,"slug":3684,"type":15},"2026-05-10T05:59:52.971881",{"slug":3864,"name":3864,"fn":3865,"description":3866,"org":3867,"tags":3868,"stars":3765,"repoUrl":3766,"updatedAt":3876},"figma-create-design-system-rules","generate design system rules from Figma","Generates custom design system rules for the user's codebase. Use when user says \"create design system rules\", \"generate rules for my project\", \"set up design rules\", \"customize design system guidelines\", or wants to establish project-specific conventions for Figma-to-code workflows. Requires Figma MCP server connection.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3869,3870,3871,3874,3875],{"name":2477,"slug":3620,"type":15},{"name":3857,"slug":3858,"type":15},{"name":3872,"slug":3873,"type":15},"Documentation","documentation",{"name":3845,"slug":3838,"type":15},{"name":3674,"slug":3675,"type":15},"2026-05-16T06:07:47.821474",{"slug":3878,"name":3878,"fn":3879,"description":3880,"org":3881,"tags":3882,"stars":3765,"repoUrl":3766,"updatedAt":3888},"figma-implement-design","translate Figma designs into application code","Translates Figma designs into production-ready application code with 1:1 visual fidelity. Use when implementing UI code from Figma files, when user mentions \"implement design\", \"generate code\", \"implement component\", provides Figma URLs, or asks to build components matching Figma specs. For Figma canvas writes via `use_figma`, use `figma-use`.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3883,3884,3885,3886,3887],{"name":2477,"slug":3620,"type":15},{"name":3845,"slug":3838,"type":15},{"name":3674,"slug":3675,"type":15},{"name":3683,"slug":3684,"type":15},{"name":3763,"slug":3764,"type":15},"2026-05-16T06:07:40.583615",{"slug":3890,"name":3890,"fn":3891,"description":3892,"org":3893,"tags":3894,"stars":3765,"repoUrl":3766,"updatedAt":3901},"hatch-pet","create animated pets for Codex","Create, repair, validate, visually QA, and package Codex-compatible animated pets and pet spritesheets from character art, generated images, company or prospect brand cues, or visual references. Use when a user wants a lightweight-worker Codex pet workflow, a non-pixel custom pet style, a prospect or company mascot pet, or a full 8x9 animated pet atlas with transparent unused cells, QA contact sheets, and pet.json packaging. This skill composes the installed $imagegen system skill for visual generation and uses bundled scripts for deterministic spritesheet assembly.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3895,3898,3899,3900],{"name":3896,"slug":3897,"type":15},"Animation","animation",{"name":3798,"slug":3799,"type":15},{"name":13,"slug":14,"type":15},{"name":2477,"slug":3620,"type":15},"2026-05-02T05:31:48.48485",{"slug":3903,"name":3903,"fn":3904,"description":3905,"org":3906,"tags":3907,"stars":3765,"repoUrl":3766,"updatedAt":3917},"imagegen","generate and edit raster images","Generate or edit raster images when the task benefits from AI-created bitmap visuals such as photos, illustrations, textures, sprites, mockups, or transparent-background cutouts. Use when Codex should create a brand-new image, transform an existing image, or derive visual variants from references, and the output should be a bitmap asset rather than repo-native code or vector. Do not use when the task is better handled by editing existing SVG\u002Fvector\u002Fcode-native assets, extending an established icon or logo system, or building the visual directly in HTML\u002FCSS\u002Fcanvas.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3908,3909,3910,3913,3916],{"name":13,"slug":14,"type":15},{"name":2477,"slug":3620,"type":15},{"name":3911,"slug":3912,"type":15},"Image Generation","image-generation",{"name":3914,"slug":3915,"type":15},"Images","images",{"name":9,"slug":8,"type":15},"2026-05-15T06:23:24.312127",675]