skills/git-remote-release/SKILL.md
Generate GitHub release notes by summarizing all commits and pull requests between two Git tags, branches, or the current branch and the upstream default branch. Use when the user asks to write release notes, generate release notes, draft a GitHub release, create release notes from tags, summarize changes between versions, summarize the current branch, or provides a GitHub compare URL. Trigger phrases: "release notes", "generate release notes", "what changed between", "summarize changes from v1 to v2", "GitHub release", "summarize this branch", compare URLs like "github.com/owner/repo/compare/v1...v2". When no explicit input is given, detects the current branch and compares against the upstream default branch automatically.
npx skillsauth add codebeltnet/agentic git-remote-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 generates polished GitHub release notes from the commits and pull requests between two tags, two branches, or the current branch and the upstream default branch. It produces a human-friendly summary optimized for release notes, not a raw commit log.
When explicit tags or a compare URL are provided, the skill works entirely through GitHub's API — no local clone is needed. When no input is provided, the skill detects the current Git working repository and resolves the comparison range from local branch and remote state.
The skill accepts input in three ways, checked in this order:
1. Compare URL:
When the user provides a GitHub compare URL like https://github.com/codebeltnet/agentic/compare/v1.0.0...v1.0.1, extract the owner, repository, previous ref, and current ref from it.
2. Separate values:
owner/repo format (e.g. codebeltnet/agentic)v1.0.0) or branch namev1.0.1) or branch name3. Default resolution (no input provided):
When the user does not provide an explicit repository, tag range, compare URL, or branch name, the skill operates on the current Git working repository. See Default Resolution Behavior below.
If any required value is missing and cannot be inferred or resolved, ask the user for it before proceeding.
If the user does not provide an explicit repository, tag range, compare URL, branch name, or release range, the skill must operate on the current Git working repository.
In that case, the skill must:
main, but do not assume main if the remote default branch can be resolved.The default comparison should be conceptually equivalent to:
upstream/default-branch...current-branch
For example, if the current branch is feature/git-remote-release and the upstream default branch is main, the comparison should be treated as:
upstream/main...feature/git-remote-release
If the repository uses origin as the upstream remote, use:
origin/main...current-branch
If the repository has both origin and upstream, prefer the remote that represents the canonical source repository. In fork-based workflows, this is usually upstream. In single-repository workflows, this is usually origin.
The skill must not silently assume the wrong base branch. If the default branch cannot be resolved, fall back in this order:
origin/HEADupstream/HEADorigin/mainorigin/masterupstream/mainupstream/masterIf none of these can be resolved, ask the user to provide the base branch or compare URL.
Useful commands for default resolution:
git rev-parse --abbrev-ref HEAD
git remote
git symbolic-ref refs/remotes/origin/HEAD --short
git symbolic-ref refs/remotes/upstream/HEAD --short
git merge-base HEAD {resolvedBase}
git log --oneline {resolvedBase}..HEAD
Contributor attribution should be based on available GitHub metadata when possible. If GitHub metadata is unavailable, use Git commit author information.
The Sources: section must preserve contributor attribution using this format when a GitHub username is available:
* <title> by @<author> in <pull-request-or-commit-url>
If a GitHub username is unavailable, use the commit author name without the @ prefix:
* <title> by <author-name> in <commit-url-or-sha>
When using the current branch default behavior, the skill must include all contributors involved in the detected commits and pull requests. Do not collapse contributor attribution in a way that hides who contributed to the release.
Determine which input path applies:
Validate that the repository exists and both refs are reachable before continuing.
Fetch all commits included in the range previousRef...currentRef using the GitHub API or local Git commands. For each commit, collect:
For each commit in the range, determine whether it belongs to a merged pull request. Prefer pull request metadata over raw commit data when available, because PRs carry richer context: descriptions, labels, review discussions, and linked issues.
Collect unique pull requests only. If multiple commits map to the same pull request, record that pull request once and preserve all contributing commits through the single PR source entry.
For each pull request, collect:
Use commits directly only when:
Read through all collected pull requests and commits. Understand what changed, why it matters, and how it affects users and maintainers. Group related changes together. Identify breaking changes, new features, bug fixes, dependency updates, CI/CD changes, documentation updates, and infrastructure work.
The summary should explain the effect of the changes, not just the implementation. A good release note tells users what they can expect from this version, not just what code was modified.
Follow the exact output format defined below. Every release note must start with ## What's Changed and end with the full changelog link. Nothing may appear after the changelog link.
## What's Changed
<optimized-summary>
<optional-alert-blocks>
Sources:
* <title> by @<author> in <url>
* <title> by @<author> in <url>
**Full Changelog**: https://github.com/{owner}/{repo}/compare/{previousRef}...{currentRef}
The summary is the heart of the release note. It must be:
For small releases (a handful of changes), prefer a concise paragraph or short bullet list.
For larger releases, prefer grouped bullets organized by theme: new features, fixes, infrastructure, breaking changes, etc.
Avoid simply repeating PR titles or commit messages unless they are already clear and release-note friendly. Rewrite them into prose that explains the effect.
When the release note includes a "Key capabilities" section, each bullet must be written as a natural sentence with a bolded lead-in.
Do not use a bold label followed by an em dash, colon, or definition-style fragment.
Avoid this style:
- **Thematic grouping** — Related changes are discussed together instead of listed chronologically
Use this style instead:
- **Thematic grouping** where related changes are discussed together instead of listed chronologically,
The bold text should highlight the capability name, but the full bullet must read as one natural sentence.
Preferred pattern:
- **<Capability name>** where/that/so/with <natural sentence continuation>,
End each bullet with , except the final bullet in a populated section, which must end with ..
Alert blocks draw attention to information that deserves special notice. Use them sparingly — prefer zero to two per release. Only include alerts when the release data genuinely supports the attention level.
Alert blocks appear after the summary and before the Sources: section.
When to use each alert type:
> [!NOTE] — Helpful context, compatibility notes, clarifications for skimmers, non-breaking behavior explanations.
> [!TIP] — Recommended usage, easier migration paths, better ways to use a new or changed feature, practical follow-up actions.
> [!IMPORTANT] — New capabilities users should notice, required configuration changes, important behavior changes, major release highlights.
> [!WARNING] — Breaking changes, deprecated behavior that may affect users soon, changes that can cause builds, tests, runtime behavior, or integrations to fail if ignored.
> [!CAUTION] — Security-sensitive changes, data loss risks, removal of functionality, operational risks, changes where misuse can lead to negative outcomes.
Do not invent alerts. Do not add a WARNING or CAUTION unless the release data supports that level of attention. Breaking changes should normally use WARNING. Security-sensitive or risk-heavy changes should normally use CAUTION.
The Sources: section preserves the original references that informed the summary. This gives readers a path to the raw details if the summary is not enough.
Each source entry follows this format:
* <title> by @<author> in <url>
For pull requests, use the PR title and PR URL:
* Add validation for skill templates by @gimlichael in https://github.com/codebeltnet/agentic/pull/19
For direct commits without a PR, use the commit subject and commit URL:
* Fix script path handling by @gimlichael in https://github.com/codebeltnet/agentic/commit/abc123def
List every pull request and direct commit that contributed to the release. Do not omit sources.
The final line of the release note must always be:
**Full Changelog**: https://github.com/{owner}/{repo}/compare/{previousRef}...{currentRef}
When comparing tags, use the tag names (e.g. v1.0.0...v1.0.1). When comparing branches from default resolution, use the branch names (e.g. main...feature/my-branch).
Nothing may appear after this line.
## What's Changed.Sources: section is always included.* <title> by @<author> in <url> format, falling back to * <title> by <author-name> in <url> when no GitHub username is available.The skill uses GitHub's API and local Git commands to gather data. The preferred approach depends on the input path and what tools are available.
When explicit tags or a compare URL are provided, use GitHub's API. The preferred approach depends on what tools are available in the agent environment.
When GitHub MCP tools are available (such as github_list_commits, github_get_commit, github_pull_request_read), use them directly. They provide structured data without requiring shell access.
When gh CLI is available, use these commands:
gh api repos/{owner}/{repo}/compare/{previousRef}...{currentRef} --jq '.commits[]'
gh api repos/{owner}/{repo}/commits/{sha}/pulls --jq '.[]'
gh pr view {number} --repo {owner}/{repo} --json title,author,body,labels,files,url
The GitHub compare API can return fewer commits than the range contains. After fetching a compare response, compare total_commits with the number of collected .commits[] entries. If total_commits is greater than the collected commit count, fetch remaining pages when possible; otherwise warn the user that commit data is capped and do not present the Sources: section as complete.
When using default resolution (no explicit input), combine local Git commands with GitHub API. First resolve the base branch (see Default Resolution Behavior above), then substitute the resolved value into {resolvedBase} — do not hardcode origin/main:
git rev-parse --abbrev-ref HEAD
git remote
git symbolic-ref refs/remotes/origin/HEAD --short
git log --oneline {resolvedBase}..HEAD
git log --format="%H%x09%an%x09%ae%x09%s%x09%b" {resolvedBase}..HEAD
Then use the GitHub API to enrich local commit data with pull request metadata, labels, and descriptions.
When neither is available, guide the user to install gh or authenticate with GitHub.
For each commit in the compare range, check whether it belongs to a pull request. GitHub's API can resolve this through the commit's associated pull requests endpoint. When a commit maps to a PR, use the PR's metadata (title, description, labels) as the primary source of truth for that change.
Before returning the result, verify:
## What's Changed.Sources: section is included with all contributing PRs and commits.* <title> by @<author> in <url> format, with fallback to author name when no GitHub username is available.development
Classifies .NET library or NuGet package changes and recommends the correct release bump: Major, Minor, or Patch. Applies both Semantic Versioning (MAJOR.MINOR.PATCH) and .NET assembly/file versioning (Major.Minor.Build.Revision), grounded in Microsoft’s official .NET library compatibility rules. Use when evaluating the current branch, breaking changes, API diffs, public API changes, dependency updates, TFM/platform support, interface or enum changes, overloads, analyzers, source generators, or binary/source/behavioral/design-time/backwards compatibility. When no explicit change details or compare range are provided, inspects the current Git branch and compares it against the upstream default branch automatically. Always returns structured compatibility reasoning with the recommendation.
documentation
Generate source-grounded repository digest markdown from deterministic local evidence bundles. Use when the user asks to create, refresh, or complete repo/package digests, family or project overview pages, .bot/digests output, digest workspace workflows, or result/Index.md plus result/{PackageName}.md files for any repository URL. The skill runs its bundled .NET file-based evidence generator over a git clone, separates authoritative XML evidence from Markdown prompts and reading aids, writes package digests first, then writes the overview from completed package digests, and enforces complete-read grounding and no-invention rules even when file output is capped.
testing
Turn many commits into a curated grouped squash summary compatible with the opinionated wording style of git-visual-commits. Use when the user asks to squash a branch into a concise summary, write a squash-and-merge summary, summarize this branch, summarize a commit range or PR as grouped lines, clean up noisy commit history, or asks for a curated summary without committing. For normal squash-and-merge requests, default to the full current feature branch from merge-base to HEAD against the base branch instead of a same-named tracking remote, include commits from all authors unless the user explicitly narrows by author, and do not ask for yolo because the skill is read-only. Returns grouped lines only, preserves identifiers, merges overlap, drops noise, and avoids changelog wording.
tools
Scaffold a new .NET NuGet library solution following codebelt engineering conventions. Use this skill when the user wants to create a new NuGet library, class library, or reusable .NET package. Also use when the user mentions "new library", "new NuGet package", "scaffold library", "class library solution", "dotnet new classlib", or wants a .NET library project with multi-target frameworks, strong-name signing, NuGet packaging, DocFX documentation, CI/CD pipeline, and code quality tooling. ALWAYS use this skill when asked to scaffold or create a new .NET library solution.