From 5c8d9e69c4e7e92979df42128198f2087bdeca43 Mon Sep 17 00:00:00 2001 From: G30 <50341825+silentoplayz@users.noreply.github.com> Date: Thu, 13 Aug 2026 14:55:03 -0400 Subject: [PATCH] ci: auto-label feature requests with the enhancement label (#28531) --- .github/workflows/issue-label.yaml | 70 ++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) diff --git a/.github/workflows/issue-label.yaml b/.github/workflows/issue-label.yaml index a2a343a022..1a138e2f11 100644 --- a/.github/workflows/issue-label.yaml +++ b/.github/workflows/issue-label.yaml @@ -67,3 +67,73 @@ jobs: issue_number: issue.number, labels: ['bug'] }); + + label-feature-requests: + runs-on: ubuntu-latest + steps: + - name: Add "enhancement" label to unlabeled feature requests + uses: actions/github-script@v7 + with: + script: | + const issue = context.payload.issue; + + if (issue.labels.some((label) => label.name === 'enhancement')) { + return; + } + + // A human (or the bug form) already classified this as a bug; + // do not stack a second, contradictory classification on it. + if (issue.labels.some((label) => label.name === 'bug')) { + return; + } + + const isEdit = context.payload.action === 'edited'; + const titleWasEdited = Boolean(context.payload.changes?.title); + + if (isEdit && !titleWasEdited) { + return; + } + + const title = issue.title ?? ''; + const body = issue.body ?? ''; + + // Feature requests: "feat: ...", "feature: ...", "feature request: ...", + // "enhancement: ...", "enh: ...", "[Feature Request] ..." — the feature + // request form titles every submission "feat: ", so form submissions are + // covered by the same pattern. + const featureLikeTitle = + /^\s*(\[\s*(feat|feature|enhancement|enh)\b[^\]]*\]|(feat|feature( request)?|enhancement|enh)\s*[:/\-])/i.test( + title + ); + + // API/CLI-created issues that reproduce the feature request form structure. + // Only headings distinctive to that form. + const featureFormBody = /###\s*(Proposed Solution|Alternatives Considered)/i.test(body); + + if (!featureLikeTitle && !featureFormBody) { + return; + } + + if (isEdit) { + const events = await github.paginate(github.rest.issues.listEvents, { + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: issue.number, + per_page: 100 + }); + + const enhancementLabelWasRemoved = events.some( + (event) => event.event === 'unlabeled' && event.label?.name === 'enhancement' + ); + + if (enhancementLabelWasRemoved) { + return; + } + } + + await github.rest.issues.addLabels({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: issue.number, + labels: ['enhancement'] + });