[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6FKXEJPRFF6Y9VARJS6JP6T":3,"skill-same:01M6FKXEJPRFF6Y9VARJS6JP6T":186},{"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},"01M6FKXEJPRFF6Y9VARJS6JP6T","create-video",null,"Produces narrated Aspire videos (feature walkthroughs, dashboard tours, integration overviews, pull request demos) with one unified look and specification - 1080p, the Aspire logo and purple palette from aspire.dev, a neural voice picked from a shortlist, captions, slight dynamic zooms on demos, and renditions for GitHub, aspire.dev, YouTube or chat apps. Use when asked to record, narrate, or produce a video of Aspire, its dashboard or its CLI: narrated and branded by default, or silent or unbranded when the user asks for a simpler video.","microsoft\u002Faspire","microsoft","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F6154722?v=4","01M698VYDXZ6JW5WH3CRV650R8","Microsoft","01M6FKTZ7ND1S9JN6JTVK7A7MD",6426,"MIT","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Faspire\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fcreate-video\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000016","图像与多媒体","SCENARIO","使用场景",[24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46],"create","create video","Video","Neural","when","request","for","palette","demos","apps","feature","specification","default","youtube","cli","use","logo","Captions","produce","pull","dev","aspire","dashboard","2026-11-10 10:12:30",false,"---\nname: create-video\ndescription: >-\n  Produces narrated Aspire videos (feature walkthroughs, dashboard tours, integration overviews, pull request demos)\n  with one unified look and specification - 1080p, the Aspire logo and purple palette from aspire.dev, a neural voice\n  picked from a shortlist, captions, slight dynamic zooms on demos, and renditions for GitHub, aspire.dev, YouTube or\n  chat apps. Use when asked to record, narrate, or produce a video of Aspire, its dashboard or its CLI: narrated and\n  branded by default, or silent or unbranded when the user asks for a simpler video.\n---\n\n# Create an Aspire video\n\nEvery Aspire video looks the same: the same branding, layout, captions, zooms, and encodings. The user picks the\nnarrator, the renditions, and whether sections get chapter cards (step 0).\nThis skill holds that specification and the scripts that apply it. It's adapted from the Orchard Core video producer\nskill (BSD 3-Clause License, see \"Orchard Core\" in the repository's `THIRD-PARTY-NOTICES.TXT`). **Don't change the specification for a single\nvideo.** If it must change, change it here, in `scripts\u002FBrand.cs`, `scripts\u002FSpeech.cs` and `scripts\u002FAssembly.cs`,\nand in `references\u002Fspecs.md`, so every later video follows.\n\n## When to use it\n\nBy default, a video is narrated and branded: walkthroughs, overviews, tours and demos with a voice, captions, cards\nand slides. A simpler video turns those off, in the storyboard:\n\n- **No narration** (`\"narration\": false`): a silent video, without captions; each step lasts its `\"seconds\"`.\n- **No branding** (`\"branding\": false`): no Aspire logo and no Aspire color. Recordings fill the whole frame, cards\n  are white text on black, and the recorder's highlight rings, click ripples and captions are white and black.\n\nFor a simpler video, ask only what it needs (usually the renditions), skip the voice and chapter-card questions, and\ndon't add cards, slides or narration the user didn't ask for. Any other layout, such as two runs side by side, comes\nfrom the user's request: build it for that video (for instance with ffmpeg, from recordings made with this skill's\nrecorder), rather than from a preset. When it isn't clear what the user wants, ask.\n\nThe worked example in `examples\u002Fdashboard-tour\u002F` is the storyboard and slides of a short tour of the Aspire\ndashboard, matching the example clip in `scripts\u002Frecorder\u002FScenes.cs`. Read it before writing a new one.\n\n## The specification, in short\n\n| | |\n|---|---|\n| Output | 1920x1080, 30 fps, H.264 (`-tune stillimage`), `+faststart`, in the renditions the user picks: `web` (1080p, **under 10 MB**, the default), `hd` (1080p, best quality), `light` (720p, under 5 MB) |\n| Recording | Chromium at 1536x864 CSS pixels, device scale 1.25, dark color scheme, en-US, shown at 1728x972 in a purple frame |\n| Branding | The aspire.dev dark theme (`#1F1E33`) with purple and magenta glows, the Aspire logo (symbol and white \"Aspire\" name), the system UI and monospace fonts (Segoe UI and Cascadia Mono on Windows, Helvetica Neue and Menlo on macOS) |\n| Colors | Purple `#512BD4` (pills), primary `#7455DD` (accents, frame, highlights, cursor clicks), secondary `#B9AAEE`, muted `#DCD5F6`, black `#1F1E33`, white |\n| Voice | The narrator the user picks from a shortlist (default `en-US-AndrewMultilingualNeural`), rate `+2%`, through the `msedge-tts` npm package (`scripts\u002Ftts\u002Ftts.mjs`) |\n| Structure | Opening card, numbered chapters (an optional chapter card + slides or recordings), closing card |\n| Zooms | Slight (1.25x), eased zooms on what each recorded step points at, rendered by the assembly |\n| Captions | WebVTT and SRT, from the narration, at most about 13 words each |\n\nThe full specification, with every value and the reasons behind them, is in `references\u002Fspecs.md`.\n\n## Prerequisites\n\n- .NET SDK 10.0.300 or later: the tools (`scripts\u002Fvideo.cs`) and the recorder (`scripts\u002Frecorder\u002Frecorder.cs`, with\n  Playwright for .NET) are .NET file-based apps, split with `#:include`. Install the recorder's browser once: `dotnet\n  run \u003Ctools>\u002Frecorder\u002Frecorder.cs -- install` (the Chromium build of the recorder's Playwright version).\n- Node.js 22 or later (24 LTS recommended), for the voice. Its package, `msedge-tts`, is pinned in `scripts\u002Ftts\u002Fpackage.json` and\n  `package-lock.json`, and installed from the lockfile: `npm ci --prefix \u003Ctools>\u002Ftts`. Microsoft changes the speech\n  service's handshake from time to time: when every request fails with a 403, update `msedge-tts` (Dependabot\n  proposes new versions).\n- ffmpeg 7 or later, with the libx264 encoder, on the `PATH` (or named by `FFMPEG`): `winget install Gyan.FFmpeg`,\n  `brew install ffmpeg`, or `sudo apt install ffmpeg`.\n- The Aspire CLI and a throwaway sample app to record: see `references\u002Frecording.md`.\n- Internet access for the voice (`msedge-tts` calls the Microsoft Edge speech service).\n- Docker (or Podman) running, when the app to record has container resources.\n\nCheck these first. If one is missing, tell the user what to install rather than working around it.\n\n`\u003Cskill>` below is the folder of this skill, and `\u003Ctools>` the copy of its `scripts` folder in the workspace (step 1).\nEvery package the tools use is pinned to an exact version: the NuGet packages in `scripts\u002FDirectory.Packages.props`\n(central package management, for both file-based apps), the npm packages in `scripts\u002Ftts\u002Fpackage-lock.json`. Nothing\ninstalls a missing prerequisite on its own: the tools stop and say what to install. Run the tools with `dotnet run \u003Ctools>\u002Fvideo.cs -- \u003Ccommand> ...`; the first run\nbuilds them (a few seconds), and later runs reuse the build.\n\n## Workflow\n\n### 0. Understand the request\n\nThe user describes what the video is about; everything else comes from this skill. Work out:\n\n- **The subject**: a feature, an integration, the dashboard, the CLI, or the change of a pull request.\n- **The kind**: an overview (4 to 9 minutes, the outline of `references\u002Fstoryboard.md`) or a pull request demo\n  (shorter: an opening card, the recordings, a closing card).\n- **What to show**: the app or the pull request branch to record, and the code for the slides.\n- **Which Aspire runs it**: the installed `aspire` CLI (the default), a released version, or the current branch of\n  the Aspire repository, to show a feature still in development. See \"Which Aspire runs the app\" in\n  `references\u002Frecording.md`. Ask when the subject is new or unreleased: recording it needs the current branch.\n- **Where it goes**: aspire.dev, a pull request, or only the file.\n\nAsk only about what you can't infer. Then ask the user these three, together, as multiple-choice questions (with the\nquestion tool when the session has one), unless they already said:\n\n1. **Renditions** (several can be picked): `web`, 1080p under 10 MB, for GitHub pull requests and aspire.dev (the\n   default); `hd`, 1080p at the best quality, for YouTube, conferences or editing; `light`, 720p under 5 MB, for\n   Teams, Slack, email or phones. Recommend from where the video goes. See \"Renditions\" in `references\u002Fspecs.md`;\n   there is no vertical or 4K rendition.\n2. **Voice**: the shortlist of \"Voice\" in `references\u002Fspecs.md`, Andrew (the default) first. Offer a sample before\n   they choose: `dotnet run \u003Ctools>\u002Fvideo.cs -- voices \u003Cworkspace>\u002Fvoices.mp4` reads one line in each voice of the\n   shortlist (or in the voices given), on cards that name them. Send it, and use the voice they pick. For another\n   voice or language, pick from `dotnet run \u003Ctools>\u002Fvideo.cs -- voices --list \u003Cprefix>` (such as `es-`): only the voices\n   it lists work.\n3. **Chapter cards**: a card between sections (\"Chapter 2, The resources\"), or none, for a quicker video. Recommend\n   cards for overviews of 3 minutes or more, none for short videos and pull request demos.\n\nWrite the answers into the storyboard: `renditions`, `voice`, `chapterCards`. To test the skill itself, produce\n`examples\u002Fdashboard-tour` as it is.\n\n### 1. Create a workspace outside any repository\n\nUse the session's scratchpad or a temp folder, never a repository: frames and audio are large, and the tools must not\npick up a repository's build settings or package sources. Copy the skill's `scripts` folder into it as `tools`,\ninstall the voice package, and work from the workspace:\n\n```bash\ncp -R \u003Cskill>\u002Fscripts \u003Cworkspace>\u002Ftools\nnpm ci --prefix \u003Cworkspace>\u002Ftools\u002Ftts\ncd \u003Cworkspace>\n```\n\n**Run every command of the steps below from the workspace.** The .NET CLI picks its SDK from the `global.json`\nnearest the current directory, not the script's: from inside a repository, such as the Aspire checkout (which pins a\npreview SDK), `dotnet run \u003Ctools>\u002F...` would use that repository's SDK, or fail without it.\n\n```text\n\u003Cworkspace>\u002F\n  storyboard.json   the chapters, clips, narration and slides (see references\u002Fstoryboard.md)\n  slides\u002F           the code shown on slides, if any (\"source\" of a code panel)\n  tools\u002F            a copy of the skill's scripts: video.cs, tts\u002F, and recorder\u002F with your scenes in Scenes.cs\n  app\u002F              the throwaway Aspire app to record, if the video shows one\n  audio\u002F            generated: one mp3 per step\n  durations.json    generated: the length of each step's narration\n  clips\u002F\u003Cclip>\u002F     generated: the frames and timeline.json of each recording\n  build\u002F            generated: intermediate segments, and master.mp4\n  \u003Coutput>.mp4\u002F.vtt\u002F.srt   the result\n```\n\nStart from `examples\u002Fdashboard-tour\u002Fstoryboard.json` and its `slides\u002F` folder.\n\n### 2. Write the storyboard\n\nRead `references\u002Fstoryboard.md` first. In short:\n\n- Write for the long term: say \"the Aspire dashboard\", never \"the new dashboard\", \"now\", \"in this release\", or version\n  numbers, so the video stays accurate for years.\n- One idea per step, one to three sentences, spoken in the present tense. A step is what the viewer sees while it plays.\n- Chapters: why it exists, each feature, how to configure it in the AppHost, how to adopt or extend it.\n\nShow the user the outline and the narration before generating anything, unless they asked you to go straight\nthrough: changing the text after recording means recording again.\n\n### 3. Generate the narration\n\n```bash\ndotnet run \u003Ctools>\u002Fvideo.cs -- narrate \u003Cworkspace>\n```\n\nIt writes `audio\u002F` and `durations.json`. Run it again after any change to the text: only the changed steps are\ngenerated again. **Record after narrating**, since the recorder holds each step for the length of its narration.\n\nIf the voice mispronounces a word, add it to `s_spoken` in `scripts\u002FSpeech.cs` (for every video) or to `\"spoken\"` in\nthe storyboard (for this one). The captions keep the written form. **Have a person confirm a new spelling before\nusing it**: make a pronunciation sample, a few seconds per candidate spelling, and ask which option sounds right.\nRebuilding a whole video to try a spelling wastes minutes per attempt. Pass the storyboard, so the sample uses the\nvideo's voice and rate (or `--voice` and `--rate`): a spelling that works for one voice can fail with another.\n\n```bash\ndotnet run \u003Ctools>\u002Fvideo.cs -- pronounce --storyboard \u003Cworkspace>\u002Fstoryboard.json otlp.mp4 \"The dashboard receives {} telemetry from every resource.\" \"OTLP\" \"O.T.L.P.\" \"O-T-L-P\" \"O T L P\"\n```\n\nLetters said one by one are written as an abbreviation with periods, such as \"A.S.P.\": the voice spells it at an\neven pace. With spaces (\"A S P\"), the letters run together; with commas (\"A, S, P\"), the pauses are uneven.\n\"ASP.NET\" is spoken as \"A.S.P. .NET\".\n\n### 4. Record the clips\n\nStart the sample app (`aspire run`), then write one method per \"clip\" in `tools\u002Frecorder\u002FScenes.cs`, with one\n`scene.StepAsync(\"\u003Cstep id>\", ...)` per step, in the storyboard's order. See `references\u002Frecording.md` for the app\nto record, the scene API, and the pitfalls. Wait until every resource is Running and healthy, and generate some\ntraffic so logs, traces and metrics have data. Then:\n\nEach workspace's copy of the recorder builds into its own folder, so several videos can be recorded side by side.\n\n```bash\nexport VIDEO_ROOT=\u003Cworkspace> VIDEO_BASE_URL=https:\u002F\u002Flocalhost:17010\nexport VIDEO_LOGIN_URL='\u003Cthe dashboard login URL that aspire run prints>'\ndotnet run \u003Ctools>\u002Frecorder\u002Frecorder.cs -- setup          # logs in to the dashboard, once per run of the app\ndotnet run \u003Ctools>\u002Frecorder\u002Frecorder.cs -- probe \u002F \"...\"  # checks each selector of Scenes.cs before recording\ndotnet run \u003Ctools>\u002Frecorder\u002Frecorder.cs -- record all     # or the names of some clips\ndotnet run \u003Ctools>\u002Fvideo.cs -- review \u003Cworkspace> \u003Cclip>\n```\n\nLook at every contact sheet (`shots\u002F\u003Cclip>.jpg`) before assembling: the frame at the end of each step must show what\nits narration describes, and no caption may cover what the narration names.\n\nTo make several versions of one video (30 seconds, 1 minute, 3 minutes), use one workspace per version, with its own\nstoryboard, slides and recorder, and record them all from the same running app.\n\n### 5. Assemble\n\n```bash\ndotnet run \u003Ctools>\u002Fvideo.cs -- slides \u003Cworkspace>     # renders the slides to shots\u002Fslides\u002F, to check them first\ndotnet run \u003Ctools>\u002Fvideo.cs -- assemble \u003Cworkspace>\n```\n\nIt writes one file per rendition (`\u003Coutput>.mp4` for `web`, `\u003Coutput>-hd.mp4`, `\u003Coutput>-light.mp4`), and prints\nthe length and the size of each. If one is over its limit, shorten the video, or raise its CRF one step at a time\n(`CRF=34` for `web`, `CRF_LIGHT=31` for `light`) and check that text stays readable. Extract a few frames with ffmpeg\nand look at them: a recording, a slide with code, a card, and a recording while it's zoomed in.\n\n### 6. Publish\n\n- **aspire.dev** (`microsoft\u002Faspire.dev`, an Astro Starlight site): put `\u003Cname>.mp4`, `\u003Cname>.vtt` and a poster\n  (`build\u002F\u003Copening card>.png` saved as JPEG) in `src\u002Ffrontend\u002Fpublic\u002Fvideos\u002F`, and embed it under the introduction of\n  the `.mdx` page:\n\n  ```html\n  \u003Cvideo controls preload=\"metadata\" width=\"100%\" poster=\"\u002Fvideos\u002F\u003Cname>.jpg\">\n      \u003Csource src=\"\u002Fvideos\u002F\u003Cname>.mp4\" type=\"video\u002Fmp4\" \u002F>\n      \u003Ctrack kind=\"captions\" src=\"\u002Fvideos\u002F\u003Cname>.vtt\" srclang=\"en\" label=\"English\" \u002F>\n      Your browser does not support embedded videos. \u003Ca href=\"\u002Fvideos\u002F\u003Cname>.mp4\">Download the video\u003C\u002Fa>.\n  \u003C\u002Fvideo>\n  ```\n\n  Don't use the `LoopingVideo` component for narrated videos: it autoplays muted, without captions. Introduce the\n  video with one sentence that says what it covers, without \"new\". Build the site locally, following the\n  repository's README, and check the page.\n- **Pull request**: GitHub only accepts videos through its web uploader (drag and drop, or the attachment button\n  of the description editor), up to 10 MB on free plans. The upload gives a `https:\u002F\u002Fgithub.com\u002Fuser-attachments\u002Fassets\u002F...`\n  URL: put it alone on a line near the top of the description, so GitHub shows a player.\n\n### 7. Clean up\n\nStop the app you recorded: `aspire stop` from `\u003Cworkspace>\u002Fapp`, or Ctrl+C in the terminal running it. An app\nstarted in the background may ignore an interrupt (SIGINT): stop its processes with SIGTERM, and only those whose\ncommand line names its workspace.\n`aspire stop` removes the app's containers within about 20 seconds; after that, any left over outlived it: check\n`docker ps -a` and remove them (`docker rm -f \u003Cname>`, such as `cache-\u003Csuffix>`).\nKeep the throwaway project and the workspace until step 8 has copied their sources and the user has accepted the\nvideo, in case a step must be re-recorded; remove the project after that.\n\n### 8. Deliver\n\nGive the user `\u003Coutput>.mp4` (send the file when the session can), and end with a summary that lists, for each video:\n\n- **A link to each rendition**, as a clickable link to its absolute path (`[\u003Coutput>.mp4](\u002Fabs\u002Fpath\u002F\u003Coutput>.mp4)`),\n  with its length, its resolution, its size, its voice, and its language. Copy the videos and their captions out of a temporary workspace, to a\n  folder the user can open (such as `\u003Cworking directory>\u002F\u003Cname>-videos\u002F`), and link to the copies: a temporary folder is\n  temporary.\n- **Links to its captions**: `\u003Coutput>.vtt` and `\u003Coutput>.srt`.\n- **The path to its workspace**, with links to `storyboard.json` (the narration and slides), and the\n  recorder's `Scenes.cs`, so the user can change the text or a clip and produce the video again. When the workspace\n  is in a temporary folder, also copy its sources next to the videos (`\u003Cname>-videos\u002Fworkspaces\u002F`: the storyboards,\n  `slides\u002F`, `tools\u002F` without `tts\u002Fnode_modules`, `bin` and `obj`, and the app without `node_modules`, `bin`, `obj` and\n  `aspire-output`), and link to both: the copy outlives the session, the workspace keeps the frames and audio.\n- **Shared files**, when several videos use them: the sample app, the recorder, and any settings or AppHost versions\n  the clips copy in.\n\nEnd with the commands that produce a video again from its workspace (`video.cs narrate`, `recorder.cs record`, `video.cs\nassemble`).\n\n## Improving the skill\n\nWhen a script fails, a selector breaks with a newer dashboard, a slide overflows, or a reference is wrong or unclear,\nfix it here, in the skill (scripts, references or example), not only in the workspace, so the next video benefits.\nWhen an external tool misbehaves (VS Code, the Aspire CLI, a package, the voice service), add the symptom, the cause and\nthe fix to `references\u002Ftroubleshooting.md`.\nTell the user what you changed. Never change the specification (colors, fonts, layout, voice, encoding) without the\nuser's agreement.\n\n## References\n\n- `references\u002Fspecs.md`: the full specification.\n- `references\u002Fstoryboard.md`: the storyboard format, and how to write the narration and the slides.\n- `references\u002Frecording.md`: the app to record, the recorder, the scene API, and pitfalls.\n- `references\u002Ftroubleshooting.md`: problems with external tools (VS Code in the browser, the Aspire CLI, NuGet\n  packages, the dashboard, the voice), with their fixes. Check it before debugging one, and add what you find.\n- `scripts\u002Fvideo.cs`: the tools, a .NET file-based app: `narrate`, `voices`, `pronounce`, `slides`, `assemble`,\n  `review`. `Brand.cs` holds the branding and layout, `Slides.cs` the slides, `Speech.cs` the voice, `Assembly.cs` the\n  assembly, and `Media.cs` the calls to ffmpeg and Node.js.\n- `scripts\u002Ftts\u002F`: the voice (`tts.mjs`), with its pinned npm package.\n- `scripts\u002Frecorder\u002F`: the recorder, a Playwright for .NET file-based app, with helpers for VS Code in the browser\n  (`VsCode.cs`, `vscode-settings.jsonc`) and for the dashboard (`Dashboard.cs`).\n- `scripts\u002Fassets\u002F`: the Aspire logo, from aspire.dev.\n- `cgmanifest.json`: the components the skill uses that component detection can't find: the packages of `video.cs`,\n  and Orchard Core, which the skill is adapted from.\n- `examples\u002Fdashboard-tour\u002F`: a complete storyboard, with slides.\n","# Create an Aspire video\n\nEvery Aspire video looks the same: the same branding, layout, captions, zooms, and encodings. The user picks the\nnarrator, the renditions, and whether sections get chapter cards (step 0).\nThis skill holds that specification and the scripts that apply it. It's adapted from the Orchard Core video producer\nskill (BSD 3-Clause License, see \"Orchard Core\" in the repository's `THIRD-PARTY-NOTICES.TXT`). **Don't change the specification for a single\nvideo.** If it must change, change it here, in `scripts\u002FBrand.cs`, `scripts\u002FSpeech.cs` and `scripts\u002FAssembly.cs`,\nand in `references\u002Fspecs.md`, so every later video follows.\n\n## When to use it\n\nBy default, a video is narrated and branded: walkthroughs, overviews, tours and demos with a voice, captions, cards\nand slides. A simpler video turns those off, in the storyboard:\n\n- **No narration** (`\"narration\": false`): a silent video, without captions; each step lasts its `\"seconds\"`.\n- **No branding** (`\"branding\": false`): no Aspire logo and no Aspire color. Recordings fill the whole frame, cards\n  are white text on black, and the recorder's highlight rings, click ripples and captions are white and black.\n\nFor a simpler video, ask only what it needs (usually the renditions), skip the voice and chapter-card questions, and\ndon't add cards, slides or narration the user didn't ask for. Any other layout, such as two runs side by side, comes\nfrom the user's request: build it for that video (for instance with ffmpeg, from recordings made with this skill's\nrecorder), rather than from a preset. When it isn't clear what the user wants, ask.\n\nThe worked example in `examples\u002Fdashboard-tour\u002F` is the storyboard and slides of a short tour of the Aspire\ndashboard, matching the example clip in `scripts\u002Frecorder\u002FScenes.cs`. Read it before writing a new one.\n\n## The specification, in short\n\n| | |\n|---|---|\n| Output | 1920x1080, 30 fps, H.264 (`-tune stillimage`), `+faststart`, in the renditions the user picks: `web` (1080p, **under 10 MB**, the default), `hd` (1080p, best quality), `light` (720p, under 5 MB) |\n| Recording | Chromium at 1536x864 CSS pixels, device scale 1.25, dark color scheme, en-US, shown at 1728x972 in a purple frame |\n| Branding | The aspire.dev dark theme (`#1F1E33`) with purple and magenta glows, the Aspire logo (symbol and white \"Aspire\" name), the system UI and monospace fonts (Segoe UI and Cascadia Mono on Windows, Helvetica Neue and Menlo on macOS) |\n| Colors | Purple `#512BD4` (pills), primary `#7455DD` (accents, frame, highlights, cursor clicks), secondary `#B9AAEE`, muted `#DCD5F6`, black `#1F1E33`, white |\n| Voice | The narrator the user picks from a shortlist (default `en-US-AndrewMultilingualNeural`), rate `+2%`, through the `msedge-tts` npm package (`scripts\u002Ftts\u002Ftts.mjs`) |\n| Structure | Opening card, numbered chapters (an optional chapter card + slides or recordings), closing card |\n| Zooms | Slight (1.25x), eased zooms on what each recorded step points at, rendered by the assembly |\n| Captions | WebVTT and SRT, from the narration, at most about 13 words each |\n\nThe full specification, with every value and the reasons behind them, is in `references\u002Fspecs.md`.\n\n## Prerequisites\n\n- .NET SDK 10.0.300 or later: the tools (`scripts\u002Fvideo.cs`) and the recorder (`scripts\u002Frecorder\u002Frecorder.cs`, with\n  Playwright for .NET) are .NET file-based apps, split with `#:include`. Install the recorder's browser once: `dotnet\n  run \u003Ctools>\u002Frecorder\u002Frecorder.cs -- install` (the Chromium build of the recorder's Playwright version).\n- Node.js 22 or later (24 LTS recommended), for the voice. Its package, `msedge-tts`, is pinned in `scripts\u002Ftts\u002Fpackage.json` and\n  `package-lock.json`, and installed from the lockfile: `npm ci --prefix \u003Ctools>\u002Ftts`. Microsoft changes the speech\n  service's handshake from time to time: when every request fails with a 403, update `msedge-tts` (Dependabot\n  proposes new versions).\n- ffmpeg 7 or later, with the libx264 encoder, on the `PATH` (or named by `FFMPEG`): `winget install Gyan.FFmpeg`,\n  `brew install ffmpeg`, or `sudo apt install ffmpeg`.\n- The Aspire CLI and a throwaway sample app to record: see `references\u002Frecording.md`.\n- Internet access for the voice (`msedge-tts` calls the Microsoft Edge speech service).\n- Docker (or Podman) running, when the app to record has container resources.\n\nCheck these first. If one is missing, tell the user what to install rather than working around it.\n\n`\u003Cskill>` below is the folder of this skill, and `\u003Ctools>` the copy of its `scripts` folder in the workspace (step 1).\nEvery package the tools use is pinned to an exact version: the NuGet packages in `scripts\u002FDirectory.Packages.props`\n(central package management, for both file-based apps), the npm packages in `scripts\u002Ftts\u002Fpackage-lock.json`. Nothing\ninstalls a missing prerequisite on its own: the tools stop and say what to install. Run the tools with `dotnet run \u003Ctools>\u002Fvideo.cs -- \u003Ccommand> ...`; the first run\nbuilds them (a few seconds), and later runs reuse the build.\n\n## Workflow\n\n### 0. Understand the request\n\nThe user describes what the video is about; everything else comes from this skill. Work out:\n\n- **The subject**: a feature, an integration, the dashboard, the CLI, or the change of a pull request.\n- **The kind**: an overview (4 to 9 minutes, the outline of `references\u002Fstoryboard.md`) or a pull request demo\n  (shorter: an opening card, the recordings, a closing card).\n- **What to show**: the app or the pull request branch to record, and the code for the slides.\n- **Which Aspire runs it**: the installed `aspire` CLI (the default), a released version, or the current branch of\n  the Aspire repository, to show a feature still in development. See \"Which Aspire runs the app\" in\n  `references\u002Frecording.md`. Ask when the subject is new or unreleased: recording it needs the current branch.\n- **Where it goes**: aspire.dev, a pull request, or only the file.\n\nAsk only about what you can't infer. Then ask the user these three, together, as multiple-choice questions (with the\nquestion tool when the session has one), unless they already said:\n\n1. **Renditions** (several can be picked): `web`, 1080p under 10 MB, for GitHub pull requests and aspire.dev (the\n   default); `hd`, 1080p at the best quality, for YouTube, conferences or editing; `light`, 720p under 5 MB, for\n   Teams, Slack, email or phones. Recommend from where the video goes. See \"Renditions\" in `references\u002Fspecs.md`;\n   there is no vertical or 4K rendition.\n2. **Voice**: the shortlist of \"Voice\" in `references\u002Fspecs.md`, Andrew (the default) first. Offer a sample before\n   they choose: `dotnet run \u003Ctools>\u002Fvideo.cs -- voices \u003Cworkspace>\u002Fvoices.mp4` reads one line in each voice of the\n   shortlist (or in the voices given), on cards that name them. Send it, and use the voice they pick. For another\n   voice or language, pick from `dotnet run \u003Ctools>\u002Fvideo.cs -- voices --list \u003Cprefix>` (such as `es-`): only the voices\n   it lists work.\n3. **Chapter cards**: a card between sections (\"Chapter 2, The resources\"), or none, for a quicker video. Recommend\n   cards for overviews of 3 minutes or more, none for short videos and pull request demos.\n\nWrite the answers into the storyboard: `renditions`, `voice`, `chapterCards`. To test the skill itself, produce\n`examples\u002Fdashboard-tour` as it is.\n\n### 1. Create a workspace outside any repository\n\nUse the session's scratchpad or a temp folder, never a repository: frames and audio are large, and the tools must not\npick up a repository's build settings or package sources. Copy the skill's `scripts` folder into it as `tools`,\ninstall the voice package, and work from the workspace:\n\n```bash\ncp -R \u003Cskill>\u002Fscripts \u003Cworkspace>\u002Ftools\nnpm ci --prefix \u003Cworkspace>\u002Ftools\u002Ftts\ncd \u003Cworkspace>\n```\n\n**Run every command of the steps below from the workspace.** The .NET CLI picks its SDK from the `global.json`\nnearest the current directory, not the script's: from inside a repository, such as the Aspire checkout (which pins a\npreview SDK), `dotnet run \u003Ctools>\u002F...` would use that repository's SDK, or fail without it.\n\n```text\n\u003Cworkspace>\u002F\n  storyboard.json   the chapters, clips, narration and slides (see references\u002Fstoryboard.md)\n  slides\u002F           the code shown on slides, if any (\"source\" of a code panel)\n  tools\u002F            a copy of the skill's scripts: video.cs, tts\u002F, and recorder\u002F with your scenes in Scenes.cs\n  app\u002F              the throwaway Aspire app to record, if the video shows one\n  audio\u002F            generated: one mp3 per step\n  durations.json    generated: the length of each step's narration\n  clips\u002F\u003Cclip>\u002F     generated: the frames and timeline.json of each recording\n  build\u002F            generated: intermediate segments, and master.mp4\n  \u003Coutput>.mp4\u002F.vtt\u002F.srt   the result\n```\n\nStart from `examples\u002Fdashboard-tour\u002Fstoryboard.json` and its `slides\u002F` folder.\n\n### 2. Write the storyboard\n\nRead `references\u002Fstoryboard.md` first. In short:\n\n- Write for the long term: say \"the Aspire dashboard\", never \"the new dashboard\", \"now\", \"in this release\", or version\n  numbers, so the video stays accurate for years.\n- One idea per step, one to three sentences, spoken in the present tense. A step is what the viewer sees while it plays.\n- Chapters: why it exists, each feature, how to configure it in the AppHost, how to adopt or extend it.\n\nShow the user the outline and the narration before generating anything, unless they asked you to go straight\nthrough: changing the text after recording means recording again.\n\n### 3. Generate the narration\n\n```bash\ndotnet run \u003Ctools>\u002Fvideo.cs -- narrate \u003Cworkspace>\n```\n\nIt writes `audio\u002F` and `durations.json`. Run it again after any change to the text: only the changed steps are\ngenerated again. **Record after narrating**, since the recorder holds each step for the length of its narration.\n\nIf the voice mispronounces a word, add it to `s_spoken` in `scripts\u002FSpeech.cs` (for every video) or to `\"spoken\"` in\nthe storyboard (for this one). The captions keep the written form. **Have a person confirm a new spelling before\nusing it**: make a pronunciation sample, a few seconds per candidate spelling, and ask which option sounds right.\nRebuilding a whole video to try a spelling wastes minutes per attempt. Pass the storyboard, so the sample uses the\nvideo's voice and rate (or `--voice` and `--rate`): a spelling that works for one voice can fail with another.\n\n```bash\ndotnet run \u003Ctools>\u002Fvideo.cs -- pronounce --storyboard \u003Cworkspace>\u002Fstoryboard.json otlp.mp4 \"The dashboard receives {} telemetry from every resource.\" \"OTLP\" \"O.T.L.P.\" \"O-T-L-P\" \"O T L P\"\n```\n\nLetters said one by one are written as an abbreviation with periods, such as \"A.S.P.\": the voice spells it at an\neven pace. With spaces (\"A S P\"), the letters run together; with commas (\"A, S, P\"), the pauses are uneven.\n\"ASP.NET\" is spoken as \"A.S.P. .NET\".\n\n### 4. Record the clips\n\nStart the sample app (`aspire run`), then write one method per \"clip\" in `tools\u002Frecorder\u002FScenes.cs`, with one\n`scene.StepAsync(\"\u003Cstep id>\", ...)` per step, in the storyboard's order. See `references\u002Frecording.md` for the app\nto record, the scene API, and the pitfalls. Wait until every resource is Running and healthy, and generate some\ntraffic so logs, traces and metrics have data. Then:\n\nEach workspace's copy of the recorder builds into its own folder, so several videos can be recorded side by side.\n\n```bash\nexport VIDEO_ROOT=\u003Cworkspace> VIDEO_BASE_URL=https:\u002F\u002Flocalhost:17010\nexport VIDEO_LOGIN_URL='\u003Cthe dashboard login URL that aspire run prints>'\ndotnet run \u003Ctools>\u002Frecorder\u002Frecorder.cs -- setup          # logs in to the dashboard, once per run of the app\ndotnet run \u003Ctools>\u002Frecorder\u002Frecorder.cs -- probe \u002F \"...\"  # checks each selector of Scenes.cs before recording\ndotnet run \u003Ctools>\u002Frecorder\u002Frecorder.cs -- record all     # or the names of some clips\ndotnet run \u003Ctools>\u002Fvideo.cs -- review \u003Cworkspace> \u003Cclip>\n```\n\nLook at every contact sheet (`shots\u002F\u003Cclip>.jpg`) before assembling: the frame at the end of each step must show what\nits narration describes, and no caption may cover what the narration names.\n\nTo make several versions of one video (30 seconds, 1 minute, 3 minutes), use one workspace per version, with its own\nstoryboard, slides and recorder, and record them all from the same running app.\n\n### 5. Assemble\n\n```bash\ndotnet run \u003Ctools>\u002Fvideo.cs -- slides \u003Cworkspace>     # renders the slides to shots\u002Fslides\u002F, to check them first\ndotnet run \u003Ctools>\u002Fvideo.cs -- assemble \u003Cworkspace>\n```\n\nIt writes one file per rendition (`\u003Coutput>.mp4` for `web`, `\u003Coutput>-hd.mp4`, `\u003Coutput>-light.mp4`), and prints\nthe length and the size of each. If one is over its limit, shorten the video, or raise its CRF one step at a time\n(`CRF=34` for `web`, `CRF_LIGHT=31` for `light`) and check that text stays readable. Extract a few frames with ffmpeg\nand look at them: a recording, a slide with code, a card, and a recording while it's zoomed in.\n\n### 6. Publish\n\n- **aspire.dev** (`microsoft\u002Faspire.dev`, an Astro Starlight site): put `\u003Cname>.mp4`, `\u003Cname>.vtt` and a poster\n  (`build\u002F\u003Copening card>.png` saved as JPEG) in `src\u002Ffrontend\u002Fpublic\u002Fvideos\u002F`, and embed it under the introduction of\n  the `.mdx` page:\n\n  ```html\n  \u003Cvideo controls preload=\"metadata\" width=\"100%\" poster=\"\u002Fvideos\u002F\u003Cname>.jpg\">\n      \u003Csource src=\"\u002Fvideos\u002F\u003Cname>.mp4\" type=\"video\u002Fmp4\" \u002F>\n      \u003Ctrack kind=\"captions\" src=\"\u002Fvideos\u002F\u003Cname>.vtt\" srclang=\"en\" label=\"English\" \u002F>\n      Your browser does not support embedded videos. \u003Ca href=\"\u002Fvideos\u002F\u003Cname>.mp4\">Download the video\u003C\u002Fa>.\n  \u003C\u002Fvideo>\n  ```\n\n  Don't use the `LoopingVideo` component for narrated videos: it autoplays muted, without captions. Introduce the\n  video with one sentence that says what it covers, without \"new\". Build the site locally, following the\n  repository's README, and check the page.\n- **Pull request**: GitHub only accepts videos through its web uploader (drag and drop, or the attachment button\n  of the description editor), up to 10 MB on free plans. The upload gives a `https:\u002F\u002Fgithub.com\u002Fuser-attachments\u002Fassets\u002F...`\n  URL: put it alone on a line near the top of the description, so GitHub shows a player.\n\n### 7. Clean up\n\nStop the app you recorded: `aspire stop` from `\u003Cworkspace>\u002Fapp`, or Ctrl+C in the terminal running it. An app\nstarted in the background may ignore an interrupt (SIGINT): stop its processes with SIGTERM, and only those whose\ncommand line names its workspace.\n`aspire stop` removes the app's containers within about 20 seconds; after that, any left over outlived it: check\n`docker ps -a` and remove them (`docker rm -f \u003Cname>`, such as `cache-\u003Csuffix>`).\nKeep the throwaway project and the workspace until step 8 has copied their sources and the user has accepted the\nvideo, in case a step must be re-recorded; remove the project after that.\n\n### 8. Deliver\n\nGive the user `\u003Coutput>.mp4` (send the file when the session can), and end with a summary that lists, for each video:\n\n- **A link to each rendition**, as a clickable link to its absolute path (`[\u003Coutput>.mp4](\u002Fabs\u002Fpath\u002F\u003Coutput>.mp4)`),\n  with its length, its resolution, its size, its voice, and its language. Copy the videos and their captions out of a temporary workspace, to a\n  folder the user can open (such as `\u003Cworking directory>\u002F\u003Cname>-videos\u002F`), and link to the copies: a temporary folder is\n  temporary.\n- **Links to its captions**: `\u003Coutput>.vtt` and `\u003Coutput>.srt`.\n- **The path to its workspace**, with links to `storyboard.json` (the narration and slides), and the\n  recorder's `Scenes.cs`, so the user can change the text or a clip and produce the video again. When the workspace\n  is in a temporary folder, also copy its sources next to the videos (`\u003Cname>-videos\u002Fworkspaces\u002F`: the storyboards,\n  `slides\u002F`, `tools\u002F` without `tts\u002Fnode_modules`, `bin` and `obj`, and the app without `node_modules`, `bin`, `obj` and\n  `aspire-output`), and link to both: the copy outlives the session, the workspace keeps the frames and audio.\n- **Shared files**, when several videos use them: the sample app, the recorder, and any settings or AppHost versions\n  the clips copy in.\n\nEnd with the commands that produce a video again from its workspace (`video.cs narrate`, `recorder.cs record`, `video.cs\nassemble`).\n\n## Improving the skill\n\nWhen a script fails, a selector breaks with a newer dashboard, a slide overflows, or a reference is wrong or unclear,\nfix it here, in the skill (scripts, references or example), not only in the workspace, so the next video benefits.\nWhen an external tool misbehaves (VS Code, the Aspire CLI, a package, the voice service), add the symptom, the cause and\nthe fix to `references\u002Ftroubleshooting.md`.\nTell the user what you changed. Never change the specification (colors, fonts, layout, voice, encoding) without the\nuser's agreement.\n\n## References\n\n- `references\u002Fspecs.md`: the full specification.\n- `references\u002Fstoryboard.md`: the storyboard format, and how to write the narration and the slides.\n- `references\u002Frecording.md`: the app to record, the recorder, the scene API, and pitfalls.\n- `references\u002Ftroubleshooting.md`: problems with external tools (VS Code in the browser, the Aspire CLI, NuGet\n  packages, the dashboard, the voice), with their fixes. Check it before debugging one, and add what you find.\n- `scripts\u002Fvideo.cs`: the tools, a .NET file-based app: `narrate`, `voices`, `pronounce`, `slides`, `assemble`,\n  `review`. `Brand.cs` holds the branding and layout, `Slides.cs` the slides, `Speech.cs` the voice, `Assembly.cs` the\n  assembly, and `Media.cs` the calls to ffmpeg and Node.js.\n- `scripts\u002Ftts\u002F`: the voice (`tts.mjs`), with its pinned npm package.\n- `scripts\u002Frecorder\u002F`: the recorder, a Playwright for .NET file-based app, with helpers for VS Code in the browser\n  (`VsCode.cs`, `vscode-settings.jsonc`) and for the dashboard (`Dashboard.cs`).\n- `scripts\u002Fassets\u002F`: the Aspire logo, from aspire.dev.\n- `cgmanifest.json`: the components the skill uses that component detection can't find: the packages of `video.cs`,\n  and Orchard Core, which the skill is adapted from.\n- `examples\u002Fdashboard-tour\u002F`: a complete storyboard, with slides.\n",{"name":5,"description":7},"main","cec61ac9b795bbfd9913f0c7196689b0d7a215d7",".agents\u002Fskills\u002Fcreate-video",1039,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Faspire","https:\u002F\u002Faspire.dev","https:\u002F\u002Fgithub.com\u002Fmicrosoft","https:\u002F\u002Fopensource.microsoft.com","Open source projects and samples from Microsoft","2026-11-15 00:32:23",{"source":8,"skillName":5,"commands":63,"prompt":73,"zipAvailable":74},[64,67,70],{"tool":65,"command":66},"npx","npx skills add microsoft\u002Faspire --skill create-video",{"tool":68,"command":69},"bunx","bunx skills add microsoft\u002Faspire --skill create-video",{"tool":71,"command":72},"pnpm","pnpm dlx skills add microsoft\u002Faspire --skill create-video","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Faspire\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fcreate-video\u002FSKILL.md",true,[76,82,88,92,96,100,104,108,114,118,122,126,130,134,138,142,146,150,154,158,162,166,170,174,178,182],{"path":77,"resourceType":78,"resourceTypeDesc":79,"sizeBytes":80,"sourceHtmlUrl":81},"cgmanifest.json","REFERENCE","参考文档",1211,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Faspire\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fcreate-video\u002Fcgmanifest.json",{"path":83,"resourceType":84,"resourceTypeDesc":85,"sizeBytes":86,"sourceHtmlUrl":87},"examples\u002Fdashboard-tour\u002Fslides\u002FAppHost.cs","OTHER","其他",472,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Faspire\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fcreate-video\u002Fexamples\u002Fdashboard-tour\u002Fslides\u002FAppHost.cs",{"path":89,"resourceType":78,"resourceTypeDesc":79,"sizeBytes":90,"sourceHtmlUrl":91},"examples\u002Fdashboard-tour\u002Fstoryboard.json",6275,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Faspire\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fcreate-video\u002Fexamples\u002Fdashboard-tour\u002Fstoryboard.json",{"path":93,"resourceType":78,"resourceTypeDesc":79,"sizeBytes":94,"sourceHtmlUrl":95},"references\u002Frecording.md",15589,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Faspire\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fcreate-video\u002Freferences\u002Frecording.md",{"path":97,"resourceType":78,"resourceTypeDesc":79,"sizeBytes":98,"sourceHtmlUrl":99},"references\u002Fspecs.md",9522,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Faspire\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fcreate-video\u002Freferences\u002Fspecs.md",{"path":101,"resourceType":78,"resourceTypeDesc":79,"sizeBytes":102,"sourceHtmlUrl":103},"references\u002Fstoryboard.md",9176,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Faspire\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fcreate-video\u002Freferences\u002Fstoryboard.md",{"path":105,"resourceType":78,"resourceTypeDesc":79,"sizeBytes":106,"sourceHtmlUrl":107},"references\u002Ftroubleshooting.md",10927,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Faspire\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fcreate-video\u002Freferences\u002Ftroubleshooting.md",{"path":109,"resourceType":110,"resourceTypeDesc":111,"sizeBytes":112,"sourceHtmlUrl":113},"scripts\u002FAssembly.cs","SCRIPT","脚本",31757,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Faspire\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fcreate-video\u002Fscripts\u002FAssembly.cs",{"path":115,"resourceType":110,"resourceTypeDesc":111,"sizeBytes":116,"sourceHtmlUrl":117},"scripts\u002Fassets\u002Faspire-logo-1024.png",36874,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Faspire\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fcreate-video\u002Fscripts\u002Fassets\u002Faspire-logo-1024.png",{"path":119,"resourceType":110,"resourceTypeDesc":111,"sizeBytes":120,"sourceHtmlUrl":121},"scripts\u002Fassets\u002Faspire-logo.svg",1818,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Faspire\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fcreate-video\u002Fscripts\u002Fassets\u002Faspire-logo.svg",{"path":123,"resourceType":110,"resourceTypeDesc":111,"sizeBytes":124,"sourceHtmlUrl":125},"scripts\u002FBrand.cs",14678,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Faspire\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fcreate-video\u002Fscripts\u002FBrand.cs",{"path":127,"resourceType":110,"resourceTypeDesc":111,"sizeBytes":128,"sourceHtmlUrl":129},"scripts\u002FDirectory.Packages.props",741,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Faspire\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fcreate-video\u002Fscripts\u002FDirectory.Packages.props",{"path":131,"resourceType":110,"resourceTypeDesc":111,"sizeBytes":132,"sourceHtmlUrl":133},"scripts\u002FMedia.cs",6634,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Faspire\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fcreate-video\u002Fscripts\u002FMedia.cs",{"path":135,"resourceType":110,"resourceTypeDesc":111,"sizeBytes":136,"sourceHtmlUrl":137},"scripts\u002Frecorder\u002FDashboard.cs",4326,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Faspire\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fcreate-video\u002Fscripts\u002Frecorder\u002FDashboard.cs",{"path":139,"resourceType":110,"resourceTypeDesc":111,"sizeBytes":140,"sourceHtmlUrl":141},"scripts\u002Frecorder\u002Frecorder.cs",5889,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Faspire\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fcreate-video\u002Fscripts\u002Frecorder\u002Frecorder.cs",{"path":143,"resourceType":110,"resourceTypeDesc":111,"sizeBytes":144,"sourceHtmlUrl":145},"scripts\u002Frecorder\u002FScene.cs",24124,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Faspire\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fcreate-video\u002Fscripts\u002Frecorder\u002FScene.cs",{"path":147,"resourceType":110,"resourceTypeDesc":111,"sizeBytes":148,"sourceHtmlUrl":149},"scripts\u002Frecorder\u002FScenes.cs",3224,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Faspire\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fcreate-video\u002Fscripts\u002Frecorder\u002FScenes.cs",{"path":151,"resourceType":110,"resourceTypeDesc":111,"sizeBytes":152,"sourceHtmlUrl":153},"scripts\u002Frecorder\u002Fvscode-settings.jsonc",5097,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Faspire\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fcreate-video\u002Fscripts\u002Frecorder\u002Fvscode-settings.jsonc",{"path":155,"resourceType":110,"resourceTypeDesc":111,"sizeBytes":156,"sourceHtmlUrl":157},"scripts\u002Frecorder\u002FVsCode.cs",13559,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Faspire\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fcreate-video\u002Fscripts\u002Frecorder\u002FVsCode.cs",{"path":159,"resourceType":110,"resourceTypeDesc":111,"sizeBytes":160,"sourceHtmlUrl":161},"scripts\u002FSlides.cs",13437,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Faspire\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fcreate-video\u002Fscripts\u002FSlides.cs",{"path":163,"resourceType":110,"resourceTypeDesc":111,"sizeBytes":164,"sourceHtmlUrl":165},"scripts\u002FSpeech.cs",12713,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Faspire\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fcreate-video\u002Fscripts\u002FSpeech.cs",{"path":167,"resourceType":110,"resourceTypeDesc":111,"sizeBytes":168,"sourceHtmlUrl":169},"scripts\u002Ftts\u002F.npmrc",37,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Faspire\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fcreate-video\u002Fscripts\u002Ftts\u002F.npmrc",{"path":171,"resourceType":110,"resourceTypeDesc":111,"sizeBytes":172,"sourceHtmlUrl":173},"scripts\u002Ftts\u002Fpackage-lock.json",17835,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Faspire\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fcreate-video\u002Fscripts\u002Ftts\u002Fpackage-lock.json",{"path":175,"resourceType":110,"resourceTypeDesc":111,"sizeBytes":176,"sourceHtmlUrl":177},"scripts\u002Ftts\u002Fpackage.json",278,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Faspire\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fcreate-video\u002Fscripts\u002Ftts\u002Fpackage.json",{"path":179,"resourceType":110,"resourceTypeDesc":111,"sizeBytes":180,"sourceHtmlUrl":181},"scripts\u002Ftts\u002Ftts.mjs",2306,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Faspire\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fcreate-video\u002Fscripts\u002Ftts\u002Ftts.mjs",{"path":183,"resourceType":110,"resourceTypeDesc":111,"sizeBytes":184,"sourceHtmlUrl":185},"scripts\u002Fvideo.cs",2929,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Faspire\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fcreate-video\u002Fscripts\u002Fvideo.cs",[187,220,242,255,272,298],{"skillNo":188,"name":189,"nameZh":6,"description":190,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":191,"categories":192,"keywords":204,"publishedAt":47},"01M6FKZQPMA7VRA0PRBZRDFJTX","vscode-extension","Use when investigating, developing, debugging, testing, or reviewing Aspire VS Code extension behavior under extension\u002F, including extension UI, command, debugger, RPC, DCP, MCP, and CLI-integration issues or features.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Faspire\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fvscode-extension\u002FSKILL.md",[193,196,199],{"categoryNo":194,"categoryName":195,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000008","测试与质量",{"categoryNo":197,"categoryName":198,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",{"categoryNo":200,"categoryName":201,"taxonomyType":202,"taxonomyTypeDesc":203},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[205,206,207,208,209,38,45,210,211,212,213,214,215,216,217,218,39,219,28],"vscode","vscode extension","extension","testing","MCP","debugging","code","issues","rpc","ui","integration","debugger","command","behavior","features",{"skillNo":221,"name":222,"nameZh":6,"description":223,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":224,"categories":225,"keywords":227,"publishedAt":47},"01M6FKZJG81XP80SVWFBJVMDWN","update-container-images","Updates Docker container image tags used by Aspire hosting integrations. Queries registries for newer tags, uses LLM to determine version-compatible updates, and applies changes. Use this when asked to update container image versions.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Faspire\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fupdate-container-images\u002FSKILL.md",[226],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[228,229,230,231,232,233,234,45,235,39,236,237,238,239,240,30,241,28],"container images","update","container","images","update container images","image","docker","integrations","version","hosting","queries","tags","updates","changes",{"skillNo":243,"name":244,"nameZh":6,"description":245,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":246,"categories":247,"keywords":249,"publishedAt":47},"01M6FKZDY1MY0QA62EYSDG5NHW","test-management","Quarantines or disables flaky\u002Fproblematic tests using the QuarantineTools utility","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Faspire\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Ftest-management\u002FSKILL.md",[248],{"categoryNo":194,"categoryName":195,"taxonomyType":21,"taxonomyTypeDesc":22},[250,251,252,253,254],"test","management","test management","tests","utility",{"skillNo":256,"name":257,"nameZh":6,"description":258,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":259,"categories":260,"keywords":261,"publishedAt":47},"01M6FKZAQ428JX8F6NSA19XBQJ","startup-perf","Measures Aspire startup profiling with CLI self-profile capture and dashboard export traces.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Faspire\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fstartup-perf\u002FSKILL.md",[],[262,263,264,38,46,45,265,266,267,268,269,270,271],"perf","startup","startup perf","profiling","capture","profile","export","self","with","traces",{"skillNo":273,"name":274,"nameZh":6,"description":275,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":276,"categories":277,"keywords":278,"publishedAt":47},"01M6FKZ4W4J0ET0Q0C2Z30HYRV","reviewing-aspire-architecture","Use only when the user explicitly requests a deep Aspire architectural or pattern review of an existing PR or diff, or when a generic reviewer escalates a named Aspire-domain question it cannot resolve. Do not use for ordinary review, implementation, debugging, explanation, or design discussion—even when a PR is referenced—and never select it from changed file paths alone.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Faspire\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Freviewing-aspire-architecture\u002FSKILL.md",[],[279,45,280,281,282,283,210,284,285,286,287,39,288,289,290,291,292,293,294,295,30,296,297,28],"architecture","reviewing aspire architecture","design","review","pr","file","select","reviewer","question","diff","never","only","do","domain","pattern","deep","paths","Existing","generic",{"skillNo":299,"name":300,"nameZh":6,"description":301,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":302,"categories":303,"keywords":305,"publishedAt":47},"01M6FKYZ44BEPJNV8VQ0X73CZR","pr-testing","Use when asked to test a microsoft\u002Faspire pull request, including CLI, hosting, dashboard, component, template, and VS Code extension changes. Also covers testing PRs that change CI infrastructure — GitHub Actions (workflows, actions, gh-aw agentic workflows, CI scripts under .github\u002F and eng\u002F) and Azure DevOps pipelines (eng\u002Fpipelines, eng\u002Fcommon).","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Faspire\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fpr-testing\u002FSKILL.md",[304],{"categoryNo":194,"categoryName":195,"taxonomyType":21,"taxonomyTypeDesc":22},[208,283,306,38,307,308,46,309,310,311,312,313,45,314,211,315,316,317,318,319,39,320,237,321,207,322,241,323],"pr testing","github","agentic","workflows","change","component","agentic workflows","azure devops","infrastructure","actions","ci","github actions","template","common","devops","pipelines","scripts","prs"]