К основному содержанию
скилл CX Codex

nuget-trusted-publishing — скилл для Claude Code: обзор и установка

Настраивает публикацию пакетов в nuget.org через GitHub Actions и OIDC без постоянных API-ключей. Пригодится при переводе сборки на NuGet/login или создании нового пайплайна.

Установить в Claude Code · Через Skills CLI (Vercel) Все способы и платформы ↓
npx skills add dotnet/skills --skill nuget-trusted-publishing -a claude-code
Открыть на GitHub

Что делает nuget-trusted-publishing

Скилл автоматизирует переход на доверенную публикацию (trusted publishing) для репозиториев на GitHub Actions. Вместо долгоживущего секрета NUGET_API_KEY агент внедряет короткоживущие токены через NuGet/login@v1 и право id-token: write. Скилл анализирует .csproj и Directory.Build.props, определяет тип проекта (библиотека, утилита dotnet tool, MCP-сервер или шаблон), сверяет версии и проверяет старые пайплайны.

Перед релизом агент предлагает локально собрать пакет через dotnet pack -c Release -o ./artifacts. Номер версии в NuGet сжечь легко. Поэтому скилл перепроверяет метаданные и формирует точные данные для формы nuget.org/account/trustedpublishing: владельца репозитория и имя файла воркфлоу без путей. Старые секреты агент не трогает без явного подтверждения.

Для публикации в приватные фиды или Azure Artifacts скилл не подходит: механизм OIDC поддерживается исключительно на nuget.org.

Какие задачи решает

  • перевести публикацию пакета с NUGET_API_KEY на OIDC и NuGet/login@v1
  • подготовить рабочий процесс GitHub Actions для релиза библиотеки или dotnet tool
  • проверить метаданные .csproj и синхронизацию версий перед публикацией
  • получить точные параметры для настройки политики доверия на nuget.org

Примеры запросов агенту

  • Настрой trusted publishing для публикации пакета в nuget.org
  • Помоги убрать NUGET_API_KEY и перейти на OIDC через NuGet/login
  • Создай GitHub Actions воркфлоу для релиза нашего MCP-сервера в NuGet

Как установить nuget-trusted-publishing

1Через Skills CLI (Vercel)

npx skills add dotnet/skills --skill nuget-trusted-publishing -a claude-code

2Вручную: положить файлы

~/.claude/skills/nuget-trusted-publishing/SKILL.md

Папка скилла целиком; для одного проекта — .claude/skills/nuget-trusted-publishing/

По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов

Из того же набора101

build-perf-baseline Скилл задаёт методику замера скорости сборки .NET и MSBuild перед оптимизацией. Он помогает зафиксировать холодный, тёплый и no-op прогоны с бинлогами. CX Codex +1 3 500установок thread-abort-migration Переводит устаревший вызов Thread.Abort из .NET Framework на кооперативную отмену задач через CancellationToken в .NET 6+. Помогает убрать ошибки PlatformNotSupportedException и предупреждения SYSLIB0006. CX Codex +1 3 300установок maui-app-lifecycle Подсказывает агенту, как правильно обрабатывать переходы состояний приложения .NET MAUI и сохранять данные при сворачивании. CX Codex +1 3 300установок generate-testability-wrappers Скилл генерирует обёртки и регистрацию в DI для статических зависимостей C#, из-за которых код не получается покрыть тестами. CX Codex +1 3 300установок resolve-project-references Помогает не оптимизировать ResolveProjectReferences по вводящей в заблуждение метрике MSBuild. Нужен при разборе медленной сборки с binlog. CX Codex +1 3 300установок migrate-dotnet8-to-dotnet9 Скилл ведёт проект с net8.0 на net9.0: правит TargetFramework, разбирает ошибки сборки и поведенческие изменения .NET 9, C# 13, ASP.NET Core 9 и EF Core 9. CX Codex +1 3 400установок including-generated-files Помогает подключить файлы, созданные во время сборки, к компиляции или выходным данным MSBuild. Нужен, когда созданный файл не подхватывается автоматически. CX Codex +1 3 400установок clr-activation-debugging Скилл читает логи активации CLR от mscoree.dll и показывает, какую версию рантайма выбрал шим и на каком шаге выбор сломался. CX Codex +1 3 400установок

