Agent skill

Release

by ngrok in ngrok/ngrok-operator

Automates the ngrok-operator release process: gathers PR data, classifies changes by component (container, Helm chart, CRDs chart), generates changelogs, updates version files, and prepares the…

MITAuto-check passedDevelopment

Install Release

skills CLI
$ npx skills add ngrok/ngrok-operator --skill release -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install ngrok/ngrok-operator release --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/ngrok/ngrok-operator.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/release .claude/skills/release && rm -rf skills-src

Use ~/.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/

Facts

Skill name
release
GitHub stars
272
Token cost
~2.7k tokens
SKILL.md length
1,050 words
Files
2 (incl. scripts)
Skills in repo
1
Repo updated
First seen
Licence
MIT

At a glance

Automates the ngrok-operator release process: gathers PR data, classifies changes by component (container, Helm chart, CRDs chart), generates changelogs, updates version files, and prepares the…

  • Works in 10 steps: Pre-flight checks → Gather release data → Suggest version bumps → …
  • The user mentions releasing
  • SKILL.md covers The Three Components, Workflow and Important notes
  • Runs Shell scripts from its folder; calls yq, git and bash

What it does

Release is an agent skill from ngrok/ngrok-operator. Automates the ngrok-operator release process: gathers PR data, classifies changes by component (container, Helm chart, CRDs chart), generates changelogs, updates version files, and prepares the release branch. Use this skill whenever the user mentions releasing, cutting a release, bumping versions, updating changelogs, or preparing a release PR for the ngrok-operator. Also use when the user says "release", "cut a release", "prepare release", "update changelog", or "version bump".

Its SKILL.md is about 2.7k tokens, which your agent loads only when the skill is triggered. The skill folder holds 2 other files, including scripts (for example `scripts/gather-release-data.sh`).

It sits in Development, covering Changelog and release notes, Container orchestration and Deployment. It works with Helm and Kubernetes. The repository describes itself as: The official ngrok Kubernetes Operator. The licence is MIT.

When your agent uses it

  • The user mentions releasing
  • Cutting a release
  • Bumping versions
  • Updating changelogs

Example prompts

  • “release”
  • “cut a release”
  • “prepare release”
  • “/release”

Requirements

  • A Bash shell

Workflow steps

10 steps, taken from the step headings in SKILL.md.

  1. Pre-flight checks
  2. Gather release data
  3. Suggest version bumps
  4. Create release branch
  5. Update version files
  6. Handle meta-only PRs
  7. Generate changelogs
  8. Update Helm snapshots
  9. Regenerate manifest bundle
  10. Done

What it can do on your machine

Read from SKILL.md and the folder at commit 55a7ebb. It shows what the files ask for, not the result of running them.

  • Tool permissions

    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.

  • Runs code

    Ships 1 file in scripts/ (Shell), which the agent can run.

    Shell commands in SKILL.md call:

    • yq
    • git
    • bash
    • make
    • gh

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md. Its commands use git and gh, which can reach the network depending on how they are called.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Release loads about 2.7k tokens when it runs. Until then it costs about 123 tokens; SKILL.md has 1,050 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~123
When it runs · the whole SKILL.md, loaded when a task matches
~2.7k

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.

Safety

Auto-check passed

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); the scripts in this folder are not scanned.

SKILL.md

The full file from ngrok/ngrok-operator at commit 55a7ebb, republished under its MIT licence (© ngrok). 1,050 words, ~2,709 tokens.

Download SKILL.mdSave it as .claude/skills/release/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub.
name
release
description
Automates the ngrok-operator release process: gathers PR data, classifies changes by component (container, Helm chart, CRDs chart), generates changelogs, updates version files, and prepares the release branch. Use this skill whenever the user mentions releasing, cutting a release, bumping versions, updating changelogs, or preparing a release PR for the ngrok-operator. Also use when the user says "release", "cut a release", "prepare release", "update changelog", or "version bump".

