Conversational agent that guides developers through creating complete Azure PowerShell cmdlet design specifications. Walks through an interactive interview covering service release details, contacts, scenarios, cmdlet syntax, parameter sets, piping, test cases, and spec links. Validates against PowerShell design guidelines, pre-populates fields from TypeSpec, and files the design as a GitHub Issue in Azure/azure-powershell-cmdlet-review-pr. USE FOR: 'create PowerShell design', 'PS design review', 'cmdlet design', 'PowerShell cmdlet review', 'submit PS design'. DO NOT USE FOR: SDK generation, TypeSpec authoring, releasing packages.
75
92%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Low
Low-risk findings worth noting
A conversational skill that guides developers through building a complete PowerShell cmdlet design specification and submitting it for review.
Prerequisite: The GitHub MCP server must be configured and running. If any MCP tool call fails with a connection or server error, instruct the developer to add the following to their VS Code MCP configuration file (.vscode/mcp.json or the workspace .mcp.json):
{
"servers": {
"github": {
"url": "https://api.githubcopilot.com/mcp/"
}
}
}Then reload the VS Code window and retry.
| Tool | Purpose |
|---|---|
github-mcp-server:get_file_contents | Primary tool for reading PR changes. Read TypeSpec files from the PR branch (refs/pull/{number}/head) and base branch to diff and identify new/changed resources. |
github-mcp-server:create_issue | Create the design review issue in Azure/azure-powershell-cmdlet-review-pr |
github-mcp-server:search_code | Search for existing cmdlet patterns in Azure/azure-powershell for consistency |
github-mcp-server:list_issues | Check for existing design reviews to avoid duplicates |
needs-review label and use the {MODULE} - {FEATURE} title format.> _Created with help from PS design skill_ for tracking. Never omit this line..md file and open it in the editor. See Scratch File Pattern.gh CLI, git commands, curl, PowerShell, shell commands, or any other workaround to read PR data, fetch file contents, list files, or create issues. The only way to interact with GitHub is through github-mcp-server tools. If a tool call fails, do NOT fall back to shell commands — instead display the MCP setup instructions above and ask the developer to configure the server.Several interview steps require multi-line input (cmdlet syntax blocks, piping examples, end-to-end samples) that is difficult to type in the Copilot Chat input box. For these steps, the agent must use a scratch file instead of asking the developer to paste into chat.
How it works:
.github/skills/azure-ps-design-review/scratch/design-input.md (or a step-specific name like cmdlet-syntax.md).design-input.md in your editor. Please fill in the sections and let me know when you're done."When to use scratch files (vs. chat input):
| Input type | Method |
|---|---|
| Short answers (release type, date, module name, contacts) | Chat input — ask directly |
| Multi-line content (cmdlet syntax, piping examples, sample usage, business logic, test scenarios, feature descriptions) | Scratch file — create and open in editor |
IMPORTANT: Do NOT ask for multi-line content in the chat input box. Always create a scratch file for any response that would reasonably span more than 2–3 lines. This includes feature descriptions, piping scenarios, sample usage, cmdlet syntax blocks, business logic, and test scenarios. The chat input box is too small for formatted content.
Scratch file conventions:
.github/skills/azure-ps-design-review/scratch/ (gitignored)<!-- INSTRUCTION: ... --> comments guiding the developerPR Link First → Ingest Changes → Interview → Validate → Generate → Submit
CRITICAL: The very first action when this skill is invoked is to ask the developer for their TypeSpec PR link. Do not ask about module names, release details, contacts, or anything else until the PR link has been provided and the changes have been ingested. The PR diff is used to pre-populate as much of the template as possible before starting the interview.
Copy and update as you progress:
This step MUST execute first. Do not proceed to any other step until this is complete.
Goal: Get the TypeSpec PR link in a follow-up popup and ingest the diff to extract as much design data as possible.
Initial message: When the skill is first invoked, respond with a brief introduction and the workflow overview, with a popup PR link input request. Example:
👋 I'll help you create a PowerShell cmdlet design spec. Here's how this works:
- You give me your TypeSpec PR link
- I'll ask a few quick questions (release type, contacts, etc.)
- I'll create a pre-filled design draft — you just fill in the long-form sections
- I validate against design guidelines and file the review issue In a follow-up popup, ask for the TypeSpec PR link with clear instructions. Example: To get started, paste the link to your TypeSpec PR (e.g.,
https://github.com/Azure/azure-rest-api-specs/pull/12345).
If the developer already provided the PR link in their initial message, skip the introduction and proceed directly to ingesting the PR.
Actions (after receiving the PR link):
github-mcp-server:get_file_contents with refs/pull/{number}/head to read the TypeSpec files on the PR branch, and again with the base branch to read the prior versions.Microsoft.Compute → Az.Compute)Snapshot, VirtualMachine).github-mcp-server:search_code to search Azure/azure-powershell for existing cmdlets matching that noun. For example:
"AzSnapshot" language:cs path:src/Compute in repo:Azure/azure-powershell"AzSnapshot" language:ps1 path:src/Compute in repo:Azure/azure-powershellNewAzSnapshotCommand.cs, Get-AzSnapshot.ps1)github-mcp-server:get_file_contents to read the cmdlet source file and extract:
OutputType attribute)ShouldProcess, AsJob, or PassThru are already implemented
This gives the agent a baseline of what the cmdlet already supports.Update-AzSnapshot doesn't exist yet)Get-AzSnapshot (has -ResourceGroupName, -Name, -ResourceId), New-AzSnapshot (has -Location, -Sku, ...). Based on your PR, Update-AzSnapshot is new, and New-AzSnapshot needs a new -EncryptionType parameter. Does that look right?"Important: Do not scan the local working tree for changes. All change detection must come from the PR. The developer may invoke this skill long after the TypeSpec changes were made.
Output: A structured set of pre-populated fields. Do NOT present this raw or create the scratch file yet — first collect the short answers in Step 2.
Goal: Ask the developer for all short-form information in a the follow-up popup questionnaire. These are quick answers that don't need the editor.
Present all questions together in one message after ingesting the PR. Skip any the agent can already infer from the PR (and show the inferred values for confirmation). Example:
I've read your PR and found 3 new operations. Before I create the design draft, I need a few details:
- Release type: Embargoed Preview, Public Preview, or General Release?
- Expected release date:
- PowerShell module: (I'm guessing
Az.Compute— correct?)- Developer contacts: (email + GitHub alias)
- PM contact: (email + GitHub alias)
- Additional reviewers: (optional)
- Related GitHub issues/PRs: (optional)
- Feature flags or restrictions: (optional)
Rules:
Goal: Combine everything from the PR (Step 1) and the chat answers (Step 2) into a single scratch file. The developer only needs to fill in the long-form sections — everything else is already done.
Input method: MUST use scratch file. Create scratch/design-draft.md with all short answers and TypeSpec data already filled in. Only long-form sections that require multi-line formatted input should have <!-- TODO --> markers.
Use this template — {...} values are filled from Steps 1 and 2:
# PowerShell Design Review Draft
<!-- Review the pre-filled sections and fill in the TODO sections.
Only the long-form sections (scenarios, business logic, sample code) need your input.
Everything else has been pre-filled from your PR and chat answers. -->
---
## Service Release Details
- **Release type**: {RELEASE_TYPE}
- **Expected release date**: {RELEASE_DATE}
- **PowerShell module**: {MODULE}
## Contact Information
- **Main developer contacts**: {DEV_CONTACTS}
- **PM contact**: {PM_CONTACT}
- **Additional reviewers**: {ADDITIONAL_CONTACTS}
## High-Level Scenarios
### Feature Description
{PR_DESCRIPTION_OR_TITLE}
<!-- TODO: Expand on the above if needed. Describe how this feature is intended to be used by customers. -->
### Piping Scenarios
<!-- TODO: Show how these cmdlets integrate with existing cmdlets.
Example: Get-AzVM | Update-AzVM -Tag @{env="prod"}
Example: Get-AzSnapshot -ResourceGroupName "rg1" | Remove-AzSnapshot -->
### End-to-End Sample Usage
<!-- TODO: Provide comprehensive examples that don't assume additional setup. -->
```powershell
```{FOR_EACH_NEW_CMDLET}
Parameters:
| Parameter | Type | Mandatory | Description |
|---|
{PARAMETER_ROWS}
Business Logic:
Sample Syntax and Output:
PS C:\> {CMDLET_NAME} -ResourceGroupName "rg1" -Name "example"{END_FOR_EACH}
{FOR_EACH_CHANGED_CMDLET}
New/Changed Parameters:
| Parameter | Type | Mandatory | Description |
|---|---|---|---|
Business Logic Changes:
Sample Syntax or Diff:
Affected Parameter Sets:
{END_FOR_EACH}
Created with help from PS design skill
**What should be pre-filled** (not TODO):
- All service release details (from Step 2 chat)
- All contact information (from Step 2 chat)
- Feature description seed text (from PR title/description)
- Cmdlet names and parameter tables (from TypeSpec diff)
- Related links, restrictions (from Step 2 chat)
- Spec link (the PR URL)
**What should be TODO** (long-form only):
- Expanded feature description (developer may want to add more detail)
- Piping scenarios (requires formatted PowerShell examples)
- End-to-end sample usage (requires formatted PowerShell code blocks)
- Business logic for each cmdlet (requires prose)
- Sample syntax and output for each cmdlet (requires formatted code blocks)
- Test cases (full list of every scenario to test — positive, negative, edge cases)
**Pre-population rules for cmdlets**:
- Cmdlet names: Derive from operations (PUT → `New-`/`Set-`, PATCH → `Update-`, DELETE → `Remove-`, GET → `Get-`, POST actions → approved verb). Mark each with `<!-- FROM TYPESPEC -->`.
- Parameters: Extract from resource model properties. Include type and mark as `<!-- FROM TYPESPEC -->`.
Tell the developer: **"I've created `design-draft.md` in your editor. All the info from your PR and our chat is already filled in — you just need to write the long-form sections (piping scenarios, sample usage, business logic, and test cases). Let me know when you're done."**
---
### Step 4: Validate Against Design Guidelines
**Goal**: Run a final validation pass over the complete design.
**Validation checks**:
- Verb is from the [approved PowerShell verbs list](https://learn.microsoft.com/en-us/powershell/scripting/developer/cmdlet/approved-verbs-for-windows-powershell-commands)
- Noun uses `Az` prefix and Pascal case
- PATCH operations use `Update-`, PUT operations use `Set-`
- Cmdlets that modify resources implement `ShouldProcess` (`-WhatIf` / `-Confirm`)
- Cmdlets returning no output implement `-PassThru`
- Long-running operations implement `-AsJob`
- Required parameter sets present: Interactive, ResourceId, InputObject
- Output types are specific (never `object`, `PSObject`, `PSCustomObject`, or `string`)
- Two-char acronyms fully capitalized; 3+ char acronyms Pascal-cased
- Piping examples use `-InputObject` or `-ResourceId` parameter sets
**Actions**:
1. Re-check all cmdlet names, parameters, output types, and piping scenarios against the [design guidelines summary](references/design-guidelines-summary.md).
2. Flag any issues found and present them to the developer with suggested fixes.
3. If issues exist, update the scratch file with corrections and re-open for the developer.
4. Once all validations pass, proceed to generation.
For edge cases or when the developer requests detailed rationale, fetch the full guidelines from `Azure/azure-powershell/documentation/development-docs/design-guidelines/` via the GitHub MCP Server.
---
### Step 5: Generate Design Spec
**Goal**: Produce the complete design document.
**Actions**:
1. Assemble all collected information into the [design review template format](references/issue-template.md).
2. Present the full Markdown document to the developer for review.
3. Ask: "Does this look correct? Would you like to make any changes before I submit it?"
4. If changes requested, apply them and re-present.
---
### Step 6: Create GitHub Issue
**Goal**: File the design as a GitHub Issue.
**Actions**:
1. Create an issue in `Azure/azure-powershell-cmdlet-review-pr` using `github-mcp-server:create_issue` with:
- **Title**: `{MODULE} - {FEATURE}` (e.g., `Az.Compute - ManagedDisk Snapshot`)
- **Body**: The generated design spec from Step 5
- **Labels**: `needs-review`. If the module is `Az.Compute`, also apply the `Compute` label.
2. Display the created issue URL to the developer.
3. **Clean up scratch files** — delete all files in `.github/skills/azure-ps-design-review/scratch/` (except `.gitignore`).
4. Inform: "The Azure PowerShell team's SLA for initial reviews is 3 business days. Ping the team for urgent requests."
---
## Examples
- "Help me create a PowerShell design for my new Compute feature"
- "I need to submit a cmdlet design review for Az.Compute"
- "Create a PS design spec from my TypeSpec"
- "Guide me through a PowerShell design review submission"
## Troubleshooting
- **GitHub MCP Server not connected / tool calls fail**: The GitHub MCP server is required for this skill. If any `github-mcp-server` tool call fails, instruct the developer to add the following to their `.vscode/mcp.json` (or workspace `.mcp.json`), then reload VS Code:
```json
{
"servers": {
"github": {
"url": "https://api.githubcopilot.com/mcp/"
}
}
}Do NOT fall back to gh CLI, git, curl, or PowerShell commands. Wait for the developer to fix the MCP configuration and retry.
Azure/azure-powershell-cmdlet-review-pr. If not, output the Markdown spec so they can file it manually.Azure/azure-powershell/documentation/development-docs/design-guidelines/ for detailed rationale.358882a
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.