Repo Release Notes Skill
Hand-quality release notes from a git commit log. Cluster commits into Features / Fixes / Improvements / Breaking Changes / Internal, rewrite terse commit messages into user-readable prose, drop the chore noise.
The Problem
The first 10 minutes of every release are spent staring at git log, copy-pasting commit messages, and trying to remember what each one actually meant for users. The output never feels good and nobody wants to do it. AI is a perfect fit: structured input (commits), structured output (release notes), with judgment about what matters.
How It Works
- A
runtimeenvtask runsgit log <fromTag>..<toTag>with full message bodies - The
repo-release-notesskill clusters and rewrites - The
messagetask delivers the markdown notes (or you append it to a CHANGELOG.md, post to Slack, etc.)
Setup
- Install this skill
- Clone the repo to a working directory the InTouch host can read
- Use the YAML below; run on-demand when you cut a release
Example YAML Job
name: release-notes
version: 1.0.0
description: Generate release notes between two git tags
notifications:
- userNames: [intouch]
alertOnError: true
tasks:
- name: collect-commits
tool: runtimeenv
properties:
scriptContent: |
#!/bin/bash
set -euo pipefail
REPO_DIR="${REPO_DIR:-/srv/repos/myproject}"
FROM_TAG="${FROM_TAG:-v1.4.0}"
TO_TAG="${TO_TAG:-HEAD}"
cd "$REPO_DIR"
git fetch --tags --quiet
echo "project: myproject"
echo "versionFrom: $FROM_TAG"
echo "versionTo: $TO_TAG"
echo "releaseDate: $(date -u +%Y-%m-%d)"
echo "commits:"
git log "${FROM_TAG}..${TO_TAG}" --pretty=format:"commit %h%nAuthor: %an <%ae>%nDate: %ad%n%n %s%n%n%b%n" --date=short
- name: write-notes
tool: skill
properties:
skillName: repo-release-notes
input: "{{collect-commits.output}}"
- name: send
tool: message
properties:
subject: "Release notes draft"
body: "{{write-notes.answer}}"
userNames: "intouch"
Customization
- From/to tags — set
FROM_TAGandTO_TAGenv vars on the job (or hardcode in the script). For "since the previous tag," usegit describe --tags --abbrev=0 HEAD~1for FROM_TAG andHEADfor TO_TAG - Multiple repos — duplicate the collect-commits task per repo, concatenate inputs into the skill (pass them with separator headers so the AI keeps them grouped)
- Append to CHANGELOG.md — replace the message task with a runtimeenv that prepends
{{write-notes.answer}}to a file in the repo and commits it - Tone customization — edit SKILL.md to change the voice (more formal, more casual, with emojis, etc.)
Notes
- The
git logformat string is intentionally verbose so the AI sees full commit bodies — terse subject-only logs lose context that matters for good release notes - For monorepos, scope to a path:
git log <range> -- packages/web/ - Conventional Commits (
feat:,fix:, etc.) make the AI's clustering much sharper; if your repo doesn't use them, the AI still does its best from the messages but quality varies
Cost
- AI assistant: ~$0.02 per release with Claude Sonnet (synthesis benefits from a stronger model)
- One-off per release, so cost is trivial