RE

release-publish

Publish and finalize NuGet packages and GitHub releases.

Install

mkdir -p .claude/skills/release-publish && curl -L -o skill.zip "https://agentskills.codes/api/skills/download/2987" && unzip -o skill.zip -d .claude/skills/release-publish && rm skill.zip

Installs to .claude/skills/release-publish

Activation

This is the description your AI agent reads to decide when to run this skill — the better it matches your request, the more reliably it fires.

Publish SkiaSharp packages and finalize the release. Use when user says "publish X", "finalize X", "tag X", or "finish release X". This is the FINAL step - after release-testing passes. Publishes to NuGet.org, creates tag, GitHub release, and closes milestone. Triggers: "publish the release", "push to nuget", "create github release", "tag the release", "close the milestone", "annotate release notes", "testing passed what's next", "finalize 3.119.2", "release is ready".
473 chars✓ has a “when” triggerlonger than Claude Code's old 250-char listing cap (fine on current versions)
Advanced

Key capabilities

  • Publish packages to NuGet.org
  • Create and push git tags
  • Generate GitHub releases
  • Close version-specific milestones

How it works

It executes a multi-step pipeline to publish packages, tag the repository, update release notes, and close milestones.

Inputs & outputs

You give it
Release version and branch
You get back
Published NuGet package and GitHub release

When to use release-publish

  • Publish package to NuGet
  • Finalize the release process
  • Create a git tag and release

About this skill

Release Publish

This skill is Step 4 of 5:

release-branchrelease-statusrelease-testingrelease-publishrelease-milestones

Contract

  • Start from a passing release-testing handoff unless the user explicitly overrides that gate. Preserve the exact branch, source SHA, managed run ID, tests run ID, and paired package versions.
  • Use scripts for detection, Azure publication, NuGet verification, draft creation, and final publication.
  • Package publication, tag push, and GitHub Release publication are irreversible. Present the corresponding dry-run and obtain approval first.
  • Preserve the detector's source SHA and run IDs; never select newer packages or pipeline runs.
  • Keep the checkout unchanged. Draft creation pushes a lightweight tag directly to the tested SHA.
  • Never delete or move a published tag/release to recover.
  • Approval of the queue command authorizes only queueing pipeline 25298. Its protected push stage then waits for a human to review the exact versions and destination. The agent never approves that downstream gate.
  • The agent owns customer-teaser classification between draft creation and publication; scripts assemble and validate the final release body.

Script contract

ScriptResponsibility
scripts/detect-release-publish.pyRead-only exact release/testing/package handoff.
scripts/push-release-packages.pyAudit, queue/recover one exact pipeline 25298 run, and optionally wait through NuGet verification.
scripts/create-release-draft.pyAudit or create the exact tag and generated-notes GitHub draft.
scripts/publish-release.pyValidate the teaser and publish the draft.
scripts/release_github.pyShared GitHub release and body helpers; not a user command.
scripts/release_publish.pyShared clients and validation; not a user command.

Write scripts audit with --dry-run and execute without it. The detector emits the pinned audit commands; every confirmation report emits its exact executionCommand.

Actions

SourcenextActionResponse
Detectoraudit-package-publicationRun pushAuditCommand.
Packagesconfirm-publish-packagesApprove and run package execution.
Packagesapprove-publish-runShow publishRun.url and stop for human review/approval.
Packageswait-for-nugetContinue the pinned resume command until both versions index.
Packagesretry-publish-runShow the failed exact run and return to package audit.
Packagesstart-release-draftRun draftAuditCommand.
Draftconfirm-create-release-draftApprove and create the tag/draft.
Draftwrite-release-teaserClassify generated-log.md and fill teaser.md.
Draftaudit-release-publicationRelease already exists; run publishAuditCommand.
Publicationconfirm-publish-releaseApprove and publish the completed draft.
Publicationstart-release-milestonesHand off the emitted milestone reconciliation command.

Workflow

1. Detect

python3 .agents/skills/release-publish/scripts/detect-release-publish.py \
  {release-branch-or-tested-sha}

Preserve all returned release/run/package pins. Detection is also the recovery entry point after lost context: rerun it from only release/{version} to reconstruct every --expect-* value and pinned audit command. Never reconstruct those values manually.

