Start with one job and grow from there.
Free to start · No credit card required
# Read the durable ledger first — the last release tag covered, and any open
# changelog PR from a prior run.
cat .singulacomp/memory/changelog-sync-log.md 2>/dev/null || echo "(no ledger yet — first run)"
# Check for an open changelog PR before opening a new one.
gh pr list --repo {{target_repo}} --state open \
--search 'in:title "release notes" OR label:changelog' \
--json number,title,headRefName,statusCheckRollup,url
cd /workspace/repo 2>/dev/null || { git clone --filter=blob:none https://github.com/{{target_repo}}.git /workspace/repo && cd /workspace/repo; }
git fetch origin --tags
LAST_TAG=$(grep -m1 '^checkpoint:' .singulacomp/memory/changelog-sync-log.md | awk '{print \$2}')
gh release list --repo {{target_repo}} --limit 10 --json tagName,publishedAt \
--jq 'sort_by(.publishedAt)'
$LAST_TAG is empty, this is the first run — seed the checkpoint from the
release immediately prior to the newest one (so this run covers exactly the
latest release, not the entire history). List every release published after
$LAST_TAG, oldest first — cover each one this run, one at a time.$NEW_TAG with predecessor $PREV_TAG:git log "$PREV_TAG".."$NEW_TAG" --merges --oneline
gh pr list --repo {{target_repo}} --state merged --base main \
--search "merged:$PREV_TAG_DATE..$NEW_TAG_DATE" \
--json number,title,body,labels,author,mergedAt,url
gh pr view <number> --repo {{target_repo}} --json title,body,labels,files
internal, chore, ci, dependencies,
no-changelog, or whose title starts with chore(deps), ci:, or test:.
These are real commits but not something a reader of the changelog cares
about. Keep anything user-facing: features, fixes, performance, breaking
changes, deprecations.{{changelog_path}}'s existing entries first and match its established
format (heading style, date format, grouping labels, tone) rather than
inventing a new one.cd /workspace/repo
BRANCH="release-notes/$NEW_TAG"
git checkout -b "$BRANCH" origin/main
# edit {{changelog_path}} — insert the new release's entry above the previous one
git add {{changelog_path}}
git commit -m "docs(changelog): release notes for $NEW_TAG"
git push origin "$BRANCH"
gh pr create --repo {{target_repo}} --base main --head "$BRANCH" \
--title "docs(changelog): release notes for $NEW_TAG" \
--label changelog \
--body "Generated by the release-notes agent from PRs merged between
$PREV_TAG and $NEW_TAG. Grouped by area; internal-only PRs and dependency
bumps are dropped. A human reviews the wording and merges."
.singulacomp/memory/changelog-sync-log.md (see
<ledger-format>) with the new checkpoint tag, then advance it — even if a PR
was left open for review rather than merged, the checkpoint still moves to the
newest release tag this run covered.