Release Preparation
MichaelGrafnetter/DSInternals
Prepare the DSInternals project for a new release by updating version numbers, release notes, and changelog.
Generate a new PnP PowerShell cmdlet modelled on an existing sibling - class with the right base class and permission attributes, the documentation page, and the changelog entry.
$ npx skills add pnp/powershell --skill cmdlet-scaffolder -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install pnp/powershell cmdlet-scaffolder --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/pnp/powershell.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/cmdlet-scaffolder .claude/skills/cmdlet-scaffolder && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "cmdlet-scaffolder" agent skill from https://github.com/pnp/powershell/tree/dev/.agents/skills/cmdlet-scaffolder into .claude/skills/cmdlet-scaffolder/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "cmdlet-scaffolder", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/pnp/powershell/tree/dev/.agents/skills/cmdlet-scaffolderType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add pnp/powershell --skill cmdlet-scaffolder -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install pnp/powershell cmdlet-scaffolder --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/pnp/powershell.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.agents/skills/cmdlet-scaffolder .agents/skills/cmdlet-scaffolder && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "cmdlet-scaffolder" agent skill from https://github.com/pnp/powershell/tree/dev/.agents/skills/cmdlet-scaffolder into .agents/skills/cmdlet-scaffolder/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "cmdlet-scaffolder", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add pnp/powershell --skill cmdlet-scaffolder -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install pnp/powershell cmdlet-scaffolder --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/pnp/powershell.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.agents/skills/cmdlet-scaffolder .cursor/skills/cmdlet-scaffolder && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "cmdlet-scaffolder" agent skill from https://github.com/pnp/powershell/tree/dev/.agents/skills/cmdlet-scaffolder into .cursor/skills/cmdlet-scaffolder/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "cmdlet-scaffolder", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/pnp/powershell.git --path .agents/skills/cmdlet-scaffolder--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add pnp/powershell --skill cmdlet-scaffolder -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install pnp/powershell cmdlet-scaffolder --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/pnp/powershell.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.agents/skills/cmdlet-scaffolder .gemini/skills/cmdlet-scaffolder && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "cmdlet-scaffolder" agent skill from https://github.com/pnp/powershell/tree/dev/.agents/skills/cmdlet-scaffolder into .gemini/skills/cmdlet-scaffolder/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "cmdlet-scaffolder", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install pnp/powershell cmdlet-scaffolderInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add pnp/powershell --skill cmdlet-scaffolder -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/pnp/powershell.git skills-src && mkdir -p .github/skills && cp -r skills-src/.agents/skills/cmdlet-scaffolder .github/skills/cmdlet-scaffolder && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "cmdlet-scaffolder" agent skill from https://github.com/pnp/powershell/tree/dev/.agents/skills/cmdlet-scaffolder into .github/skills/cmdlet-scaffolder/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "cmdlet-scaffolder", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add pnp/powershell --skill cmdlet-scaffolder -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install pnp/powershell cmdlet-scaffolder --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/pnp/powershell.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.agents/skills/cmdlet-scaffolder .opencode/skills/cmdlet-scaffolder && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "cmdlet-scaffolder" agent skill from https://github.com/pnp/powershell/tree/dev/.agents/skills/cmdlet-scaffolder into .opencode/skills/cmdlet-scaffolder/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "cmdlet-scaffolder", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
cmdlet-scaffolderGenerate a new PnP PowerShell cmdlet modelled on an existing sibling - class with the right base class and permission attributes, the documentation page, and the changelog entry.
Cmdlet Scaffolder is an agent skill from pnp/powershell. Generate a new PnP PowerShell cmdlet modelled on an existing sibling - class with the right base class and permission attributes, the documentation page, and the changelog entry. Use when adding a cmdlet for a Graph or CSOM API. Output is a draft needing verification against a real tenant.
Its SKILL.md is about 1.3k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Development, covering Changelog and release notes. It works with PowerShell and Microsoft 365. The licence is MIT.
8 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 947ac5e. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
gitdotnetFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use git, which can reach the network depending on how they are called.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Cmdlet Scaffolder loads about 1.3k tokens when it runs. Until then it costs about 77 tokens; SKILL.md has 612 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from pnp/powershell at commit 947ac5e, republished under its MIT licence (© pnp). 612 words, ~1,263 tokens.
.claude/skills/cmdlet-scaffolder/SKILL.md (or your agent's skills folder).Generate a new cmdlet — class, attributes, documentation page and changelog entry — modelled on an existing sibling.
The output is a draft. You cannot call the API or run the cmdlet. Everything about the request shape, the response fields and the permission scopes is inferred. Hand it over labelled as such, with the inferences listed. A plausible, well-formed, subtly wrong cmdlet is the specific failure mode this playbook exists to avoid.
Conventions live in new-cmdlet; language rules in
dotnet-standards. This playbook is the procedure.
Never commit, push, or open a PR. Leave the work in the tree and hand it over — see Human in the loop.
Before writing anything, pin down: cmdlet name (Verb-PnPNoun, approved verb, singular noun), the
API being wrapped, the parameters, and the output shape. If the verb or noun is unsettled, ask —
renaming later requires an [Alias] and a changelog entry.
Check the name is not already taken, including as an alias:
grep -rn 'Cmdlet(Verbs[A-Za-z]*\.[A-Za-z]*, "PnPTheNoun")' src/Commands --include=*.cs
grep -rn '\[Alias(' src/Commands --include=*.csThis is the most important step. Find the closest existing cmdlet: same folder, same base class, same API, same verb. Prefer a recently modified one — helper signatures have evolved and old call shapes survive in the tree.
git log --diff-filter=M --name-only -20 -- src/Commands/<Area>Read the sibling's class and its documentation/*.md page in full. You are matching a house style,
not producing generic C#. Say which sibling you used.
Use the Microsoft Learn MCP server for the endpoint, its request/response shape and its least-privilege permissions, delegated and application. Do not answer from memory — this is where generated cmdlets go wrong, and it is exactly what the permission attributes encode.
Record the Learn URL for each claim; it goes in the handover.
Per new-cmdlet: correct base class, [Cmdlet], [OutputType], permission
attributes, PipeBind parameters with validation attributes, ExecuteCmdlet() override.
src/Commands/Enums/.GetResultCollection, not Get.ExecuteQueryRetry().SupportsShouldProcess plus an actual ShouldProcess call and
-Force.Resources.resx, not string literals.documentation/<Verb-PnPNoun>.md, structure copied from the sibling page:
Module Name, title, schema: 2.0.0, applicable, external help file,
online version slug matching the cmdlet name exactly## SYNOPSIS — a Required Permissions block stating the same scopes as the attributes with the
same delegated/application split, then a one-line summary. Omit the block entirely if the
cmdlet carries ApiPermissionsNotRequired; adding one there contradicts the attribute and the
existing pages## SYNTAX — one ```powershell block per parameter set## DESCRIPTION## EXAMPLES — at least one, realistic, each followed by a sentence explaining it## PARAMETERS — alphabetical, one ```yaml block per parameter and **nothing else fenced
in this section**, including the standard -Connection and -Verbose blocks copied verbatim from
the sibling## RELATED LINKSThe YAML fields must agree with the attributes exactly — see docs-sync for the
field mapping.
One line under [Current nightly] → Added, cmdlet name in backticks, ending with a link to the PR
or issue. Match the surrounding entries' tone: what it does and why someone would use it, not "added
new cmdlet".
dotnet build src/PnP.PowerShell.slnWarning-clean. Do not touch src/Tests.
Report:
Do not describe the result as tested, working, or verified. It has been compiled, and that is all.
© pnp, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in .agents/skills/cmdlet-scaffolder of pnp/powershell.
Open the folder on GitHubat commit 947ac5e
Cmdlet Scaffolder next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Cmdlet Scaffolder this skillpnp/powershell | 905 | — | ~1.3k | Automated safety check: Pass | MIT | |
| Release PreparationMichaelGrafnetter/DSInternals | 2k | — | ~752 | Automated safety check: Pass | MIT | |
| Validate Release-Note Code Samplesdotnet/core | 22k | — | ~1.4k | Automated safety check: Pass | MIT | |
| Entra Agent Idmicrosoft/GitHub-Copilot-for-Azure | 255 | 3 repos | ~4k | Automated safety check: Pass | MIT | |
| CLI Microsoft365 Scriptpnp/cli-microsoft365-mcp-server | 131 | — | ~3.3k | Automated safety check: Pass | MIT | |
| Entra Agent Usergithub/awesome-copilot | 40k | 1 repos | ~2.3k | Automated safety check: Pass | MIT |
MichaelGrafnetter/DSInternals
Prepare the DSInternals project for a new release by updating version numbers, release notes, and changelog.
dotnet/core
Builds and runs the code snippets behind .NET release-note features against the exact milestone SDK, and records what must change to move maintained samples to a new preview.
microsoft/GitHub-Copilot-for-Azure
Provision Microsoft Entra Agent Identity Blueprints, BlueprintPrincipals, and per-instance Agent Identities via Microsoft Graph, and configure OAuth 2.0 token exchange (fmipath, OBO, cross-tenant)…
pnp/cli-microsoft365-mcp-server
Write PowerShell scripts using CLI for Microsoft 365 commands to automate Microsoft 365 management tasks.
github/awesome-copilot
Create Agent Users in Microsoft Entra ID from Agent Identities, enabling AI agents to act as digital workers with user identity capabilities in Microsoft 365 and Azure environments.
mukul975/Anthropic-Cybersecurity-Skills
Auditing Microsoft Entra ID (Azure Active Directory) configuration to identify risky authentication policies, overly permissive role assignments, stale accounts, conditional access gaps, and guest…
pnp/powershell
C 12 / .NET 8 and PowerShell cmdlet design rules for this repository - naming, output and error channels, parameter validation, ShouldProcess, async, culture, cross-platform and ALC constraints.
pnp/powershell
Take a PnP PowerShell GitHub issue, find the cmdlet that owns it, trace the code path, and decide whether the cause is in this repo or in PnP Framework, PnP Core SDK or the service.
pnp/powershell
The conventions a PnP PowerShell cmdlet must satisfy - base class selection, permission attributes, PipeBinds, parameter validation, Graph and CSOM call patterns, and the documentation plus…
pnp/powershell
Audit PnP PowerShell permission attributes against the APIs a cmdlet actually calls and against its documentation.
pnp/powershell
Compare the public cmdlet surface of the current branch against dev - names, aliases, parameters, types, mandatory flags, parameter sets, output types, permissions - and classify each change as…
pnp/powershell
Review changes to PnP PowerShell for the failure modes this repository actually ships - silently ignored input, unpaged Graph collections, the wrong base class, permission attributes that do not…
Works with
Categories
Generate a new PnP PowerShell cmdlet modelled on an existing sibling - class with the right base class and permission attributes, the documentation page, and the changelog entry. Cmdlet Scaffolder is an agent skill from pnp/powershell. Generate a new PnP PowerShell cmdlet modelled on an existing sibling - class with the right base class and permission attributes, the documentation page, and the changelog entry.
Cmdlet Scaffolder fits situations like: adding a cmdlet for a Graph; tasks that involve Changelog and release notes.
Run `npx skills add pnp/powershell --skill cmdlet-scaffolder -a claude-code`. Or copy the skill folder (.agents/skills/cmdlet-scaffolder in pnp/powershell) into .claude/skills/cmdlet-scaffolder in your project. Claude Code loads it when a task matches its description.
Run `npx skills add pnp/powershell --skill cmdlet-scaffolder -a codex`. Or copy the skill folder (.agents/skills/cmdlet-scaffolder in pnp/powershell) into .agents/skills/cmdlet-scaffolder in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add pnp/powershell --skill cmdlet-scaffolder -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/cmdlet-scaffolder, .gemini/skills/cmdlet-scaffolder, .github/skills/cmdlet-scaffolder and .opencode/skills/cmdlet-scaffolder in your project.
Going by SKILL.md and its folder, Cmdlet Scaffolder needs the command-line tools its instructions call (git and dotnet).
SKILL.md contains no URLs. Its commands use git, which can reach the network depending on how they are called. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Cmdlet Scaffolder is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 1.3k tokens (SKILL.md is roughly 5.1k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Cmdlet Scaffolder: Release Preparation (MichaelGrafnetter/DSInternals, 2k stars), Validate Release-Note Code Samples (dotnet/core, 22k stars), Entra Agent Id (microsoft/GitHub-Copilot-for-Azure, 255 stars) and CLI Microsoft365 Script (pnp/cli-microsoft365-mcp-server, 131 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
pnp (a GitHub organization) maintains it in pnp/powershell, which has 905 GitHub stars. The repository holds 9 skills in this directory. The repository was last updated on October 7, 2026.
Source: pnp/powershell on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.