Daily Releases
Create GitHub Releases with AI-categorized changelogs for every day that had commits. Uses the same pipeline as /create-merge-request-changelog — real AI analysis, not template substitution.
Automatic Invocation
When this skill is activated, immediately begin processing without asking the user. Parse any arguments from $ARGUMENTS:
--start-date YYYY-MM-DD Only process days on or after this date
--end-date YYYY-MM-DD Only process days on or before this date (default: today)
--branch BRANCH Git branch (default: origin/main)
--dry-run Preview without creating releases
Process
Requires GITHUB_TOKEN for release status checks (list) and publishing.
Working directory: Run all commands from the repository root. Paths below assume cwd is the repo root.
Step 1: List days to process
uv run .claude/skills/daily-releases/scripts/list_daily_ranges.py [--branch BRANCH] [--start-date ...] [--end-date ...] [-R OWNER/REPO]
This outputs a JSON array. Each entry has:
{
"date": "2026-02-21",
"tag": "v2026.02.21",
"base_ref": "<parent-commit-hash>",
"head_ref": "<last-commit-hash-of-day>",
"commit_count": 12,
"release_exists": true,
"needs_update": false
}
Skip entries where release_exists: true and needs_update: false — those are up to date.
For --dry-run, print the list and stop.
Step 2: For each day that needs a release
Work through days chronologically. For each day:
2a. Extract git data
uv run .claude/skills/create-merge-request-changelog/scripts/analyze_git_changes.py \
<base_ref> <head_ref> ./daily-releases/<date>/
This writes to ./daily-releases/<date>/:
commits_oneline.txt— one-line commit listcommits_detailed.txt— full commit messages with metadatachanges.diff— unified diffchanges_stat.txt— diffstat summarychanged_files.txt— file list with A/M/D statuschanges_numstat.txt— per-file line countssummary.json— machine-readable stats
2b. AI analysis
Read the extracted data and apply the primary analysis prompt from:
.claude/skills/create-merge-request-changelog/references/analysis_prompts.md
Use the Primary Analysis Prompt section with the day's data substituted in:
{commit_details}→ contents ofcommits_detailed.txt{changes_diff}→ contents ofchanges.diff(truncate to ~4000 chars if very large; usechanges_stat.txtsummary instead){changed_files}→ contents ofchanged_files.txt{commit_count},{files_changed},{lines_added},{lines_deleted}→ fromsummary.json
Produce the structured JSON analysis output defined in the prompt's <output_format> section.
Also generate a title using the Title Generation Prompt:
Daily Release - <date>
Save the complete analysis JSON to ./daily-releases/<date>/analysis.json.
2c. Format into release notes
uv run .claude/skills/create-merge-request-changelog/scripts/format_mr_description.py \
./daily-releases/<date>/analysis.json \
--no-preview \
--output ./daily-releases/<date>/description.md
2d. Publish the release
uv run .claude/skills/daily-releases/scripts/publish_daily_release.py \
--date <date> \
--tag <tag> \
--head-ref <head_ref> \
--notes-file ./daily-releases/<date>/description.md
Add --keep-existing-tag=false if updating a release that already has the correct tag commit.
Step 3: Report
After processing all days, print a summary:
Processed N days:
- Created: X new releases
- Updated: Y existing releases
- Skipped: Z already up to date
Reference files
- ./scripts/list_daily_ranges.py — list days + commit ranges
- ./scripts/publish_daily_release.py — create/update git tag + GitHub release
- ../create-merge-request-changelog/scripts/analyze_git_changes.py — extract git data per day
- ../create-merge-request-changelog/references/analysis_prompts.md — AI analysis prompts
- ../create-merge-request-changelog/scripts/format_mr_description.py — render AI analysis to markdown
Reference paths above are relative to this skill directory; CLI commands use repo-root paths.