Похожие

git-guardrails-claude-code Matt Pocock Скилл ставит хук Claude Code, который останавливает опасные Git-команды до их запуска. Нужен, если агент не должен делать push или удалять изменения. 499 069установок ponytail-review DietrichGebert Скилл проверяет изменения глубже обычного diff: читает связанный код, ищет ошибки, риски, проблемы нагрузки и недостающие тесты. Пригодится для ревью PR и коммитов. CX Codex +1 57 000установок ponytail-audit DietrichGebert Проверяет репозиторий и ранжирует ошибки, риски и лишний код. Подойдёт, если нужен разовый разбор без автоматических правок. CX Codex +1 45 400установок security-audit cloudflare Проверяет кодовую базу на уязвимости и ищет нарушения границ доверия. Пригодится перед релизом или для точечного разбора опасных участков кода. CX Codex +1 54 800установок security-and-hardening addyosmani Помогает проектировать защиту и проверять код на уязвимости при работе с вводом, авторизацией, сессиями и внешними сервисами. Подойдёт перед релизом и при создании функций, которые обрабатывают недоверенные данные. CX Codex +1 70 200установок supabase официальный supabase Скилл помогает настраивать базу данных, аутентификацию и RLS в Supabase без скрытых дыр в безопасности. CX Codex GP ChatGPT 8установок

Рядом в теме «Безопасность»

Всё по теме «Безопасность» →

Вопросы о nuget-trusted-publishing

Как установить nuget-trusted-publishing в Claude Code?

Выполните команду npx skills add dotnet/skills --skill nuget-trusted-publishing -a claude-code. Файлы скилла сохранятся в локальную директорию конфигурации.

Что делает nuget-trusted-publishing?

Скилл пошагово настраивает публикацию пакетов из GitHub Actions на nuget.org без долгоживущих API-ключей. Он генерирует воркфлоу с NuGet/login@v1 и подсказывает параметры для создания политики OIDC.

Можно ли использовать этот скилл для Azure Artifacts или приватных фидов?

Нет, скилл предназначен строго для nuget.org. Доверенная публикация по протоколу OIDC не работает с Azure Artifacts и сторонними приватными репозиториями пакетов.

Исходный текст

SKILL.md · MIT
---
name: nuget-trusted-publishing
description: >
  Set up NuGet trusted publishing (OIDC) on a GitHub Actions repo — replaces long-lived API keys
  with short-lived tokens. USE FOR: trusted publishing, NuGet OIDC, keyless NuGet publish,
  migrate from NuGet API key, NuGet/login, secure NuGet publishing.
  DO NOT USE FOR: publishing to private feeds or Azure Artifacts (OIDC is nuget.org only).
  INVOKES: shell (powershell or bash), edit, create, ask_user for guided repo setup.
license: MIT
---

# NuGet Trusted Publishing Setup

