AgentStack
SKILL verified MIT Self-run

Daily Releases

skill-jamie-bitflight-claude-skills-daily-releases · by Jamie-BitFlight

Create GitHub Releases with AI-analyzed changelogs for every calendar day with commits on origin/main. Use when creating daily release notes, backfilling releases, or generating AI-categorized changelogs per day. Uses collect → bucket → analyze → synthesize → publish pipeline via Haiku subagents. Idempotent — skips up-to-date days, updates releases where new commits were added. Accepts optional -…

No reviews yet
0 installs
11 views
0.0% view→install

Install

$ agentstack add skill-jamie-bitflight-claude-skills-daily-releases

✓ scanned · ✓ verified — works with Claude Code, Cursor, and more.

Security review

✓ Passed

No issues found. Passed automated security review. · v0.1.0 How review works →

  • Prompt-injection patterns
  • Secret / credential exfiltration
  • Dangerous shell & filesystem operations
  • Untrusted network calls
  • Known-malicious package signatures

What it can access

  • Network access No
  • Filesystem access No
  • Shell / process execution No
  • Environment & secrets No
  • Dynamic code execution No

From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.

Are you the author of Daily Releases? Claim this listing to set pricing, connect Stripe payouts, and keep 70% of every sale.
Sign up to claim

About

$ARGUMENTS

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 ``:

--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": "",
  "head_ref": "",
  "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, the pipeline collects data, buckets it by token budget, analyses each bucket with a Haiku subagent, synthesises the results, then formats and publishes. Days with few commits pass through a single bucket with no synthesis overhead.

2a. Collect dataset
uv run .claude/skills/daily-releases/scripts/collect_day_dataset.py \
    ./daily-releases// [-R OWNER/REPO]

Writes ./daily-releases//dataset/:

  • files.json — changed source files with status and line counts
  • commits.json — commits with SHA, message, files touched
  • issues.json — GitHub issues/PRs referenced or closed (empty if no token)
  • diffs/.diff — per-file unified diff for each source file

Source files: *.py .js .cjs .mjs .ts .tsx .sh .md .json .yaml .yml Excluded: dist/ build/ node_modules/ vendor/ .venv/ and similar build outputs.

2b. Create token-bounded buckets
uv run .claude/skills/daily-releases/scripts/bucket_day_data.py \
  ./daily-releases// [--token-limit 100000]

Token limit defaults to env var DAILY_RELEASES_TOKEN_LIMIT or 100000.

Groups source files by directory module, fills buckets greedily keeping each under the token limit (measured with tiktoken cl100k_base as a proxy).

Writes ./daily-releases//buckets/bucket_NNN/:

  • manifest.json{bucket_id, files, token_count, commit_shas}
  • content.txt — file diffs followed by commit messages for this bucket

Prints a summary listing bucket count and token sizes.

2c. Analyse each bucket (delegate — do NOT read bucket files yourself)

For each bucket_NNN/ directory found under ./daily-releases//buckets/:

Agent(
  subagent_type="general-purpose",
  model="claude-haiku-4-5-20251001",
  prompt="""
Read: ./daily-releases//buckets/bucket_NNN/content.txt

Apply the Per-Bucket Analysis Prompt from:
  .claude/skills/daily-releases/references/synthesis_prompt.md

Write the structured JSON output to:
  ./daily-releases//summaries/bucket_NNN.json

Report "bucket_NNN.json written" when done.
"""
)

Replace ` and NNN` with actual values before emitting each Agent() call. Buckets may be processed in parallel — each writes to its own summary file.

After all agents return, verify each summaries/bucket_NNN.json exists. Stop with an error if any is missing.

2d. Synthesise summaries into analysis.json

If exactly one bucket exists: promote its JSON directly — copy summaries/bucket_001.json to analysis.json, adding a statistics block from dataset/files.json counts (commitcount, fileschanged, linesadded, linesdeleted). No synthesis agent needed.

If two or more buckets exist:

Agent(
  subagent_type="general-purpose",
  model="claude-haiku-4-5-20251001",
  prompt="""
Apply the Day Synthesis Prompt from:
  .claude/skills/daily-releases/references/synthesis_prompt.md

Read all bucket summary files:
  ./daily-releases//summaries/bucket_001.json
  ./daily-releases//summaries/bucket_002.json
  ... (list all that exist)

Also read ./daily-releases//dataset/files.json for statistics counts.

Write the merged analysis JSON to: ./daily-releases//analysis.json

Report "analysis.json written" when done.
"""
)

After the agent returns, verify ./daily-releases//analysis.json exists. Stop with an error if missing.

2e. Format into release notes
uv run .claude/skills/create-merge-request-changelog/scripts/format_mr_description.py \
  ./daily-releases//analysis.json \
  --no-preview \
  --output ./daily-releases//description.md
2f. Publish the release
uv run .claude/skills/daily-releases/scripts/publish_daily_release.py \
  --date  \
  --tag  \
  --head-ref  \
  --notes-file ./daily-releases//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/listdailyranges.py](./scripts/listdailyranges.py) — list days + commit ranges
  • [./scripts/collectdaydataset.py](./scripts/collectdaydataset.py) — per-file diff + commit + issues extraction into dataset/
  • [./scripts/bucketdaydata.py](./scripts/bucketdaydata.py) — token-bounded semantic bucketing into buckets/
  • [./scripts/publishdailyrelease.py](./scripts/publishdailyrelease.py) — create/update git tag + GitHub release
  • [./references/synthesisprompt.md](./references/synthesisprompt.md) — per-bucket analysis prompt + day synthesis prompt
  • [../create-merge-request-changelog/scripts/formatmrdescription.py](../create-merge-request-changelog/scripts/formatmrdescription.py) — render analysis.json to markdown

Reference paths above are relative to this skill directory; CLI commands use repo-root paths.

Source & license

This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.

Install and usage instructions live in the source repository linked above.

Reviews

No reviews yet — be the first.

Versions

  • v0.1.0 Imported from the upstream source.