diff --git a/README.md b/README.md index 0bde6804..31ae3ebf 100644 --- a/README.md +++ b/README.md @@ -1,354 +1,216 @@ -# Generate Release Notes Action +# Release Notes Scrapper Action +Automatically generate **structured release notes** directly from your GitHub issues and pull requests. +Categorize changes, highlight contributors, and maintain consistent release documentation โ€” all fully automated. + +[![Version](https://img.shields.io/github/v/release/AbsaOSS/generate-release-notes)](https://github.com/AbsaOSS/generate-release-notes/releases) +[![GitHub Marketplace](https://img.shields.io/badge/Marketplace-Release%20Notes%20Scrapper-blue)](https://github.com/marketplace/actions/release-notes-scrapper) + +- [Overview](#overview) - [Motivation](#motivation) +- [Quick Start](#quick-start) - [Requirements](#requirements) -- [Inputs](#inputs) - - [Feature controls](#feature-controls) -- [Outputs](#outputs) -- [Usage Example](#usage-example) -- [Features](#features) - - [Built-in](#built-in) - - [Release Notes Extraction Process](#release-notes-extraction-process) - - [Contributors Mention](#contributors-mention) - - [Handling Multiple PRs](#handling-multiple-prs) - - [No Release Notes Found](#no-release-notes-found) - - [Select start date for closed issues and PRs](#select-start-date-for-closed-issues-and-prs) - - [Enable skipping of release notes for specific issues using label](#enable-skipping-of-release-notes-for-specific-issues-using-label) - - [Enable Service Chapters](#enable-service-chapters) - - [Showing Duplicity Lines In Chapters](#showing-duplicity-lines-in-chapters) - - [Define "From Tag" Name](#define-from-tag-name) -- [Developer Guide](#developer-guide) -- [GitHub Workflow Examples](#github-workflow-examples) - - [Create Release Tag & Draft Release - By Workflow Dispatch](#create-release-tag--draft-release---by-workflow-dispatch) - - [Check Release Notes Presence - in Pull Request Description](#check-release-notes-presence---in-pull-request-description) -- [Contribution Guidelines](#contribution-guidelines) - - [How to Contribute](#how-to-contribute) -- [License Information](#license-information) -- [Contact or Support Information](#contact-or-support-information) -- [FAQs](#faqs) - -## Description - -This GitHub Action automatically generates release notes for a given release tag by categorizing contributions into user-defined chapters based on labels. It streamlines the process of documenting new features, bug fixes, and breaking changes in your project releases. +- [Configuration](#configuration) +- [Example Workflow](#example-workflow) +- [Feature Tutorials](#feature-tutorials) +- [Troubleshooting](#troubleshooting) +- [Developer & Contribution Guide](#developer--contribution-guide) +- [License & Support](#license--support) + +## Overview + +**Release Notes Scrapper Action** scans issues, pull requests, and commits to create categorized release notes for your project releases. +It groups changes by labels (e.g., โ€œBugfixes ๐Ÿ› โ€, โ€œNew Features ๐ŸŽ‰โ€) and extracts relevant content from PR descriptions or CodeRabbit summaries. + +### Key Benefits +- Fully automated release note generation +- Categorization by labels or issue hierarchy +- Built-in โ€œService Chaptersโ€ to detect missing or incomplete release notes +- Configurable templates and icons +- Smart duplicate detection ## Motivation -Generate Release Notes action is dedicated to enhance the quality and organization of project documentation. Its primary purpose is to categorize release notes according to various labels, perfectly aligning with the unique organizational needs of each project. In addition, it offers robust support for acknowledging the efforts of contributors, thereby fostering a sense of recognition and appreciation within the team. Another noteworthy feature of this tool is its capability to detect potential gaps in documentation, ensuring that release notes are comprehensive and leave no stone unturned. Well maintained release notes are a vital component in maintaining high-quality, meticulously organized documentation, which is indispensable in the development process. This repository reflects our commitment to excellence in project documentation and team collaboration. +Good documentation isnโ€™t optional โ€” itโ€™s your projectโ€™s memory. +This Action was created to make structured release documentation effortless and consistent across teams. -## Requirements -- **GitHub Token**: A GitHub token with permission to fetch repository data such as Issues and Pull Requests. -- **Python 3.11+**: Ensure you have Python 3.11 installed on your system. - -## Inputs - -| Name | Description | Required | Default | -|------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------|-----------------------------------------------------------------------------| -| `GITHUB_TOKEN` | Your GitHub token for authentication. Store it as a secret and reference it in the workflow file as secrets.GITHUB_TOKEN. | Yes | | -| `tag-name` | The name of the tag for which you want to generate release notes. This should be the same as the tag name used in the release workflow. | Yes | | -| `from-tag-name` | The name of the tag from which you want to generate release notes. | No | '' | -| `chapters` | An YAML array defining chapters and corresponding labels for categorization. Each chapter should have a title and a label matching your GitHub issues and PRs. | Yes | | -| `hierarchy` | Set to true to enable issue hierarchy handling. When enabled, the action will organize issues based on their hierarchical relationships (e.g., Epics and their child issues). This is useful for projects that use issue types to represent different levels of work. | No | false | -| `row-format-hierarchy-issue` | The format of the row for the hierarchy issue in the release notes. Placeholders: `type`, `number`, `title`, `author`, `assignees`, `developers` (case-sensitive). | No | `"{type}: _{title}_ {number}"` | -| `row-format-issue` | The format of the row for the issue in the release notes. The format can contain placeholders for the issue `type`, `number`, `title`, `author`, `assignees`, `developers`, and issues `pull-requests`. The placeholders are case-sensitive. | No | `"{type}: {number} _{title}_ developed by {developers} in {pull-requests}"` | -| `row-format-pr` | The format of the row for the PR in the release notes. The format can contain placeholders for the PR `number`, `author`, `assignees`, `developers`, and `title`. The placeholders are case-sensitive. | No | `"{number} _{title}_ developed by {developers}"` | -| `row-format-link-pr` | If defined `true`, the PR row will begin with a `"PR: "` string. Otherwise, no prefix will be added. | No | true | -| `duplicity-scope` | Set to `custom` to allow duplicity issue lines to be shown only in custom chapters. Options: `custom`, `service`, `both`, `none`. | No | `both` | -| `duplicity-icon` | The icon used to indicate duplicity issue lines in the release notes. Icon will be placed at the beginning of the line. | No | `๐Ÿ””` | -| `published-at` | Set to true to enable the use of the `published-at` timestamp as the reference point for searching closed issues and PRs, instead of the `created-at` date of the latest release. If first release, repository creation date is used. | No | false | -| `skip-release-notes-labels` | List labels used for detection if issues or pull requests are ignored in the Release Notes generation process. Example: `skip-release-notes, question`. | No | `skip-release-notes` | -| `verbose` | Set to true to enable verbose logging for detailed output during the action's execution. | No | false | -| `release-notes-title` | The title of the release notes section in the PR description. | No | `[Rr]elease [Nn]otes:` | -| `coderabbit-support-active` | Enable CodeRabbit support. If true, the action will use CodeRabbit to generate release notes. | No | false | -| `coderabbit-release-notes-title` | The title of the CodeRabbit summary in the PR body. Value supports regex. | No | `Summary by CodeRabbit` | -| `coderabbit-summary-ignore-groups` | List of "group names" to be ignored by release notes detection logic. Example: `Documentation, Tests, Chores, Bug Fixes`. | No | '' | - -> **Notes** -> - `skip-release-notes-labels` -> - If used on issue then Issue will be skipped during Release Notes generation. -> - If used on PR with issue then on PR it will be ignored and PR will show as part of issue's release notes. -> - If used on PR without issue then PR will be skipped during Release Notes generation. -> - `verbose` -> - If workflow run in debug regime, 'verbose' logging is activated. - -### Feature controls - -| Name | Description | Required | Default | -|------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------|--------------------------------------| -| `warnings` | Set to true to print service chapters in the release notes. These warnings identify issues without release notes, without user-defined labels, or without associated pull requests, and PRs without linked issues. | No | true (Service chapters are printed.) | -| `print-empty-chapters` | Set it to true to print chapters with no issues or PRs. | No | true (Empty chapters are printed.) | - -> [!WARNING] -> - `warnings` -> - **Disabling this feature will hide service chapter showing direct commits!** These cannot be visible in custom chapters as they do not have labels! - -## Outputs -The output of the action is a markdown string containing the release notes for the specified tag. This string can be used in subsequent steps to publish the release notes to a file, create a GitHub release, or send notifications. - -See the [example of output](./examples/output_example.md). - -## Usage Example - -### Prerequisites - -Before we begin, ensure you have a GitHub Token with permission to fetch repository data such as Issues and Pull Requests. - -### Adding the Action to Your Workflow - -Add the following step to your GitHub workflow (in example are used non-default values): - -#### Default -```yaml -- name: Generate Release Notes - id: release_notes_generator - uses: AbsaOSS/generate-release-notes@v0.2.0 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - tag-name: "v0.2.0" # accepts also v0.2 format when patch version is 0 - from-tag-name: "v0.1.0" # accepts also v0.1 format when patch version is 0 - chapters: | - - {"title": "Breaking Changes ๐Ÿ’ฅ", "label": "breaking-change"} - - {"title": "New Features ๐ŸŽ‰", "label": "enhancement"} - - {"title": "New Features ๐ŸŽ‰", "label": "feature"} - - {"title": "Bugfixes ๐Ÿ› ", "label": "bug"} -``` +๐Ÿ‘‰ For the full background and design principles, see [docs/motivation.md](/docs/motivation.md) + +## Quick Start + +Add the following step to your workflow to start generating release notes. -#### Full example ```yaml - name: Generate Release Notes - id: release_notes_generator - uses: AbsaOSS/generate-release-notes@v0.7.0 + id: release_notes_scrapper + uses: AbsaOSS/generate-release-notes@v1 env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: - tag-name: "v0.2.0" - from-tag-name: "v0.1.0" + tag-name: "v1.2.0" chapters: | - {"title": "Breaking Changes ๐Ÿ’ฅ", "label": "breaking-change"} - - {"title": "New Features ๐ŸŽ‰", "label": "enhancement"} - {"title": "New Features ๐ŸŽ‰", "label": "feature"} - {"title": "Bugfixes ๐Ÿ› ", "label": "bug"} - - hierarchy: true - duplicity-scope: 'service' - duplicity-icon: '๐Ÿ”' - published-at: true - skip-release-notes-labels: 'ignore-in-release' # changing default value of label - verbose: false - release-notes-title: '[Rr]elease Notes:' - - coderabbit-support-active: true - coderabbit-release-notes-title: 'Summary by CodeRabbit' - coderabbit-summary-ignore-groups: 'Documentation, Tests, Chores, Bug Fixes, Refactor' - - warnings: false - print-empty-chapters: false ``` -## Features -### Built-in -#### Release Notes Extraction Process - -This feature automatically extracts release notes from GitHub pull request descriptions to help maintainers track meaningful changes. - -##### ๐Ÿ” How Detection Works - -- The Action looks for a specific section in the PR body, defined by: - - `release-notes-title`: A regex pattern to match the release notes section header. - - `coderabbit-support-active`: Enables fallback support for CodeRabbit summaries. - - โœ… _Used only if no section matching `release-notes-title` is found._ - -##### ๐Ÿ“ Detection Rules -- The release notes section: - - Can be **anywhere in the PR body** - - Must begin with a header that matches either: - - `release-notes-title` - - or `coderabbit-release-notes-title` (when CodeRabbit support is active) - - Supports [Markdown formatting](https://www.markdownguide.org/basic-syntax/#unordered-lists) - - Only the **first matching section** is extracted - - Is **optional** โ€“ the Action will still proceed even if no notes are found - - Will be **skipped silently** if the PR has a label listed in `skip-release-notes-labels` - -> ๐Ÿ”• If no valid section is found, the output Release Notes record will not contain any release notes. - -- **Example:** - - Here are examples of how to structure the release notes: +**Example output snippet:** ```markdown -## Release Notes: -- This update introduces a new caching mechanism that improves performance by 20%. - - The caching mechanism reduces database queries. - - Optimized for high-traffic scenarios. - - Includes support for distributed caching. - -## Release Notes: -* This update introduces a new caching mechanism that improves performance by 20%. - * Affected only specific edge cases. - -## Release Notes: -+ This update introduces a new caching mechanism that improves performance by 20%. - -## Summary by CodeRabbit - -- **New Features** - - Introduced a new feature. - -- **Documentation** - - Added new descriptions. - -- **Chores** - - Added configuration files for code style. - -- **Tests** - - Introduced a complete test suite for all classes. -``` -> The extraction process supports all three types of bullet points: `-`, `*`, and `+`, and their combinations. (GitHub documentation do not recommend to mix them.) -> -> **Best Practice:** Select one character from `-`, `*`, `+` for bullet points. The Markdown parser will automatically format them as a list. - -#### Handling Multiple PRs -If an issue is linked to multiple PRs, the action fetches and aggregates contributions from all linked PRs. - -### Select start date for closed issues and PRs -By set **published-at** to true the action will use the `published-at` timestamp of the latest release as the reference point for searching closed issues and PRs, instead of the `created-at` date. If first release, repository creation date is used. - -### Enable skipping of release notes for specific issues using label -By defining the `skip-release-notes-labels` option, the action will skip all issues and related PRs if they contain a label defined in configuration. This is useful for issues that are not relevant for release notes. - -### Enable Service Chapters -If the `warnings` option is enabled in the action's configuration, the release notes will include sections that highlight possible issues. - -The action includes four specific warning chapters to highlight potential areas of improvement in release documentation. Each chapter serves a distinct purpose: - -- **_Closed Issues Without Pull Request_** - - **Purpose**: This chapter lists issues that have been closed since the last release but are not linked to any pull requests. - - **Importance**: Helps maintainers identify changes that might not have been properly reviewed or documented through PRs, ensuring the integrity of the release documentation. - -- **_Closed Issues Without User-Defined Labels_** - - **Purpose**: Displays issues lacking the labels defined in the `chapters` configuration. - - **Importance**: Ensures all issues are categorized correctly according to the project's classification system. It aids in organizing release notes into predefined chapters effectively. - -- **_Closed Issues Without Release Notes_** - - **Purpose**: Identifies pull requests which do not contain a "Release Notes" section in description. - - **Importance**: Ensures that all significant changes are properly documented in the release notes, enhancing the completeness and usefulness of the release information provided to end-users. - -- **_Merged PRs Without Linked Issue_** - - **Purpose**: Lists pull requests that are not associated with any issues. - - **Importance**: Encourages linking PRs to issues for better traceability and understanding of why changes were made. It also helps in maintaining a cohesive narrative in the project history and release notes. +### New Features ๐ŸŽ‰ +- #23 _Feature title_ author is @root assigned to @neo developed by @morpheus in #24 + - Added support for multi-factor authentication. -- **_Merged PRs Linked to Open Issue_** - - **Purpose**: This section identifies merged pull requests that are still linked to issues which are open. - - **Importance**: Highlighting these PRs indicates potential discrepancies or ongoing work related to the PR. It helps in ensuring that all issues addressed by PRs are properly closed and documented, maintaining the accuracy and relevance of the project's issue tracking. +### Bugfixes ๐Ÿ›  +- PR: #25 _Copy not allowed_ author is @dependabot[bot] assigned to @smith developed by @smith + - File copy operation has been implemented. -- **_Closed PRs Without Linked Issue_** - - **Purpose**: Lists pull requests that are closed (not merged) but not associated with any issues. - - **Importance**: Highlighting closed PRs without linked issues ensures transparency in the project's history. It helps track important decisions and clarifies the reasoning behind changes, even if they aren't merged. This practice enhances the project's documentation quality and aids in understanding its evolution. - -- **_Others - No Topic_** - - **Purpose**: This chapter lists issues that do not fall into any of the predefined chapters. - - **Importance**: Helps maintainers identify issues that may not have been categorized correctly. This ensures that all issues are properly documented and organized in the release notes. - -Each warning chapter acts as a quality check, ensuring that the release notes are comprehensive, well-organized, and meaningful. By addressing these warnings, project maintainers can significantly improve the clarity and effectiveness of their release documentation. +#### Full Changelog +https://github.com/org/repo/compare/v1.1.0...v1.2.0 +``` +**Thatโ€™s it** โ€” the Action will: -### Showing Duplicity Lines In Chapters -By setting the `duplicity-scope` with one of the options, the action will show whether the duplicity issue lines are correct. -- `custom`: will show duplicity lines only in custom chapters. -- `service`: will show duplicity lines only in service chapters. -- `both`: will show duplicity lines in both custom and service chapters. -- `none`: will hide duplicity lines in all chapters. +1. Fetch all closed issues and PRs from latest till now. +2. Categorize them by labels. +3. Extract release note text and contributors. +4. Output a Markdown section ready for publishing. -Duplicity lines in `custom` chapters can point to potential issues with wrong labeling. In contrast, duplicity lines in `service` chapters can help maintainers identify areas with the most significant problems to address. +## Requirements -By setting `duplicity-icon` you can customize the icon used to indicate duplicity issue lines in the release notes. Icon will be placed at the beginning of the line. The duplicity icon is visible from **second** occurrence of the issue in the selected scope. +To run this action successfully, make sure your environment meets the following requirements: -### Define "From Tag" Name -By setting the `from-tag-name` option, the action will generate release notes from the specified tag to the tag defined in the `tag-name` option. This feature is helpful for generating release notes for a specific range of tags. +| Requirement | Description | +|----------------------------|----------------------------------------------------------------------------------------------------------------------------------| +| **GitHub Token** | A GitHub token with permission to read issues, pull requests, and releases. Usually available as `${{ secrets.GITHUB_TOKEN }}`. | +| **Python 3.11+** | The action internally runs on Python 3.11 or higher. If youโ€™re developing locally or testing, ensure this version is available. | +| **Repository Permissions** | The action needs at least `read` access to issues and pull requests, and `write` access to create or update release drafts. | +| **YAML Chapters Config** | Each chapter must have a `title` and a `label`. Example: `{"title": "Bugfixes ๐Ÿ› ", "label": "bug"}`. | -The final interval is time-based. The `published-at` or `created-at` timestamp of the previous release or repository creation date, if it is the first release, is used as the starting point. The previous release is determined to be the previous semantic version tag. +## Configuration -## Developer Guide +Only a few inputs are required to get started: -See this [Developer Guide](DEVELOPER.md) for more technical, development-related information. +| Name | Description | Required | Default | +|----------------|------------------------------------------------|----------|---------| +| `GITHUB_TOKEN` | GitHub token for authentication | Yes | - | +| `tag-name` | Target tag for the release | Yes | - | +| `chapters` | List of chapters and labels for categorization | No | - | +| `verbose` | Enable detailed logging | No | false | -## GitHub Workflow Examples -GitHub Actions enable automating key parts of your development process. +For the full input and output reference, see [Configuration reference](docs/configuration_reference.md). +For how label โ†’ chapter mapping and aggregation works, see [Custom Chapters Behavior](docs/configuration_reference.md#custom-chapters-behavior). -### Create Release Tag & Draft Release - By Workflow Dispatch -This workflow automates the creation of a release tag and a draft release, triggered manually via a workflow dispatch. -Tag is created after successful release notes generation to avoid manual removing of the tag if the release notes are not generated due to wrong configuration. +> **Important**: tag defined by `tag-name` must exist in the repository; otherwise, the action fails. -See the [example of workflow](./examples/release_draft.yml). +## Example Workflow -#### Impact to Users -The users can trigger the workflow manually by clicking the "Run workflow" button in the Actions tab. The workflow will create a release tag and a draft release based on the release notes generated by the action. +You can integrate this Action with your release process. -This workflow replaces the manual process of creating a release tag and draft release, saving time and ensuring consistency in the release process. +### Example โ€” Manual Release Dispatch -### Check Release Notes Presence - in Pull Request Description -This workflow checks that every pull request includes release notes in the description. +```yaml +name: "Create Release & Notes" +on: + workflow_dispatch: + inputs: + tag-name: + description: 'Existing git tag to use for this draft release. Syntax: "v[0-9]+.[0-9]+.[0-9]+". Ensure the tag is created and pushed before running.' + required: true + +jobs: + release: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Generate Release Notes + id: notes + uses: AbsaOSS/generate-release-notes@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + tag-name: ${{ github.event.inputs.tag-name }} + chapters: | + - {"title": "New Features ๐ŸŽ‰", "label": "enhancement"} + - {"title": "New Features ๐ŸŽ‰", "label": "feature"} + - {"title": "Bugfixes ๐Ÿ› ", "label": "error"} + - {"title": "Bugfixes ๐Ÿ› ", "label": "bug"} + - {"title": "Infrastructure ๐Ÿšง", "label": "infrastructure"} + - {"title": "Documentation ๐Ÿ“š", "label": "documentation"} + + - name: Create Draft Release + uses: softprops/action-gh-release@v2 + with: + name: ${{ github.event.inputs.tag-name }} + tag_name: ${{ github.event.inputs.tag-name }} + body: ${{ steps.notes.outputs.release_notes }} + draft: true +``` -See the [example of workflow](./examples/check_pr_release_notes.yml). +For more complex automation scenarios, see the [examples](examples) folder. -#### Impact to Users -The users are expected to provide the release notes in the pull request body. See example: -```markdown -Release Notes: .... also valid: ## Release Notes: -- 1st line of PR's release notes -- 2nd line of PR's release notes -``` +## Feature Tutorials -This section can be placed anywhere in the pull request body. The action will search for the release notes based on the provided title text. _Hint:_ The title can be chapter name, the Markdown format tags are ignored. +Each feature is documented separately โ€” click a name below to learn configuration, examples, and best practices. -## Contribution Guidelines +| Feature | Scope | Description | +|-----------------------------------------------------------------------|----------------------------|---------------------------------------------------------------------------------------------------------------| +| [Release Notes Extraction](docs/features/release_notes_extraction.md) | Extraction | Core logic that scans descriptions to extract structured release notes (and optionally CodeRabbit summaries). | +| [CodeRabbit Integration](docs/features/coderabbit_integration.md) | Extraction | Optional extension to Release Notes Extraction, enabling AI-generated summaries when PR notes are missing. | +| [Skip Labels](docs/features/skip_labels.md) | Filtering | Exclude issues/PRs carrying configured labels from all release notes. | +| [Service Chapters](docs/features/service_chapters.md) | Quality & Warnings | Surfaces gaps: issues without PRs, unlabeled items, PRs without notes, etc. | +| [Duplicity Handling](docs/features/duplicity_handling.md) | Quality & Warnings | Marks duplicate lines when the same issue appears in multiple chapters. | +| [Tag Range Selection](docs/features/tag_range.md) | Time Range | Chooses scope via `tag-name`/`from-tag-name`. | +| [Date Selection](docs/features/date_selection.md) | Time Range | Chooses scope via timestamps (`published-at` vs `created-at`). | +| [Custom Row Formats](docs/features/custom_row_formats.md) | Formatting & Presentation | Controls row templates and placeholders (`{number}`, `{title}`, `{developers}`, โ€ฆ). | +| [Custom Chapters](docs/features/custom_chapters.md) | Formatting & Presentation | Maps labels to chapter headings; aggregates multiple labels under one title. | +| [Issue Hierarchy Support](docs/features/issue_hierarchy_support.md) | Formatting & Presentation | Displays issue โ†’ sub-issue relationships. | +| [Verbose Mode](docs/features/verbose_mode.md) | Diagnostics & Technical | Adds detailed logs for debugging. | -We welcome contributions to the Generate Release Notes Action! Whether you're fixing bugs, improving documentation, or proposing new features, your help is appreciated. +_Category legend (keep it consistent across docs)_ -### How to Contribute -- **Submit Pull Requests**: Feel free to fork the repository, make changes, and submit a pull request. Please ensure your code adheres to the existing style and all tests pass. -- **Report Issues**: If you encounter any bugs or issues, please report them via the repository's [Issues page](https://github.com/AbsaOSS/generate-release-notes/issues). -- **Suggest Enhancements**: Have ideas on how to make this action better? Open an issue to suggest enhancements. +- **Extraction** โ€“ how notes are gathered (core behavior). +- **Filtering** โ€“ what gets included/excluded. +- **Quality & Warnings** โ€“ health checks that keep releases clean. +- **Time Range** โ€“ how the release window is determined. +- **Formatting & Presentation** โ€“ how lines look. +- **Diagnostics & Technical** โ€“ tooling, logs, debug. -Before contributing, please review our [contribution guidelines](https://github.com/AbsaOSS/generate-release-notes/blob/master/CONTRIBUTING.md) for more detailed information. +## Troubleshooting +Common questions and quick pointers. -## License Information +| Symptom | Likely Cause | Where to Read More | +|---------|--------------|--------------------| +| Issue/PR missing from a chapter | Skip label applied | [Skip Labels](docs/features/skip_labels.md) | +| Issue missing but its PR appears | No change increment detected for issue (no merged PR linkage) | [Release Notes Extraction](docs/features/release_notes_extraction.md) | +| Chapter heading is empty | No qualifying records OR duplicates suppressed | [Custom Chapters](docs/features/custom_chapters.md#faq) | +| Expected duplicate not shown | `duplicity-scope` excludes that chapter category | [Duplicity Handling](docs/features/duplicity_handling.md) | +| CodeRabbit section ignored | Manual release notes section already present OR support disabled | [CodeRabbit Integration](docs/features/coderabbit_integration.md) | -This project is licensed under the Apache License 2.0. It is a liberal license that allows you great freedom in using, modifying, and distributing this software, while also providing an express grant of patent rights from contributors to users. +More Q&A: see the [Custom Chapters FAQ](docs/features/custom_chapters.md#faq). -For more details, see the [LICENSE](https://github.com/AbsaOSS/generate-release-notes/blob/master/LICENSE) file in the repository. +## Developer & Contribution Guide -## Contact or Support Information +We love community contributions! +- [Developer Guide](DEVELOPER.md) +- [Contributing Guide](CONTRIBUTING.md) -If you need help with using or contributing to Generate Release Notes Action, or if you have any questions or feedback, don't hesitate to reach out: +Typical contributions include: +- Fixing bugs or edge cases +- Improving documentation or examples +- Adding new configuration options -- **Issue Tracker**: For technical issues or feature requests, use the [GitHub Issues page](https://github.com/AbsaOSS/generate-release-notes/issues). -- **Discussion Forum**: For general questions and discussions, join our [GitHub Discussions forum](https://github.com/AbsaOSS/generate-release-notes/discussions). +## License & Support -## FAQs -### Why is in generated Release Notes content mentioned co-author without link to his GitHub account? -Co-authors can be added into a commit message by using the `Co-authored-by` trailer in the commit message. This trailer is used by GitHub to link the commit to the co-author's GitHub account. The co-author's name is mentioned in the generated Release Notes without a link to his GitHub account. -``` -Co-authored-by: NAME -``` -The Release Notes generator is trying to get Github user by call GitHub API with the co-author's email address. If the user is found, the generator will use the user's name and link to his GitHub account. If the user is not found, the generator will use the co-author's name without a link to his GitHub account. -This leads to the situation when the co-author's name is mentioned in the generated Release Notes without a link to his GitHub account. +This project is licensed under the **Apache License 2.0**. +See the [LICENSE](/LICENSE) file for full terms. -### Will the action provide duplicate line in chapters if the issue contains multiple labels? -Let's imagine that we have an issue which has three labels: `enhancement`, `feature`, `bug`. -We defined chapters for our GH actions this way: -``` - chapters: '[ - {"title": "Breaking Changes ๐Ÿ’ฅ", "label": "breaking-change"}, - {"title": "New Features ๐ŸŽ‰", "label": "enhancement"}, - {"title": "New Features ๐ŸŽ‰", "label": "feature"}, - {"title": "Bugfixes ๐Ÿ› ", "label": "bug"} - ]' -``` -Then in chapters `New Features ๐ŸŽ‰` and `Bugfixes ๐Ÿ› ` will be duplicated lines for this issue. When mentioned second+ times then **[Duplicate]** prefix will be visible. -In the `New Features ๐ŸŽ‰` chapter will be mentioned this issue once only. +### Support & Contact +- [Issues](https://github.com/AbsaOSS/generate-release-notes/issues) +- [Discussions](https://github.com/AbsaOSS/generate-release-notes/discussions) -### What will happen when the pull request contains multiple "Release Notes" sections? -Only the first one will be used. +## Acknowledgements -### What will happen when Merged PR is linked to open issues? -The PR will be mentioned in warning chapter **Merged PRs Linked to Open Issue**. +Thanks to all contributors and teams who helped evolve this Action. +Your feedback drives continuous improvement and automation quality. diff --git a/docs/configuration_reference.md b/docs/configuration_reference.md new file mode 100644 index 00000000..23aa38d5 --- /dev/null +++ b/docs/configuration_reference.md @@ -0,0 +1,107 @@ +# Configuration Reference + +This page lists all action inputs and outputs with defaults. Grouped for readability. + +## Inputs + +| Name | Required | Default | Description | +|------|----------|---------|-------------| +| `tag-name` | Yes | โ€“ | Target release tag (must already exist). | +| `from-tag-name` | No | "" | Explicit previous release tag; if empty semantic latest published release is used. | +| `chapters` | No | "" | YAML list of chapter objects `{ "title": str, "label": str }`. Multiple entries may share a title to aggregate labels. | +| `hierarchy` | No | `false` | Enable Issue Hierarchy Support. | +| `published-at` | No | `false` | Use previous release `published_at` timestamp instead of `created_at`. | +| `skip-release-notes-labels` | No | `skip-release-notes` | Commaโ€‘separated labels that fully exclude issues/PRs. | +| `warnings` | No | `true` | Toggle Service Chapters generation. | +| `print-empty-chapters` | No | `true` | Print chapter headings even when empty. | +| `duplicity-scope` | No | `both` | Where duplicates are allowed: `none`, `custom`, `service`, `both`. Case-insensitive. | +| `duplicity-icon` | No | `๐Ÿ””` | One-character icon prefixed on duplicate rows. | +| `verbose` | No | `false` | Enable verbose (debug) logging. | +| `release-notes-title` | No | `[Rr]elease [Nn]otes:` | Regex matching the PR body section header for manual notes. First match only. | +| `coderabbit-support-active` | No | `false` | Enable CodeRabbit fallback when manual notes absent. | +| `coderabbit-release-notes-title` | No | `Summary by CodeRabbit` | Regex for CodeRabbit summary header. | +| `coderabbit-summary-ignore-groups` | No | "" | Comma or newline list of group names to discard from CodeRabbit summary. | +| `row-format-hierarchy-issue` | No | `{type}: _{title}_ {number}` | Template for hierarchy (parent) issue rows. | +| `row-format-issue` | No | `{type}: {number} _{title}_ developed by {developers} in {pull-requests}` | Template for issue rows. | +| `row-format-pr` | No | `{number} _{title}_ developed by {developers}` | Template for PR rows. | +| `row-format-link-pr` | No | `true` | If true adds `PR:` prefix when a PR is listed without an issue. | + +> CodeRabbit summaries must already be present in the PR body (produced by your own CI/App setup). This action only parses existing summaries; it does not configure or call CodeRabbit. + +### Placeholder Reference + +| Context | Placeholders | +|---------|--------------| +| Issue | `{type}`, `{number}`, `{title}`, `{author}`, `{assignees}`, `{developers}`, `{pull-requests}` | +| PR | `{number}`, `{title}`, `{author}`, `{assignees}`, `{developers}` | +| Hierarchy Issue | `{type}`, `{number}`, `{title}`, `{author}`, `{assignees}`, `{developers}` | + +Placeholders are case-insensitive; unknown placeholders are removed silently. + +### Chapters Configuration +Provide chapters as a YAML multi-line string. Each entry must define a `title` and `label`. + +```yaml +with: + chapters: | + - {"title": "New Features ๐ŸŽ‰", "label": "feature"} + - {"title": "Bugfixes ๐Ÿ› ", "label": "bug"} + - {"title": "Bugfixes ๐Ÿ› ", "label": "error"} # merges both labels under one heading +``` + +Resulting chapter headings are unique by title; labels aggregate. + +### Custom Chapters Behavior +- A record (issue / PR / hierarchy issue) is eligible for a user-defined chapter if it: + - Is not skipped (no skip label), and + - Contains a change increment (has extracted release notes OR at least one linked merged PR supplying changes), and + - Owns at least one label matching any configured chapter label (including implicit issue type label), and + - (For hierarchy) ultimately aggregates qualifying sub-issues/PRs. +- Issue Type is automatically merged into the issue's label set as a lowercase implicit label (e.g. `Epic`, `Feature`, `Bug`, `Task` โ†’ `epic`, `feature`, `bug`, `task`). You can reference these directly in `chapters` without adding a duplicate formal label in GitHub. +- Direct commits are excluded (no labels to match). +- Multiple entries with identical `title` merge label sets (logical OR across labels under the same heading). +- Rendering order follows the YAML order of first appearance for each unique title. +- If `duplicity-scope` excludes `custom`, a record that matched one chapter will not be added to others. +- Empty chapters: suppressed only when `print-empty-chapters: false`. +- Duplicity icon is applied per appearance count after all chapters are populated. + +### Issue โ†” PR Linking +Link detection influences chapter population and Service Chapters: +- GitHub automatically links PRs to issues using closing keywords (e.g. `Fixes #123`, `Closes org/repo#45`). These become closing issue references available through the API. +- The action also queries GitHub (GraphQL) for closing issue references of each PR (internal implementation) to gather linked issues. +- If no issue is linked and required metadata is missing, affected PRs can appear in Service Chapters (e.g. *Merged PRs without Issue and User Defined Labels โš ๏ธ*). + +### Skip Logic +Any issue or PR containing at least one label from `skip-release-notes-labels` is entirely excluded from: +- Release Notes Extraction (manual section parsing) +- CodeRabbit fallback detection +- Custom (user-defined) Chapters +- Service Chapters + +### Duplicates +Controlled by `duplicity-scope` and `duplicity-icon` (see [Duplicity Handling](features/duplicity_handling.md)). + +## Outputs + +| Name | Description | +|------|-------------| +| `release-notes` | Final Markdown block of release notes (includes Service Chapters if enabled and a Full Changelog link). | + +## Quick Selection Guide + +| Goal | Recommended Inputs | +|------|--------------------| +| Basic release notes | `tag-name`, `chapters` | +| Restrict time window manually | Add `from-tag-name` | +| Prefer published timestamp | `published-at: true` | +| Hide diagnostics | `warnings: false` | +| Tight output (no empty headings) | `print-empty-chapters: false` | +| Enforce no duplicates | `duplicity-scope: none` | +| Enable hierarchy rollups | `hierarchy: true` | +| Use AI fallback | `coderabbit-support-active: true` | + +## Related Pages +- [Feature Tutorials](../README.md#feature-tutorials) +- [Release Notes Extraction](features/release_notes_extraction.md) +- [Service Chapters](features/service_chapters.md) +- [Duplicity Handling](features/duplicity_handling.md) diff --git a/docs/features/coderabbit_integration.md b/docs/features/coderabbit_integration.md new file mode 100644 index 00000000..4269abb3 --- /dev/null +++ b/docs/features/coderabbit_integration.md @@ -0,0 +1,64 @@ +# Feature: CodeRabbit Integration + +## Purpose +Provide an automatic fallback summary for pull requests that lack an explicit Release Notes section. Uses a CodeRabbit-generated summary block when available and configured, reducing manual effort and minimizing empty chapters. + +> NOTE: This action only CONSUMES a CodeRabbit summary already present in the PR body. It does NOT configure, invoke, or authenticate CodeRabbit itself. Any CodeRabbit workflow, app installation, or settings are managed outside of this action. + +## How It Works +- Activation is controlled by input `coderabbit-support-active` (default: `false`). When `false`, no CodeRabbit parsing occurs. +- If Release Notes Extraction fails to find a matching section (or yields zero valid bullet lines), the action searches for a section whose heading matches `coderabbit-release-notes-title` (regex, default: `Summary by CodeRabbit`). +- The detected summary text is converted into bullet entries using existing bullet list markers (`-`, `*`, `+`) found inside the summary block. +- Groups listed in `coderabbit-summary-ignore-groups` are removed. Delimiters supported: comma (",") OR newline. The parser picks comma if present; otherwise splits by newline. +- If both explicit release notes AND a CodeRabbit section exist, only the explicit release notes are used (no merge; strict fallback behavior). +- Skip Labels still apply: PRs or issues labeled with any `skip-release-notes-labels` value are ignored entirely. + +## Configuration +```yaml +- name: Generate Release Notes + id: release_notes_scrapper + uses: AbsaOSS/generate-release-notes@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + tag-name: "v1.2.0" + chapters: | + - {"title": "New Features ๐ŸŽ‰", "label": "feature"} + coderabbit-support-active: true + coderabbit-release-notes-title: "Summary by CodeRabbit" # optional regex override + coderabbit-summary-ignore-groups: "Chore,Internal" # comma or newline separated list + release-notes-title: "[Rr]elease [Nn]otes:" # shown for clarity +``` + +### PR Body Example (no explicit release notes) +```markdown +Implementation details... + +Summary by CodeRabbit +- Add MFA enrollment flow +- Improve cache invalidation + +Additional notes. +``` + +## Example Result (fallback in effect) +```markdown +### New Features ๐ŸŽ‰ +- #233 _Add MFA enrollment flow_ developed by @alice in #234 + - Add MFA enrollment flow + - Improve cache invalidation +``` +(Exact formatting depends on Custom Row Formats and whether an issue is linked.) + +## Limitations +- Only activates when no valid explicit release notes section is found. +- Relies on predictable heading text; modified headings may need a custom `coderabbit-release-notes-title` regex. +- Group filtering requires consistent group naming within the CodeRabbit summary output. +- Does not merge with partially present manual notesโ€”manual notes have precedence. + +## Related Features +- [Release Notes Extraction](./release_notes_extraction.md) โ€“ primary mechanism; CodeRabbit is only a fallback. +- [Skip Labels](./skip_labels.md) โ€“ can exclude PRs entirely (applies before fallback). +- [Duplicity Handling](./duplicity_handling.md) โ€“ marks duplicates across chapters. + +โ† [Back to Feature Tutorials](../../README.md#feature-tutorials) diff --git a/docs/features/custom_chapters.md b/docs/features/custom_chapters.md new file mode 100644 index 00000000..2064ddb7 --- /dev/null +++ b/docs/features/custom_chapters.md @@ -0,0 +1,64 @@ +# Feature: Custom Chapters + +## Purpose +Map issue and PR labels to human-friendly chapter titles. Lets teams group multiple labels under a single heading and control output order without modifying repository label taxonomy. + +## How It Works +- Input `chapters` is a YAML list; each entry contains `title` + `label`. +- Multiple entries with the same `title` aggregate labels into one chapter (logical OR). +- Records qualify when: not skipped, contain a change increment (at least one linked merged PR), and have โ‰ฅ1 matching label (explicit or implicit Issue Type label). + - Issue Type is automatically merged as a lowercase implicit label (e.g. `Epic` โ†’ `epic`, `Feature` โ†’ `feature`, `Bug` โ†’ `bug`, `Task` โ†’ `task`). You can reference these directly in `chapters` without creating extra labels in the repository. +- Direct commits are ignored (no labels) and appear only in Service Chapters if relevant. +- Duplicates across chapters depend on `duplicity-scope` (see Duplicity Handling). If disallowed, first match wins. +- Empty chapters printed only when `print-empty-chapters: true`. + +## Configuration +```yaml +- name: Generate Release Notes + id: release_notes_scrapper + uses: AbsaOSS/generate-release-notes@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + tag-name: "v2.1.0" + chapters: | + - {"title": "New Features ๐ŸŽ‰", "label": "feature"} + - {"title": "New Features ๐ŸŽ‰", "label": "enhancement"} + - {"title": "Bugfixes ๐Ÿ› ", "label": "bug"} + - {"title": "Epics", "label": "epic"} # using implicit issue type label + duplicity-scope: "custom" + print-empty-chapters: true +``` + +## Example Result +```markdown +### New Features ๐ŸŽ‰ +- #410 _Add inline diff viewer_ developed by @alice in #415 + +### Bugfixes ๐Ÿ›  +- #412 _Fix cache stampede_ developed by @bob in #418 +``` +(Multiple labels under the same title unify into one heading.) + +## FAQ +**Why didnโ€™t my issue appear in any chapter?** +- It has a skip label (see [Skip Labels](./skip_labels.md)). +- It has no change increment (no merged PR linked to it). +- Its labels (including implicit issue type) donโ€™t match any configured chapter labels. +- Itโ€™s still open and hierarchy/Service Chapters logic filtered it (for some diagnostics scenarios) but not eligible for user chapters. +- Duplicates disabled (`duplicity-scope` excludes `custom`) and it already appeared under an earlier matching chapter. + +**How do I group by issue types without adding labels?** Use the lowercase implicit type (`epic`, `feature`, `bug`, `task`) in `chapters`. + +**Why is a chapter heading empty?** Either no records qualified or they were all skipped/excluded by duplicity scope. Disable empty headings via `print-empty-chapters: false`. + +**Can a PR-only item appear without an issue?** Yesโ€”if its labels match a chapter. The line will format using the PR row template. + +## Related Features +- [Duplicity Handling](./duplicity_handling.md) โ€“ governs multi-chapter visibility. +- [Release Notes Extraction](./release_notes_extraction.md) โ€“ provides the change increment lines. +- [Skip Labels](./skip_labels.md) โ€“ excluded records never reach chapters. +- [Custom Row Formats](./custom_row_formats.md) โ€“ adjusts row templates. +- [Service Chapters](./service_chapters.md) โ€“ diagnostics separate from user-defined chapters. + +โ† [Back to Feature Tutorials](../../README.md#feature-tutorials) diff --git a/docs/features/custom_row_formats.md b/docs/features/custom_row_formats.md new file mode 100644 index 00000000..f2740e15 --- /dev/null +++ b/docs/features/custom_row_formats.md @@ -0,0 +1,51 @@ +# Feature: Custom Row Formats + +## Purpose +Customize how individual issue, PR, and hierarchy issue lines are rendered in the release notes. Ensures output matches team conventions without post-processing. + +## How It Works +- Controlled by inputs: + - `row-format-hierarchy-issue` + - `row-format-issue` + - `row-format-pr` + - `row-format-link-pr` (boolean controlling prefix `PR:` presence for standalone PR links) +- Placeholders are case-insensitive; unknown placeholders are removed. +- Available placeholders: + - Hierarchy issue rows: `{type}`, `{number}`, `{title}`, `{author}`, `{assignees}`, `{developers}` + - Issue rows: `{type}`, `{number}`, `{title}`, `{author}`, `{assignees}`, `{developers}`, `{pull-requests}` + - PR rows: `{number}`, `{title}`, `{author}`, `{assignees}`, `{developers}` +- Duplicity icon (if triggered) is prefixed before the formatted row. + +## Configuration +```yaml +- name: Generate Release Notes + id: release_notes_scrapper + uses: AbsaOSS/generate-release-notes@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + tag-name: "v4.0.0" + chapters: | + - {"title": "Features", "label": "feature"} + row-format-hierarchy-issue: "{type}: _{title}_ {number}" + row-format-issue: "{type}: {number} _{title}_ developed by {developers} in {pull-requests}" + row-format-pr: "{number} _{title}_ developed by {developers}" + row-format-link-pr: true # include PR: prefix when issue not linked +``` + +## Example Result + +```markdown +### Features +- Task: #500 _Add inline diff viewer_ developed by @alice in #501 +- PR: #505 _Add inline diff viewer_ developed by @kevin +``` + +(Formatting reflects the provided custom templates.) + +## Related Features +- [Duplicity Handling](./duplicity_handling.md) โ€“ may add icon before formatted line. +- [Issue Hierarchy Support](./issue_hierarchy_support.md) โ€“ hierarchy rows use their own format. + +โ† [Back to Feature Tutorials](../../README.md#feature-tutorials) + diff --git a/docs/features/date_selection.md b/docs/features/date_selection.md new file mode 100644 index 00000000..9cd233c8 --- /dev/null +++ b/docs/features/date_selection.md @@ -0,0 +1,44 @@ +# Feature: Date Selection + +## Purpose +Choose which timestamp from the previous release defines the cutoff boundary (the "since" moment) for included issues, PRs, and commits. Provides control for teams that publish releases later than they create them. + +## How It Works +- Input `published-at` (boolean, default `false`). +- When `published-at: true`, the previous releaseโ€™s `published_at` timestamp is used. +- When `false`, the previous releaseโ€™s `created_at` timestamp is used. +- If no prior release exists (first release), all issues are fetched without a filtration. + +## Configuration +```yaml +- name: Generate Release Notes + id: release_notes_scrapper + uses: AbsaOSS/generate-release-notes@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + tag-name: "v1.6.0" + from-tag-name: "v1.5.0" # defines the previous release + published-at: true # use published_at instead of created_at + chapters: | + - {"title": "Features", "label": "feature"} + - {"title": "Fixes", "label": "bug"} +``` + +## Example Result +```markdown +### Features +- #360 _Add audit event sink_ developed by @dev in #365 + +#### Full Changelog +https://github.com/org/repo/compare/v1.5.0...v1.6.0 +``` +(The included only records occurred after the chosen previous release timestamp.) + +## Related Features +- [Tag Range Selection](./tag_range.md) โ€“ defines which releases bound the window. +- [Service Chapters](./service_chapters.md) โ€“ uses same time window for diagnostics. +- [Release Notes Extraction](./release_notes_extraction.md) โ€“ only scans PRs within the window. + +โ† [Back to Feature Tutorials](../../README.md#feature-tutorials) + diff --git a/docs/features/duplicity_handling.md b/docs/features/duplicity_handling.md new file mode 100644 index 00000000..d6ad76ca --- /dev/null +++ b/docs/features/duplicity_handling.md @@ -0,0 +1,53 @@ +# Feature: Duplicity Handling + +## Purpose +Control whether the same record (issue / PR / hierarchy issue / commit) can appear in multiple chapters and visually mark duplicates. Prevents clutter while still allowing intentional multi-label visibility. + +## How It Works +- Input `duplicity-scope` defines where duplicates are allowed: `none`, `custom`, `service`, `both` (case-insensitive). +- When a record matches multiple user-defined chapters and scope permits (`custom` or `both`), it can appear more than once. +- Service Chapters obey the same rule: duplicates allowed only if scope includes `service` or `both`. +- A duplicate (present in >1 chapter) is prefixed by the single-character icon from `duplicity-icon` (default: ๐Ÿ””) when rendered. +- If duplicates are disallowed for a given group, additional occurrences are skipped silently (no placeholder or warning). + +### Choosing `duplicity-scope` +| Value | Custom Chapters Duplicates | Service Chapters Duplicates | Icon Applied (if >1 appearance) | Typical Use Case | +|-------|----------------------------|------------------------------|---------------------------------|------------------| +| `none` | No | No | Never (only single appearance) | Strict single-source classification | +| `custom` | Yes | No | Yes (in custom) | Emphasize multi-label themes; keep diagnostics lean | +| `service` | No | Yes | Yes (in service) | Observe all diagnostic contexts; keep user chapters clean | +| `both` | Yes | Yes | Yes | Maximum visibility across all chapter types | + +## Configuration +```yaml +- name: Generate Release Notes + id: release_notes_scrapper + uses: AbsaOSS/generate-release-notes@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + tag-name: "v3.0.0" + chapters: | + - {"title": "Features", "label": "feature"} + - {"title": "Quality", "label": "quality"} + duplicity-scope: "both" # none|custom|service|both + duplicity-icon: "๐Ÿ””" # must be exactly one character +``` + +## Example Result +```markdown +### Features +๐Ÿ”” #410 _Improve cache layer_ developed by @alice in #415 + +### Quality +๐Ÿ”” #410 _Improve cache layer_ developed by @alice in #415 +``` +(Icon appears because the same record appeared in two chapters with scope permitting duplicates.) + +## Related Features +- [Service Chapters](./service_chapters.md) โ€“ also affected by duplicity scope. +- [Custom Row Formats](./custom_row_formats.md) โ€“ icon is prefixed before formatted line. +- [Skip Labels](./skip_labels.md) โ€“ skipped records never produce duplicates. +- [Release Notes Extraction](./release_notes_extraction.md) โ€“ determines which records have change increments. + +โ† [Back to Feature Tutorials](../../README.md#feature-tutorials) diff --git a/docs/features/issue_hierarchy_support.md b/docs/features/issue_hierarchy_support.md new file mode 100644 index 00000000..6acccadd --- /dev/null +++ b/docs/features/issue_hierarchy_support.md @@ -0,0 +1,45 @@ +# Feature: Issue Hierarchy Support + +## Purpose +Represent issue โ†’ sub-issue relationships directly in release notes, aggregating linked sub-issues and their pull requests under hierarchical parents. Gives stakeholders a structured view of larger deliverables. + +## How It Works +- Enabled via input `hierarchy: true` (default: `false`). When disabled, all issues render flat. +- Parent issues are detected; sub-issues (and nested hierarchy issues) are fetched and ordered by level. Levels indent with two spaces per depth; nested items use list markers (`-`). +- Only closed sub-issues that contain a change increment (merged PR to default branch) are rendered; open ones, and PR to non default branch are ignored. +- Each hierarchy issue line can expand with its own extracted release notes block if present (prefixed with `_Release Notes_:` heading within the item block). + +## Configuration +```yaml +- name: Generate Release Notes + id: release_notes_scrapper + uses: AbsaOSS/generate-release-notes@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + tag-name: "v1.6.0" + hierarchy: true + chapters: | + - {"title": "New Features ๐ŸŽ‰", "label": "feature"} +``` + +## Example Result +```markdown +### New Features ๐ŸŽ‰ +- Epic: _Make Login Service releasable under new Maven central repository_ #140 + - Updated `sbt.version` to `1.11.5` for release. + - Updated Developers + - Updated `sbt-ci-release` to `1.11.2` + - Updated `scala213 = "2.13.13"` + - Feature: _Add user MFA enrollment flow_ #123 developed by @alice in #124 + - Add user MFA enrollment flow +``` +(1st four indented bullets under Epic line represent the extracted release notes from the parent hierarchy issue's body.) + +## Related Features +- [Custom Row Formats](./custom_row_formats.md) โ€“ controls hierarchy line rendering. +- [Service Chapters](./service_chapters.md) โ€“ flags missing change increments if hierarchy parents lack qualifying sub-issues. +- [Duplicity Handling](./duplicity_handling.md) โ€“ duplicate hierarchy items can be icon-prefixed if allowed. + +โ† [Back to Feature Tutorials](../../README.md#feature-tutorials) + diff --git a/docs/features/release_notes_extraction.md b/docs/features/release_notes_extraction.md new file mode 100644 index 00000000..50461946 --- /dev/null +++ b/docs/features/release_notes_extraction.md @@ -0,0 +1,59 @@ +# Feature: Release Notes Extraction + +## Purpose +Extract structured release note lines from pull request (and issue) descriptions. Provides a predictable, labeled section that is transformed into categorized chapters. Reduces manual curation and enforces consistent formatting. + +## How It Works +- Detects the first section in the PR body whose heading/title line matches the configurable regex input `release-notes-title` (default: `[Rr]elease [Nn]otes:`). Only the first match is used; later matches are ignored (first matching section rule). +- Reads subsequent list lines until a blank line, a new heading, or end of body. Supported bullet markers: `-`, `*`, `+` (mixed usage allowed). +- Each bullet becomes a release note entry attached to the PR (and, when applicable, its linked issue); formatting of the final output row is controlled separately by Custom Row Formats. +- If no matching section (or itโ€™s empty after filtering) AND CodeRabbit Integration is enabled, the CodeRabbit summary section may be used as a fallback (see CodeRabbit Integration). +- Issue โ†” PR linkage is determined both by GitHub closing keywords in PR bodies (e.g. `Fixes #123`) and by API lookups of closing references. See [Issue โ†” PR Linking](../configuration_reference.md#issue--pr-linking). + +## Configuration +```yaml +- name: Generate Release Notes + id: release_notes_scrapper + uses: AbsaOSS/generate-release-notes@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + tag-name: "v1.2.0" + chapters: | + - {"title": "New Features ๐ŸŽ‰", "label": "feature"} + - {"title": "Bugfixes ๐Ÿ› ", "label": "bug"} + release-notes-title: "[Rr]elease [Nn]otes:" # optional regex override + skip-release-notes-labels: "skip-release-notes,internal-doc" # comma-separated list + coderabbit-support-active: false # fallback disabled here +``` + +### PR Body Example (author input) +```markdown +Some intro text + +Release Notes: +- Add user MFA enrollment flow +* Improve cache invalidation logic ++ Adjust logging level for retries + +Other commentary... +``` + +## Example Result +```markdown +### New Features ๐ŸŽ‰ +- PR: #123 _PR title_ developed by @alice + - Add user MFA enrollment flow + - Improve cache invalidation logic + - Adjust logging level for retries +``` +(Formatting depends on row format settings and whether the issue/PR linkage exists.) + +## Related Features +- [CodeRabbit Integration](./coderabbit_integration.md) โ€“ fallback when explicit notes section is absent. +- [Skip Labels](./skip_labels.md) โ€“ exclude items entirely from extraction. +- [Custom Row Formats](./custom_row_formats.md) โ€“ control placeholder layout of resulting lines. +- [Duplicity Handling](./duplicity_handling.md) โ€“ mark lines appearing in multiple chapters. +- [Issue Hierarchy Support](./issue_hierarchy_support.md) โ€“ presentation when parent/child issues are involved. + +โ† [Back to Feature Tutorials](../../README.md#feature-tutorials) diff --git a/docs/features/service_chapters.md b/docs/features/service_chapters.md new file mode 100644 index 00000000..267626be --- /dev/null +++ b/docs/features/service_chapters.md @@ -0,0 +1,65 @@ +# Feature: Service Chapters + +## Purpose +Highlight quality gaps or inconsistencies in the release scope: missing PR for closed issues, unlabeled issues or PRs, or direct commits. Helps maintain hygiene and encourages authors to supply complete metadata. + +## How It Works +- Enabled when input `warnings` is `true` (default). When `false`, service chapters are omitted entirely. +- Builds a fixed set of diagnostic chapters after custom (user-defined) chapters are rendered. +- Honors `print-empty-chapters` (default `true`) to either show or suppress empty diagnostic sections. +- Respects `duplicity-scope`: if duplicates not allowed in Service chapters (`duplicity-scope` excludes `service`/`both`), a record appears only once. +- Skipped records (Skip Labels) are not considered. +- Issue โ†” PR linkage here relies on the same detection as main extraction: GitHub closing keywords (e.g. `Fixes #123`) plus API lookups of closing references. See [Issue โ†” PR Linking](../configuration_reference.md#issue--pr-linking). + +### Service Chapter Set +| Chapter Title | Condition Reported | +|---------------|------------------------------------------------------------------------| +| Closed Issues without Pull Request โš ๏ธ | Closed issue with zero linked PRs | +| Closed Issues without User Defined Labels โš ๏ธ | Closed issue missing all user-defined chapter labels | +| Merged PRs without Issue and User Defined Labels โš ๏ธ | Merged PR with no linked issue and none of the user-defined labels | +| Closed PRs without Issue and User Defined Labels โš ๏ธ | Closed (not merged) PR missing issue link and user-defined labels | +| Merged PRs Linked to 'Not Closed' Issue โš ๏ธ | PR merged while a linked issue is still open | +| Direct commits โš ๏ธ | Commits on default branch without PR | +| Others - No Topic โš ๏ธ | Fallback bucket when none of the above matched but the record surfaced | + +## Configuration +```yaml +- name: Generate Release Notes + id: release_notes_scrapper + uses: AbsaOSS/generate-release-notes@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + tag-name: "v1.6.0" + chapters: | + - {"title": "New Features ๐ŸŽ‰", "label": "feature"} + - {"title": "Bugfixes ๐Ÿ› ", "label": "bug"} + warnings: true # enable service chapters (default) + print-empty-chapters: true # show even when empty (default) + duplicity-scope: "both" # allow duplicates across custom + service +``` + +## Example Result +```markdown +### Closed Issues without Pull Request โš ๏ธ +All closed issues linked to a Pull Request. + +### Closed Issues without User Defined Labels โš ๏ธ +- N/A: #129 _PoC: attempt to do chrome negotiation on a get enpoint_ in #143 + - Added Option for AWS SSM Paramter Store as alternative to AWS Secrets manager for storing credentials + - Updated Tests to support the new addition + - Updated ReadMe to indicate how to implement. + +### Direct commits โš ๏ธ +All direct commits are linked pull requests. +``` +(Excerpt; remaining chapters omitted for brevity.) + +## Related Features +- [Duplicity Handling](./duplicity_handling.md) โ€“ controls duplicate visibility and icons. +- [Skip Labels](./skip_labels.md) โ€“ skipped records never appear here. +- [Release Notes Extraction](./release_notes_extraction.md) โ€“ determines change increments referenced. +- [Custom Row Formats](./custom_row_formats.md) โ€“ defines row layout reused here. +- Custom (user-defined) chapters are configured via YAML (`chapters` input); this page only covers diagnostic Service Chapters. For configuration details see [Configuration Reference](../configuration_reference.md#custom-chapters-behavior). + +โ† [Back to Feature Tutorials](../../README.md#feature-tutorials) diff --git a/docs/features/skip_labels.md b/docs/features/skip_labels.md new file mode 100644 index 00000000..0db1e9ec --- /dev/null +++ b/docs/features/skip_labels.md @@ -0,0 +1,52 @@ +# Feature: Skip Labels + +## Purpose +Exclude all issues and pull requests from release notes chapters population process when they carry one of the configured labels. Keeps internal, noise, or non-user-facing work out of published notes. + +## How It Works +- Controlled by input `skip-release-notes-labels` (commaโ€‘separated). Default: `skip-release-notes`. +- If any label on an issue or PR matches the configured list, that record is marked as skipped (`skip=True`). +- Skipped records are ignored by: Custom Chapters, and Service Chapters population logic. + +> **Observable effect:** they do not appear in any chapter, even if they would otherwise match. + +## Configuration +```yaml +- name: Generate Release Notes + id: release_notes_scrapper + uses: AbsaOSS/generate-release-notes@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + tag-name: "v2.0.0" + chapters: | + - {"title": "Features", "label": "feature"} + - {"title": "Fixes", "label": "bug"} + skip-release-notes-labels: "skip-release-notes,internal,ops" +``` + +### Example +Given PR #120 labeled `internal`: +```markdown +Features +- (no line for #120 โ€“ it was skipped) +``` + +## Example Result +```markdown +### Features +- #118 _Add MFA support_ developed by @alice in #119 + +### Fixes +- #121 _Resolve cache eviction bug_ developed by @bob in #122 + +#### Full Changelog +https://github.com/org/repo/compare/v1.5.0...v2.0.0 + +``` +> (Internal / skipped items not shown.) + +## Related Features +- [Service Chapters](./service_chapters.md) โ€“ skipped items donโ€™t appear as warnings. + +โ† [Back to Feature Tutorials](../../README.md#feature-tutorials) diff --git a/docs/features/tag_range.md b/docs/features/tag_range.md new file mode 100644 index 00000000..ab645149 --- /dev/null +++ b/docs/features/tag_range.md @@ -0,0 +1,46 @@ +# Feature: Tag Range Selection + +## Purpose +Define the window of work (issues, PRs, commits) to include in the release notes by specifying current and optional previous tags. Ensures only changes since the chosen baseline are reported. + +## How It Works +- Required input `tag-name` sets the target release tag (e.g. `v1.6.0`). + - **Important**: this tag must exist in the repository; otherwise, the action fails. +- Optional input `from-tag-name` sets an explicit starting tag. When provided, the action fetches that release directly. +- If `from-tag-name` is NOT set, the action picks the latest published, non-draft, non-prerelease tag by semantic version ordering (may differ from most recently created chronologically if versions were pushed out-of-order). + - If no prior release exists (first release), no filtering is applied; all issues/PRs are considered. +- Tag normalization: both `1.6.0` and `v1.6.0` are treated as `v1.6.0` internally. +- The time boundary ("since" value) is derived from the selected previous release timestamp (see Date Selection for which timestamp field is used). + +## Configuration +```yaml +- name: Generate Release Notes + id: release_notes_scrapper + uses: AbsaOSS/generate-release-notes@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + tag-name: "v1.6.0" # current release tag + from-tag-name: "v1.5.0" # optional; if omitted semantic latest prior release is used + chapters: | + - {"title": "Features", "label": "feature"} + - {"title": "Fixes", "label": "bug"} +``` + +## Example Result +```markdown +### Features +- #350 _Add MFA enrollment API_ developed by @alice in #355 + +#### Full Changelog +https://github.com/org/repo/compare/v1.5.0...v1.6.0 +``` +(The compare URL reflects both `from-tag-name` and `tag-name`.) + +## Related Features +- [Date Selection](./date_selection.md) โ€“ defines which timestamp of the previous release becomes the cutoff. +- [Service Chapters](./service_chapters.md) โ€“ uses the same time window to assess gaps. +- [Release Notes Extraction](./release_notes_extraction.md) โ€“ only processes PRs/issues within the computed window. + +โ† [Back to Feature Tutorials](../../README.md#feature-tutorials) + diff --git a/docs/features/verbose_mode.md b/docs/features/verbose_mode.md new file mode 100644 index 00000000..618b8be0 --- /dev/null +++ b/docs/features/verbose_mode.md @@ -0,0 +1,45 @@ +# Feature: Verbose Mode + +## Purpose +Provide detailed debug logging to troubleshoot configuration, data mining boundaries, label resolution, and chapter population decisions. Useful when release notes output is incomplete or unexpected. + +## How It Works +- Controlled by input `verbose` (default: `false`). Set to `true` to enable debug logs. +- Also auto-enabled when the GitHub Actions runner sets `RUNNER_DEBUG=1` (e.g., via repository secrets / workflow debug). +- Emits detailed context: received inputs, debug messages during processing steps, received data from API calls. +- **Does not alter functional behavior** โ€” only log verbosity. + +## Configuration +```yaml +- name: Generate Release Notes + id: release_notes_scrapper + uses: AbsaOSS/generate-release-notes@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + tag-name: "v1.6.0" + chapters: | + - {"title": "Features", "label": "feature"} + verbose: true # enable debug logging +``` + +## Example Result +```text +INFO Building Release Notes +DEBUG Repository: org/repo +DEBUG Tag name: v1.6.0 +DEBUG From tag name: v1.5.0 +DEBUG Skip release notes labels: ['skip-release-notes', 'internal'] +DEBUG Duplicity scope: BOTH +DEBUG Release notes title: [Rr]elease [Nn]otes: +DEBUG CodeRabbit support active: False +``` +(Output abbreviated; actual log lines may vary.) + +## Related Features +- [Release Notes Extraction](./release_notes_extraction.md) โ€“ debug lines show title regex and detection results. +- [Service Chapters](./service_chapters.md) โ€“ logs help trace why records appear (or not) in warnings. +- [Tag Range Selection](./tag_range.md) & [Date Selection](./date_selection.md) โ€“ logs display cutoff and release timing decisions. + +โ† [Back to Feature Tutorials](../../README.md#feature-tutorials) + diff --git a/docs/motivation.md b/docs/motivation.md new file mode 100644 index 00000000..f3e05b62 --- /dev/null +++ b/docs/motivation.md @@ -0,0 +1,66 @@ +# Motivation + +Release documentation often drifts: missing PR summaries, unlabeled issues, or manual copy/paste errors right before a release. This Action was created to enforce **repeatable, labelโ€‘driven, metadataโ€‘rich** release notes with minimal friction for contributors. + +## Problems Addressed +- Manual release note curation is slow and error-prone. +- Inconsistent formatting across releases reduces readability. +- Orphaned work (issues without PRs / PRs without notes) goes unnoticed. +- Large epics or feature umbrellas are hard to summarize without hierarchy. +- AI (CodeRabbit) summaries are useful, but only as a fallbackโ€”manual author intent stays primary. + +## Design Principles +| Principle | Explanation | +|-----------|-------------| +| Determinism | Same inputs produce the same release notes; no hidden heuristics. | +| Explicit Configuration | Chapters defined in YAML; no magic label groupings. | +| Fail Safe | If explicit notes missing, optionally fall back to CodeRabbit; never silently fabricate content. | +| Transparency | Service Chapters surface hygiene issues instead of hiding them. | +| Extensibility | Row formats, hierarchy, and duplicity policy are pluggable via inputs. | +| Minimal Boilerplate | Only a tag and basic chapters required for first adoption. | + +## Key Inputs Snapshot +(See full list in [Configuration Reference](configuration_reference.md).) + +| Category | Inputs (examples) | Purpose | +|----------|-------------------|---------| +| Scope | `tag-name`, `from-tag-name`, `published-at` | Define time window. | +| Extraction | `release-notes-title`, `coderabbit-*` | Control where notes are sourced. | +| Filtering | `skip-release-notes-labels` | Exclude internal/noisy work. | +| Quality | `warnings`, `duplicity-scope`, `duplicity-icon` | Surface inconsistencies & handle duplicates. | +| Formatting | `chapters`, row-format inputs, `print-empty-chapters` | Control output layout & presence of empty headings. | +| Structure | `hierarchy` | Enable multi-level issue rollups. | +| Diagnostics | `verbose` | Aid debugging. | + +## Outputs +| Output | Description | +|--------|-------------| +| `release-notes` | Single Markdown block containing user-defined chapters, optional Service Chapters, and a Full Changelog link. | + +## Why Chapters? +Labels are already a ubiquitous classification mechanism. Mapping labels to chapter titles gives **controllable taxonomy** (marketing-friendly headings) while keeping developer workflow unchanged. Repeating a `title` with different `label` values aggregates multiple labels under the same heading (e.g., `bug` + `error` โ†’ โ€œBugfixes ๐Ÿ› โ€). + +## Why Service Chapters? +Instead of silently skipping incomplete metadata, the Action exposes structural gaps (e.g., unlabeled issues, merged PRs with open issues) so teams can tighten process over time. + +## Why Duplicity Policy? +Some teams prefer a single canonical appearance per item; others want visibility across thematic chapters (e.g., โ€œBreaking Changesโ€ AND โ€œNew Featuresโ€). The `duplicity-scope` input lets teams choose without forking logic. + +## Why Hierarchy? +Complex efforts (epics) fragment across multiple issues/PRs. Hierarchical rendering bundles context and contributors while still allowing individual tracking. + +## Why AI Fallback (Optional)? +AI summaries can fill gapsโ€”but only when authors forget to supply release notes. The Action never overrides explicit human-authored content. + +## Lifecycle Summary +1. Resolve previous release and time window. +2. Fetch issues, PRs, commits. +3. Extract release notes (manual โ†’ fallback AI if enabled). +4. Populate custom chapters (label โ†’ title mapping). +5. Add Service Chapters (if `warnings: true`). +6. Emit final Markdown. + +## Related +- [Configuration Reference](configuration_reference.md) +- [Feature Tutorials](../README.md#feature-tutorials) + diff --git a/examples/output_example.md b/examples/output_example_no_hierarchy.md similarity index 100% rename from examples/output_example.md rename to examples/output_example_no_hierarchy.md diff --git a/examples/output_example_with_hierarchy.md b/examples/output_example_with_hierarchy.md new file mode 100644 index 00000000..5bc064cd --- /dev/null +++ b/examples/output_example_with_hierarchy.md @@ -0,0 +1,78 @@ +### Breaking Changes ๐Ÿ’ฅ +No entries detected. + +### New Features ๐ŸŽ‰ +- Epic: #100 _Epic: Improve Search Experience_ + - Feature: #101 _Feature: Add Fuzzy Search_ in [#110](https://github.com/company/test-project/pull/110) + - Task: #102 _Task: Implement backend fuzzy search_ in [#111](https://github.com/company/test-project/pull/111) + - Feature: #103 _Feature: Add Search Suggestions_ in [#112](https://github.com/company/test-project/pull/112) + - Task: #104 _Task: Implement frontend suggestions_ in [#113](https://github.com/company/test-project/pull/113) +- Feature: #105 _Feature: Export Search Results_ in [#114](https://github.com/company/test-project/pull/114) + +### Bugfixes ๐Ÿ›  +- #33 _Example bugfix_ in [#44](https://github.com/company/test-project/pull/44), [#36](https://github.com/company/test-project/pull/36), [#35](https://github.com/company/test-project/pull/35), [#34](https://github.com/company/test-project/pull/34) + - Another solved typos. Hello from second RLS notes comment. + - Solved some typos. +- PR: #41 _Initial commit._ + - Test release notes nr1 + - Test release notes nr2 + +### Closed Issues without Pull Request โš ๏ธ +- #3 _FEAT: User Authentication_ +- #4 _FEAT: Book Browsing_ +- #6 _FEAT: Shopping Cart_ +- #37 _Example Issue without PR_ +- #38 _Example Issue without Release notes comment_ +- #88 _Test issue_ + +### Closed Issues without User Defined Labels โš ๏ธ +- #1 _Initial version of project_ in [#2](https://github.com/company/test-project/pull/2) +- #7 _REQ: User Login Functionality_ in [#13](https://github.com/company/test-project/pull/13) +- #8 _REQ: User Registration Functionality_ in [#13](https://github.com/company/test-project/pull/13) +- #9 _REQ: View Book List_ in [#14](https://github.com/company/test-project/pull/14) +- #10 _REQ: Detailed Book Information_ in [#14](https://github.com/company/test-project/pull/14) +- #11 _REQ: Adding Books to Shopping Cart_ in [#15](https://github.com/company/test-project/pull/15) +- #12 _REQ: Viewing Shopping Cart Contents_ in [#15](https://github.com/company/test-project/pull/15) +- #23 _REQ: View Reviews_ in [#27](https://github.com/company/test-project/pull/27) +- #29 _Introduce workflow logic for Release notes_ in [#28](https://github.com/company/test-project/pull/28) +- #30 _Introduce Release notes logic_ in [#32](https://github.com/company/test-project/pull/32) + +### Merged PRs without Issue and User Defined Labels โš ๏ธ +- PR: #5 _BugFix - correct Issue GH folder location_ +- PR: #16 _repository improvement_ +- PR: #26 _Initial test headers_ +- PR: #39 _Initial commit._ +- PR: #40 _Initial commit._ +- PR: #42 _Initial commit._ +- PR: #43 _Feature/new tag_ +- PR: #45 _Initial commit._ +- PR: #46 _Revert "- Improved README.md (#36)"_ +- PR: #47 _- Added code for received tag format and correct version increase._ +- PR: #48 _Update of tag checks._ +- PR: #49 _Feature/tag checks update_ +- PR: #50 _Feature/tag checks update_ +- PR: #51 _Feature/tag checks update_ +- PR: #61 _New check implemented._ +- PR: #62 _Feature/add first tag check_ +- PR: #63 _New check implemented._ +- PR: #64 _Experiment with improving release worklflows._ +- PR: #66 _- Prepared workflow for RLS notes generation testing._ + +### Closed PRs without Issue and User Defined Labels โš ๏ธ +- PR: #60 _Test change to test close of PR instead of Merge._ +- PR: #65 _Fake change in PR to get PR._ +- PR: #92 _Fake change._ + +### Merged PRs Linked to 'Not Closed' Issue โš ๏ธ +- #20 _REQ: Search by Keywords_ in [#44](https://github.com/company/test-project/pull/44) +- ๐Ÿ”” #33 _Example bugfix_ in [#44](https://github.com/company/test-project/pull/44), [#36](https://github.com/company/test-project/pull/36), [#35](https://github.com/company/test-project/pull/35), [#34](https://github.com/company/test-project/pull/34) + - Another solved typos. Hello from second RLS notes comment. + - Solved some typos. +- PR: #80 _Feature/multiline excludes_ +- #81 _Test multiline excludes in filename inspector related yml_ in [#79](https://github.com/company/test-project/pull/79), [#78](https://github.com/company/test-project/pull/78), [#77](https://github.com/company/test-project/pull/77), [#76](https://github.com/company/test-project/pull/76), [#75](https://github.com/company/test-project/pull/75), [#74](https://github.com/company/test-project/pull/74), [#73](https://github.com/company/test-project/pull/73), [#72](https://github.com/company/test-project/pull/72), [#71](https://github.com/company/test-project/pull/71), [#70](https://github.com/company/test-project/pull/70), [#69](https://github.com/company/test-project/pull/69), [#68](https://github.com/company/test-project/pull/68), [#67](https://github.com/company/test-project/pull/67) + +### Others - No Topic โš ๏ธ +Previous filters caught all Issues or Pull Requests. + +#### Full Changelog +https://github.com/company/test-project/commits/v0.1.0