[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6JCFFAYR247YY41HX8TPW40":3,"skill-same:01M6JCFFAYR247YY41HX8TPW40":75},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":25,"publishedAt":46,"linkOnly":47,"markdownContent":48,"markdownBody":49,"frontMatter":50,"refName":53,"commitSha":54,"skillDirectory":55,"forksCount":56,"repositoryHtmlUrl":57,"repositoryHomepageUrl":58,"ownerHtmlUrl":59,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":60,"install":61,"resources":74},"01M6JCFFAYR247YY41HX8TPW40","media-generation",null,"Generate images, video, and talking-head animations via fal.ai and similar APIs. Covers sync-3 lipsync, cost estimation, async queue management, request recovery, and file delivery.","S3YED\u002Fappie-kit","S3YED","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F62743867?v=4","01M6JBKBRRVP6KMS0VWZ27T3R6","01M6JBKBX0KG30284PW1DBYJT1",14,"MIT","https:\u002F\u002Fgithub.com\u002FS3YED\u002Fappie-kit\u002Fblob\u002Fmaster\u002Fskills\u002Fcreative\u002Fmedia-generation\u002FSKILL.md",[17,22],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000016","图像与多媒体","SCENARIO","使用场景",{"categoryNo":23,"categoryName":24,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000023","Skill与智能体开发",[26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45],"media generation","generation","Media","fal","queue management","talking-head","ai models","estimation","delivery","async","images","image","animate","Audio","Video","generate","create","cost estimation","sync","workflow","2026-11-10 10:12:30",false,"---\nname: media-generation\ntitle: AI Media Generation (Image\u002FVideo\u002FAudio APIs)\ndescription: Generate images, video, and talking-head animations via fal.ai and similar APIs. Covers sync-3 lipsync, cost estimation, async queue management, request recovery, and file delivery.\ntrigger: User asks to create a video from photo+audio, animate an image, generate talking-head content, use sync-lipsync, use fal.ai models, or any media generation workflow with paid APIs.\n---\n\n# AI Media Generation (fal.ai & Similar APIs)\n\n## When to Use\n\n- User wants to create a talking-head video from a photo + audio\n- User asks for image-to-video, lipsync, or face animation\n- Any paid API media generation task (fal.ai, etc.)\n- Uploading\u002Fserving generated media files\n\n## Principles\n\n### Always Estimate Costs Before Running\n\n**NEVER fire a paid API call without estimating the cost first.** This is the #1 rule from Seyed after the $16 fugu-sync3 incident.\n\n```python\n# Sync-3 v3 image-to-video: $0.1333 per output second\n# 71s audio = 71 × $0.1333 = ~$9.46\n```\n\nCost estimation checklist:\n1. Look up the model's pricing (per-second, per-video, per-image)\n2. Calculate: `duration × unit_price = estimated_cost`\n3. Present to user with balance\u002Fremaining info\n4. Only proceed after user confirms\n\n### Bulletproof Async Workflow (fal.ai)\n\nThe **correct** sequence for long-running fal.ai jobs is:\n\n```\n1. submit() → get SyncRequestHandle\n2. IMMEDIATELY save handle.request_id to disk ← CARDINAL RULE\n3. Poll via REST API (GET) until Completed\n4. Download result video\n5. Compress if needed (Telegram 50MB limit)\n6. Clean up temp files\n```\n\n**NEVER use `subscribe()`** — it blocks until completion with no request_id fallback. If the client disconnects mid-processing, the result is unrecoverable and credits are wasted.\n\n### Request ID Recovery\n\nEven with proper save, if the polling process dies:\n- The saved request_id lets you recover via REST API\n- Use GET on `https:\u002F\u002Fqueue.fal.run\u002Ffal-ai\u002F{app}\u002Frequests\u002F{request_id}`\n- This returns the full result JSON including video URL\n- The `from_request_id()` method in fal-client requires an `httpx.Client` instance (internal) — use raw REST API instead\n\n## Supported Models & Pricing\n\n### fal.ai — sync-3 Lipsync\n\n| Model | Endpoint | Pricing | Notes |\n|-------|----------|---------|-------|\n| sync-3 image-to-video | `fal-ai\u002Fsync-lipsync\u002Fv3\u002Fimage-to-video` | **$0.1333\u002Fsec** output | Photo + audio → talking video |\n| sync-3 video-to-video | `fal-ai\u002Fsync-lipsync\u002Fv3` | ~$0.13\u002Fsec | Existing video + new audio |\n\n**Input:** `{\"image_url\": \"...\", \"audio_url\": \"...\"}` (image-to-video variant needs `image_url`, NOT `face_image_url`)\n\n**Output format:** MP4. Result lives at `https:\u002F\u002Fv3b.fal.media\u002F...` URLs valid ~14 days.\n\n### Arbitrary fal.ai Models\n\nAll models follow the same queue\u002Fsubmit\u002Fworkflow pattern. Generic workflow:\n\n```python\nfrom fal_client import submit\n\nhandle = submit(\"fal-ai\u002F{owner}\u002F{model}\", arguments={...})\nrequest_id = handle.request_id\n# Save request_id immediately!\n# Poll via GET https:\u002F\u002Fqueue.fal.run\u002Ffal-ai\u002F{owner}\u002F{model}\u002Frequests\u002F{request_id}\n```\n\n## fal.ai File Upload\n\nUse the `upload_file()` function from `fal_client`:\n\n```python\nfrom fal_client import upload_file\nfile_url = upload_file(\"\u002Fpath\u002Fto\u002Ffile.jpg\")\n# Returns: https:\u002F\u002Fv3b.fal.media\u002Ffiles\u002F...\n```\n\nThe returned URL is immediately usable in model arguments.\n\n## Polling Pattern\n\n**Key learning:** the status endpoint returns 405 for GET and works with POST. But the result endpoint works with GET:\n\n```bash\n# Check status (POST)\ncurl -X POST \"https:\u002F\u002Fqueue.fal.run\u002Ffal-ai\u002F{app}\u002Frequests\u002F{id}\u002Fstatus\" \\\n  -H \"Authorization: Key $FAL_KEY\"\n\n# Get completed result (GET)\ncurl \"https:\u002F\u002Fqueue.fal.run\u002Ffal-ai\u002F{app}\u002Frequests\u002F{id}\" \\\n  -H \"Authorization: Key $FAL_KEY\"\n```\n\n**Important:** The `{app}` in the queue URL may differ from the submit app name.\n- Submit uses: `fal-ai\u002Fsync-lipsync\u002Fv3\u002Fimage-to-video`\n- Queue URL uses: `fal-ai\u002Fsync-lipsync` (without the `\u002Fv3\u002Fimage-to-video` suffix)\n\nAlways check the `response_url`\u002F`status_url` from the initial submit response to get the exact queue URL pattern.\n\n## File Delivery\n\n### Telegram Delivery\n\nTelegram has a **50MB file size limit** for bots. Compress with ffmpeg:\n\n```bash\nffmpeg -i input.mp4 \\\n  -c:v libx264 -crf 28 -preset fast \\\n  -c:a aac -b:a 64k \\\n  -movflags +faststart \\\n  output-compressed.mp4\n```\n\nTypical compression: 136MB → ~5.8MB (CRF 28, 71s video). For Telegram delivery, use the MEDIA: prefix.\n\n### Google Drive Upload\n\nRequires OAuth setup (rclone or gdrive). The most direct alternative is giving the user the raw fal.ai storage URL (valid ~14 days).\n\n## Scripts\n\n### Reference: bulletproof-submit.py\n\nA template script for bulletproof fal.ai job submission. Create and modify per task:\n\n```python\nimport os, json, time\nfrom fal_client import submit\n\nRID_FILE = \"\u002Fpath\u002Fto\u002Frequest-id.txt\"\n\n# Submit\nhandle = submit(\"fal-ai\u002F{model}\", arguments={...})\nrid = handle.request_id\nwith open(RID_FILE, \"w\") as f: f.write(rid)\nprint(f\"Request ID: {rid}\")\n\n# Poll via REST (more reliable than status())\nREST_URL = f\"https:\u002F\u002Fqueue.fal.run\u002Ffal-ai\u002F{app}\u002Frequests\u002F{rid}\"\nwhile True:\n    # Use curl or requests here\n    # Check if COMPLETED\n    # If yes: download video, compress, deliver\n    time.sleep(10)\n```\n\n## References\n\n### Session Learnings (2026-06-23 fugu-sync3)\n\nThe fugu-sync3 session produced these verified facts:\n- sync-3 v3 image-to-video expects `image_url` (NOT `face_image_url`) + `audio_url`\n- The correct model path: `fal-ai\u002Fsync-lipsync\u002Fv3\u002Fimage-to-video`\n- Pricing is $0.1333 per output second, shown on the model page as \"Your request will cost $X.XX per output second\"\n- A 71s video at 30fps generates ~136MB H.264 original, compressible to ~5.8MB at CRF 28\n- Queue polling pattern: POST to status endpoint, GET to result endpoint\n- The fal.ai SDK `from_request_id()` needs an httpx.Client instance (not a simple public method) — use REST API for recovery instead\n- Video URLs from fal.ai storage are valid for ~14 days\n- Request results expire after approximately 10+ minutes of inactivity — save the video URL immediately\n\n## Pitfalls\n\n- **$16 wasted on first attempt** — Using `subscribe()` without request_id fallback made the result unrecoverable when the client timed out.\n- **405 errors on status endpoint** — The status endpoint uses POST, not GET. The result endpoint uses GET, not POST.\n- **Queue URL vs Submit URL difference** — The queue URL may strip subpaths. Check response URLs from the submit call.\n- **No charge for server errors** — fal.ai doesn't charge for 503\u002F504\u002Ftimeout errors during queue wait, but DOES charge for completed processing even if the client disconnects.\n- **Request ID expiration** — Completed request results expire after some time (observed: a 10-minute-old request ID was gone). Save the result URL, not just the request ID.\n- **Always save request_id to disk** before doing anything else. If the script crashes at any point, the request_id is the only way to recover the result.\n","# AI Media Generation (fal.ai & Similar APIs)\n\n## When to Use\n\n- User wants to create a talking-head video from a photo + audio\n- User asks for image-to-video, lipsync, or face animation\n- Any paid API media generation task (fal.ai, etc.)\n- Uploading\u002Fserving generated media files\n\n## Principles\n\n### Always Estimate Costs Before Running\n\n**NEVER fire a paid API call without estimating the cost first.** This is the #1 rule from Seyed after the $16 fugu-sync3 incident.\n\n```python\n# Sync-3 v3 image-to-video: $0.1333 per output second\n# 71s audio = 71 × $0.1333 = ~$9.46\n```\n\nCost estimation checklist:\n1. Look up the model's pricing (per-second, per-video, per-image)\n2. Calculate: `duration × unit_price = estimated_cost`\n3. Present to user with balance\u002Fremaining info\n4. Only proceed after user confirms\n\n### Bulletproof Async Workflow (fal.ai)\n\nThe **correct** sequence for long-running fal.ai jobs is:\n\n```\n1. submit() → get SyncRequestHandle\n2. IMMEDIATELY save handle.request_id to disk ← CARDINAL RULE\n3. Poll via REST API (GET) until Completed\n4. Download result video\n5. Compress if needed (Telegram 50MB limit)\n6. Clean up temp files\n```\n\n**NEVER use `subscribe()`** — it blocks until completion with no request_id fallback. If the client disconnects mid-processing, the result is unrecoverable and credits are wasted.\n\n### Request ID Recovery\n\nEven with proper save, if the polling process dies:\n- The saved request_id lets you recover via REST API\n- Use GET on `https:\u002F\u002Fqueue.fal.run\u002Ffal-ai\u002F{app}\u002Frequests\u002F{request_id}`\n- This returns the full result JSON including video URL\n- The `from_request_id()` method in fal-client requires an `httpx.Client` instance (internal) — use raw REST API instead\n\n## Supported Models & Pricing\n\n### fal.ai — sync-3 Lipsync\n\n| Model | Endpoint | Pricing | Notes |\n|-------|----------|---------|-------|\n| sync-3 image-to-video | `fal-ai\u002Fsync-lipsync\u002Fv3\u002Fimage-to-video` | **$0.1333\u002Fsec** output | Photo + audio → talking video |\n| sync-3 video-to-video | `fal-ai\u002Fsync-lipsync\u002Fv3` | ~$0.13\u002Fsec | Existing video + new audio |\n\n**Input:** `{\"image_url\": \"...\", \"audio_url\": \"...\"}` (image-to-video variant needs `image_url`, NOT `face_image_url`)\n\n**Output format:** MP4. Result lives at `https:\u002F\u002Fv3b.fal.media\u002F...` URLs valid ~14 days.\n\n### Arbitrary fal.ai Models\n\nAll models follow the same queue\u002Fsubmit\u002Fworkflow pattern. Generic workflow:\n\n```python\nfrom fal_client import submit\n\nhandle = submit(\"fal-ai\u002F{owner}\u002F{model}\", arguments={...})\nrequest_id = handle.request_id\n# Save request_id immediately!\n# Poll via GET https:\u002F\u002Fqueue.fal.run\u002Ffal-ai\u002F{owner}\u002F{model}\u002Frequests\u002F{request_id}\n```\n\n## fal.ai File Upload\n\nUse the `upload_file()` function from `fal_client`:\n\n```python\nfrom fal_client import upload_file\nfile_url = upload_file(\"\u002Fpath\u002Fto\u002Ffile.jpg\")\n# Returns: https:\u002F\u002Fv3b.fal.media\u002Ffiles\u002F...\n```\n\nThe returned URL is immediately usable in model arguments.\n\n## Polling Pattern\n\n**Key learning:** the status endpoint returns 405 for GET and works with POST. But the result endpoint works with GET:\n\n```bash\n# Check status (POST)\ncurl -X POST \"https:\u002F\u002Fqueue.fal.run\u002Ffal-ai\u002F{app}\u002Frequests\u002F{id}\u002Fstatus\" \\\n  -H \"Authorization: Key $FAL_KEY\"\n\n# Get completed result (GET)\ncurl \"https:\u002F\u002Fqueue.fal.run\u002Ffal-ai\u002F{app}\u002Frequests\u002F{id}\" \\\n  -H \"Authorization: Key $FAL_KEY\"\n```\n\n**Important:** The `{app}` in the queue URL may differ from the submit app name.\n- Submit uses: `fal-ai\u002Fsync-lipsync\u002Fv3\u002Fimage-to-video`\n- Queue URL uses: `fal-ai\u002Fsync-lipsync` (without the `\u002Fv3\u002Fimage-to-video` suffix)\n\nAlways check the `response_url`\u002F`status_url` from the initial submit response to get the exact queue URL pattern.\n\n## File Delivery\n\n### Telegram Delivery\n\nTelegram has a **50MB file size limit** for bots. Compress with ffmpeg:\n\n```bash\nffmpeg -i input.mp4 \\\n  -c:v libx264 -crf 28 -preset fast \\\n  -c:a aac -b:a 64k \\\n  -movflags +faststart \\\n  output-compressed.mp4\n```\n\nTypical compression: 136MB → ~5.8MB (CRF 28, 71s video). For Telegram delivery, use the MEDIA: prefix.\n\n### Google Drive Upload\n\nRequires OAuth setup (rclone or gdrive). The most direct alternative is giving the user the raw fal.ai storage URL (valid ~14 days).\n\n## Scripts\n\n### Reference: bulletproof-submit.py\n\nA template script for bulletproof fal.ai job submission. Create and modify per task:\n\n```python\nimport os, json, time\nfrom fal_client import submit\n\nRID_FILE = \"\u002Fpath\u002Fto\u002Frequest-id.txt\"\n\n# Submit\nhandle = submit(\"fal-ai\u002F{model}\", arguments={...})\nrid = handle.request_id\nwith open(RID_FILE, \"w\") as f: f.write(rid)\nprint(f\"Request ID: {rid}\")\n\n# Poll via REST (more reliable than status())\nREST_URL = f\"https:\u002F\u002Fqueue.fal.run\u002Ffal-ai\u002F{app}\u002Frequests\u002F{rid}\"\nwhile True:\n    # Use curl or requests here\n    # Check if COMPLETED\n    # If yes: download video, compress, deliver\n    time.sleep(10)\n```\n\n## References\n\n### Session Learnings (2026-06-23 fugu-sync3)\n\nThe fugu-sync3 session produced these verified facts:\n- sync-3 v3 image-to-video expects `image_url` (NOT `face_image_url`) + `audio_url`\n- The correct model path: `fal-ai\u002Fsync-lipsync\u002Fv3\u002Fimage-to-video`\n- Pricing is $0.1333 per output second, shown on the model page as \"Your request will cost $X.XX per output second\"\n- A 71s video at 30fps generates ~136MB H.264 original, compressible to ~5.8MB at CRF 28\n- Queue polling pattern: POST to status endpoint, GET to result endpoint\n- The fal.ai SDK `from_request_id()` needs an httpx.Client instance (not a simple public method) — use REST API for recovery instead\n- Video URLs from fal.ai storage are valid for ~14 days\n- Request results expire after approximately 10+ minutes of inactivity — save the video URL immediately\n\n## Pitfalls\n\n- **$16 wasted on first attempt** — Using `subscribe()` without request_id fallback made the result unrecoverable when the client timed out.\n- **405 errors on status endpoint** — The status endpoint uses POST, not GET. The result endpoint uses GET, not POST.\n- **Queue URL vs Submit URL difference** — The queue URL may strip subpaths. Check response URLs from the submit call.\n- **No charge for server errors** — fal.ai doesn't charge for 503\u002F504\u002Ftimeout errors during queue wait, but DOES charge for completed processing even if the client disconnects.\n- **Request ID expiration** — Completed request results expire after some time (observed: a 10-minute-old request ID was gone). Save the result URL, not just the request ID.\n- **Always save request_id to disk** before doing anything else. If the script crashes at any point, the request_id is the only way to recover the result.\n",{"name":5,"title":51,"trigger":52,"description":7},"AI Media Generation (Image\u002FVideo\u002FAudio APIs)","User asks to create a video from photo+audio, animate an image, generate talking-head content, use sync-lipsync, use fal.ai models, or any media generation workflow with paid APIs.","master","8ec37df6d71fb664ea19d32c079e7d3ff931a8e0","skills\u002Fcreative\u002Fmedia-generation",3,"https:\u002F\u002Fgithub.com\u002FS3YED\u002Fappie-kit","https:\u002F\u002Fweblyfe.ai","https:\u002F\u002Fgithub.com\u002FS3YED","2026-08-27 01:54:02",{"source":8,"skillName":5,"commands":62,"prompt":72,"zipAvailable":73},[63,66,69],{"tool":64,"command":65},"npx","npx skills add S3YED\u002Fappie-kit --skill media-generation",{"tool":67,"command":68},"bunx","bunx skills add S3YED\u002Fappie-kit --skill media-generation",{"tool":70,"command":71},"pnpm","pnpm dlx skills add S3YED\u002Fappie-kit --skill media-generation","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FS3YED\u002Fappie-kit\u002Fblob\u002Fmaster\u002Fskills\u002Fcreative\u002Fmedia-generation\u002FSKILL.md",true,[],[76,104,138,164,195,219],{"skillNo":77,"name":78,"nameZh":6,"description":79,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":80,"categories":81,"keywords":87,"publishedAt":46},"01M6JFD4M6N4DSGC7TXEJ5R3J2","ai-music","AI music generation and audio tools: HeartMuLa lyrics-to-music generation, songwriting craft (+ Suno prompts), and audio spectrogram\u002Ffeature visualization.","https:\u002F\u002Fgithub.com\u002FS3YED\u002Fappie-kit\u002Fblob\u002Fmaster\u002Fskills\u002Fwethlete\u002Fai-music\u002FSKILL.md",[82,85,86],{"categoryNo":83,"categoryName":84,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000013","分析与可视化",{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},{"categoryNo":23,"categoryName":24,"taxonomyType":20,"taxonomyTypeDesc":21},[88,89,90,91,92,39,93,94,95,96,97,98,99,100,27,101,102,103],"music","ai music","humanizer","visualization","Tools","hermes","hermes agent","songwriting","suno","lyrics","prompts","heartmula","craft","feature","ai music generation","music generation",{"skillNo":105,"name":106,"nameZh":6,"description":107,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":108,"categories":109,"keywords":118,"publishedAt":46},"01M6JFCZE4XNFQFMNZDHKHT5V5","agentic-webdesign-design-system-ingestion","Use v0 Design Systems 2.0, Bolt Design System Agents, or Lovable to generate production UI from a client's real design system components — not generic Tailwind. Use when building a client website where brand consistency matters.","https:\u002F\u002Fgithub.com\u002FS3YED\u002Fappie-kit\u002Fblob\u002Fmaster\u002Fskills\u002Fweb-design\u002Fagentic-webdesign-design-system-ingestion\u002FSKILL.md",[110,113],{"categoryNo":111,"categoryName":112,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000015","视觉设计",{"categoryNo":114,"categoryName":115,"taxonomyType":116,"taxonomyTypeDesc":117},"01JBSEEDCAT000000000000032","设计师","PROFESSION","适用职业",[119,120,121,122,123,124,125,126,41,127,128,129,130,131,132,133,134,135,136,137],"design","agentic","design system","system","ingestion","webdesign","agentic webdesign design system ingestion","components","design systems","website","ui","Tailwind","bolt","lovable","v0","design-system","wed","design system components","appie",{"skillNo":139,"name":140,"nameZh":6,"description":141,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":142,"categories":143,"keywords":146,"publishedAt":46},"01M6JFCVPX3913CFAS6QQJ33ZB","agentic-webdesign-agent-elements","Use 21st.dev Agent Elements — 25 shadcn\u002Fui components purpose-built for AI agent UIs. Tool cards (Bash, Edit, Search, Plan, Subagent, MCP), chat, input, streaming. Open source, shadcn-registry install, no runtime lock-in.","https:\u002F\u002Fgithub.com\u002FS3YED\u002Fappie-kit\u002Fblob\u002Fmaster\u002Fskills\u002Fweb-design\u002Fagentic-webdesign-agent-elements\u002FSKILL.md",[144,145],{"categoryNo":23,"categoryName":24,"taxonomyType":20,"taxonomyTypeDesc":21},{"categoryNo":114,"categoryName":115,"taxonomyType":116,"taxonomyTypeDesc":117},[120,147,124,148,149,150,126,151,152,153,154,155,156,157,158,159,160,161,162,163],"elements","agentic webdesign agent elements","MCP","ai agent","registry","search","streaming","open source","open","Bash","plan","subagent","edit","install","input","lock","source",{"skillNo":165,"name":166,"nameZh":6,"description":167,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":168,"categories":169,"keywords":174,"publishedAt":46},"01M6JFCQC7H65M9QJ6TRE71BS1","vercel-deployment","Deploy static sites and frontends to Vercel — handles both CLI and REST API paths, including the CLI token sanitization workaround.","https:\u002F\u002Fgithub.com\u002FS3YED\u002Fappie-kit\u002Fblob\u002Fmaster\u002Fskills\u002Fsoftware-development\u002Fvercel-deployment\u002FSKILL.md",[170,173],{"categoryNo":171,"categoryName":172,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000011","运维与部署",{"categoryNo":23,"categoryName":24,"taxonomyType":20,"taxonomyTypeDesc":21},[175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194],"deployment","vercel deployment","vercel","macos","cli","linux","windows","deploy","vercel deploy","REST","api","site","deploy to vercel","token","rest api","host","sites","paths","sanitization","static site",{"skillNo":196,"name":197,"nameZh":6,"description":198,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":199,"categories":200,"keywords":202,"publishedAt":46},"01M6JFCM4SMTXBM5A01BK2YQG1","software-quality-workflows","Umbrella workflow for TDD, debugging, code simplification, spikes, pre-commit review, and debugger-assisted investigation.","https:\u002F\u002Fgithub.com\u002FS3YED\u002Fappie-kit\u002Fblob\u002Fmaster\u002Fskills\u002Fsoftware-development\u002Fsoftware-quality-workflows\u002FSKILL.md",[201],{"categoryNo":23,"categoryName":24,"taxonomyType":20,"taxonomyTypeDesc":21},[203,204,205,206,207,208,45,209,210,211,212,213,214,215,216,217,218],"workflows","quality","software","software quality workflows","review","tdd","commit","debugging","code","debugger","pre-commit","investigation","code simplification","user","simplification","for",{"skillNo":220,"name":221,"nameZh":6,"description":222,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":223,"categories":224,"keywords":232,"publishedAt":46},"01M6JFCGD0M6CEATY01W7YN6DB","react-component-refactoring","Safely refactor large React components into smaller, maintainable pieces using proven patterns","https:\u002F\u002Fgithub.com\u002FS3YED\u002Fappie-kit\u002Fblob\u002Fmaster\u002Fskills\u002Fsoftware-development\u002Freact-component-refactoring\u002FSKILL.md",[225,228,231],{"categoryNo":226,"categoryName":227,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000007","代码审查",{"categoryNo":229,"categoryName":230,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000009","前端开发",{"categoryNo":23,"categoryName":24,"taxonomyType":20,"taxonomyTypeDesc":21},[233,234,235,236,237,238,239,240,178,241,242,126,243,181,244,211,245,246,247,248],"react","component","refactoring","component refactoring","react component","react component refactoring","frontend","writing","safe","typescript","react components","modular","refactor","simplify","patterns","test-driven-development"]