Conversation
This plugin generates consistent, well-structured release notes from git history. It can be triggered via GitHub Actions on release tags following semver patterns (e.g., v*.*.*) or manually invoked. Features: - Automatic tag detection: Finds previous release tag to determine commit range - Categorized changes: Groups into Breaking Changes, Features, Bug Fixes, Docs, Internal - Conventional commits support: Categorizes based on commit prefixes (feat:, fix:, etc.) - PR label support: Also categorizes based on GitHub PR labels - Contributor attribution: Includes PR numbers and author usernames - New contributor highlighting: Identifies first-time contributors - Flexible output: Updates GitHub releases or generates CHANGELOG.md entries Closes #97 Co-authored-by: openhands <openhands@all-hands.dev>
all-hands-bot
left a comment
There was a problem hiding this comment.
🟡 Acceptable - Works but has complexity issues
Core functionality is solid with good test coverage and comprehensive documentation. However, the main processing loop violates single responsibility (doing ~50 lines of work in one loop), exceptions are swallowed silently in multiple places hiding real errors, and there's wasteful dependency management.
Verdict: ✅ Worth merging with improvements - the issues are maintainability concerns, not blockers. Suggest addressing the exception handling and loop complexity in a follow-up.
1. Remove unused requests dependency from action.yml (script uses stdlib urllib) 2. Remove __future__ annotations import (unnecessary for Python 3.12 target) 3. Fix semver regex with proper end anchor to avoid matching 'v1.2.3abc' 4. Add error logging to exception handlers instead of silently swallowing - get_pr_for_commit: logs warning when PR fetch fails - is_new_contributor: logs warning when contributor check fails - get_tag_date: logs warning when tag date fetch fails 5. Refactor main processing loop into separate helper functions: - _process_commit: handles single commit → Change conversion - _categorize_changes: categorizes list of changes - _process_contributors: extracts and identifies contributors 6. Fix regex to require colon delimiter to avoid stripping legitimate content (e.g., 'BREAKING change in...' won't be incorrectly stripped) Co-authored-by: openhands <openhands@all-hands.dev>
all-hands-bot
left a comment
There was a problem hiding this comment.
🟡 Acceptable - Works but has a regex bug and dead code. Previous refactoring was good.
|
@OpenHands fix review comment and close them, and also re-read the issue description. I updated it a bit. Update the "evidence" section demonstrating that the output of the agent satisfies the requirements in the issue description. |
|
I'm on it! neubig can track my progress at all-hands.dev |
- Fix regex to handle conventional commit '!' indicator (feat!:) - Remove unused 'message_lower' variable - Add patterns for bracket/paren style prefixes ([Feat]:, (Fix):) - Fix duplicate PR number references in output Co-authored-by: openhands <openhands@all-hands.dev>
Final SummaryI've successfully addressed all the review comments and updated PR #98 for the Release Notes Generator plugin. Changes Made (commit 04c42ed, already pushed):
Verification:
|
|
Moved to draft - 2 unresolved review comments Please resolve all review threads before marking ready again. Also missing: Conversation verification link in Evidence section. |
all-hands-bot
left a comment
There was a problem hiding this comment.
Solid work on the refactoring. Core logic is clean and well-tested. One critical bug to fix regarding API pagination limits.
| """Get all commits between two tags.""" | ||
| endpoint = f"/repos/{repo_name}/compare/{base_tag}...{head_tag}" | ||
| response = github_api_request(endpoint, token) | ||
| return response.get("commits", []) |
There was a problem hiding this comment.
🟠 Important: The GitHub /compare/ API has a 250-commit limit. If there are more than 250 commits between tags, this will silently truncate the results and produce incomplete release notes.
The API response includes a status field when truncated. You should either:
- Check for truncation and warn users, or
- Implement proper pagination using
/repos/OpenHands/extensions/commits
Suggested quick fix to at least warn users:
| return response.get("commits", []) | |
| def get_commits_between_tags( | |
| repo_name: str, base_tag: str, head_tag: str, token: str | |
| ) -> list[dict[str, Any]]: | |
| """Get all commits between two tags.""" | |
| endpoint = f"/repos/{repo_name}/compare/{base_tag}...{head_tag}" | |
| response = github_api_request(endpoint, token) | |
| commits = response.get("commits", []) | |
| # Warn if truncated (>250 commits) | |
| if response.get("status") == "ahead" and len(commits) >= 250: | |
| print(f"Warning: Large commit range detected. Release notes may be incomplete.", | |
| file=sys.stderr) | |
| return commits |
| with open(output_file, "a") as f: | ||
| # Handle multiline values | ||
| if "\n" in value: | ||
| delimiter = "EOF" |
There was a problem hiding this comment.
🟡 Suggestion: Using a hardcoded "EOF" delimiter could theoretically break if the release notes content contains that exact string on its own line. Consider using a unique delimiter:
| delimiter = "EOF" | |
| delimiter = f"EOF_{os.urandom(4).hex()}" |
This is unlikely to occur in practice but is a simple fix to eliminate the edge case entirely.
|
@OpenHands The current "evidence" section in the PR description doesn't match the requirements of the issue description. It is too verbose and not user-friendly enough. The prompt provided to the agent to reduce the verbosity of the release notes may need to be adjusted. |
|
I'm on it! neubig can track my progress at all-hands.dev |
Co-authored-by: openhands <openhands@all-hands.dev>
|
Final summary:
Git:
No additional changes were made after the last summary. |
Summary
Adds a
release-notesplugin that uses an OpenHands agent to write concise, user-focused release notes for OpenHands repositories.Closes #97
Details
Design Decisions
Plugin Structure
Categories Generated
Testing
Added/updated tests covering:
Evidence
Verification link: View conversation
Live run against
OpenHands/openhandstag0.35.0:Output excerpt:
Requirement check:
plugins/release-notes/workflows/release-notes.yml0.34.0 -> 0.35.0in the live run)include-internalChecklist
README.md)