Release Skill — ngrok-operator

This skill orchestrates the full release preparation for the ngrok-operator. It supersedes the legacy workflow and is the canonical source for release steps; scripts/release.sh and .github/agents/release-agent.agent.md may still exist and delegate here.

The key insight: a shell script handles deterministic data gathering (PR metadata, file classification, author attribution via gh CLI), and you handle what AI is good at — summarizing changes into readable changelogs and suggesting version bumps.

The Three Components

ComponentChangelogVersion sourceTag pattern
Container (Go binary)CHANGELOG.mdVERSION filengrok-operator-X.Y.Z
Helm operator charthelm/ngrok-operator/CHANGELOG.mdhelm/ngrok-operator/Chart.yaml .versionhelm-chart-ngrok-operator-X.Y.Z
CRDs sub-charthelm/ngrok-crds/CHANGELOG.mdhelm/ngrok-crds/Chart.yaml .versionhelm-chart-ngrok-crds-X.Y.Z

A single PR often affects multiple components. The data-gathering script classifies by files changed — you don't need to figure this out yourself.

Workflow

Follow these steps in order. Do NOT commit, push, or create a PR — stop after local changes.

Step 1: Pre-flight checks
  1. Verify git working tree is clean: git status --porcelain
  2. Verify gh CLI is available and authenticated: gh auth status
  3. Show current versions:
    • cat VERSION
    • yq '.version' helm/ngrok-operator/Chart.yaml
    • yq '.version' helm/ngrok-crds/Chart.yaml

If the tree isn't clean, stop and tell the user.

Step 2: Gather release data

Run the data-gathering script. It lives relative to this skill file:

bash
bash .agents/skills/release/scripts/gather-release-data.sh > /tmp/release-data.json

If the user wants to override the base tags (e.g., to capture a wider range):

bash
bash .agents/skills/release/scripts/gather-release-data.sh \
  --container-tag ngrok-operator-0.19.0 \
  > /tmp/release-data.json

Read the output JSON. Present a summary to the user:

  • Number of PRs per component
  • Whether any breaking changes were detected
  • List the PR titles grouped by component
Step 3: Suggest version bumps

Analyze the PRs in the JSON to suggest next versions. Rules (this project uses semver, currently pre-1.0):

Container version (from VERSION):

  • Breaking changes → bump minor (Y in 0.Y.Z)
  • New features (feat: prefix in title) → bump minor
  • Only fixes/chores/CI → bump patch (Z in 0.Y.Z)

Helm operator chart version (from Chart.yaml .version):

  • Always bumped when releasing (it pins the container image version)
  • Breaking Helm changes (removed values, renamed fields) → bump minor
  • Otherwise → bump patch

CRDs chart version (from helm/ngrok-crds/Chart.yaml .version):

  • Only bumped if PRs have new_for containing "helm_crds"
  • Breaking CRD changes (removed fields, renamed CRDs) → bump minor
  • Otherwise → bump patch
  • If no CRD changes, skip entirely

Present your suggestions and ask the user to confirm or override. Wait for confirmation before proceeding.

Release candidates (RC): If the user asks for an RC, append -rc.N (with a dot before the number) to each version. The canonical format is always -rc.1, -rc.2, etc. — even if the user writes "RC1" or "rc1", normalize to -rc.N. To find the right N, check existing RC tags:

bash
git tag -l 'ngrok-operator-<base-version>-rc.*' | sort -V | tail -1

If no RC exists yet, use -rc.1. Otherwise increment. Apply the RC suffix to all components being released.

