[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6CT503YFHNM9YZRDRD59WGC":3,"skill-same:01M6CT503YFHNM9YZRDRD59WGC":110},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":23,"publishedAt":47,"linkOnly":48,"markdownContent":49,"markdownBody":50,"frontMatter":51,"refName":52,"commitSha":53,"skillDirectory":54,"forksCount":55,"repositoryHtmlUrl":56,"repositoryHomepageUrl":57,"ownerHtmlUrl":58,"ownerBlogUrl":59,"ownerDescription":60,"updatedAt":61,"install":62,"resources":75},"01M6CT503YFHNM9YZRDRD59WGC","tts",null,"Generates spoken narration with Gemini TTS through Vercel AI Gateway. Use for text-to-speech, audio samples, voiceovers, or speaking as Junior with the reusable Junior voice. Do not use for transcription, voice cloning, music generation, or rendering a video without a narration request.","getsentry\u002Fjunior","getsentry","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F1396951?v=4","01M6CHRN2S1A588Q46ASWA5335","Sentry","01M6CT1V0TF72B1X0MQT5MSYXF",413,"Apache-2.0","https:\u002F\u002Fgithub.com\u002Fgetsentry\u002Fjunior\u002Fblob\u002Fmain\u002Fpackages\u002Fjunior-tts\u002Fskills\u002Ftts\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000016","图像与多媒体","SCENARIO","使用场景",[5,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46],"cloning","for","text-to-speech","with","music generation","as","generation","junior","do","transcription","narration","reusable","gemini","vercel","use","text","music","voice","Audio","Video","ai gateway","gateway","speech","2026-11-10 10:12:30",false,"---\nname: tts\ndescription: Generates spoken narration with Gemini TTS through Vercel AI Gateway. Use for text-to-speech, audio samples, voiceovers, or speaking as Junior with the reusable Junior voice. Do not use for transcription, voice cloning, music generation, or rendering a video without a narration request.\n---\n\n# Text to Speech\n\nUse the bundled `scripts\u002Fspeech.mjs` from this directory. Node.js and the installed plugin's host-managed Gateway key are required. Do not install an SDK or ask for secrets in chat.\n\n## Workflow\n\n1. Resolve the requested spoken text. For a sample of Junior's voice, use the bundled sample. Do not send unrelated private context or the full persona to the provider.\n2. Use the default `junior-v1` preset: a bright, warm, mischievous adult helper with dry humor. Use `--delivery plain` for serious or sensitive text. Do not present it as an imitation or recording of a real performer.\n3. Write narration to a UTF-8 file. Keep each clip at 1–5000 characters. Generation spends Gateway credits. Do not generate extra variants without a request.\n4. Generate to a fresh `.wav` path. Inspect an existing file before trying again. Do not automatically retry timeouts or failures: generation may already have spent credits.\n5. Use `sendFiles` to deliver the returned path as `audio\u002Fwav`. Say it is synthetic narration. For a video, measure the new audio and pass it to the rendering workflow; speech generation alone does not update the video.\n\n## Commands and Assets\n\n```sh\n# Local, no API call: show the reusable voice preset.\nnode scripts\u002Fspeech.mjs --profile\n\n# Paid: generate the bundled Junior sample.\nnode scripts\u002Fspeech.mjs --sample --output \u002Ftmp\u002Fjunior-sample.wav\n\n# Paid: generate requested narration.\nnode scripts\u002Fspeech.mjs --text-file \u002Ftmp\u002Fnarration.txt --output \u002Ftmp\u002Fnarration.wav\n\n# Paid: use the same voice without snark.\nnode scripts\u002Fspeech.mjs --text-file \u002Ftmp\u002Fincident.txt --output \u002Ftmp\u002Fincident.wav --delivery plain\n```\n\nRead `assets\u002Fjunior-v1.json` when the user asks how the voice is defined. Read `assets\u002Fsample.txt` when previewing the sample script. The script sends delivery instructions separately from text. Do not prepend those directions to narration.\n\nResults are JSON with path, bytes, MIME type, model, voice, profile, delivery, and synthetic status. Use `--help` for the command surface. No key argument is accepted.\n\n## Failures\n\n- Missing host key or HTTP 401\u002F403: ask the operator to check `AI_GATEWAY_API_KEY`, plugin registration, and team speech access, then redeploy. A missing key in the Sandbox is expected. Core's OIDC authentication is not reused by this manifest-only plugin.\n- HTTP 402: ask the operator to check credits and spending limits.\n- HTTP 404: report that the requested Gemini model is unavailable for the team. Do not silently choose a different model or provider.\n- Timeout, provider warning, or bad audio: stop and check Gateway usage before a user-authorized retry. Do not claim that an audio file was created or approved by listening.\n- Missing script or Node.js: report plugin setup failure. Do not improvise a token-bearing command.\n- Missing credentials: share the preset and script as a recipe, clearly labeled as not generated audio.\n","# Text to Speech\n\nUse the bundled `scripts\u002Fspeech.mjs` from this directory. Node.js and the installed plugin's host-managed Gateway key are required. Do not install an SDK or ask for secrets in chat.\n\n## Workflow\n\n1. Resolve the requested spoken text. For a sample of Junior's voice, use the bundled sample. Do not send unrelated private context or the full persona to the provider.\n2. Use the default `junior-v1` preset: a bright, warm, mischievous adult helper with dry humor. Use `--delivery plain` for serious or sensitive text. Do not present it as an imitation or recording of a real performer.\n3. Write narration to a UTF-8 file. Keep each clip at 1–5000 characters. Generation spends Gateway credits. Do not generate extra variants without a request.\n4. Generate to a fresh `.wav` path. Inspect an existing file before trying again. Do not automatically retry timeouts or failures: generation may already have spent credits.\n5. Use `sendFiles` to deliver the returned path as `audio\u002Fwav`. Say it is synthetic narration. For a video, measure the new audio and pass it to the rendering workflow; speech generation alone does not update the video.\n\n## Commands and Assets\n\n```sh\n# Local, no API call: show the reusable voice preset.\nnode scripts\u002Fspeech.mjs --profile\n\n# Paid: generate the bundled Junior sample.\nnode scripts\u002Fspeech.mjs --sample --output \u002Ftmp\u002Fjunior-sample.wav\n\n# Paid: generate requested narration.\nnode scripts\u002Fspeech.mjs --text-file \u002Ftmp\u002Fnarration.txt --output \u002Ftmp\u002Fnarration.wav\n\n# Paid: use the same voice without snark.\nnode scripts\u002Fspeech.mjs --text-file \u002Ftmp\u002Fincident.txt --output \u002Ftmp\u002Fincident.wav --delivery plain\n```\n\nRead `assets\u002Fjunior-v1.json` when the user asks how the voice is defined. Read `assets\u002Fsample.txt` when previewing the sample script. The script sends delivery instructions separately from text. Do not prepend those directions to narration.\n\nResults are JSON with path, bytes, MIME type, model, voice, profile, delivery, and synthetic status. Use `--help` for the command surface. No key argument is accepted.\n\n## Failures\n\n- Missing host key or HTTP 401\u002F403: ask the operator to check `AI_GATEWAY_API_KEY`, plugin registration, and team speech access, then redeploy. A missing key in the Sandbox is expected. Core's OIDC authentication is not reused by this manifest-only plugin.\n- HTTP 402: ask the operator to check credits and spending limits.\n- HTTP 404: report that the requested Gemini model is unavailable for the team. Do not silently choose a different model or provider.\n- Timeout, provider warning, or bad audio: stop and check Gateway usage before a user-authorized retry. Do not claim that an audio file was created or approved by listening.\n- Missing script or Node.js: report plugin setup failure. Do not improvise a token-bearing command.\n- Missing credentials: share the preset and script as a recipe, clearly labeled as not generated audio.\n",{"name":5,"description":7},"main","5abc4b2bad9bd5ffe7b7fe0352f0999c6ca9c601","packages\u002Fjunior-tts\u002Fskills\u002Ftts",45,"https:\u002F\u002Fgithub.com\u002Fgetsentry\u002Fjunior","https:\u002F\u002Fjunior.sentry.dev","https:\u002F\u002Fgithub.com\u002Fgetsentry","https:\u002F\u002Fsentry.io","Real-time crash reporting for your web apps, mobile apps, and games.","2026-11-12 03:57:34",{"source":8,"skillName":5,"commands":63,"prompt":73,"zipAvailable":74},[64,67,70],{"tool":65,"command":66},"npx","npx skills add getsentry\u002Fjunior --skill tts",{"tool":68,"command":69},"bunx","bunx skills add getsentry\u002Fjunior --skill tts",{"tool":71,"command":72},"pnpm","pnpm dlx skills add getsentry\u002Fjunior --skill tts","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fgetsentry\u002Fjunior\u002Fblob\u002Fmain\u002Fpackages\u002Fjunior-tts\u002Fskills\u002Ftts\u002FSKILL.md",true,[76,82,86,90,96,102,106],{"path":77,"resourceType":78,"resourceTypeDesc":79,"sizeBytes":80,"sourceHtmlUrl":81},"assets\u002Fgame-development-workflow.mmd","ASSET","资产文件",2982,"https:\u002F\u002Fgithub.com\u002Fendman100\u002Fskill-router-nexus\u002Fblob\u002Fmain\u002FProject-Management\u002Fgame-development-workflow\u002Fassets\u002Fgame-development-workflow.mmd",{"path":83,"resourceType":78,"resourceTypeDesc":79,"sizeBytes":84,"sourceHtmlUrl":85},"assets\u002Fjunior-v1.json",826,"https:\u002F\u002Fgithub.com\u002Fgetsentry\u002Fjunior\u002Fblob\u002Fmain\u002Fpackages\u002Fjunior-tts\u002Fskills\u002Ftts\u002Fassets\u002Fjunior-v1.json",{"path":87,"resourceType":78,"resourceTypeDesc":79,"sizeBytes":88,"sourceHtmlUrl":89},"assets\u002Fsample.txt",213,"https:\u002F\u002Fgithub.com\u002Fgetsentry\u002Fjunior\u002Fblob\u002Fmain\u002Fpackages\u002Fjunior-tts\u002Fskills\u002Ftts\u002Fassets\u002Fsample.txt",{"path":91,"resourceType":92,"resourceTypeDesc":93,"sizeBytes":94,"sourceHtmlUrl":95},"references\u002Fstage-gates.md","REFERENCE","参考文档",6885,"https:\u002F\u002Fgithub.com\u002Fendman100\u002Fskill-router-nexus\u002Fblob\u002Fmain\u002FProject-Management\u002Fgame-development-workflow\u002Freferences\u002Fstage-gates.md",{"path":97,"resourceType":98,"resourceTypeDesc":99,"sizeBytes":100,"sourceHtmlUrl":101},"scripts\u002Fspeech.mjs","SCRIPT","脚本",6001,"https:\u002F\u002Fgithub.com\u002Fgetsentry\u002Fjunior\u002Fblob\u002Fmain\u002Fpackages\u002Fjunior-tts\u002Fskills\u002Ftts\u002Fscripts\u002Fspeech.mjs",{"path":103,"resourceType":92,"resourceTypeDesc":93,"sizeBytes":104,"sourceHtmlUrl":105},"SOURCES.md",2051,"https:\u002F\u002Fgithub.com\u002Fgetsentry\u002Fjunior\u002Fblob\u002Fmain\u002Fpackages\u002Fjunior-tts\u002Fskills\u002Ftts\u002FSOURCES.md",{"path":107,"resourceType":92,"resourceTypeDesc":93,"sizeBytes":108,"sourceHtmlUrl":109},"SPEC.md",1633,"https:\u002F\u002Fgithub.com\u002Fgetsentry\u002Fjunior\u002Fblob\u002Fmain\u002Fpackages\u002Fjunior-tts\u002Fskills\u002Ftts\u002FSPEC.md",[111,139,167,190,214,232],{"skillNo":112,"name":31,"nameZh":6,"description":113,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":114,"categories":115,"keywords":119,"publishedAt":47},"01M6CT5E87W8P93FGAVYDWD6RD","Build, review, or update Junior extension skills and plugins. Use when users ask to create a Junior SKILL.md, app skill, plugin, plugin.yaml, packaged plugin, MCP-backed plugin, OAuth or credentialed plugin, or to validate Junior extension files. Do not use for ordinary Junior usage, provider workflows, generic code editing, or non-Junior agent-skill authoring.","https:\u002F\u002Fgithub.com\u002Fgetsentry\u002Fjunior\u002Fblob\u002Fmain\u002Fskills\u002Fjunior\u002FSKILL.md",[116],{"categoryNo":117,"categoryName":118,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",[31,32,120,121,122,123,124,38,125,126,127,128,129,130,131,132,133,134,135,136,137,25,138],"provider","editing","skill authoring","files","MCP","OAuth","workflows","ask","code","review","create","plugin","build","update","app","usage","users","generic","when",{"skillNo":140,"name":141,"nameZh":6,"description":142,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":143,"categories":144,"keywords":149,"publishedAt":47},"01M6CT5AQRDSG19SBJACXGPMY9","junior-qa","Validate Junior changes through local app-facing paths. Use for local client or agent QA, dashboard mock reporting UI QA, sharing a preview URL of a running UI, Docker sandbox provider QA (also from inside a Vercel Sandbox), PR readiness, plugin CLI commands, skill\u002Ftool\u002Fprompt\u002Fplugin behavior, and behavior that tests do not cover well but can be exercised with `pnpm cli -- chat ...`, another `pnpm cli` command, or `JUNIOR_DASHBOARD_MOCK_CONVERSATIONS=true pnpm dev`.","https:\u002F\u002Fgithub.com\u002Fgetsentry\u002Fjunior\u002Fblob\u002Fmain\u002Fskills\u002Fjunior-qa\u002FSKILL.md",[145,148],{"categoryNo":146,"categoryName":147,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000011","运维与部署",{"categoryNo":117,"categoryName":118,"taxonomyType":21,"taxonomyTypeDesc":22},[150,151,31,134,152,153,154,155,156,157,158,159,160,161,162,163,164,165,71,166],"qa","junior qa","conversations","local","URL","preview","dashboard","cli","command","reporting","pr readiness","commands","paths","cover","ui","but","running",{"skillNo":168,"name":169,"nameZh":6,"description":170,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":171,"categories":172,"keywords":174,"publishedAt":47},"01M6CT58D1SJNFZ19ZXK64ZX0R","eval-auth","Use for `\u002Feval-auth` requests in MCP auth-resume integration tests. Always connect through the disclosed MCP tool before answering, then continue the user's actual request using prior thread context when needed.","https:\u002F\u002Fgithub.com\u002Fgetsentry\u002Fjunior\u002Fblob\u002Fmain\u002Fpackages\u002Fjunior\u002Ftests\u002Ffixtures\u002Fplugins\u002Feval-auth\u002Fskills\u002Feval-auth\u002FSKILL.md",[173],{"categoryNo":117,"categoryName":118,"taxonomyType":21,"taxonomyTypeDesc":22},[175,176,177,178,179,180,181,182,124,38,183,184,185,186,25,187,188,189,138],"eval auth","auth","eval","resume","integration tests","tool","integration","continue","connect","user","context","requests","request","tests","thread",{"skillNo":191,"name":192,"nameZh":6,"description":193,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":194,"categories":195,"keywords":196,"publishedAt":47},"01M6CT55MZKCVBJH2X7T1HCRPX","jr-rpc","Manage low-level config and plugin introspection flows via jr-rpc bash commands. Use only when the user explicitly asks to read or update provider defaults\u002Fconfig or list installed plugins. Do not use for PR, branch, push, or auth-order questions; load the matching provider skill instead.","https:\u002F\u002Fgithub.com\u002Fgetsentry\u002Fjunior\u002Fblob\u002Fmain\u002Fpackages\u002Fjunior\u002Fskills\u002Fjr-rpc\u002FSKILL.md",[],[197,198,32,199,131,200,201,202,176,120,203,133,204,205,206,207,208,38,209,184,25,210,211,138,212,213],"jr rpc","rpc","branch","push","pr","introspection","manage","read","config","plugins","only","list","Bash","flows","load","via","questions",{"skillNo":215,"name":216,"nameZh":6,"description":217,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":218,"categories":219,"keywords":220,"publishedAt":47},"01M6PQN1EZPHRJ5XAJP2J3ZS2T","xdotcom","Read public X (Twitter) data through the read-only X API v2. Use when users share an x.com or twitter.com link, or ask what someone posted on X, what people are saying about a topic, product, or launch on X, how much chatter something got, or for a post's text, metrics, replies, or an account's recent posts. Do not use it to post, reply, like, repost, follow, or send DMs, or to read private or protected data.","https:\u002F\u002Fgithub.com\u002Fgetsentry\u002Fjunior\u002Fblob\u002Fmain\u002Fpackages\u002Fjunior-xdotcom\u002Fskills\u002Fxdotcom\u002FSKILL.md",[],[216,32,221,25,222,223,224,225,207,226,38,227,127,209,228,229,230,136,39,231,138],"posts","read-only","x api","send","twitter","chatter","people","api","share","replies","post",{"skillNo":233,"name":37,"nameZh":6,"description":234,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":235,"categories":236,"keywords":237,"publishedAt":47},"01M6CT5386D90KE6YH8Q8WGQZ0","Deploy and inspect Vercel apps, assign aliases, delete deployments, investigate logs, and monitor deployment outcomes. Use for Vercel deployment and log requests, not GitHub code changes or other cloud providers.","https:\u002F\u002Fgithub.com\u002Fgetsentry\u002Fjunior\u002Fblob\u002Fmain\u002Fpackages\u002Fjunior-vercel\u002Fskills\u002Fvercel\u002FSKILL.md",[],[37,238,239,240,241,242,243,244,245,246,247,38,248,128,249,250,251,25,252,253,254,255,186],"investigate","delete","outcomes","github","deployment","monitor","vercel deployment","github code","deployments","cloud","deploy","Providers","logs","log","inspect","assign","apps","changes"]