2. Publish packages

Run pushAuditCommand. Render:

## Package publication audit

**Release:** `{release.version}` ({release.type})
**Commit:** `{release.sourceSha}`
**Managed/tests runs:** `{release.managedRunId}` / `{release.testsRunId}`
**Public packages:** SkiaSharp `{release.publicPackages.SkiaSharp}`,
HarfBuzzSharp `{release.publicPackages.HarfBuzzSharp}`

| Operation | Status | Detail |
|-----------|--------|--------|
| `{operations[].id}` | `{operations[].status}` | `{operations[].detail}` |

The emitted audit command already includes --dry-run. Use it whenever status must be read or recovered without queueing anything; it detects an exact queued/running/succeeded publication and returns its URL/resume command.

For confirm-publish-packages, obtain approval and run executionCommand. Verify that Azure selected the exact managed resource/run and the Stable or Preview destination. The queue command returns immediately: show publishRun.runId and publishRun.url, then stop so a human can review the versions/destination and approve the protected stage.

After the user confirms that decision, run the emitted resumeCommand. It is the same script with --wait --publish-run {id}, waits for completion, and verifies both exact public packages on NuGet.org.

If Azure succeeds but indexing exceeds the wait window, treat the returned wait-for-nuget report as resumable status, not a publication failure. Show wait.missingPackages and reuse resumeCommand.

For unattended automation, invoke the approved execution command with --wait. It queues or recovers the exact run, prints its URL immediately, then waits through protected approval and NuGet indexing in one process.

3. Create the generated-notes draft

Run draftAuditCommand. It parses all release tags using SkiaSharp's NuGet-compatible ordering (including four-part hotfixes) and selects the greatest tag below the current release as previousTag.

python3 .agents/skills/release-publish/scripts/create-release-draft.py \
  {pinned arguments} \
  --dry-run

For confirm-create-release-draft, present the exact tag, source SHA, title, prerelease state, previous tag, and operation table. Obtain approval and run executionCommand. It pushes the tag, creates a GitHub draft containing the exact generated notes, then downloads that body into ignored local artifacts:

FileOwnership
generated-log.mdBody downloaded from the GitHub draft; classification input only.
teaser.mdAgent edits customer-facing sections.

Rerunning this dry-run detects an existing remote tag/draft and re-downloads generated-log.md.

4. Prepare the teaser

For write-release-teaser, follow github-release-teaser.md, edit only teaser.md, and preserve exactly one <!-- RELEASE_LINKS --> marker.

This step is editorial and local only. It does not audit, modify, or publish the GitHub Release. Unsaved edits to teaser.md are the only publication state that cannot be recovered remotely.

5. Finish the release

Run the draft result's emitted publishAuditCommand. The publication dry-run consumes teaser.md, creates release-body.md, and validates its exact SHA.

FileOwnership
release-body.mdScript-assembled final body uploaded to the draft after approval.

For confirm-publish-release, present the draft URL, expected body SHA, teaser, and operation table. Obtain approval and run executionCommand. One execution dispatches targeted website notes, uploads the approved body, and publishes the draft.

6. Hand off milestones

For start-release-milestones, invoke the emitted milestonesCommand with release-milestones, complete its Reconcile path, then run its normal Advance path.

Reporting

Never dump raw JSON. Include every warning and link any operation URL. Ask for approval only for confirm-* actions.

See releasing.md for the complete release process.

When not to use it

  • Before release testing passes
  • When modifying protected branches directly

Prerequisites

Release testing completionAzure DevOps access

Limitations

  • Cannot undo publishing to NuGet
  • Requires strict adherence to semver ordering

How it compares

It automates the final release steps, replacing manual publishing and repository management.

Compared to similar skills

release-publish side by side with the closest alternatives in the catalog.

SkillInstallsUpdatedSafetyDifficulty
release-publish (this skill)11moReviewAdvanced
gcp-cloud-run55moReviewIntermediate
flow-nexus-platform64moReviewBeginner
smithery-mcp-deployment88moReviewIntermediate

Try saying

Example prompts that trigger this skill in your AI assistant.

add-api

mono

