From jaan-to
Generates user-facing changelogs with impact notes and support guidance from git history using Keep a Changelog format. Use for drafting release notes from commits.
npx claudepluginhub parhumm/jaan-to --plugin jaan-toThis skill is limited to using the following tools:
> Generate user-facing changelogs with impact notes and support guidance using git history analysis and the Keep a Changelog standard.
Creates isolated Git worktrees for feature branches with prioritized directory selection, gitignore safety checks, auto project setup for Node/Python/Rust/Go, and baseline verification.
Executes implementation plans in current session by dispatching fresh subagents per independent task, with two-stage reviews: spec compliance then code quality.
Dispatches parallel agents to independently tackle 2+ tasks like separate test failures or subsystems without shared state or dependencies.
Generate user-facing changelogs with impact notes and support guidance using git history analysis and the Keep a Changelog standard.
$JAAN_LEARN_DIR/jaan-to-release-iterate-changelog.learn.md - Past lessons (loaded in Pre-Execution)$JAAN_CONTEXT_DIR/tech.md - Tech context (if exists)${CLAUDE_PLUGIN_ROOT}/docs/extending/language-protocol.md - Language resolution protocolCommand: $ARGUMENTS
| Pattern | Mode | Description |
|---|---|---|
| (no args) | auto-generate | Analyze git commits since last tag, generate changelog draft |
create | create | Create a new CHANGELOG.md from scratch |
release vX.Y.Z | release | Promote [Unreleased] to versioned section |
add "<description>" | add | Add entry to [Unreleased] section manually |
| Other text | from-input | Parse provided changes list into changelog format |
If no input provided, default to auto-generate mode.
If input doesn't match any pattern, treat as from-input mode.
MANDATORY — Read and execute ALL steps in: ${CLAUDE_PLUGIN_ROOT}/docs/extending/pre-execution-protocol.md
Skill name: release-iterate-changelog
Execute: Step 0 (Init Guard) → A (Load Lessons) → B (Resolve Template) → C (Offer Template Seeding)
Also read context files if available:
$JAAN_CONTEXT_DIR/tech.md - Know the tech stack for contextIf the file does not exist, continue without it.
Read and apply language protocol: ${CLAUDE_PLUGIN_ROOT}/docs/extending/language-protocol.md
Override field for this skill: language_release-iterate-changelog
Parse $ARGUMENTS to determine mode using the Input Mode Detection table above.
Read jaan-to/config/settings.yaml for paths_changelog:
$CHANGELOG_FILE, proceed to Step 2Search for existing changelog files:
Glob: **/CHANGELOG.md, **/changelog.md, $JAAN_OUTPUTS_DIR/CHANGELOG.md
If found: Show found files and ask:
Use AskUserQuestion:
If not found: Ask where to save:
Use AskUserQuestion:
Save the chosen path to jaan-to/config/settings.yaml as paths_changelog via Edit tool.
Set $CHANGELOG_FILE to the resolved path.
Gather data based on detected mode:
auto-generateLAST_TAG=$(git describe --tags --abbrev=0 2>/dev/null)
if [ -z "$LAST_TAG" ]; then
REF=$(git rev-list --max-parents=0 HEAD)
else
REF="$LAST_TAG"
fi
git log ${REF}..HEAD --oneline --no-merges
git log ${REF}..HEAD --format="%H %s" --no-merges
git diff ${REF}..HEAD --stat
git diff ${REF}..HEAD --diff-filter=A --name-only # New files
git diff ${REF}..HEAD --diff-filter=D --name-only # Deleted files
git diff ${REF}..HEAD --diff-filter=M --name-only # Modified files
$CHANGELOG_FILE if it exists.createAsk the user:
releaserelease v1.2.0 → 1.2.0)$CHANGELOG_FILE — REQUIRED (fail if not found)^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$
[Unreleased] entriesaddadd "New dark mode toggle")$CHANGELOG_FILE — create if not foundfrom-input$CHANGELOG_FILE if it existsFor each commit or change entry:
Apply regex to each commit message:
^(?<type>\w+)(?:\((?<scope>[^)]+)\))?(?<breaking>!)?:\s*(?<description>.+)$
Map types to changelog categories:
| Conventional Commit Type | Changelog Category | SemVer Impact | Include? |
|---|---|---|---|
feat | Added | MINOR | Always |
fix | Fixed | PATCH | Always |
feat! / BREAKING CHANGE | Changed or Removed | MAJOR | Always |
perf | Changed | PATCH | Usually |
refactor | Changed | — | Optional |
revert | Removed or Fixed | varies | Usually |
deprecate (custom) | Deprecated | MINOR | Always |
security (custom) | Security | PATCH | Always |
docs, style, test, build, ci, chore | (skip) | — | No |
For commits that don't match Conventional Commits regex:
Skip commits that are:
docs/, *.md)test/, spec/, __tests__/).github/, .gitlab-ci, Dockerfile, Makefile).gitignore, lock files, config-only YAML/JSON)Track skipped commits with rationale for the "Skipped Commits" section.
Group classified entries into 6 categories:
Only include categories that have entries (don't show empty sections).
For each classified entry, write a human-friendly changelog entry:
Anti-pattern: Never dump raw commit messages. Always rewrite into user-friendly language.
Parse commit messages for issue-closing patterns (case-insensitive):
fixes #N, closes #N, resolves #Nfix #N, close #N, resolve #NDetect repo URL:
git remote get-url origin
Format matched entries with Closes reference:
- Fixed broken login flow. Closes [#42](https://github.com/owner/repo/issues/42)For add mode: explicitly ask "Does this change close a GitHub issue? (e.g., 42, or skip)"
Based on classified changes, suggest next version:
BREAKING CHANGE or Removed with breaking impact → suggest MAJOR bumpAdded or Deprecated → suggest at least MINOR bumpFixed, Changed (non-breaking), Security → suggest PATCH bumpFor each change category, assess:
| Dimension | Values |
|---|---|
| User-facing impact | High / Medium / Low / None |
| Who is affected | All users / Segment / Internal only |
| Support implications | FAQ update / Known issue / Migration steps / None |
High Impact: Breaking changes, removed features, major workflow changes, security fixes requiring user action Medium Impact: New features, significant improvements, deprecation notices Low Impact: Bug fixes, performance improvements, minor UI changes
Present draft changelog with:
## Changelog Draft
**Mode**: {mode}
**Commits Analyzed**: {count}
**Suggested Version**: {version} ({rationale})
### Categorized Changes
#### Added
- {entries}
#### Changed
- {entries}
#### Fixed
- {entries}
(etc. — only non-empty categories)
### User Impact Summary
**High Impact**: {count} changes requiring user attention
**Medium Impact**: {count} notable changes
**Low Impact**: {count} minor improvements
### Support Guidance Preview
{FAQ entries, migration steps, known issues}
### Skipped Commits
{count} commits filtered as non-user-facing
"Ready to write changelog to
$CHANGELOG_FILE? [y/n]"
Do NOT proceed to Phase 2 without explicit approval.
Write to $CHANGELOG_FILE based on mode:
createWrite new file using template from skills/release-iterate-changelog/template.md:
[Unreleased] section (empty or with initial entries)auto-generate / from-inputIf $CHANGELOG_FILE exists:
[Unreleased] section under correct change type sub-headersIf $CHANGELOG_FILE does not exist:
[Unreleased]release[Unreleased] section## [{version}] - {YYYY-MM-DD}[Unreleased] to the new versioned section[Unreleased] (keep the header, remove entries)[Unreleased] and previous latest version[unreleased] link points to {version}...HEAD[{version}] link points to {previous_version}...{version}add$CHANGELOG_FILE[Unreleased] section### Added)[Unreleased] + entryRun validation checks on the written/updated file:
[Unreleased] section preserved at topReport any validation warnings or errors.
Commit the changelog changes:
git add "$CHANGELOG_FILE"
git commit -m "changelog({mode}): {brief description}
Closes #{N}
Co-Authored-By: Claude <noreply@anthropic.com>"
Closes #N lines if any Closes entries were detectedIf any Closes #N entries were detected in the changelog, offer to post supportive comments:
Use AskUserQuestion:
/jaan-to:qa-issue-report for each closed issueIf "Yes": For each closed issue, run /jaan-to:qa-issue-report to post a supportive comment on the closed issue.
After changelog is written, ask:
"Any feedback or improvements needed? [y/n]"
If yes:
"[1] Fix now - Update this changelog [2] Learn - Save for future runs [3] Both - Fix now AND save lesson"
Option 1 - Fix now:
Option 2 - Learn for future:
/jaan-to:learn-add release-iterate-changelog "{feedback}"Option 3 - Both:
/jaan-to:learn-add (Option 2)If no:
Run /jaan-to:pm-changelog-rewrite to generate the user-facing product changelog.
This ensures CHANGELOG-PRODUCT.md stays in sync with CHANGELOG.md.
| Error | Message |
|---|---|
| No git repo | "Not a git repository. Auto-generate mode requires git history. Use create or provide changes as text." |
| No tags (auto-generate) | "No git tags found. Analyzing all commits from initial commit. Consider creating a tag with git tag v0.1.0 for better results." |
| No CHANGELOG.md (release mode) | "No existing CHANGELOG.md found at $CHANGELOG_FILE. Run create mode first or use auto-generate." |
| Invalid SemVer (release mode) | "Version '{input}' is not valid SemVer. Expected format: MAJOR.MINOR.PATCH (e.g., 1.2.0)" |
| Version not greater (release mode) | "Version {new} must be greater than latest version {latest}." |
| No commits found (auto-generate) | "No commits found since {reference}. Nothing to generate." |
| Empty [Unreleased] (release mode) | "No entries in [Unreleased] section. Add entries first with add mode or auto-generate." |
$CHANGELOG_FILE without approval$CHANGELOG_FILE written/updated