From c2e41711923c56c69ebd92ba7f446c5d355b6abb Mon Sep 17 00:00:00 2001 From: Chris Taylor Date: Tue, 27 Jan 2026 11:34:17 -0600 Subject: [PATCH 01/30] feat: add conventional commit validation workflow --- .../reusable-pr-conventional-commit-title.yml | 104 ++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 .github/workflows/reusable-pr-conventional-commit-title.yml diff --git a/.github/workflows/reusable-pr-conventional-commit-title.yml b/.github/workflows/reusable-pr-conventional-commit-title.yml new file mode 100644 index 0000000..aff22db --- /dev/null +++ b/.github/workflows/reusable-pr-conventional-commit-title.yml @@ -0,0 +1,104 @@ +on: + workflow_call: + inputs: + task_types: + type: string + default: '["feat","fix","docs","test","ci","refactor","perf","chore","revert"]' + description: 'A JSON array of task types that are allowed. Default: ["feat","fix","docs","test","ci","refactor","perf","chore","revert"]' + required: true + scope_types: + type: string + default: "" + description: 'A JSON array of valid scope types. If omitted, any scope is allowed. If given, include the empty scope with "". Example: ["login","signup","checkout","payment", ""]' + required: false + title_regex: + type: string + description: 'Regular expression for custom title validation; disabled by default. Example: ''PROJECT-\d{2,5}$'' for trailing issue ticket, ''"^[^:]+: [A-Z]"'' for capitalized title' + required: false + add_label: + type: boolean + description: "Whether to add labels to your pull request. Default: true" + required: false + default: true + add_scope_label: + type: boolean + description: 'Whether to add labels to your pull request. Example: the ''login'' scope will be added for this PR title: "fix(login): fix message in login page". Default: true' + required: false + default: true + custom_labels: + type: string + description: 'A JSON object mapping task types to custom label names. Example: {"feat": "feature", "fix": "fix", "docs": "documentation", "test": "test", "ci": "CI/CD", "refactor": "refactor", "perf": "performance", "chore": "chore", "revert": "revert", "wip": "WIP"}' + required: false + comment_on_failure: + type: boolean + description: "Whether to comment on the pull request if the title validation fails. Default: true" + required: false + default: true + +permissions: + pull-requests: write + contents: read + +jobs: + validate-title: + name: Validate Pull Request Title + runs-on: ubuntu-latest + steps: + - name: Validate inputs + run: | + node -e "try { const val = JSON.parse(process.argv[1]); if (!Array.isArray(val)) throw new Error('Not an array'); } catch(e) { console.error('Input \'task_types\' is not a valid JSON array.'); process.exit(1); }" "${{ inputs.task_types }}" + node -e "try { const val = JSON.parse(process.argv[1]); if (!Array.isArray(val)) throw new Error('Not an array'); } catch(e) { console.error('Input \'scope_types\' is not a valid JSON array.'); process.exit(1); }" "${{ inputs.scope_types }}" + node -e "try { new RegExp(process.argv[1]); } catch(e) { console.error('Input \'title_regex\' is not a valid regular expression.'); process.exit(1); }" "${{ inputs.title_regex }}" + node -e "try { const val = JSON.parse(process.argv[1]); if (typeof val !== 'object' || val === null || Array.isArray(val)) throw new Error('Not an object'); } catch(e) { console.error('Input \'custom_labels\' is not a valid JSON object.'); process.exit(1); }" "${{ inputs.custom_labels }}" + + - name: PR Conventional Commit Validation + uses: ytanikin/pr-conventional-commits@1.4.0 + with: + task_types: ${{ inputs.task_types }} + scope_types: ${{ inputs.scope_types }} + title_regex: ${{ inputs.title_regex }} + add_label: ${{ inputs.add_label }} + add_scope_label: ${{ inputs.add_scope_label }} + token: ${{ github.token }} + custom_labels: ${{ inputs.custom_labels }} + + - name: Create failure comment based on inputs + id: create-failure-comment + if: failure() && inputs.comment_on_failure == 'true' + run: | + COMMENT="" + COMMENT+="### ❌ Pull Request Title Validation Failed\n" + COMMENT+="Your pull request title does not conform to the Conventional Commits specification.\n" + COMMENT+="Please ensure your title follows the format: `(): `.\n" + COMMENT+="- **Type** must be one of the following: ${{ inputs.task_types }}." + COMMENT+="- **Scope** must be one of the following: ${{ inputs.scope_types || 'any' }}." + COMMENT+="- **Description** should be a brief summary of the changes.\n" + if [ -n "${{ inputs.title_regex }}" ]; then + COMMENT+="- Additionally, your description must match the custom regex: `${{ inputs.title_regex }}`.\n" + fi + COMMENT+="\nIf you have any questions, please refer to the [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/) documentation for more details." + echo "comment=$COMMENT" >> $GITHUB_OUTPUT + + - name: Comment on Failure + if: failure() && inputs.comment_on_failure == 'true' + uses: peter-evans/create-or-update-comment@v5 + with: + issue-number: ${{ github.event.pull_request.number }} + body: ${{ steps.create-failure-comment.outputs.comment }} + edit-mode: replace + + - name: Find previous failure comment + id: find-comment + if: success() && inputs.comment_on_failure == 'true' + uses: peter-evans/find-comment@v4 + with: + issue-number: ${{ github.event.pull_request.number }} + comment-author: github-actions[bot] + body-includes: "Pull Request Title Validation Failed" + + - name: Cleanup Failure Comment on Success + if: success() && inputs.comment_on_failure == 'true' + run: | + if [ "${{ steps.find-comment.outputs.comment-found }}" == "true" ]; then + gh api -X DELETE repos/${{ github.repository }}/issues/comments/${{ steps.find-comment.outputs.comment-id }} --silent + fi From 14049e921d2107c3bb01c8f6660ce8d7a4e818a7 Mon Sep 17 00:00:00 2001 From: Chris Taylor Date: Tue, 27 Jan 2026 11:41:14 -0600 Subject: [PATCH 02/30] fix: do not require task_types --- .github/workflows/reusable-pr-conventional-commit-title.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/reusable-pr-conventional-commit-title.yml b/.github/workflows/reusable-pr-conventional-commit-title.yml index aff22db..ce14de2 100644 --- a/.github/workflows/reusable-pr-conventional-commit-title.yml +++ b/.github/workflows/reusable-pr-conventional-commit-title.yml @@ -5,7 +5,7 @@ on: type: string default: '["feat","fix","docs","test","ci","refactor","perf","chore","revert"]' description: 'A JSON array of task types that are allowed. Default: ["feat","fix","docs","test","ci","refactor","perf","chore","revert"]' - required: true + required: false scope_types: type: string default: "" From 69a0f6be09fc832a6a0ae5104ee54766eded974d Mon Sep 17 00:00:00 2001 From: Chris Taylor Date: Tue, 27 Jan 2026 11:46:48 -0600 Subject: [PATCH 03/30] fix: github-script over node -e --- .../reusable-pr-conventional-commit-title.yml | 51 +++++++++++++++++-- 1 file changed, 46 insertions(+), 5 deletions(-) diff --git a/.github/workflows/reusable-pr-conventional-commit-title.yml b/.github/workflows/reusable-pr-conventional-commit-title.yml index ce14de2..1ff6cac 100644 --- a/.github/workflows/reusable-pr-conventional-commit-title.yml +++ b/.github/workflows/reusable-pr-conventional-commit-title.yml @@ -45,11 +45,52 @@ jobs: runs-on: ubuntu-latest steps: - name: Validate inputs - run: | - node -e "try { const val = JSON.parse(process.argv[1]); if (!Array.isArray(val)) throw new Error('Not an array'); } catch(e) { console.error('Input \'task_types\' is not a valid JSON array.'); process.exit(1); }" "${{ inputs.task_types }}" - node -e "try { const val = JSON.parse(process.argv[1]); if (!Array.isArray(val)) throw new Error('Not an array'); } catch(e) { console.error('Input \'scope_types\' is not a valid JSON array.'); process.exit(1); }" "${{ inputs.scope_types }}" - node -e "try { new RegExp(process.argv[1]); } catch(e) { console.error('Input \'title_regex\' is not a valid regular expression.'); process.exit(1); }" "${{ inputs.title_regex }}" - node -e "try { const val = JSON.parse(process.argv[1]); if (typeof val !== 'object' || val === null || Array.isArray(val)) throw new Error('Not an object'); } catch(e) { console.error('Input \'custom_labels\' is not a valid JSON object.'); process.exit(1); }" "${{ inputs.custom_labels }}" + uses: actions/github-script@v8 + with: + script: | + const taskTypes = `${{ inputs.task_types }}`; + const scopeTypes = `${{ inputs.scope_types }}`; + const titleRegex = `${{ inputs.title_regex }}`; + const customLabels = `${{ inputs.custom_labels }}`; + + // Validate task_types is a valid JSON array + if (taskTypes) { + try { + const val = JSON.parse(taskTypes); + if (!Array.isArray(val)) throw new Error('Not an array'); + } catch(e) { + core.setFailed("Input 'task_types' is not a valid JSON array."); + } + } + + // Validate scope_types is a valid JSON array (if provided) + if (scopeTypes) { + try { + const val = JSON.parse(scopeTypes); + if (!Array.isArray(val)) throw new Error('Not an array'); + } catch(e) { + core.setFailed("Input 'scope_types' is not a valid JSON array."); + } + } + + // Validate title_regex is a valid regular expression (if provided) + if (titleRegex) { + try { + new RegExp(titleRegex); + } catch(e) { + core.setFailed("Input 'title_regex' is not a valid regular expression."); + } + } + + // Validate custom_labels is a valid JSON object (if provided) + if (customLabels) { + try { + const val = JSON.parse(customLabels); + if (typeof val !== 'object' || val === null || Array.isArray(val)) throw new Error('Not an object'); + } catch(e) { + core.setFailed("Input 'custom_labels' is not a valid JSON object."); + } + } - name: PR Conventional Commit Validation uses: ytanikin/pr-conventional-commits@1.4.0 From a23ffaa07ea395a97dc2c67d528116e80eb9131d Mon Sep 17 00:00:00 2001 From: Chris Taylor Date: Tue, 27 Jan 2026 11:49:59 -0600 Subject: [PATCH 04/30] fix: bump action version --- .github/workflows/reusable-pr-conventional-commit-title.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/reusable-pr-conventional-commit-title.yml b/.github/workflows/reusable-pr-conventional-commit-title.yml index 1ff6cac..5288421 100644 --- a/.github/workflows/reusable-pr-conventional-commit-title.yml +++ b/.github/workflows/reusable-pr-conventional-commit-title.yml @@ -93,7 +93,7 @@ jobs: } - name: PR Conventional Commit Validation - uses: ytanikin/pr-conventional-commits@1.4.0 + uses: ytanikin/pr-conventional-commits@1.5.1 with: task_types: ${{ inputs.task_types }} scope_types: ${{ inputs.scope_types }} From 72cef325cfb13547fd7ab5b379fa5323cac4952f Mon Sep 17 00:00:00 2001 From: Chris Taylor Date: Tue, 27 Jan 2026 11:52:12 -0600 Subject: [PATCH 05/30] fix: continue-on-error --- .github/workflows/reusable-pr-conventional-commit-title.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/reusable-pr-conventional-commit-title.yml b/.github/workflows/reusable-pr-conventional-commit-title.yml index 5288421..333c4ba 100644 --- a/.github/workflows/reusable-pr-conventional-commit-title.yml +++ b/.github/workflows/reusable-pr-conventional-commit-title.yml @@ -102,6 +102,7 @@ jobs: add_scope_label: ${{ inputs.add_scope_label }} token: ${{ github.token }} custom_labels: ${{ inputs.custom_labels }} + continue-on-error: true - name: Create failure comment based on inputs id: create-failure-comment From 4a0ccee1116d08a6135a3db7b1702206478f5cc7 Mon Sep 17 00:00:00 2001 From: Chris Taylor Date: Tue, 27 Jan 2026 12:01:20 -0600 Subject: [PATCH 06/30] fix: rework if statements --- .../workflows/reusable-pr-conventional-commit-title.yml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/.github/workflows/reusable-pr-conventional-commit-title.yml b/.github/workflows/reusable-pr-conventional-commit-title.yml index 333c4ba..38ad201 100644 --- a/.github/workflows/reusable-pr-conventional-commit-title.yml +++ b/.github/workflows/reusable-pr-conventional-commit-title.yml @@ -93,6 +93,7 @@ jobs: } - name: PR Conventional Commit Validation + id: pr-validation uses: ytanikin/pr-conventional-commits@1.5.1 with: task_types: ${{ inputs.task_types }} @@ -106,7 +107,7 @@ jobs: - name: Create failure comment based on inputs id: create-failure-comment - if: failure() && inputs.comment_on_failure == 'true' + if: steps.pr-validation.outcome == 'failure' && inputs.comment_on_failure == 'true' run: | COMMENT="" COMMENT+="### ❌ Pull Request Title Validation Failed\n" @@ -122,7 +123,7 @@ jobs: echo "comment=$COMMENT" >> $GITHUB_OUTPUT - name: Comment on Failure - if: failure() && inputs.comment_on_failure == 'true' + if: steps.pr-validation.outcome == 'failure' && inputs.comment_on_failure == 'true' uses: peter-evans/create-or-update-comment@v5 with: issue-number: ${{ github.event.pull_request.number }} @@ -131,7 +132,7 @@ jobs: - name: Find previous failure comment id: find-comment - if: success() && inputs.comment_on_failure == 'true' + if: steps.pr-validation.outcome == 'success' && inputs.comment_on_failure == 'true' uses: peter-evans/find-comment@v4 with: issue-number: ${{ github.event.pull_request.number }} @@ -139,7 +140,7 @@ jobs: body-includes: "Pull Request Title Validation Failed" - name: Cleanup Failure Comment on Success - if: success() && inputs.comment_on_failure == 'true' + if: steps.pr-validation.outcome == 'success' && steps.find-comment.outcome == 'success' && inputs.comment_on_failure == 'true' run: | if [ "${{ steps.find-comment.outputs.comment-found }}" == "true" ]; then gh api -X DELETE repos/${{ github.repository }}/issues/comments/${{ steps.find-comment.outputs.comment-id }} --silent From aefa51263cfcdde6c05197f0d11fe6786124389e Mon Sep 17 00:00:00 2001 From: Chris Taylor Date: Tue, 27 Jan 2026 12:03:53 -0600 Subject: [PATCH 07/30] fix: rework if statements --- .../workflows/reusable-pr-conventional-commit-title.yml | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/.github/workflows/reusable-pr-conventional-commit-title.yml b/.github/workflows/reusable-pr-conventional-commit-title.yml index 38ad201..3b41a47 100644 --- a/.github/workflows/reusable-pr-conventional-commit-title.yml +++ b/.github/workflows/reusable-pr-conventional-commit-title.yml @@ -103,11 +103,10 @@ jobs: add_scope_label: ${{ inputs.add_scope_label }} token: ${{ github.token }} custom_labels: ${{ inputs.custom_labels }} - continue-on-error: true - name: Create failure comment based on inputs id: create-failure-comment - if: steps.pr-validation.outcome == 'failure' && inputs.comment_on_failure == 'true' + if: ${{ failure() && inputs.comment_on_failure }} run: | COMMENT="" COMMENT+="### ❌ Pull Request Title Validation Failed\n" @@ -123,7 +122,7 @@ jobs: echo "comment=$COMMENT" >> $GITHUB_OUTPUT - name: Comment on Failure - if: steps.pr-validation.outcome == 'failure' && inputs.comment_on_failure == 'true' + if: ${{ steps.pr-validation.outcome == 'failure' && inputs.comment_on_failure }} uses: peter-evans/create-or-update-comment@v5 with: issue-number: ${{ github.event.pull_request.number }} @@ -132,7 +131,7 @@ jobs: - name: Find previous failure comment id: find-comment - if: steps.pr-validation.outcome == 'success' && inputs.comment_on_failure == 'true' + if: ${{ steps.pr-validation.outcome == 'success' && inputs.comment_on_failure }} uses: peter-evans/find-comment@v4 with: issue-number: ${{ github.event.pull_request.number }} @@ -140,7 +139,7 @@ jobs: body-includes: "Pull Request Title Validation Failed" - name: Cleanup Failure Comment on Success - if: steps.pr-validation.outcome == 'success' && steps.find-comment.outcome == 'success' && inputs.comment_on_failure == 'true' + if: ${{ steps.pr-validation.outcome == 'success' && steps.find-comment.outcome == 'success' && inputs.comment_on_failure }} run: | if [ "${{ steps.find-comment.outputs.comment-found }}" == "true" ]; then gh api -X DELETE repos/${{ github.repository }}/issues/comments/${{ steps.find-comment.outputs.comment-id }} --silent From 4c559ed720dcb07521a4a76efbee2c9fa49aa6b1 Mon Sep 17 00:00:00 2001 From: Chris Taylor Date: Tue, 27 Jan 2026 12:08:17 -0600 Subject: [PATCH 08/30] fix: adjust how comment is constructed --- .../reusable-pr-conventional-commit-title.yml | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/.github/workflows/reusable-pr-conventional-commit-title.yml b/.github/workflows/reusable-pr-conventional-commit-title.yml index 3b41a47..b33a88f 100644 --- a/.github/workflows/reusable-pr-conventional-commit-title.yml +++ b/.github/workflows/reusable-pr-conventional-commit-title.yml @@ -108,21 +108,21 @@ jobs: id: create-failure-comment if: ${{ failure() && inputs.comment_on_failure }} run: | - COMMENT="" - COMMENT+="### ❌ Pull Request Title Validation Failed\n" - COMMENT+="Your pull request title does not conform to the Conventional Commits specification.\n" - COMMENT+="Please ensure your title follows the format: `(): `.\n" - COMMENT+="- **Type** must be one of the following: ${{ inputs.task_types }}." - COMMENT+="- **Scope** must be one of the following: ${{ inputs.scope_types || 'any' }}." - COMMENT+="- **Description** should be a brief summary of the changes.\n" - if [ -n "${{ inputs.title_regex }}" ]; then - COMMENT+="- Additionally, your description must match the custom regex: `${{ inputs.title_regex }}`.\n" - fi - COMMENT+="\nIf you have any questions, please refer to the [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/) documentation for more details." + cat << EOC >> $COMMENT + ### ❌ Pull Request Title Validation Failed + Your pull request title does not conform to the Conventional Commits specification. + Please ensure your title follows the format: `(): `. + - **Type** must be one of the following: ${{ inputs.task_types }}. + - **Scope** must be one of the following: ${{ inputs.scope_types || 'any' }}. + - **Description** should be a brief summary of the changes. + ${{ inputs.title_regex && format('- Additionally, your description must match the custom regex: `{0}`.', inputs.title_regex) || '' }} + + If you have any questions, please refer to the [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/) documentation for more details. + EOC echo "comment=$COMMENT" >> $GITHUB_OUTPUT - name: Comment on Failure - if: ${{ steps.pr-validation.outcome == 'failure' && inputs.comment_on_failure }} + if: ${{ failure() && inputs.comment_on_failure }} uses: peter-evans/create-or-update-comment@v5 with: issue-number: ${{ github.event.pull_request.number }} @@ -131,7 +131,7 @@ jobs: - name: Find previous failure comment id: find-comment - if: ${{ steps.pr-validation.outcome == 'success' && inputs.comment_on_failure }} + if: ${{ success() && inputs.comment_on_failure }} uses: peter-evans/find-comment@v4 with: issue-number: ${{ github.event.pull_request.number }} @@ -139,7 +139,7 @@ jobs: body-includes: "Pull Request Title Validation Failed" - name: Cleanup Failure Comment on Success - if: ${{ steps.pr-validation.outcome == 'success' && steps.find-comment.outcome == 'success' && inputs.comment_on_failure }} + if: ${{ success() && steps.find-comment.outcome == 'success' && inputs.comment_on_failure }} run: | if [ "${{ steps.find-comment.outputs.comment-found }}" == "true" ]; then gh api -X DELETE repos/${{ github.repository }}/issues/comments/${{ steps.find-comment.outputs.comment-id }} --silent From 316708d54f84d737928dfe12ac4455357952e3b6 Mon Sep 17 00:00:00 2001 From: Chris Taylor Date: Tue, 27 Jan 2026 12:10:41 -0600 Subject: [PATCH 09/30] fix: adjust how comment is constructed --- .github/workflows/reusable-pr-conventional-commit-title.yml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/workflows/reusable-pr-conventional-commit-title.yml b/.github/workflows/reusable-pr-conventional-commit-title.yml index b33a88f..df7a528 100644 --- a/.github/workflows/reusable-pr-conventional-commit-title.yml +++ b/.github/workflows/reusable-pr-conventional-commit-title.yml @@ -108,7 +108,7 @@ jobs: id: create-failure-comment if: ${{ failure() && inputs.comment_on_failure }} run: | - cat << EOC >> $COMMENT + cat << EOC >> pr-title-failure-comment.md ### ❌ Pull Request Title Validation Failed Your pull request title does not conform to the Conventional Commits specification. Please ensure your title follows the format: `(): `. @@ -119,14 +119,13 @@ jobs: If you have any questions, please refer to the [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/) documentation for more details. EOC - echo "comment=$COMMENT" >> $GITHUB_OUTPUT - name: Comment on Failure if: ${{ failure() && inputs.comment_on_failure }} uses: peter-evans/create-or-update-comment@v5 with: issue-number: ${{ github.event.pull_request.number }} - body: ${{ steps.create-failure-comment.outputs.comment }} + body-file: pr-title-failure-comment.md edit-mode: replace - name: Find previous failure comment From f8f7e70a63d37be7e4d2ba91c4693203a179c3c1 Mon Sep 17 00:00:00 2001 From: Chris Taylor Date: Tue, 27 Jan 2026 12:14:30 -0600 Subject: [PATCH 10/30] fix: escape backticks --- .github/workflows/reusable-pr-conventional-commit-title.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/reusable-pr-conventional-commit-title.yml b/.github/workflows/reusable-pr-conventional-commit-title.yml index df7a528..42bc492 100644 --- a/.github/workflows/reusable-pr-conventional-commit-title.yml +++ b/.github/workflows/reusable-pr-conventional-commit-title.yml @@ -111,7 +111,7 @@ jobs: cat << EOC >> pr-title-failure-comment.md ### ❌ Pull Request Title Validation Failed Your pull request title does not conform to the Conventional Commits specification. - Please ensure your title follows the format: `(): `. + Please ensure your title follows the format: \`(): \`. - **Type** must be one of the following: ${{ inputs.task_types }}. - **Scope** must be one of the following: ${{ inputs.scope_types || 'any' }}. - **Description** should be a brief summary of the changes. From 202ca466c2ebd2c994462c52df00124ba6c2ec05 Mon Sep 17 00:00:00 2001 From: Chris Taylor Date: Tue, 27 Jan 2026 12:17:00 -0600 Subject: [PATCH 11/30] adjust verbiage --- .github/workflows/reusable-pr-conventional-commit-title.yml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/workflows/reusable-pr-conventional-commit-title.yml b/.github/workflows/reusable-pr-conventional-commit-title.yml index 42bc492..5edbd6e 100644 --- a/.github/workflows/reusable-pr-conventional-commit-title.yml +++ b/.github/workflows/reusable-pr-conventional-commit-title.yml @@ -113,10 +113,9 @@ jobs: Your pull request title does not conform to the Conventional Commits specification. Please ensure your title follows the format: \`(): \`. - **Type** must be one of the following: ${{ inputs.task_types }}. - - **Scope** must be one of the following: ${{ inputs.scope_types || 'any' }}. + ${{ inputs.scope_types && format('- **Scope** must be one of the following: {0}.', inputs.scope_types) || '- **Scope** is optional and can be any value or omitted entirely.' }}. - **Description** should be a brief summary of the changes. - ${{ inputs.title_regex && format('- Additionally, your description must match the custom regex: `{0}`.', inputs.title_regex) || '' }} - + ${{ inputs.title_regex && format('- Additionally, your description must match the custom regex: `{0}`.\n', inputs.title_regex) || '' }} If you have any questions, please refer to the [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/) documentation for more details. EOC From b93412bc832c519ee0b73b284c9452c3a6cd5e8d Mon Sep 17 00:00:00 2001 From: Chris Taylor Date: Tue, 27 Jan 2026 12:20:23 -0600 Subject: [PATCH 12/30] fix: reorder comment retrieval, use to populate replacement --- .../reusable-pr-conventional-commit-title.yml | 23 ++++++++++--------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/.github/workflows/reusable-pr-conventional-commit-title.yml b/.github/workflows/reusable-pr-conventional-commit-title.yml index 5edbd6e..1d7d237 100644 --- a/.github/workflows/reusable-pr-conventional-commit-title.yml +++ b/.github/workflows/reusable-pr-conventional-commit-title.yml @@ -112,30 +112,31 @@ jobs: ### ❌ Pull Request Title Validation Failed Your pull request title does not conform to the Conventional Commits specification. Please ensure your title follows the format: \`(): \`. - - **Type** must be one of the following: ${{ inputs.task_types }}. - ${{ inputs.scope_types && format('- **Scope** must be one of the following: {0}.', inputs.scope_types) || '- **Scope** is optional and can be any value or omitted entirely.' }}. + - **Type** must be one of the following: ${{ inputs.task_types }} + ${{ inputs.scope_types && format('- **Scope** must be one of the following: {0}', inputs.scope_types) || '- **Scope** is optional and can be any value or omitted entirely.' }}. - **Description** should be a brief summary of the changes. ${{ inputs.title_regex && format('- Additionally, your description must match the custom regex: `{0}`.\n', inputs.title_regex) || '' }} If you have any questions, please refer to the [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/) documentation for more details. EOC - - name: Comment on Failure - if: ${{ failure() && inputs.comment_on_failure }} - uses: peter-evans/create-or-update-comment@v5 - with: - issue-number: ${{ github.event.pull_request.number }} - body-file: pr-title-failure-comment.md - edit-mode: replace - - name: Find previous failure comment id: find-comment - if: ${{ success() && inputs.comment_on_failure }} + if: ${{ always() && inputs.comment_on_failure }} uses: peter-evans/find-comment@v4 with: issue-number: ${{ github.event.pull_request.number }} comment-author: github-actions[bot] body-includes: "Pull Request Title Validation Failed" + - name: Comment on Failure + if: ${{ failure() && inputs.comment_on_failure }} + uses: peter-evans/create-or-update-comment@v5 + with: + issue-number: ${{ github.event.pull_request.number }} + comment-id: ${{ steps.find-comment.outputs.comment-id }} + body-file: pr-title-failure-comment.md + edit-mode: replace + - name: Cleanup Failure Comment on Success if: ${{ success() && steps.find-comment.outcome == 'success' && inputs.comment_on_failure }} run: | From f9320889282eaaf985d7af6144f721c7068b243f Mon Sep 17 00:00:00 2001 From: Chris Taylor Date: Tue, 27 Jan 2026 12:38:14 -0600 Subject: [PATCH 13/30] fix: stray dot --- .github/workflows/reusable-pr-conventional-commit-title.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/reusable-pr-conventional-commit-title.yml b/.github/workflows/reusable-pr-conventional-commit-title.yml index 1d7d237..25554a3 100644 --- a/.github/workflows/reusable-pr-conventional-commit-title.yml +++ b/.github/workflows/reusable-pr-conventional-commit-title.yml @@ -113,7 +113,7 @@ jobs: Your pull request title does not conform to the Conventional Commits specification. Please ensure your title follows the format: \`(): \`. - **Type** must be one of the following: ${{ inputs.task_types }} - ${{ inputs.scope_types && format('- **Scope** must be one of the following: {0}', inputs.scope_types) || '- **Scope** is optional and can be any value or omitted entirely.' }}. + ${{ inputs.scope_types && format('- **Scope** must be one of the following: {0}', inputs.scope_types) || '- **Scope** is optional and can be any value or omitted entirely.' }} - **Description** should be a brief summary of the changes. ${{ inputs.title_regex && format('- Additionally, your description must match the custom regex: `{0}`.\n', inputs.title_regex) || '' }} If you have any questions, please refer to the [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/) documentation for more details. From 99468083d8097e8d8036e9b136ffcfdce645b3ed Mon Sep 17 00:00:00 2001 From: Chris Taylor Date: Tue, 27 Jan 2026 12:44:16 -0600 Subject: [PATCH 14/30] fix: pr title in comment --- .github/workflows/reusable-pr-conventional-commit-title.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/reusable-pr-conventional-commit-title.yml b/.github/workflows/reusable-pr-conventional-commit-title.yml index 25554a3..3a579c4 100644 --- a/.github/workflows/reusable-pr-conventional-commit-title.yml +++ b/.github/workflows/reusable-pr-conventional-commit-title.yml @@ -110,7 +110,7 @@ jobs: run: | cat << EOC >> pr-title-failure-comment.md ### ❌ Pull Request Title Validation Failed - Your pull request title does not conform to the Conventional Commits specification. + Your pull request title (\`${{ github.event.pull_request.title }}\`) does not conform to the Conventional Commits specification. Please ensure your title follows the format: \`(): \`. - **Type** must be one of the following: ${{ inputs.task_types }} ${{ inputs.scope_types && format('- **Scope** must be one of the following: {0}', inputs.scope_types) || '- **Scope** is optional and can be any value or omitted entirely.' }} From 723ffc8e3573f3c7f76d28beb586d1a60a933c80 Mon Sep 17 00:00:00 2001 From: Chris Taylor Date: Tue, 27 Jan 2026 12:48:44 -0600 Subject: [PATCH 15/30] fix: cleanup behavior --- .github/workflows/reusable-pr-conventional-commit-title.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/reusable-pr-conventional-commit-title.yml b/.github/workflows/reusable-pr-conventional-commit-title.yml index 3a579c4..f36536b 100644 --- a/.github/workflows/reusable-pr-conventional-commit-title.yml +++ b/.github/workflows/reusable-pr-conventional-commit-title.yml @@ -140,6 +140,6 @@ jobs: - name: Cleanup Failure Comment on Success if: ${{ success() && steps.find-comment.outcome == 'success' && inputs.comment_on_failure }} run: | - if [ "${{ steps.find-comment.outputs.comment-found }}" == "true" ]; then + if [ "${{ steps.find-comment.outputs.comment-id }}" != "" ]; then gh api -X DELETE repos/${{ github.repository }}/issues/comments/${{ steps.find-comment.outputs.comment-id }} --silent fi From e56cb34e0a7773e89df1c2b0b95675264288d310 Mon Sep 17 00:00:00 2001 From: Chris Taylor Date: Tue, 27 Jan 2026 12:50:11 -0600 Subject: [PATCH 16/30] fix: pass token --- .github/workflows/reusable-pr-conventional-commit-title.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/reusable-pr-conventional-commit-title.yml b/.github/workflows/reusable-pr-conventional-commit-title.yml index f36536b..358f1b0 100644 --- a/.github/workflows/reusable-pr-conventional-commit-title.yml +++ b/.github/workflows/reusable-pr-conventional-commit-title.yml @@ -139,6 +139,8 @@ jobs: - name: Cleanup Failure Comment on Success if: ${{ success() && steps.find-comment.outcome == 'success' && inputs.comment_on_failure }} + env: + GH_TOKEN: ${{ github.token }} run: | if [ "${{ steps.find-comment.outputs.comment-id }}" != "" ]; then gh api -X DELETE repos/${{ github.repository }}/issues/comments/${{ steps.find-comment.outputs.comment-id }} --silent From a03a5bba7d913eca03a682ab24f2b915a473ad73 Mon Sep 17 00:00:00 2001 From: Chris Taylor Date: Tue, 27 Jan 2026 12:52:57 -0600 Subject: [PATCH 17/30] fix: default --- .../workflows/reusable-pr-conventional-commit-title.yml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/workflows/reusable-pr-conventional-commit-title.yml b/.github/workflows/reusable-pr-conventional-commit-title.yml index 358f1b0..0f197db 100644 --- a/.github/workflows/reusable-pr-conventional-commit-title.yml +++ b/.github/workflows/reusable-pr-conventional-commit-title.yml @@ -3,14 +3,14 @@ on: inputs: task_types: type: string - default: '["feat","fix","docs","test","ci","refactor","perf","chore","revert"]' description: 'A JSON array of task types that are allowed. Default: ["feat","fix","docs","test","ci","refactor","perf","chore","revert"]' required: false + default: '["feat","fix","docs","test","ci","refactor","perf","chore","revert"]' scope_types: type: string - default: "" description: 'A JSON array of valid scope types. If omitted, any scope is allowed. If given, include the empty scope with "". Example: ["login","signup","checkout","payment", ""]' required: false + default: "" title_regex: type: string description: 'Regular expression for custom title validation; disabled by default. Example: ''PROJECT-\d{2,5}$'' for trailing issue ticket, ''"^[^:]+: [A-Z]"'' for capitalized title' @@ -27,8 +27,9 @@ on: default: true custom_labels: type: string - description: 'A JSON object mapping task types to custom label names. Example: {"feat": "feature", "fix": "fix", "docs": "documentation", "test": "test", "ci": "CI/CD", "refactor": "refactor", "perf": "performance", "chore": "chore", "revert": "revert", "wip": "WIP"}' + description: 'A JSON object mapping task types to custom label names. Default: {"feat": "feature", "fix": "fix", "docs": "documentation", "test": "test", "ci": "CI/CD", "refactor": "refactor", "perf": "performance", "chore": "chore", "revert": "revert", "wip": "WIP"}' required: false + default: '{"feat": "feature", "fix": "fix", "docs": "documentation", "test": "test", "ci": "CI/CD", "refactor": "refactor", "perf": "performance", "chore": "chore", "revert": "revert", "wip": "WIP"}' comment_on_failure: type: boolean description: "Whether to comment on the pull request if the title validation fails. Default: true" From e50147fc7de8b9f3b7ed3ad1486bac70253282d6 Mon Sep 17 00:00:00 2001 From: Chris Taylor Date: Tue, 27 Jan 2026 13:00:59 -0600 Subject: [PATCH 18/30] fix: clear old scope labels by default --- .../reusable-pr-conventional-commit-title.yml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/.github/workflows/reusable-pr-conventional-commit-title.yml b/.github/workflows/reusable-pr-conventional-commit-title.yml index 0f197db..2a32d0c 100644 --- a/.github/workflows/reusable-pr-conventional-commit-title.yml +++ b/.github/workflows/reusable-pr-conventional-commit-title.yml @@ -35,6 +35,11 @@ on: description: "Whether to comment on the pull request if the title validation fails. Default: true" required: false default: true + clear_labels: + type: boolean + description: "Whether to clear existing labels when the workflow is run. This helps clean up scope labels added by this action when the scope changes. Default: true" + required: false + default: true permissions: pull-requests: write @@ -93,6 +98,12 @@ jobs: } } + - name: Clear labels + id: clear-labels + if: ${{ inputs.clear_labels_when_run }} + run: | + gh pr edit ${{ github.event.pull_request.number }} --remove-label $(gh pr view ${{ github.event.pull_request.number }} --json labels --template '{{range .labels}}{{.name}} {{end}}') + - name: PR Conventional Commit Validation id: pr-validation uses: ytanikin/pr-conventional-commits@1.5.1 From e5326bf0d4f54684603f6b9f7714f7141e254a1a Mon Sep 17 00:00:00 2001 From: Chris Taylor Date: Tue, 27 Jan 2026 13:02:29 -0600 Subject: [PATCH 19/30] fix: clear old scope labels by default --- .github/workflows/reusable-pr-conventional-commit-title.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/reusable-pr-conventional-commit-title.yml b/.github/workflows/reusable-pr-conventional-commit-title.yml index 2a32d0c..2a77866 100644 --- a/.github/workflows/reusable-pr-conventional-commit-title.yml +++ b/.github/workflows/reusable-pr-conventional-commit-title.yml @@ -100,7 +100,7 @@ jobs: - name: Clear labels id: clear-labels - if: ${{ inputs.clear_labels_when_run }} + if: ${{ inputs.clear_labels }} run: | gh pr edit ${{ github.event.pull_request.number }} --remove-label $(gh pr view ${{ github.event.pull_request.number }} --json labels --template '{{range .labels}}{{.name}} {{end}}') From d202360ebd736486d6dc1b2a411b04cd444fd030 Mon Sep 17 00:00:00 2001 From: Chris Taylor Date: Tue, 27 Jan 2026 13:03:33 -0600 Subject: [PATCH 20/30] fix: pass token --- .github/workflows/reusable-pr-conventional-commit-title.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/reusable-pr-conventional-commit-title.yml b/.github/workflows/reusable-pr-conventional-commit-title.yml index 2a77866..ca9a633 100644 --- a/.github/workflows/reusable-pr-conventional-commit-title.yml +++ b/.github/workflows/reusable-pr-conventional-commit-title.yml @@ -101,6 +101,8 @@ jobs: - name: Clear labels id: clear-labels if: ${{ inputs.clear_labels }} + env: + GH_TOKEN: ${{ github.token }} run: | gh pr edit ${{ github.event.pull_request.number }} --remove-label $(gh pr view ${{ github.event.pull_request.number }} --json labels --template '{{range .labels}}{{.name}} {{end}}') From a10416cdcc076bb77d48ca6c1af752bae66a91cb Mon Sep 17 00:00:00 2001 From: Chris Taylor Date: Tue, 27 Jan 2026 13:04:14 -0600 Subject: [PATCH 21/30] fix: failure comment only if the validation fails, not prior steps --- .github/workflows/reusable-pr-conventional-commit-title.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/reusable-pr-conventional-commit-title.yml b/.github/workflows/reusable-pr-conventional-commit-title.yml index ca9a633..5e3273b 100644 --- a/.github/workflows/reusable-pr-conventional-commit-title.yml +++ b/.github/workflows/reusable-pr-conventional-commit-title.yml @@ -143,7 +143,7 @@ jobs: body-includes: "Pull Request Title Validation Failed" - name: Comment on Failure - if: ${{ failure() && inputs.comment_on_failure }} + if: ${{ failure() && steps.pr-validation.outcome == 'failure' && inputs.comment_on_failure }} uses: peter-evans/create-or-update-comment@v5 with: issue-number: ${{ github.event.pull_request.number }} From 39c6f61d27ab8007a66fc64aa8f662e142d75629 Mon Sep 17 00:00:00 2001 From: Chris Taylor Date: Tue, 27 Jan 2026 13:06:47 -0600 Subject: [PATCH 22/30] fix: adjust label removal --- .github/workflows/reusable-pr-conventional-commit-title.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/reusable-pr-conventional-commit-title.yml b/.github/workflows/reusable-pr-conventional-commit-title.yml index 5e3273b..31bb637 100644 --- a/.github/workflows/reusable-pr-conventional-commit-title.yml +++ b/.github/workflows/reusable-pr-conventional-commit-title.yml @@ -42,8 +42,8 @@ on: default: true permissions: - pull-requests: write contents: read + pull-requests: write jobs: validate-title: @@ -104,7 +104,7 @@ jobs: env: GH_TOKEN: ${{ github.token }} run: | - gh pr edit ${{ github.event.pull_request.number }} --remove-label $(gh pr view ${{ github.event.pull_request.number }} --json labels --template '{{range .labels}}{{.name}} {{end}}') + gh api -X PUT repos/${{ github.repository }}/issues/${{ github.event.pull_request.number }}/labels -f labels='[]' - name: PR Conventional Commit Validation id: pr-validation From 44f2b991b028e1ea863f703f40ef3543cbd8e5ed Mon Sep 17 00:00:00 2001 From: Chris Taylor Date: Tue, 27 Jan 2026 13:10:21 -0600 Subject: [PATCH 23/30] fix: adjust label removal --- .github/workflows/reusable-pr-conventional-commit-title.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/reusable-pr-conventional-commit-title.yml b/.github/workflows/reusable-pr-conventional-commit-title.yml index 31bb637..fb9b851 100644 --- a/.github/workflows/reusable-pr-conventional-commit-title.yml +++ b/.github/workflows/reusable-pr-conventional-commit-title.yml @@ -104,7 +104,7 @@ jobs: env: GH_TOKEN: ${{ github.token }} run: | - gh api -X PUT repos/${{ github.repository }}/issues/${{ github.event.pull_request.number }}/labels -f labels='[]' + echo '{"labels":[]}' | gh api -X PUT repos/${{ github.repository }}/issues/${{ github.event.pull_request.number }}/labels --input - - name: PR Conventional Commit Validation id: pr-validation From 6e0a32dd73a773cb6ba0205f39f3db51bc24e935 Mon Sep 17 00:00:00 2001 From: Chris Taylor Date: Tue, 27 Jan 2026 15:49:15 -0600 Subject: [PATCH 24/30] fix: add note about breaking changes --- .github/workflows/reusable-pr-conventional-commit-title.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/reusable-pr-conventional-commit-title.yml b/.github/workflows/reusable-pr-conventional-commit-title.yml index fb9b851..4f8c443 100644 --- a/.github/workflows/reusable-pr-conventional-commit-title.yml +++ b/.github/workflows/reusable-pr-conventional-commit-title.yml @@ -129,6 +129,7 @@ jobs: - **Type** must be one of the following: ${{ inputs.task_types }} ${{ inputs.scope_types && format('- **Scope** must be one of the following: {0}', inputs.scope_types) || '- **Scope** is optional and can be any value or omitted entirely.' }} - **Description** should be a brief summary of the changes. + - If you have a breaking change, ensure the exclamation mark (\`!\`) is placed immediately after the type or scope, e.g., \`feat!: ...\` or \`feat(scope)!: ...\`. ${{ inputs.title_regex && format('- Additionally, your description must match the custom regex: `{0}`.\n', inputs.title_regex) || '' }} If you have any questions, please refer to the [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/) documentation for more details. EOC From e0a647121876383e64ccb79255c1c89f22c7c555 Mon Sep 17 00:00:00 2001 From: Chris Taylor Date: Tue, 27 Jan 2026 16:19:57 -0600 Subject: [PATCH 25/30] docs: create workflow config, usage doc --- .../reusable-pr-conventional-commit-title.yml | 2 + docs/reusable-pr-conventional-commit-title.md | 46 +++++++++++++++++++ 2 files changed, 48 insertions(+) create mode 100644 docs/reusable-pr-conventional-commit-title.md diff --git a/.github/workflows/reusable-pr-conventional-commit-title.yml b/.github/workflows/reusable-pr-conventional-commit-title.yml index 4f8c443..a437010 100644 --- a/.github/workflows/reusable-pr-conventional-commit-title.yml +++ b/.github/workflows/reusable-pr-conventional-commit-title.yml @@ -15,6 +15,7 @@ on: type: string description: 'Regular expression for custom title validation; disabled by default. Example: ''PROJECT-\d{2,5}$'' for trailing issue ticket, ''"^[^:]+: [A-Z]"'' for capitalized title' required: false + default: "" add_label: type: boolean description: "Whether to add labels to your pull request. Default: true" @@ -125,6 +126,7 @@ jobs: cat << EOC >> pr-title-failure-comment.md ### ❌ Pull Request Title Validation Failed Your pull request title (\`${{ github.event.pull_request.title }}\`) does not conform to the Conventional Commits specification. + Please ensure your title follows the format: \`(): \`. - **Type** must be one of the following: ${{ inputs.task_types }} ${{ inputs.scope_types && format('- **Scope** must be one of the following: {0}', inputs.scope_types) || '- **Scope** is optional and can be any value or omitted entirely.' }} diff --git a/docs/reusable-pr-conventional-commit-title.md b/docs/reusable-pr-conventional-commit-title.md new file mode 100644 index 0000000..b503fa6 --- /dev/null +++ b/docs/reusable-pr-conventional-commit-title.md @@ -0,0 +1,46 @@ +# Enforce Conventional Commits on PR titles + +This workflow will ensure that your pull request's title matches the Conventional Commits specification. This format is often used to drive downstream workflows like automated versioning and changelogs. + +This is intended for use with repositories that utilize Squash merges, as the title of the pull request is what lands on the base branch when a PR is merged. + +## Configuration + +This workflow exposes several configuration items that you can supply through your repository's workflow invocation that will be passed through to the underlying [ytanikin/pr-conventional-commits](https://github.com/ytanikin/pr-conventional-commits) workflow: + +| Configuration Key | Type | Default Value | Notes | +|-------------------|---------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| task_types | string (JSON array) | ["feat","fix","docs","test","ci","refactor","perf","chore","revert"] | Configures the valid prefixes for your commit message. Prefixes can be given a particular label by using the `custom_labels` setting below. | +| scope_types | string (JSON array) | "" | Valid scopes, e.g. `["login", "signup", "checkout", "payment"]`. If not supplied, any scope is valid. | +| title_regex | string | "" | Regular expression to apply to the title. Typically this is used to validate a ticket number is included, e.g. `.+ JIRA-\d{3,6} .+`. If not specified, bypasses regular expression checking. | +| add_label | boolean | true | Whether to add a label to the pull request with the type of the pull request. | +| add_scope_label | boolean | true | Whether to add a label to the pull request for the scope (if supplied). | +| custom_labels | string (JSON map) | {"feat": "feature", "fix": "fix", "docs": "documentation", "test": "test",
"ci": "CI/CD", "refactor": "refactor", "perf": "performance", "chore": "chore",
"revert": "revert", "wip": "WIP"} | A map of task_types and their stylized label text. With the default values, a task_type of `perf` will result in a label called `Performance`. | + +There are two additional configurations that are not passed to the underlying workflow, but control additional behaviors: + +| Configuration Key | Type | Default Value | Notes | +|--------------------|---------|---------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| comment_on_failure | boolean | true | Whether to comment on the pull request if the title validation fails. | +| clear_labels | boolean | true | Whether to clear the existing labels on the pull request when the workflow is run. This helps clean up scope labels added by this action when the scope changes, as they persist if you rename your pull request and change the scope. If you have another labeling solution, turn this off. | + + +## Usage + +To validate your PR titles using our default configuration, add the following workflow to your repository: + +```yaml +on: + pull_request: + types: [opened, reopened, edited] + +jobs: + validate-title: + name: Validate PR Title + permissions: + contents: read + pull-requests: write + uses: launchbynttdata/launch-workflows/.github/workflows/reusable-pr-conventional-commit-title.yml@ref +``` + +Be sure you replace `ref` with an appropriate ref to this repository. From e49341314d90a4319ee28fac1bf091231ac3d344 Mon Sep 17 00:00:00 2001 From: Chris Taylor Date: Tue, 27 Jan 2026 16:32:06 -0600 Subject: [PATCH 26/30] fix: normalize workflow names --- .github/workflows/reusable-pr-conventional-commit-title.yml | 2 +- docs/reusable-pr-conventional-commit-title.md | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/.github/workflows/reusable-pr-conventional-commit-title.yml b/.github/workflows/reusable-pr-conventional-commit-title.yml index a437010..d8a29c1 100644 --- a/.github/workflows/reusable-pr-conventional-commit-title.yml +++ b/.github/workflows/reusable-pr-conventional-commit-title.yml @@ -48,7 +48,7 @@ permissions: jobs: validate-title: - name: Validate Pull Request Title + name: Validate PR Title runs-on: ubuntu-latest steps: - name: Validate inputs diff --git a/docs/reusable-pr-conventional-commit-title.md b/docs/reusable-pr-conventional-commit-title.md index b503fa6..4ec21dc 100644 --- a/docs/reusable-pr-conventional-commit-title.md +++ b/docs/reusable-pr-conventional-commit-title.md @@ -30,6 +30,8 @@ There are two additional configurations that are not passed to the underlying wo To validate your PR titles using our default configuration, add the following workflow to your repository: ```yaml +name: Validate PR Title + on: pull_request: types: [opened, reopened, edited] @@ -44,3 +46,6 @@ jobs: ``` Be sure you replace `ref` with an appropriate ref to this repository. + +> [!NOTE] +> By default, your repository may not require this workflow to succeed before a change is merged. \ No newline at end of file From 9986d4bdde5771ee2ef9eece2a64fee907987ee8 Mon Sep 17 00:00:00 2001 From: Chris Taylor Date: Tue, 27 Jan 2026 16:41:58 -0600 Subject: [PATCH 27/30] doc: required workflow note --- docs/images/all-required-checks-passed.png | Bin 0 -> 22478 bytes docs/images/required-status-check.png | Bin 0 -> 64779 bytes docs/reusable-pr-conventional-commit-title.md | 12 ++++++++++-- 3 files changed, 10 insertions(+), 2 deletions(-) create mode 100644 docs/images/all-required-checks-passed.png create mode 100644 docs/images/required-status-check.png diff --git a/docs/images/all-required-checks-passed.png b/docs/images/all-required-checks-passed.png new file mode 100644 index 0000000000000000000000000000000000000000..1bdb84bed32e2fcf2e71eb38854edac03bb8ccae GIT binary patch literal 22478 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"=^=vDpWPi|doHCCy!)0b=nwzZ!K4fpB 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 literal 0 HcmV?d00001 diff --git a/docs/reusable-pr-conventional-commit-title.md b/docs/reusable-pr-conventional-commit-title.md index 4ec21dc..18bb5a5 100644 --- a/docs/reusable-pr-conventional-commit-title.md +++ b/docs/reusable-pr-conventional-commit-title.md @@ -47,5 +47,13 @@ jobs: Be sure you replace `ref` with an appropriate ref to this repository. -> [!NOTE] -> By default, your repository may not require this workflow to succeed before a change is merged. \ No newline at end of file +> [!CAUTION] +> By default, your repository likely does not require this workflow to succeed before a change is merged. By making this workflow required, you ensure that a successful run must be achieved prior to merge, which ensures your commit messages are consistent! +> +> To make this workflow required, visit your repository's settings and create a new Ruleset with a required status check, as shown below: + +![Required status check in the GitHub settings page](images/required-status-check.png) + +By doing so, you should see the `Required` indicator on your pull request's checks section, as shown below: + +![Pull request with a required status check showing a passing state](images/required-status-check.png) From 502a9a254d40b941d9809f5cc91398a23df1c27f Mon Sep 17 00:00:00 2001 From: Chris Taylor Date: Tue, 27 Jan 2026 16:44:24 -0600 Subject: [PATCH 28/30] doc: adjust image path --- docs/reusable-pr-conventional-commit-title.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/reusable-pr-conventional-commit-title.md b/docs/reusable-pr-conventional-commit-title.md index 18bb5a5..3d21bb5 100644 --- a/docs/reusable-pr-conventional-commit-title.md +++ b/docs/reusable-pr-conventional-commit-title.md @@ -56,4 +56,4 @@ Be sure you replace `ref` with an appropriate ref to this repository. By doing so, you should see the `Required` indicator on your pull request's checks section, as shown below: -![Pull request with a required status check showing a passing state](images/required-status-check.png) +![Pull request with a required status check showing a passing state](docs/images/all-required-checks-passed.png) From a10dcc2d91dcb4ec14ee1a44d5a287dddd89e7c5 Mon Sep 17 00:00:00 2001 From: Chris Taylor Date: Tue, 27 Jan 2026 16:46:10 -0600 Subject: [PATCH 29/30] doc: adjust image path again --- docs/reusable-pr-conventional-commit-title.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/reusable-pr-conventional-commit-title.md b/docs/reusable-pr-conventional-commit-title.md index 3d21bb5..28fde7b 100644 --- a/docs/reusable-pr-conventional-commit-title.md +++ b/docs/reusable-pr-conventional-commit-title.md @@ -56,4 +56,4 @@ Be sure you replace `ref` with an appropriate ref to this repository. By doing so, you should see the `Required` indicator on your pull request's checks section, as shown below: -![Pull request with a required status check showing a passing state](docs/images/all-required-checks-passed.png) +![Pull request with a required status check showing a passing state](/docs/images/all-required-checks-passed.png) From c6db9b5a5e36b6b7458d2cf73e646f79fd73d437 Mon Sep 17 00:00:00 2001 From: Chris Taylor Date: Tue, 27 Jan 2026 16:47:25 -0600 Subject: [PATCH 30/30] doc: adjust image path yet again --- docs/reusable-pr-conventional-commit-title.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/reusable-pr-conventional-commit-title.md b/docs/reusable-pr-conventional-commit-title.md index 28fde7b..c2eabee 100644 --- a/docs/reusable-pr-conventional-commit-title.md +++ b/docs/reusable-pr-conventional-commit-title.md @@ -56,4 +56,4 @@ Be sure you replace `ref` with an appropriate ref to this repository. By doing so, you should see the `Required` indicator on your pull request's checks section, as shown below: -![Pull request with a required status check showing a passing state](/docs/images/all-required-checks-passed.png) +![Pull request with a required status check showing a passing state](images/all-required-checks-passed.png)