Add new C# APIs to SkiaSharp by wrapping Skia C++ functionality. Structured 6-phase workflow: C++ analysis → C API creation → submodule commits → binding generation → C# wrapper → testing. Triggers: - Issue classified as "New API" (after fetching and classification) - Direct request: "add DrawFoo method", "expose SkSurface::draw", "wrap sk_foo_bar" - Keywords: "add API", "expose function", "wrap method", "create binding for"

68

bug-fix

mono

Fix bugs in SkiaSharp C# bindings. Structured workflow for investigating, fixing, and testing bug reports. Triggers: Crash, exception, AccessViolationException, incorrect output, wrong behavior, memory leak, disposal issues, "fails", "broken", "doesn't work", "investigate issue", "fix issue", "look at #NNNN", any GitHub issue number referencing a bug. For adding new APIs, use `add-api` skill instead.

426

api-docs

mono

Write and review XML API documentation for SkiaSharp following .NET guidelines. Triggers: "document class", "add XML docs", "write XML documentation", "add triple-slash comments", "review documentation quality", "check docs for errors", "fix doc issues", "fill in missing docs", "remove To be added placeholders", API documentation requests.

110

native-dependency-update

mono

Update native dependencies (libpng, libexpat, zlib, libwebp, harfbuzz, freetype, libjpeg-turbo, etc.) in SkiaSharp's Skia fork. Handles security CVE fixes, bug fixes, and version bumps. Use when user asks to: - Bump/update a native dependency (libpng, zlib, expat, webp, etc.) - Fix a CVE or security vulnerability in a native library - Update Skia's DEPS file - Check what version of a dependency is currently used - Analyze breaking changes between dependency versions Triggers: "bump libpng", "update zlib", "fix CVE in expat", "update native deps", "what version of libpng", "check for breaking changes". For security audits (finding CVEs, checking PR coverage), use the `security-audit` skill instead.

11

release-branch

mono

Create a release branch for SkiaSharp. Use when user says "release X", "start release X", "create release branch for X", "I want to release", or "release now". This is the FIRST step of releasing - creates branch and pushes to trigger CI. Can auto-detect next preview version from main branch.

12

release-testing

mono

Run integration tests to verify SkiaSharp NuGet packages work correctly before publishing. Use when user asks to: - Test/verify packages before release - Run integration tests - Test on specific device (iPad, iPhone, Android emulator, Mac, Windows) - Verify SkiaSharp rendering works - Check if packages are ready for publishing - Run smoke/console/blazor/maui tests - Continue with release - Test version X Triggers: "test the release", "verify packages", "run tests on iPad", "check ios tests", "test mac catalyst", "run android tests", "continue", "test 3.119.2-preview.2".

14

You might also like

gcp-cloud-run

aj-geddes

Deploy containerized applications on Google Cloud Run with automatic scaling, traffic management, and service mesh integration. Use for container-based serverless computing.

5107

flow-nexus-platform

ruvnet

Comprehensive Flow Nexus platform management - authentication, sandboxes, app deployment, payments, and challenges

691

smithery-mcp-deployment

CaullenOmdahl

Best practices for creating, optimizing, and deploying MCP servers to Smithery. Use this skill when:(1) Creating new MCP servers for Smithery deployment(2) Optimizing quality scores (achieving 90/100)(3) Troubleshooting deployment issues (0/0 tools, missing annotations, low scores)(4) Migrating existing MCP servers to Smithery format(5) Understanding Smithery's schema format requirements(6) Adding workflow prompts, tool annotations, or documentation resources(7) Configuring smithery.yaml and package.json for deployment

881

deployment-pipeline-design

wshobson

Design multi-stage CI/CD pipelines with approval gates, security checks, and deployment orchestration. Use when architecting deployment workflows, setting up continuous delivery, or implementing GitOps practices.

670

vercel-deployment

davila7

Expert knowledge for deploying to Vercel with Next.js Use when: vercel, deploy, deployment, hosting, production.

359

netlify-deploy

openai

Deploy web projects to Netlify using the Netlify CLI (`npx netlify`). Use when the user asks to deploy, host, publish, or link a site/repo on Netlify, including preview and production deploys.

740

Search skills

Search the agent skills registry