When doing an RC:

  • Branch name includes RC suffix: release-ngrok-operator-0.21.0-rc.1-helm-chart-0.23.0-rc.1
  • VERSION file: 0.21.0-rc.1
  • Chart.yaml versions: 0.23.0-rc.1
  • Changelog entries: use the RC version as the section header (e.g., ## 0.21.0-rc.1)

When the user later does the final (non-RC) release, the RC changelog entries get folded into the final version entry — don't duplicate them.

Step 4: Create release branch
bash
git fetch origin main
git checkout -b release-ngrok-operator-<app-ver>-helm-chart-<chart-ver> origin/main
Step 5: Update version files
  1. Write new container version:

    bash
    echo "<new-app-version>" > VERSION
  2. Update Helm operator chart:

    bash
    yq -Y -i ".version = \"<new-chart-version>\"" helm/ngrok-operator/Chart.yaml
    yq -Y -i ".appVersion = \"<new-app-version>\"" helm/ngrok-operator/Chart.yaml
  3. If CRDs changed, update CRDs chart:

    bash
    yq -Y -i ".version = \"<new-crds-version>\"" helm/ngrok-crds/Chart.yaml
    yq -Y -i ".appVersion = \"<new-crds-version>\"" helm/ngrok-crds/Chart.yaml
  4. If CRDs changed, update the dependency version in the operator chart:

    bash
    yq -Y -i "(.dependencies[] | select(.name == \"ngrok-crds\") | .version) = \"<new-crds-version>\"" helm/ngrok-operator/Chart.yaml
Step 6: Handle meta-only PRs

Some PRs only touch CI workflows, developer docs, AI agent configs, nix tooling, or other files that don't affect the released artifacts. The gather script marks these with "meta_only": true.

Review each meta-only PR and decide: include or exclude from the changelog.

Exclude when the PR clearly doesn't affect users:

  • CI workflow tweaks (.github/workflows/ only)
  • AI agent/copilot setup (.github/agents/, .github/copilot/)
  • Nix devshell changes (flake.nix, flake.lock)
  • Internal docs or specs (docs/developer-guide/, specs/)
  • Makefile/tooling changes that don't affect the build output

Include when the change could matter to users even indirectly:

  • Go version bumps (affects the built binary)
  • Security docs users might reference
  • Generated manifest changes (deploy/, manifest-bundle/)
  • Test infrastructure changes that indicate behavior changes

Always err on the side of including — it's better to document something trivial than to miss something that matters.

Present excluded PRs to the user as a separate list with reasons, so they can override your decision:

text
Excluded from changelogs (meta-only):
- #786: Temporarily disabled Trivy scanning — CI workflow only
- #795: Consolidated nix setup — dev tooling only
Show full SKILL.md (367 more words)Show less
Step 7: Generate changelogs

For each component where summary.*_prs > 0 in the release data JSON, generate a changelog entry. Use ONLY the PRs where new_for includes that component. Skip PRs you excluded in Step 6.

Changelog format

Match the existing format exactly. Read the current changelogs to see recent examples.

Container changelog (CHANGELOG.md):

markdown
## <version>
**Full Changelog**: https://github.com/ngrok/ngrok-operator/compare/ngrok-operator-<prev>...ngrok-operator-<new>

### Added
- <description> by @<author> in [#<num>](https://github.com/ngrok/ngrok-operator/pull/<num>)

### Changed
- <description> by @<author> in [#<num>](https://github.com/ngrok/ngrok-operator/pull/<num>)

### Fixed
- <description> by @<author> in [#<num>](https://github.com/ngrok/ngrok-operator/pull/<num>)

Helm operator changelog (helm/ngrok-operator/CHANGELOG.md):

markdown
## <chart-version>
**Full Changelog**: https://github.com/ngrok/ngrok-operator/compare/helm-chart-ngrok-operator-<prev>...helm-chart-ngrok-operator-<new>

- Update ngrok-operator image version to `<app-version>`
- Update Helm chart version to `<chart-version>`
- Update [ngrok-crds](../ngrok-crds/CHANGELOG.md) dependency version to `<crds-version>` (only if CRDs updated)

### Added
...

CRDs changelog (helm/ngrok-crds/CHANGELOG.md):

markdown
## <crds-version>
**Full Changelog**: https://github.com/ngrok/ngrok-operator/compare/helm-chart-ngrok-crds-<prev>...helm-chart-ngrok-crds-<new>

- Update CRDs Helm chart version to `<crds-version>`

### Added
...
Categorization rules

Use the PR title's conventional commit prefix to categorize:

  • feat: or feat(...): → Added
  • fix: or fix(...): → Fixed
  • chore:, refactor:, ci:, docs:, test:, perf: → Changed
  • Explicit removals or deprecations → Removed
  • If no prefix, read the title and use your best judgment

If a PR has has_breaking_changes: true, add a Breaking Changes subsection at the top (before Added).

Writing the entry descriptions
  • Write concise, user-facing descriptions. Don't just copy the PR title verbatim — clean it up.
  • Strip the conventional commit prefix (fix(ngrok): → just describe the fix).
  • Keep the by @author in [#num](url) attribution format.
  • Only include sections that have entries. Don't leave empty ### Added headers.
Inserting into the file

Insert the new version section after the header block (the "# Changelog" line and the format description) and before the first existing ## X.Y.Z entry. Do not overwrite or modify existing entries.

Step 8: Update Helm snapshots
bash
make helm-update-snapshots helm-test

If helm-test fails, investigate and fix. Common cause: snapshot drift from version changes.

Step 9: Regenerate manifest bundle
bash
make manifest-bundle

This regenerates manifest-bundle.yaml at the repo root with the updated Helm chart versions. CI will fail if this is stale.

Step 10: Done

Show the user:

  1. A summary of files changed (git status)
  2. The diff of changelog entries (git diff CHANGELOG.md helm/ngrok-operator/CHANGELOG.md helm/ngrok-crds/CHANGELOG.md)
  3. Remind them: "Review the changes. When satisfied, commit and push."

Do NOT commit, push, or create a PR. The user handles that.

Important notes

  • The gather-release-data.sh script writes progress to stderr and JSON to stdout. Always redirect stdout to a file.
  • Tag comparison links use the tag prefix for that component (ngrok-operator- for container, helm-chart-ngrok-operator- for helm chart, helm-chart-ngrok-crds- for CRDs).
  • The appVersion in helm/ngrok-operator/Chart.yaml must match the container version in VERSION.
  • When the CRDs chart is bumped, you must also update its dependency version in helm/ngrok-operator/Chart.yaml under the dependencies section.
  • Refer to docs/developer-guide/releasing.md for the full release documentation.

© ngrok, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 1 other file (scripts) in .agents/skills/release of ngrok/ngrok-operator.

  • SKILL.md
  • scripts/gather-release-data.sh

Open the folder on GitHubat commit 55a7ebb

Compare with similar skills

Release 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.

Release compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Release this skillngrok/ngrok-operator272—~2.7kAutomated safety check: PassMIT
Ama Logs Update Charts Release Notesmicrosoft/Docker-Provider173—~2.6kAutomated safety check: PassCustom licence
KubeShark for KubernetesLukasNiessen/kubernetes-skill444—~1.2kAutomated safety check: PassMIT
Release Chartzabbix-community/helm-zabbix132—~1.5kAutomated safety check: PassApache-2.0
Aks Deployment Skilltimothywarner/chatgptclass143—~916Automated safety check: PassCustom licence
Securing Helm Chart Deploymentsmukul975/Anthropic-Cybersecurity-Skills34k—~1.9kAutomated safety check: WarnApache-2.0

Similar skills

  • Ama Logs Update Charts Release Notes

    microsoft/Docker-Provider

    Official

    Prepare an ama-logs release PR: bump the image tag (X.Y.Z) across Helm charts, manifests, and Dockerfiles, and add a formatted ReleaseNotes.md entry.

    173 GitHub stars~2.6k tokensUpdated today
    DevOps & CloudAuto-check passed
  • KubeShark for Kubernetes

    LukasNiessen/kubernetes-skill

    Keeps Kubernetes manifests, Helm charts and policies grounded by diagnosing six failure modes, such as insecure defaults and API drift, and loading only matching references.

    444 GitHub stars~1.2k tokensUpdated 24 days ago
    DevOps & CloudAuto-check passed
  • Release Chart

    zabbix-community/helm-zabbix

    Cut and publish a new release of the Zabbix Helm chart in this repository, following the versioning rules and maintainer release process documented in CONTRIBUTING.md and CLAUDE.md (bump…

    132 GitHub stars~1.5k tokensUpdated 3 mo ago
    DevOps & CloudAuto-check passed
  • Aks Deployment Skill

    timothywarner/chatgptclass

    Deploy and operate workloads on Azure Kubernetes Service (AKS) the safe way.

    143 GitHub stars~916 tokensUpdated 18 days ago
    DevOps & CloudAuto-check passed
  • Securing Helm Chart Deployments

    mukul975/Anthropic-Cybersecurity-Skills

    Secures Helm chart deployments by verifying chart signatures and provenance, rendering and linting templates for misconfiguration, enforcing pod security contexts through values.yaml, moving secrets…

    34k GitHub stars~1.9k tokensUpdated 1 mo ago
    DevOps & CloudAuto-check: warnings
  • Kubernetes Deployment

    seb1n/awesome-ai-agent-skills

    Deploy, manage, and scale applications on Kubernetes clusters using manifests, Helm charts, and autoscaling configurations.

    206 GitHub stars~3.1k tokensUpdated 1 mo ago
    DevOps & CloudAuto-check passed

Works with

Questions about Release

What does Release do?

Automates the ngrok-operator release process: gathers PR data, classifies changes by component (container, Helm chart, CRDs chart), generates changelogs, updates version files, and prepares the…. Release is an agent skill from ngrok/ngrok-operator. Automates the ngrok-operator release process: gathers PR data, classifies changes by component (container, Helm chart, CRDs chart), generates changelogs, updates version files, and prepares the release branch.

When should I use Release?

Release fits situations like: the user mentions releasing; cutting a release; bumping versions; updating changelogs.

How do I install Release in Claude Code?

Run `npx skills add ngrok/ngrok-operator --skill release -a claude-code`. Or copy the skill folder (.agents/skills/release in ngrok/ngrok-operator) into .claude/skills/release in your project. Claude Code loads it when a task matches its description.

How do I install Release in Codex?

Run `npx skills add ngrok/ngrok-operator --skill release -a codex`. Or copy the skill folder (.agents/skills/release in ngrok/ngrok-operator) into .agents/skills/release in your project. Codex loads it when a task matches its description.

Can I use Release in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add ngrok/ngrok-operator --skill release -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/release, .gemini/skills/release, .github/skills/release and .opencode/skills/release in your project.

What does Release need to run?

Going by SKILL.md and its folder, Release needs a shell for the scripts in its folder and the command-line tools its instructions call (yq, git, bash, make and gh). Our summary lists: A Bash shell.

Does Release access the network?

SKILL.md contains no URLs. Its commands use git and gh, which can reach the network depending on how they are called. This is read from the text; nothing was executed.

Is Release safe to install?

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. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.

What licence does Release use?

Release is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Release use?

About 2.7k tokens (SKILL.md is roughly 11k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Release?

Skills that share tags, products or a category with Release: Ama Logs Update Charts Release Notes (microsoft/Docker-Provider, 173 stars), KubeShark for Kubernetes (LukasNiessen/kubernetes-skill, 444 stars), Release Chart (zabbix-community/helm-zabbix, 132 stars) and Aks Deployment Skill (timothywarner/chatgptclass, 143 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Release?

ngrok (a GitHub organization) maintains it in ngrok/ngrok-operator, which has 272 GitHub stars. The repository was last updated on October 5, 2026.

Source: ngrok/ngrok-operator on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.