Release
PowerShell/vscode-powershell
Guide for preparing a release of the PowerShell VS Code extension.
Create custom GitHub Copilot agents. An agent skill from dotnet/efcore.
$ npx skills add dotnet/efcore --skill make-custom-agent -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install dotnet/efcore make-custom-agent --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/dotnet/efcore.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/make-custom-agent .claude/skills/make-custom-agent && 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 "make-custom-agent" agent skill from https://github.com/dotnet/efcore/tree/main/.agents/skills/make-custom-agent into .claude/skills/make-custom-agent/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "make-custom-agent", 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/dotnet/efcore/tree/main/.agents/skills/make-custom-agentType 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 dotnet/efcore --skill make-custom-agent -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install dotnet/efcore make-custom-agent --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/dotnet/efcore.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.agents/skills/make-custom-agent .agents/skills/make-custom-agent && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "make-custom-agent" agent skill from https://github.com/dotnet/efcore/tree/main/.agents/skills/make-custom-agent into .agents/skills/make-custom-agent/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "make-custom-agent", 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 dotnet/efcore --skill make-custom-agent -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install dotnet/efcore make-custom-agent --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/dotnet/efcore.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.agents/skills/make-custom-agent .cursor/skills/make-custom-agent && 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 "make-custom-agent" agent skill from https://github.com/dotnet/efcore/tree/main/.agents/skills/make-custom-agent into .cursor/skills/make-custom-agent/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "make-custom-agent", 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/dotnet/efcore.git --path .agents/skills/make-custom-agent--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 dotnet/efcore --skill make-custom-agent -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install dotnet/efcore make-custom-agent --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/dotnet/efcore.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.agents/skills/make-custom-agent .gemini/skills/make-custom-agent && 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 "make-custom-agent" agent skill from https://github.com/dotnet/efcore/tree/main/.agents/skills/make-custom-agent into .gemini/skills/make-custom-agent/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "make-custom-agent", 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 dotnet/efcore make-custom-agentInstalls 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 dotnet/efcore --skill make-custom-agent -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/dotnet/efcore.git skills-src && mkdir -p .github/skills && cp -r skills-src/.agents/skills/make-custom-agent .github/skills/make-custom-agent && 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 "make-custom-agent" agent skill from https://github.com/dotnet/efcore/tree/main/.agents/skills/make-custom-agent into .github/skills/make-custom-agent/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "make-custom-agent", 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 dotnet/efcore --skill make-custom-agent -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install dotnet/efcore make-custom-agent --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/dotnet/efcore.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.agents/skills/make-custom-agent .opencode/skills/make-custom-agent && 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 "make-custom-agent" agent skill from https://github.com/dotnet/efcore/tree/main/.agents/skills/make-custom-agent into .opencode/skills/make-custom-agent/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "make-custom-agent", 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.
make-custom-agentCreate custom GitHub Copilot agents. An agent skill from dotnet/efcore.
Make Custom Agent is an agent skill from dotnet/efcore, published by the product's own GitHub organization. Create custom GitHub Copilot agents. Use when asked to create, scaffold, or configure a custom agent, declarative agent, or @-invokable chat participant for GitHub Copilot.
Its SKILL.md is about 2.3k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It works with Visual Studio Code and GitHub. The repository describes itself as: EF Core is a modern object-database mapper for .NET. It supports LINQ queries, change tracking, updates, and schema migrations. The licence is MIT.
7 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 7adff35. 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.
No scripts in the folder and no shell commands in SKILL.md (its code samples are yaml, json, typescript and markdown).
From the folder's file list and the shell code blocks in SKILL.md.
Links to these hosts (documentation or services it may open):
docs.github.comcode.visualstudio.comgithub.comagentskills.ioFrom 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.
Make Custom Agent loads about 2.3k tokens when it runs. Until then it costs about 48 tokens; SKILL.md has 784 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 dotnet/efcore at commit 7adff35, republished under its MIT licence (© dotnet). 784 words, ~2,344 tokens.
.claude/skills/make-custom-agent/SKILL.md (or your agent's skills folder).This skill guides you through creating a custom GitHub Copilot agent — an @-invokable chat participant that extends Copilot with domain-specific expertise. Custom agents are distinct from Agent Skills: skills provide reusable instructions loaded on demand, while agents own the full conversational interaction and can orchestrate tools, call APIs, and maintain their own prompt strategies.
.agents/skills/) instead.github/instructions/) instead.github/copilot-instructions.md instead| Type | Location | Best for |
|---|---|---|
| Declarative (prompt file) | .github/agents/<name>.md | Simple prompt-driven cross-surface agents with no code |
| Extension-based (chat participant) | VS Code extension project | Full control, tool calling, VS Code API access |
| GitHub App (Copilot Extension) | Hosted service + GitHub App | Cross-surface agents (github.com, VS Code, Visual Studio) |
If the agent only needs a scoped system prompt and doesn't require custom code, start with a declarative agent.
Declarative agents are Markdown files in .github/agents/. VS Code and GitHub Copilot discover them automatically.
.github/agents/
└── <agent-name>.md # Agent definitionTemplate:
---
name: my-agent
description: A short description of what this agent does and when to use it.
---
# <Agent Title>
You are an expert in <domain>. Your job is to:
- <behavior 1>
- <behavior 2>
## Guidelines
- <guideline 1>
- <guideline 2>
## Workflow
1. <step 1>
2. <step 2>
## Constraints
- <constraint 1>
- <constraint 2>
Supported frontmatter fields:
| Field | Required | Description |
|---|---|---|
name | Yes | Lowercase, hyphens allowed. Used for @-mention. |
description | Yes | What the agent does and when to use it. Shown in the participant list. |
target | No | Target environment: vscode or github-copilot (defaults to both) |
tools | No | List of allowed tools/tool sets |
model | No | LLM name or prioritized array of models |
user-invocable | No | Show in agents dropdown (default: true) |
disable-model-invocation | No | Prevent subagent invocation (default: false) |
mcp-servers | No | MCP server configs for GitHub Copilot target |
metadata | No | Key-value mapping for additional arbitrary metadata. |
argument-hint | No | Hint text guiding user interaction (VS Code only) |
agents | No | List of allowed subagents (* for all, [] for none, VS Code only) |
handoffs | No | List of next-step agent transitions (VS Code only) |
Tips for instructions:
#tool:<tool-name> syntaxSpecify which tools the agent can use:
tools:
- search # Built-in tool
- fetch # Built-in tool
- codebase # Tool set
- myServer/* # All tools from MCP serverCommon tool patterns:
['search', 'fetch', 'codebase']['*'] or specific editing toolsConfigure transitions to other agents:
handoffs:
- label: Start Implementation
agent: implementation
prompt: Implement the plan outlined above.
send: false
model: GPT-5.2 (copilot)Handoff fields:
label: Button text displayed to useragent: Target agent identifierprompt: Pre-filled prompt for target agentsend: Auto-submit prompt (default: false)model: Optional model override for handoffFor full control, implement a VS Code extension with a chat participant:
package.json:"contributes": {
"chatParticipants": [
{
"id": "my-extension.my-agent",
"name": "my-agent",
"fullName": "My Agent",
"description": "Short description shown in chat input",
"isSticky": false,
"commands": [
{
"name": "explain",
"description": "Explain the selected code"
}
]
}
]
}extension.ts:export function activate(context: vscode.ExtensionContext) {
const agent = vscode.chat.createChatParticipant('my-extension.my-agent', handler);
agent.iconPath = vscode.Uri.joinPath(context.extensionUri, 'icon.png');
}
const handler: vscode.ChatRequestHandler = async (
request: vscode.ChatRequest,
context: vscode.ChatContext,
stream: vscode.ChatResponseStream,
token: vscode.CancellationToken
) => {
const model = request.model;
const messages = [
vscode.LanguageModelChatMessage.User(request.prompt)
];
const response = await model.sendRequest(messages, {}, token);
for await (const fragment of response.text) {
stream.markdown(fragment);
}
};package.json:"extensionDependencies": ["github.copilot-chat"]Agents can invoke language model tools registered by other extensions:
const tools = vscode.lm.tools.filter(tool => tool.tags.includes('my-domain'));
const result = await chatUtils.sendChatParticipantRequest(request, context, {
prompt: 'You are an expert in <domain>.',
tools,
responseStreamOptions: { stream, references: true, responseText: true }
}, token);
return await result.result;If the agent should be available on GitHub.com, Visual Studio, JetBrains, and VS Code simultaneously, implement a GitHub App that acts as a Copilot Extension. The app registers a webhook endpoint, receives chat requests, and streams responses back.
Key considerations:
After creating or modifying an agent, verify:
name is lowercase, uses hyphens (no spaces), and is uniquedescription clearly describes what the agent does and when to invoke it.github/agents/package.json and createChatParticipant call@workspace, @vscode, @terminal)| Pitfall | Solution |
|---|---|
| Agent name conflicts with built-in participants | Use a unique prefix (domain name) |
| Description is too vague | Include specific keywords users would naturally say |
| System prompt is too long | Keep instructions to essential behaviors; move reference material to Agent Skills |
| Agent requires VS Code API but is authored as declarative | Switch to extension-based participant |
Using isSticky: true unnecessarily | Only set sticky if the agent should persist between turns by default |
No extensionDependencies on github.copilot-chat | Add it; otherwise the contribution point may not be available |
| Agent invoked as subagent unexpectedly | Set disable-model-invocation: true |
| Subagent appears in the dropdown | Set user-invocable: false |
make-skill and make-instructions© dotnet, 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/make-custom-agent of dotnet/efcore.
Open the folder on GitHubat commit 7adff35
Make Custom Agent 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 |
|---|---|---|---|---|---|---|
| Make Custom Agent this skilldotnet/efcore | 15k | — | ~2.3k | Automated safety check: Pass | MIT | |
| ReleasePowerShell/vscode-powershell | 1.9k | — | ~1.1k | Automated safety check: Pass | MIT | |
| Release Roslynatordotnet/roslynator | 3.5k | — | ~1k | Automated safety check: Pass | Custom licence | |
| Promotion Branches E2E Testhardisgroupcom/sfdx-hardis | 400 | — | ~4.7k | Automated safety check: Notes | AGPL-3.0 | |
| Capture As Gh IssuetwentyTwo/vsc-ext-coding-time-tracker | 151 | — | ~1k | Automated safety check: Pass | MIT | |
| Unicliolo-dot-io/Uni-CLI | 273 | — | ~3.8k | Automated safety check: Notes | Apache-2.0 |
PowerShell/vscode-powershell
Guide for preparing a release of the PowerShell VS Code extension.
dotnet/roslynator
A skill your agent uses when shipping a roslynator release, rolling CHANGELOG.md [Unreleased], updating the VS Code extension changelog, creating a GitHub v release, or optionally tagging cli-v.
hardisgroupcom/sfdx-hardis
Runs a full end-to-end test of sfdx-hardis promotion branches and backpromote against real Salesforce orgs and a throwaway repository, then writes a report.
twentyTwo/vsc-ext-coding-time-tracker
Capture the idea, concept, or bug being brainstormed in the current chat and file it as a GitHub issue in the current repository.
olo-dot-io/Uni-CLI
Comprehensive guide to Uni-CLI — the open Agent-Computer Interface runtime for real software.
signageos/vscode-sops
Releases the vscode-sops extension end-to-end: determines the next version from the bump history, updates CHANGELOG.md and package.json/package-lock.json, builds via vscode:prepublish, publishes to…
dotnet/efcore
Create and evaluate new Agent Skills for GitHub Copilot. An agent skill from dotnet/efcore.
dotnet/efcore
Create GitHub Actions workflows for CI, automation, or PR management.
dotnet/efcore
Create and evaluate VS Code file-based instructions (.instructions.md files).
dotnet/efcore
Implementation details for EF Core model building. An agent skill from dotnet/efcore.
dotnet/efcore
Run ApiChief in the EF Core repo to emit baselines, summaries, deltas, review files, or breaking-change checks.
dotnet/efcore
Create EF Core PRs targeting servicing release branches (release/).
Works with
Create custom GitHub Copilot agents. An agent skill from dotnet/efcore. Make Custom Agent is an agent skill from dotnet/efcore, published by the product's own GitHub organization. Create custom GitHub Copilot agents.
Make Custom Agent fits situations like: asked to create; configure a custom agent; declarative agent; @-invokable chat participant for GitHub Copilot.
Run `npx skills add dotnet/efcore --skill make-custom-agent -a claude-code`. Or copy the skill folder (.agents/skills/make-custom-agent in dotnet/efcore) into .claude/skills/make-custom-agent in your project. Claude Code loads it when a task matches its description.
Run `npx skills add dotnet/efcore --skill make-custom-agent -a codex`. Or copy the skill folder (.agents/skills/make-custom-agent in dotnet/efcore) into .agents/skills/make-custom-agent 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 dotnet/efcore --skill make-custom-agent -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/make-custom-agent, .gemini/skills/make-custom-agent, .github/skills/make-custom-agent and .opencode/skills/make-custom-agent in your project.
SKILL.md names no scripts, command-line tools or credentials: Make Custom Agent is instructions for the agent only.
SKILL.md names 4 domains. As links in the text: docs.github.com, code.visualstudio.com, github.com and agentskills.io. 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.
Make Custom Agent is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 2.3k tokens (SKILL.md is roughly 9.4k 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 Make Custom Agent: Release (PowerShell/vscode-powershell, 1.9k stars), Release Roslynator (dotnet/roslynator, 3.5k stars), Promotion Branches E2E Test (hardisgroupcom/sfdx-hardis, 400 stars) and Capture As Gh Issue (twentyTwo/vsc-ext-coding-time-tracker, 151 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
dotnet (a GitHub organization, an official publisher) maintains it in dotnet/efcore, which has 14,800 GitHub stars. The repository holds 17 skills in this directory. The repository was last updated on October 7, 2026.
Source: dotnet/efcore on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.