.agents/skills/dtctl-release/SKILL.md
Ship a new dtctl release — bump version, write changelog entries, run tests, commit, tag, push, and write GitHub release notes. Use this skill whenever the user says "release", "ship it", "cut a release", "new version", "bump version", "publish", or asks about the dtctl release process. Also use when the user wants to update CHANGELOG.md for a release or write GitHub release notes.
npx skillsauth add dynatrace-oss/dtctl dtctl-releaseInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
This skill walks through shipping a new dtctl release end-to-end. The process has six phases: analyze, version, changelog, test, commit/tag/push, and GitHub release notes.
main branch with all feature branches mergedgit status shows no uncommitted changes)Pre-flight check:
git branch --show-current # Must be "main"
git status # Must be clean
git pull origin main # Must be up to date with remote
If any check fails, stop and resolve before continuing.
Identify what changed since the last release to determine the version bump and write good release notes.
# Find the latest release tag
git tag --sort=-version:refname | head -5
# List all commits since that tag
git log <last-tag>..HEAD --oneline
# Check the current Unreleased section in CHANGELOG.md
Read the commits carefully and group them into:
For each significant feature, explore the actual implementation files to understand what it does. Don't just rely on commit messages — read the code so you can write accurate, detailed release notes.
dtctl follows Semantic Versioning (currently pre-1.0, so 0.MINOR.PATCH):
| Change type | Bump | Example | |-------------|------|---------| | New features, new commands | MINOR | 0.23.0 -> 0.24.0 | | Bug fixes only, no new features | PATCH | 0.24.0 -> 0.24.1 | | Breaking changes (pre-1.0) | MINOR | 0.24.0 -> 0.25.0 |
Edit pkg/version/version.go — change the Version variable:
var Version = "X.Y.Z" // update this
This is the only place the version is hardcoded. GoReleaser injects it at build time via -ldflags, but the fallback value here should always match the latest release.
The changelog follows Keep a Changelog format. Move items from [Unreleased] into a new version section:
## [Unreleased]
## [X.Y.Z] - YYYY-MM-DD
### Added
- **Feature name** — description with enough detail that users understand what it does and how to use it; include CLI examples where relevant
### Fixed
- **Bug summary** — what was broken and how it's fixed now
### Changed
- **Change summary** — what changed and why
### Security
- **Security fix** — what was vulnerable and what was upgraded
### Documentation
- **Doc name** — what was added or updated
Also add the comparison link at the bottom of the file:
[X.Y.Z]: https://github.com/dynatrace-oss/dtctl/compare/vPREVIOUS...vX.Y.Z
If a comparison link for the previous version is missing (check!), add that too.
**double asterisks**— and a descriptionRun the full test suite and build to catch any issues before releasing:
# Run all tests
go test ./...
# Build the binary
make build
# Verify the build works
./bin/dtctl version
All tests must pass. If any fail, fix them before proceeding.
git add CHANGELOG.md pkg/version/version.go
git commit -m "release vX.Y.Z: short summary of key features"
The commit message should follow the pattern: release vX.Y.Z: feature1, feature2, feature3
git push origin main
git tag vX.Y.Z
git push origin vX.Y.Z
Pushing the tag triggers the GitHub Actions release workflow (.github/workflows/release.yml), which automatically:
dynatrace-oss/homebrew-tapNo manual Homebrew update is needed. GoReleaser's homebrew_casks config in .goreleaser.yaml automatically pushes the updated cask to the tap repository using a GitHub App token. The skip_upload: auto setting prevents pre-release tags from being published.
After the tag is pushed, update the GitHub release with polished release notes. The auto-generated changelog from GoReleaser is a raw commit list — replace it with proper release notes.
gh release edit vX.Y.Z --notes "$(cat <<'EOF'
... release notes here ...
EOF
)"
Follow this exact structure (see previous releases for reference — gh release view vPREVIOUS):
## What's New
### Feature Name
Paragraph explaining the feature with context on why it's useful.
\`\`\`bash
# Concrete usage example
dtctl some-command --some-flag
\`\`\`
Additional detail about configuration, behavior, or edge cases. Keep it practical — show users exactly how to use the feature.
### Another Feature
...repeat for each major feature...
## Bug Fixes
- **Short fix title** — one-line explanation of what was broken and what's fixed.
- **Another fix** — description.
## Documentation
- **Doc title** — what was added, with a link if applicable.
## Install / Upgrade
\`\`\`bash
# Homebrew
brew update && brew upgrade dtctl
# Direct install
curl -fsSL https://raw.githubusercontent.com/dynatrace-oss/dtctl/main/install.sh | bash
# Go install
go install github.com/dynatrace-oss/[email protected]
\`\`\`
**Full Changelog**: https://github.com/dynatrace-oss/dtctl/compare/vPREVIOUS...vX.Y.Z
### Heading with a paragraph + code example## Bug Fixes## Install / Upgrade block**Full Changelog** comparison link## Security if there are no security fixes)gh release view v0.23.0, gh release view v0.22.0Use this to track progress:
main branch, clean working tree, up to date with remotepkg/version/version.goCHANGELOG.md (entries + comparison link)go test ./...)make build)mainorigin/mainvX.Y.Zgh release edittools
Investigate incidents, debug performance issues, analyze logs, and manage observability resources in Dynatrace using the dtctl CLI. Use this skill whenever the user asks about error rates, latency spikes, service health, crash-looping pods, web vitals, SLO status, open problems, root cause analysis, log patterns, trace analysis, or building dashboards — even if they don't mention Dynatrace by name. Also covers DQL queries, workflow management, notebook and dashboard creation, settings configuration, and any operations against a Dynatrace environment.
testing
Create, edit, improve, or audit AgentSkills. Use when creating a new skill from scratch or when asked to improve, review, audit, tidy up, or clean up an existing skill or SKILL.md file. Also use when editing or restructuring a skill directory (moving files to references/ or scripts/, removing stale content, validating against the AgentSkills spec). Triggers on phrases like "create a skill", "author a skill", "tidy up a skill", "improve this skill", "review the skill", "clean up the skill", "audit the skill".
testing
Host security hardening and risk-tolerance configuration for OpenClaw deployments. Use when a user asks for security audits, firewall/SSH/update hardening, risk posture, exposure review, OpenClaw cron scheduling for periodic checks, or version status checks on a machine running OpenClaw (laptop, workstation, Pi, VPS).
testing
Create, edit, improve, or audit AgentSkills. Use when creating a new skill from scratch or when asked to improve, review, audit, tidy up, or clean up an existing skill or SKILL.md file. Also use when editing or restructuring a skill directory (moving files to references/ or scripts/, removing stale content, validating against the AgentSkills spec). Triggers on phrases like "create a skill", "author a skill", "tidy up a skill", "improve this skill", "review the skill", "clean up the skill", "audit the skill".