From 3fc7d34f21d382d82c3072e15c9fb974cbc1ccbd Mon Sep 17 00:00:00 2001 From: Mike Odnis Date: Thu, 20 Aug 2026 02:36:00 -0400 Subject: [PATCH 1/5] chore: add PR labeler (npm format) Add automated pull-request labeling to resq-software/dev. - .github/labeler.yml: repo-specific config mapping this repo's real top-level surfaces (worker, bin, scripts, tests, installers, nix) to area:* labels, plus A-DevOps (.github), A-Release (VERSION, release plumbing, bin/gen-pins.sh, bin/stamp.sh, release.yml) and C-Documentation (**/*.md, docs). - .github/workflows/labeler.yml: repo-agnostic workflow (actions/labeler v7, SHA-pinned) that reads .github/labeler.yml. Uses pull_request_target guarded by a same-repo head check, minimal permissions, and sync-labels. These area/A-Release labels feed resq-software/landing's changelog generation via the release job. --- .github/labeler.yml | 71 +++++++++++++++++++++++++++++++++++ .github/workflows/labeler.yml | 35 +++++++++++++++++ 2 files changed, 106 insertions(+) create mode 100644 .github/labeler.yml create mode 100644 .github/workflows/labeler.yml diff --git a/.github/labeler.yml b/.github/labeler.yml new file mode 100644 index 0000000..286eadb --- /dev/null +++ b/.github/labeler.yml @@ -0,0 +1,71 @@ +# Copyright 2026 ResQ Systems, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# ── Area labels (top-level source surfaces) ───────────────────────────── +# This repo is a shell-installer distribution, not a monorepo, so areas are +# keyed to the real top-level source dirs (bin, scripts, tests, worker) plus +# the top-level installer entrypoints. + +"area:worker": + - changed-files: + - any-glob-to-any-file: worker/**/* + +"area:bin": + - changed-files: + - any-glob-to-any-file: bin/**/* + +"area:scripts": + - changed-files: + - any-glob-to-any-file: scripts/**/* + +"area:tests": + - changed-files: + - any-glob-to-any-file: tests/**/* + +"area:installers": + - changed-files: + - any-glob-to-any-file: + - install.sh + - install.ps1 + +"area:nix": + - changed-files: + - any-glob-to-any-file: + - flake.nix + - flake.lock + +# ── DevOps / infra ────────────────────────────────────────────────────── + +"A-DevOps": + - changed-files: + - any-glob-to-any-file: + - .github/**/* + +# ── Release plumbing ──────────────────────────────────────────────────── + +"A-Release": + - changed-files: + - any-glob-to-any-file: + - VERSION + - bin/gen-pins.sh + - bin/stamp.sh + - .github/workflows/release.yml + +# ── Category labels ───────────────────────────────────────────────────── + +"C-Documentation": + - changed-files: + - any-glob-to-any-file: + - "**/*.md" + - docs/**/* \ No newline at end of file diff --git a/.github/workflows/labeler.yml b/.github/workflows/labeler.yml new file mode 100644 index 0000000..4708263 --- /dev/null +++ b/.github/workflows/labeler.yml @@ -0,0 +1,35 @@ +# Copyright 2026 ResQ Systems, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +name: Pull Request Labeler + +on: + pull_request_target: # zizmor: ignore[dangerous-triggers] -- needs write access; guarded by same-repo check + types: [opened, synchronize] + +permissions: {} + +jobs: + labeler: + if: github.event.pull_request.head.repo.full_name == github.repository + permissions: + contents: read + pull-requests: write + runs-on: ubuntu-latest + steps: + - uses: actions/labeler@bf12e9b00b37c5c0ca2b87b79b2daf7891dbda13 # v7.0.0 + with: + repo-token: "${{ secrets.GITHUB_TOKEN }}" + configuration-path: .github/labeler.yml + sync-labels: true From e299eb71bffc1dbe79b4dbe2646923ac8e7df732 Mon Sep 17 00:00:00 2001 From: Mike Odnis Date: Thu, 20 Aug 2026 03:02:57 -0400 Subject: [PATCH 2/5] =?UTF-8?q?chore(labeler):=20complete=20npm-format=20s?= =?UTF-8?q?uite=20=E2=80=94=20pr-size=20+=20label-sync=20+=20labels.yml=20?= =?UTF-8?q?+=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Faithfully ports the remaining pieces of resq-software/npm's labeler suite: - .github/workflows/pr-size-labeler.yml: verbatim copy (pascalgn/size-label-action) - .github/workflows/label-sync.yml: verbatim copy, trigger branch retargeted master -> main (this repo's default branch) - .github/labels.yml: shared org taxonomy (C-/A-/S-/P-, deps, community, workflow) kept as-is, npm pkg:* entries dropped, plus definitions for every label this repo's labeler.yml (area:*, A-DevOps, A-Release) and release.yml (type:*, feature/fix/chore, ignore-for-release, skip-changelog) reference — 51 labels total - .github/release.yml: release-notes categorization config so label-sync-created labels drive the changelog aggregator Every label named in .github/labeler.yml and .github/release.yml is defined in labels.yml so label-sync creates it. --- .github/labels.yml | 230 ++++++++++++++++++++++++++ .github/release.yml | 35 ++++ .github/workflows/label-sync.yml | 45 +++++ .github/workflows/pr-size-labeler.yml | 34 ++++ 4 files changed, 344 insertions(+) create mode 100644 .github/labels.yml create mode 100644 .github/release.yml create mode 100644 .github/workflows/label-sync.yml create mode 100644 .github/workflows/pr-size-labeler.yml diff --git a/.github/labels.yml b/.github/labels.yml new file mode 100644 index 0000000..20c281e --- /dev/null +++ b/.github/labels.yml @@ -0,0 +1,230 @@ +# Copyright 2026 ResQ Systems, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Standardized label definitions (shared ResQ org taxonomy). +# Synced to the repository by .github/workflows/label-sync.yml. + +# --- Type (C- Category) --- +- name: "C-Bug" + color: "d73a4a" + description: Something isn't working + +- name: "C-Feature" + color: "a2eeef" + description: New feature or request + +- name: "C-Documentation" + color: "0075ca" + description: Improvements or additions to documentation + +- name: "C-Security" + color: "e4e669" + description: Security vulnerability or improvement + +- name: "C-Performance" + color: "f9d0c4" + description: Performance regression or optimization + +- name: "C-Refactor" + color: "d4c5f9" + description: Code refactoring with no behavior change + +- name: "C-Breaking-Change" + color: "b60205" + description: Breaking change to the API or behavior + +- name: "C-Chore" + color: "ededed" + description: "Chore: deps, tooling, or config with no public API change" + +- name: "C-Design" + color: "d4c5f9" + description: Design assets and tokens + +- name: "C-Testing" + color: "c2e0c6" + description: Tests and test tooling + +# --- Priority (P-) --- +- name: "P0: critical" + color: "b60205" + description: "Outage or data loss — drop everything" + +- name: "P1: high" + color: "d93f0b" + description: "Major impact — fix this sprint" + +- name: "P2: medium" + color: "fbca04" + description: "Moderate impact — fix soon" + +- name: "P3: low" + color: "0e8a16" + description: "Minor impact — fix when convenient" + +# --- Area (A-) --- (path-based, applied by .github/labeler.yml) --- +- name: "A-TypeScript" + color: "3178c6" + description: TypeScript/JavaScript code + +- name: "A-CI" + color: "000000" + description: "CI/CD, workflows, actions, and git hooks" + +- name: "A-Build" + color: "5319e7" + description: "Build configuration (tsdown, tsconfig)" + +- name: "A-Storybook" + color: "ff4785" + description: "Storybook stories and configuration" + +- name: "A-Examples" + color: "1d76db" + description: "Example applications under examples/" + +- name: "A-Effect" + color: "8250df" + description: "Effect-based code (Schema, fetchers, mailer)" + +- name: "A-DevOps" + color: "2188ff" + description: "CI, workflows, actions, and repo infra (.github)" + +- name: "A-Release" + color: "6f42c1" + description: "Release plumbing (VERSION, pins, stamp, release workflow)" + +# --- Area scope (area:) --- (path-based, applied by .github/labeler.yml) --- +# This repo is a shell-installer distribution keyed to top-level source dirs. +- name: "area:worker" + color: "c5def5" + description: "Changes under worker/" + +- name: "area:bin" + color: "c5def5" + description: "Changes under bin/" + +- name: "area:scripts" + color: "c5def5" + description: "Changes under scripts/" + +- name: "area:tests" + color: "c5def5" + description: "Changes under tests/" + +- name: "area:installers" + color: "c5def5" + description: "Changes to install.sh / install.ps1" + +- name: "area:nix" + color: "c5def5" + description: "Changes to the Nix flake (flake.nix / flake.lock)" + +# --- Release notes categories --- (referenced by .github/release.yml) --- +- name: "type:feature" + color: "a2eeef" + description: New feature or request + +- name: "feature" + color: "a2eeef" + description: New feature or request + +- name: "enhancement" + color: "a2eeef" + description: New feature or request + +- name: "type:fix" + color: "d73a4a" + description: Bug fix + +- name: "fix" + color: "d73a4a" + description: Bug fix + +- name: "bug" + color: "d73a4a" + description: Something isn't working + +- name: "type:chore" + color: "ededed" + description: "Chore: tooling, deps, or config" + +- name: "chore" + color: "ededed" + description: "Chore: tooling, deps, or config" + +- name: "ignore-for-release" + color: "cfd3d7" + description: Exclude this PR from generated release notes + +- name: "skip-changelog" + color: "cfd3d7" + description: Exclude this PR from the changelog + +# --- Dependency automation --- +- name: "dependencies" + color: "0366d6" + description: Automated dependency updates + +- name: "github-actions" + color: "1f6feb" + description: GitHub Actions dependency updates + +- name: "javascript" + color: "f1e05a" + description: JavaScript and TypeScript dependency updates + +# --- Status (S-) --- +- name: "S-Needs-Triage" + color: "ededed" + description: Needs initial assessment + +- name: "S-In-Progress" + color: "1d76db" + description: Actively being worked on + +- name: "S-Blocked" + color: "b60205" + description: Blocked by external dependency or decision + +- name: "S-Needs-Review" + color: "fbca04" + description: Ready for code review + +- name: "S-Ready-To-Merge" + color: "0e8a16" + description: "Approved and ready to be merged" + +# --- Community --- +- name: "good first issue" + color: "7057ff" + description: Good for newcomers + +- name: "help wanted" + color: "008672" + description: Extra attention is needed + +# --- Workflow --- +- name: "pinned" + color: "006b75" + description: Exempt from stale bot + +- name: "duplicate" + color: "cfd3d7" + description: This issue or PR already exists + +- name: "wontfix" + color: "ffffff" + description: This will not be worked on diff --git a/.github/release.yml b/.github/release.yml new file mode 100644 index 0000000..55fbee5 --- /dev/null +++ b/.github/release.yml @@ -0,0 +1,35 @@ +# Copyright 2026 ResQ Systems, Inc. +# SPDX-License-Identifier: Apache-2.0 +# +# Categorizes the notes that `gh release create --generate-notes` produces +# (grouping merged PRs by label into sections). Those categorized notes flow +# into the resq-software/landing changelog aggregator, whose `kind` inference +# reads these section headers — so labeling PRs makes the changelog's +# feature/fix/improvement classification accurate instead of a default guess. +# Add `type:*` labels (or the conventional feature/fix/chore labels) to PRs to +# populate the sections; the path labels from .github/labeler.yml also apply. +changelog: + exclude: + labels: + - ignore-for-release + - skip-changelog + categories: + - title: ✨ Features + labels: + - "type:feature" + - feature + - enhancement + - title: 🐛 Fixes + labels: + - "type:fix" + - fix + - bug + - title: 🔧 Maintenance + labels: + - "type:chore" + - chore + - dependencies + - A-DevOps + - title: Other Changes + labels: + - "*" diff --git a/.github/workflows/label-sync.yml b/.github/workflows/label-sync.yml new file mode 100644 index 0000000..0fd95ea --- /dev/null +++ b/.github/workflows/label-sync.yml @@ -0,0 +1,45 @@ +# Copyright 2026 ResQ Systems, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +name: Label Sync + +on: + push: + branches: [main] + paths: + - ".github/labels.yml" + workflow_dispatch: + +permissions: + issues: write + contents: read + +jobs: + sync: + name: Sync Labels + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + persist-credentials: false + + - name: Sync labels + uses: EndBug/label-sync@52074158190acb45f3077f9099fea818aa43f97a # v2.3.3 + with: + config-file: .github/labels.yml + delete-other-labels: false + dry-run: false + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/pr-size-labeler.yml b/.github/workflows/pr-size-labeler.yml new file mode 100644 index 0000000..f2766a2 --- /dev/null +++ b/.github/workflows/pr-size-labeler.yml @@ -0,0 +1,34 @@ +# Copyright 2026 ResQ Systems, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +name: PR Size Labeler + +on: + pull_request_target: # zizmor: ignore[dangerous-triggers] -- needs write access; guarded by same-repo check + types: [opened, synchronize] + +permissions: {} + +jobs: + labeler: + if: github.event.pull_request.head.repo.full_name == github.repository + permissions: + contents: read + pull-requests: write + runs-on: ubuntu-latest + steps: + - uses: pascalgn/size-label-action@56b489b027932ec0cf60438a1a5f1a19c8fc71ff # v0.5.7 + env: + GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}" + IGNORED: ".*\\.lock$|bun\\.lock|\\.lock\\.yml$" From c01e5dea169ada54918c2b3eb9ad7dd8e9b28307 Mon Sep 17 00:00:00 2001 From: Mike Odnis Date: Thu, 20 Aug 2026 03:08:08 -0400 Subject: [PATCH 3/5] fix(release): categorize release notes by the org C-* taxonomy (not non-existent type:*) --- .github/release.yml | 28 +++++++++++----------------- 1 file changed, 11 insertions(+), 17 deletions(-) diff --git a/.github/release.yml b/.github/release.yml index 55fbee5..8b32e32 100644 --- a/.github/release.yml +++ b/.github/release.yml @@ -6,8 +6,9 @@ # into the resq-software/landing changelog aggregator, whose `kind` inference # reads these section headers — so labeling PRs makes the changelog's # feature/fix/improvement classification accurate instead of a default guess. -# Add `type:*` labels (or the conventional feature/fix/chore labels) to PRs to -# populate the sections; the path labels from .github/labeler.yml also apply. +# Add the org's C-* category labels (C-Feature, C-Bug, C-Performance, +# C-Documentation, C-Chore, C-Refactor) to PRs to populate the sections; the +# path labels from .github/labeler.yml also apply. changelog: exclude: labels: @@ -15,21 +16,14 @@ changelog: - skip-changelog categories: - title: ✨ Features - labels: - - "type:feature" - - feature - - enhancement + labels: ["C-Feature"] - title: 🐛 Fixes - labels: - - "type:fix" - - fix - - bug + labels: ["C-Bug"] + - title: ⚡ Performance + labels: ["C-Performance"] + - title: 📚 Documentation + labels: ["C-Documentation"] - title: 🔧 Maintenance - labels: - - "type:chore" - - chore - - dependencies - - A-DevOps + labels: ["C-Chore", "C-Refactor", "A-DevOps", "dependencies"] - title: Other Changes - labels: - - "*" + labels: ["*"] From 1fec34fa02974bd8d20d6df230e4f95499e34a5e Mon Sep 17 00:00:00 2001 From: Mike Odnis Date: Thu, 20 Aug 2026 03:45:03 -0400 Subject: [PATCH 4/5] ci: add conventional-title labeler (auto C-* change-type -> release notes/changelog) --- .../workflows/conventional-title-labeler.yml | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 .github/workflows/conventional-title-labeler.yml diff --git a/.github/workflows/conventional-title-labeler.yml b/.github/workflows/conventional-title-labeler.yml new file mode 100644 index 0000000..4bd4077 --- /dev/null +++ b/.github/workflows/conventional-title-labeler.yml @@ -0,0 +1,49 @@ +# Copyright 2026 ResQ Systems, Inc. +# SPDX-License-Identifier: Apache-2.0 +# +# Applies the org C-* change-type label (C-Feature / C-Bug / ...) to a PR based +# on its conventional-commit title prefix. Combined with .github/release.yml, +# this makes `gh release create --generate-notes` group PRs by type, which flows +# into resq-software/landing's changelog aggregator so its feature/fix/kind +# classification is automatic rather than a default guess. Path labels come from +# .github/labeler.yml; this covers the change *type* that paths cannot express. +name: Conventional Title Labeler + +on: + pull_request_target: # zizmor: ignore[dangerous-triggers] -- needs write access; guarded by same-repo check + types: [opened, edited, reopened, synchronize] + +permissions: {} + +jobs: + label: + if: github.event.pull_request.head.repo.full_name == github.repository + permissions: + contents: read + pull-requests: write + runs-on: ubuntu-latest + steps: + - name: Map conventional title prefix to a C-* label + # TITLE is read from env (never interpolated into the script) to avoid + # zizmor template-injection. The type is the leading token before an + # optional scope and colon, e.g. `feat(ui)!: ...` -> `feat`. + env: + GH_TOKEN: ${{ github.token }} + PR: ${{ github.event.pull_request.number }} + TITLE: ${{ github.event.pull_request.title }} + run: | + set -euo pipefail + type="$(printf '%s' "$TITLE" | sed -nE 's/^([a-zA-Z]+)(\([^)]*\))?!?:.*/\1/p' | tr '[:upper:]' '[:lower:]')" + case "$type" in + feat|feature) label="C-Feature" ;; + fix) label="C-Bug" ;; + perf) label="C-Performance" ;; + docs) label="C-Documentation" ;; + refactor) label="C-Refactor" ;; + test) label="C-Testing" ;; + chore|build|ci|style|revert) label="C-Chore" ;; + *) echo "Title has no conventional type prefix; nothing to label."; exit 0 ;; + esac + echo "Conventional type '$type' -> $label" + gh pr edit "$PR" --repo "$GITHUB_REPOSITORY" --add-label "$label" \ + || echo "::warning::label '$label' not found yet (run Label Sync); skipped." \ No newline at end of file From 8e4e29f81dab26ed270b05eae3ac24ead9af431f Mon Sep 17 00:00:00 2001 From: Mike Odnis Date: Thu, 20 Aug 2026 05:46:59 -0400 Subject: [PATCH 5/5] fix(labeler): correct size-label globs, provision size labels, drop stale change-type labels - pr-size-labeler: IGNORED is parsed by pascalgn/size-label-action as newline-separated glob expressions (gitignore-style), not a regex. The prior single-line regex (".*\\.lock$|bun\\.lock|\\.lock\\.yml$") was converted by globrex into a pattern that matched no real path, so lockfiles were never excluded from the size calculation. Replace with explicit lockfile globs (verified against globrex). - labels.yml: define size/XS..size/XXL. The action does not create labels (see its README "Create the needed labels"), so label-sync must provision them alongside the rest of the taxonomy. - conventional-title-labeler: on a retitle (e.g. feat -> fix) the workflow re-runs via the edited event; remove any stale managed C-* label before adding the selected one so release.yml's first-match categorization does not keep the PR under the previous section. --- .github/labels.yml | 28 +++++++++++++++++++ .../workflows/conventional-title-labeler.yml | 16 ++++++++++- .github/workflows/pr-size-labeler.yml | 13 ++++++++- 3 files changed, 55 insertions(+), 2 deletions(-) diff --git a/.github/labels.yml b/.github/labels.yml index 20c281e..97e6382 100644 --- a/.github/labels.yml +++ b/.github/labels.yml @@ -132,6 +132,34 @@ color: "c5def5" description: "Changes to the Nix flake (flake.nix / flake.lock)" +# --- Size (size/) --- (applied by .github/workflows/pr-size-labeler.yml) --- +# pascalgn/size-label-action does not create labels; they must pre-exist, so +# label-sync provisions them here. Thresholds mirror the action's defaults +# (XS 0-9, S 10-29, M 30-99, L 100-499, XL 500-999, XXL 1000+ changed lines). +- name: "size/XS" + color: "3fb950" + description: "PR size: extra small (< 10 lines changed)" + +- name: "size/S" + color: "56d364" + description: "PR size: small (10-29 lines changed)" + +- name: "size/M" + color: "d4a72c" + description: "PR size: medium (30-99 lines changed)" + +- name: "size/L" + color: "db6d28" + description: "PR size: large (100-499 lines changed)" + +- name: "size/XL" + color: "f85149" + description: "PR size: extra large (500-999 lines changed)" + +- name: "size/XXL" + color: "da3633" + description: "PR size: extra extra large (1000+ lines changed)" + # --- Release notes categories --- (referenced by .github/release.yml) --- - name: "type:feature" color: "a2eeef" diff --git a/.github/workflows/conventional-title-labeler.yml b/.github/workflows/conventional-title-labeler.yml index 4bd4077..4fe30d2 100644 --- a/.github/workflows/conventional-title-labeler.yml +++ b/.github/workflows/conventional-title-labeler.yml @@ -45,5 +45,19 @@ jobs: *) echo "Title has no conventional type prefix; nothing to label."; exit 0 ;; esac echo "Conventional type '$type' -> $label" + + # Managed change-type labels this workflow owns. On a retitle (e.g. + # feat -> fix) the workflow re-runs via the `edited` event, so the + # stale C-* label must be dropped first — otherwise release.yml's + # first-match categorization would keep the PR under the old section. + managed="C-Feature C-Bug C-Performance C-Documentation C-Refactor C-Testing C-Chore" + current="$(gh pr view "$PR" --repo "$GITHUB_REPOSITORY" --json labels --jq '.labels[].name')" + for m in $managed; do + if [ "$m" != "$label" ] && printf '%s\n' "$current" | grep -Fxq -- "$m"; then + gh pr edit "$PR" --repo "$GITHUB_REPOSITORY" --remove-label "$m" \ + || echo "::warning::failed to remove stale label '$m'." + fi + done + gh pr edit "$PR" --repo "$GITHUB_REPOSITORY" --add-label "$label" \ - || echo "::warning::label '$label' not found yet (run Label Sync); skipped." \ No newline at end of file + || echo "::warning::label '$label' not found yet (run Label Sync); skipped." diff --git a/.github/workflows/pr-size-labeler.yml b/.github/workflows/pr-size-labeler.yml index f2766a2..c563fd3 100644 --- a/.github/workflows/pr-size-labeler.yml +++ b/.github/workflows/pr-size-labeler.yml @@ -31,4 +31,15 @@ jobs: - uses: pascalgn/size-label-action@56b489b027932ec0cf60438a1a5f1a19c8fc71ff # v0.5.7 env: GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}" - IGNORED: ".*\\.lock$|bun\\.lock|\\.lock\\.yml$" + # IGNORED is parsed by size-label-action as newline-separated glob + # expressions (gitignore-style), NOT a regex. Lockfiles are generated + # noise, so exclude them from the change-size calculation. + IGNORED: | + *.lock + **/*.lock + *.lock.yml + **/*.lock.yml + package-lock.json + **/package-lock.json + bun.lock + **/bun.lock