Set up [NuGet trusted publishing](https://learn.microsoft.com/en-us/nuget/nuget-org/trusted-publishing) on a GitHub Actions repo. Replaces long-lived API keys with OIDC-based short-lived tokens — no secrets to rotate or leak.

## Prerequisites

- **GitHub Actions** — this skill covers GitHub Actions setup only
- **nuget.org account** — the user needs access to create trusted publishing policies

## When to Use This Skill

Use this skill when:
- Setting up trusted publishing for a NuGet package
- Migrating from `secrets.NUGET_API_KEY` to OIDC-based publishing
- Asked about keyless or secure NuGet publishing
- Creating a new NuGet publish workflow from scratch
- Asked to "remove NuGet API key" or "use NuGet/login"
- Setting up publishing for a dotnet tool, MCP server, or template package
- Asked about `NuGet/login@v1` or `id-token: write`

## Safety Rules

> ⚠️ **Bail-out rule**: If any phase fails after one fix attempt on an infrastructure/auth issue, stop and ask the user. Don't loop on environment problems.

> ⚠️ **Never delete or overwrite without confirmation**: Removing API key secrets, deleting tags/releases, removing workflow steps, or changing package IDs. NuGet package IDs are permanent — mistakes can't be undone.

## Process

> **Fast-path for greenfield repos**: When the user has a simple setup (one packable project, no existing publish workflow), don't gate on multi-turn assessment. Combine phases: create the workflow immediately, include nuget.org policy guidance, local pack recommendation, and filename-matching warning all in one response. The full phased process below is for complex or migration scenarios.

### Phase 1: Assess

Inspect the repo and report findings before making any changes.

1. **Find and classify packable projects** — check `.csproj` files **and `Directory.Build.props`** (package metadata is often set repo-wide). Classify in this order (earlier matches win):
   - `<PackageType>Template</PackageType>` → **Template**
   - `<PackageType>McpServer</PackageType>` → **MCP server** (also a dotnet tool)
   - `<PackAsTool>true</PackAsTool>` → **Dotnet tool**
   - Class library (`IsPackable=true` or no `OutputType`) → **Library**
   - `<OutputType>Exe</OutputType>` with `<IsPackable>true</IsPackable>` → **Application package** (not a tool, but still publishable)
   - `<OutputType>Exe</OutputType>` without `PackAsTool` or `IsPackable` → Not packable by default (ask user if they intend to publish it)

2. **Validate structure** for each project's type:

   | Type | Required |
   |------|----------|
   | All | `PackageId`, `Version` (in .csproj or Directory.Build.props) |
   | Dotnet tool | `PackAsTool` (required); `ToolCommandName` (optional but recommended — defaults to assembly name) |
   | MCP server | `PackageType=McpServer`, `.mcp/server.json` included in package |
   | Template | `PackageType=Template`, `.template.config/template.json` under content dir |

3. **Find existing publish workflows** in `.github/workflows/` — look for `dotnet nuget push`, `nuget push`, or `dotnet pack`.

4. **Check version consistency** — for MCP servers, verify `.csproj` `<Version>` matches both `server.json` version fields (root `version` and `packages[].version`). Flag any mismatch.

5. **Report findings** to the user: classification, missing properties, version mismatches, existing workflows. For multi-project repos, note whether one workflow or separate workflows per package are needed. Offer to fix gaps — use `ask_user` before modifying project files.

> ❌ See [references/package-types.md](references/package-types.md) for per-type details and required properties.

### Phase 2: Local Verification

Pack and verify locally before touching nuget.org — publishing errors waste a permanent version number.

> ⚠️ **Always mention this step**, even if you defer running it. Tell the user: "Before your first publish, run `dotnet pack -c Release -o ./artifacts` to verify the .nupkg is created correctly."

1. `dotnet pack -c Release -o ./artifacts` — verify `.nupkg` is created
2. For tools/MCP servers: install from `./artifacts`, run `--help`, uninstall
3. For libraries: inspect the `.nupkg` contents (it's a zip)

### Phase 3: nuget.org Policy

This phase requires the user to act on nuget.org — guide them with exact values.

1. Determine the **repo owner**, **repo name**, and the **workflow filename** that will publish.

   > ❌ The policy requires the **exact workflow filename** (e.g., `publish.yml` or `publish.yaml`) — just the filename, no path prefix. Matching is case-insensitive. Don't use the workflow `name:` field.

2. Guide the user to create the trusted publishing policy:
   > Go to [**nuget.org/account/trustedpublishing**](https://www.nuget.org/account/trustedpublishing) → **Add policy**
   >
   > - **Repository Owner**: `{owner}`
   > - **Repository**: `{repo}`
   > - **Workflow File**: `{filename}.yml`
   > - **Environment**: `release` *(only if the workflow uses `environment:`; leave blank otherwise)*

   Policy ownership: the user chooses individual account or organization. Org-owned policies apply to all packages owned by that org.

   For **private repos**: policy is "temporarily active" for 7 days — becomes permanent after the first successful publish.

3. Guide the user to create a **GitHub Environment** (recommended but optional — provides secret scoping + approval gates):
   > Repo **Settings** → **Environments** → **New environment** → `release`
   >
   > Add environment secret: **Name** = `NUGET_USER`, **Value** = nuget.org username (NOT email)

   Optional: add **Required reviewers** for an approval gate.

> ⚠️ Wait for the user to confirm they've created the policy **before asking them to remove old API keys/secrets or before attempting to run/publish with the workflow**. Drafting or showing the workflow file itself is OK before confirmation.

### Phase 4: Workflow Setup

Create or modify the publish workflow. **The workflow must always be created or shown in your response** — you may draft/show it even if the nuget.org policy is not yet confirmed, but do not guide the user to actually run/publish or remove old secrets until after confirmation.

**Greenfield**: Create `publish.yml` from the template in [references/publish-workflow.md](references/publish-workflow.md). Adapt .NET version, project path, and environment name. Ensure your output explicitly mentions `id-token: write` and `NuGet/login@v1`.

**Migration** (existing workflow with API key): Modify in place —

1. **Add OIDC permission and environment** to the publishing job:
   ```yaml
   jobs:
     publish:
       environment: release
       permissions:
         id-token: write     # Required — without this, NuGet/login fails with 403
         contents: read      # Explicit — setting permissions overrides defaults
   ```

2. **Add the NuGet login step** before push:
   ```yaml
   - name: NuGet login (OIDC)
     id: login
     uses: NuGet/login@v1
     with:
       user: ${{ secrets.NUGET_USER }}  # nuget.org profile name, NOT email
   ```

3. **Replace the API key** in the push step:
   ```yaml
   --api-key ${{ steps.login.outputs.NUGET_API_KEY }} --skip-duplicate
   ```

4. **Verify**: Ask the user to trigger a publish and confirm the package appears on nuget.org.

> ❌ **Don't delete the old API key secret** until trusted publishing is verified. Removing it is a one-way door — wait for confirmation.

## Troubleshooting

| Problem | Cause | Fix |
|---------|-------|-----|
| `NuGet/login` 403 | Missing `id-token: write` | Add to job permissions |
| "no matching policy" | Workflow filename mismatch | Verify exact filename on nuget.org |
| Push unauthorized | Package not owned by policy account | Check policy owner on nuget.org |
| Token expired | Login step >1hr before push | Move `NuGet/login` closer to push |
| "temporarily active" policy | Private repo, first publish pending | Publish within 7 days |
| `already_exists` on push | Re-running same version | Add `--skip-duplicate` |
| GitHub Release 422 | Duplicate release for tag | Delete conflicting release (confirm first) |
| Re-run uses wrong YAML | `gh run rerun` replays original commit's YAML | Delete obstacle, re-run — never re-tag |

> ⚠️ If any blocker persists after one fix attempt, **stop and ask the user**.

## References

- **Package type details**: [references/package-types.md](references/package-types.md) — detection logic, required properties, minimal .csproj examples
- **Publish workflow template**: [references/publish-workflow.md](references/publish-workflow.md) — complete tag-triggered workflow ready to adapt
- **Microsoft docs**: [NuGet Trusted Publishing](https://learn.microsoft.com/en-us/nuget/nuget-org/trusted-publishing)

© dotnet · MIT · dotnet/skills

Смотрите также

Спонсоры проекта

Компании, которые помогают держать аналитику открытой