Merge pull request #3678 from SillyTavern/update-git-workflows Update github workflows for better issue & PR management, automating chores

aad4b449ee3c876ca8c9d4dc31f0640ed384cdc8

Wolfsblvt <wolfsblvt@gmail.com>

Signed
23 files changed, +771 -312Showing whitespace changes
.github/ISSUE_TEMPLATE/bug-report.yml+1 -0
@@ -1,4 +1,5 @@
11name: Bug Report πŸ›
2+type: Bug
23description: Report something that's not working the intended way. Support requests for external programs (reverse proxies, 3rd party servers, other peoples' forks) will be refused! Please use English only.
34title: '[BUG] <title>'
45labels: ['πŸ› Bug']
.github/ISSUE_TEMPLATE/feature-request.yml+1 -0
@@ -1,4 +1,5 @@
11name: Feature Request ✨
2+type: Feature
23description: Suggest an idea for future development of this project. Please use English only.
34title: '[FEATURE_REQUEST] <title>'
45labels: ['πŸ¦„ Feature Request']
.github/close-label.yml+0 -2
@@ -1,2 +0,0 @@
1-πŸ› Bug: βœ… Fixed
2-πŸ¦„ Feature Request: βœ… Implemented
2 \ No newline at end of file
.github/issue-auto-comments.yml+0 -62
@@ -1,62 +0,0 @@
1-comment:
2- footer: |
3- ---
4- > I am a bot, and this is an automated message πŸ€–
5-labels:
6- - name: βœ–οΈ Invalid
7- labeled:
8- issue:
9- action: close
10- body: >
11- Hello @{{ issue.user.login }} your ticket has been marked as invalid.
12- Please ensure you follow the issue template, provide all requested info,
13- and be sure to check the docs + previous issues prior to raising tickets.
14- pr:
15- body: Thank you @{{ pull_request.user.login }} for suggesting this. Please follow the pull request templates.
16- action: close
17-
18- - name: πŸ‘©β€πŸ’» Good First Issue
19- labeled:
20- issue:
21- body: >
22- This issue has been marked as a good first issue for first-time contributors to implement!
23- This is a great way to support the project, while also improving your skills, you'll also be credited as a contributor once your PR is merged.
24- If you're new to SillyTavern [here are a collection of resources](https://docs.sillytavern.app/)
25- If you need any support at all, feel free to reach out via [Discord](https://discord.gg/sillytavern).
26-
27- - name: ❌ wontfix
28- labeled:
29- issue:
30- action: close
31- body: >
32- This ticked has been marked as 'wontfix', which usually means it is out-of-scope, or not feasible at this time.
33- You can still fork the project and make the changes yourself.
34-
35- - name: βœ… Fixed
36- labeled:
37- issue:
38- body: >
39- Hello @{{ issue.user.login }}! It looks like all or part of this issue has now been implemented.
40-
41-
42- - name: ‼️ High Priority
43- labeled:
44- issue:
45- body: >
46- This ticket has been marked as high priority, and has been bumped to the top of the priority list.
47- You should expect an implementation to be pushed out soon. Thank you for your patience.
48-
49- - name: πŸ’€ Spam
50- labeled:
51- issue:
52- action: close
53- locking: lock
54- lock_reason: spam
55- body: >
56- This issue has been identified as spam, and is now locked.
57- Users who repeatedly raise spam issues may be blocked or reported.
58-
59- - name: β›” Don't Merge
60- labeled:
61- pr:
62- body: This PR has been temporarily blocked from merging.
62 \ No newline at end of file
.github/issues-auto-comments.yml+69 -0
@@ -0,0 +1,69 @@
1+labels:
2+ - name: βœ–οΈ Invalid
3+ labeled:
4+ issue:
5+ action: close
6+ body: >
7+ Hey @{{ issue.user.login }}, this issue has been marked as invalid.
8+
9+ Please double-check that you've followed the issue template, included all necessary details, and reviewed the docs & previous issues before submitting.
10+ If provided, follow the instructions given by maintainers.
11+
12+ - name: πŸ‘©β€πŸ’» Good First Issue
13+ labeled:
14+ issue:
15+ body: >
16+ πŸ† This issue has been marked as a good first issue for contributors to implement!
17+ This is a great way to support the project. While also improving your skills, you'll also be credited as a contributor once your PR is merged.
18+
19+ If you're new to SillyTavern [here is the official documentation](https://docs.sillytavern.app/). The official contribution guide can be found [here](https://github.com/SillyTavern/SillyTavern/blob/release/CONTRIBUTING.md).
20+ If you need any support, feel free to reach out via [Discord](https://discord.gg/sillytavern), or let us know in this issue or via [discussions](https://github.com/SillyTavern/SillyTavern/discussions).
21+
22+ - name: ❌ wontfix
23+ labeled:
24+ issue:
25+ action: close
26+ body: >
27+ ❌ This issue has been marked as 'wontfix', which usually means it is out-of-scope, not feasible at this time or will not be implemented for various reasons.
28+ If you have any questions about this, feel free to reach out.
29+
30+ - name: πŸ›‘ Out of Scope
31+ labeled:
32+ issue:
33+ action: close
34+ body: >
35+ πŸ›‘ This issue has been marked as 'out of scope', as this can't or won't be implemented.
36+ If you have any questions about this, feel free to reach out.
37+
38+ - name: βœ… Done (staging)
39+ labeled:
40+ issue:
41+ body: >
42+ βœ… It looks like all or part of this issue has now been implemented as part of the `staging` branch.
43+ If you currently are on the `release` branch, you can switch to `staging` to test this right away.
44+
45+ Note that `staging` is considered less stable than the official releases. To switch, follow existing instructions,
46+ or simply enter the following command: `git switch staging`
47+
48+ - name: βœ… Done
49+ labeled:
50+ issue:
51+ body: >
52+ βœ… It looks like all or part of this issue has now been implemented as part of the latest release.
53+
54+ - name: ‼️ High Priority
55+ labeled:
56+ issue:
57+ body: >
58+ 🚨 This issue has been marked high priority, meaning it's important to the maintainers or community.
59+ While we can't promise immediate changes, it is on our radar and will be addressed whenever possible. Thanks for your patience!
60+
61+ - name: πŸ’€ Spam
62+ labeled:
63+ issue:
64+ action: close
65+ locking: lock
66+ lock_reason: spam
67+ body: >
68+ πŸ’€ This issue has been flagged as spam and is now locked.
69+ Please avoid posting spam - it disrupts the community and wastes everyone's time.
.github/labeler.yml β†’ .github/issues-auto-labels.yml+6 -4
@@ -1,7 +1,3 @@
1-# Add/remove 'critical' label if issue contains the words 'urgent' or 'critical'
2-#critical:
3-# - '(critical|urgent)'
4-
51πŸͺŸ Windows:
62 - '(πŸͺŸ Windows)'
73
@@ -16,3 +12,9 @@
1612
1713🐧 Linux:
1814 - '(🐧 Linux)'
15+
16+🦊 Firefox:
17+ - '(firefox|mozilla)'
18+
19+πŸ“± Mobile:
20+ - '(iphone|ios|android|πŸ“± Termux)'
.github/pr-auto-comments.yml+51 -0
@@ -0,0 +1,51 @@
1+labels:
2+ - name: βœ–οΈ Invalid
3+ labeled:
4+ pr:
5+ action: close
6+ body: >
7+ Hey @{{ pull_request.user.login }}, thanks for your contribution!
8+ Unfortunately, this PR has been marked as invalid.
9+
10+ Please check that you've followed the PR template, included all relevant details, and are targeting the correct branch (`staging` for regular contributions, `release` only for hotfixes).
11+
12+ If you need help, feel free to ask!
13+
14+ - name: β›” Don't Merge
15+ labeled:
16+ pr:
17+ body: >
18+ 🚨 This PR has been temporarily blocked from merging.
19+
20+ - name: πŸ’₯πŸ’£ Breaking Changes
21+ labeled:
22+ pr:
23+ body: >
24+ ⚠️ Heads up! This PR introduces breaking changes.
25+
26+ Make sure these changes are well-documented and that users will be properly informed when this is released.
27+
28+ - name: β›” Waiting For External/Upstream
29+ labeled:
30+ pr:
31+ body: >
32+ β›” This PR is awaiting external or upstream changes or approval.
33+ It can only be merged once those changes have been implemented and approved.
34+
35+ Please inform us of any progress on the upstream changes or approval.
36+
37+ - name: πŸ”¬ Needs Testing
38+ labeled:
39+ pr:
40+ body: >
41+ πŸ”¬ This PR needs testing!
42+ Any contributor can test and leave reviews, so feel free to help us out!
43+
44+ - name: πŸŸ₯ ⬀⬀⬀⬀⬀
45+ labeled:
46+ pr:
47+ body: >
48+ ⚠️ This PR is over 1000 lines, which is larger than recommended.
49+
50+ Please make sure that it only addresses a single issue - PRs this large are hard to test and may be rejected.
51+
.github/pr-auto-labels-by-branch.yml+77 -0
@@ -0,0 +1,77 @@
1+####################################
2+# Label PRs against 'release' #
3+####################################
4+❗ Against Release Branch:
5+- base-branch: 'release'
6+
7+####################################
8+# Labels based on PR branch name #
9+####################################
10+πŸ¦‹ Bug Fix:
11+- head-branch: ['^fix[/-]', '\bfixes\b']
12+
13+πŸš‘ Hot Fix:
14+- head-branch: ['^hotfix[/-]']
15+
16+✨ New Feature:
17+- head-branch: ['^feat(ure)?[/-].*?\badd', '^add-']
18+
19+✨ Feature Changes:
20+- head-branch: ['^feat(ure)?[/-](?!.*\badd\b)', '\bchanges?\b']
21+
22+πŸ€– API / Model:
23+- head-branch: ['\bapi\b', '\bmodels?\b']
24+
25+🏭 Backend Changes:
26+- head-branch: ['\bbackend\b', '\bendpoints?\b']
27+
28+πŸ‹ Docker:
29+- head-branch: ['\bdocker\b']
30+
31+βž• Extension:
32+- head-branch: ['\bextension\b', '\bext\b']
33+
34+🦊 Firefox:
35+- head-branch: ['\bfirefox\b']
36+
37+πŸ–ΌοΈ Image Gen:
38+- head-branch: ['\bimage-gen\b']
39+
40+🌐 Language:
41+- head-branch: ['\btranslations?\b', '\blanguages?\b']
42+
43+🐧 Linux:
44+- head-branch: ['\blinux\b']
45+
46+🧩 Macros:
47+- head-branch: ['\bmacros?\b']
48+
49+πŸ“± Mobile:
50+- head-branch: ['\bmobile\b', '\bios\b', '\bandroid\b']
51+
52+πŸš„ Performance:
53+- head-branch: ['\bperformance\b']
54+
55+βš™οΈ Preset:
56+- head-branch: ['\bpresets?\b']
57+
58+πŸ“œ Prompt:
59+- head-branch: ['\bprompt\b']
60+
61+🚚 Refactor:
62+- head-branch: ['\brefactor(s|ed)?\b']
63+
64+πŸ“œ STscript:
65+- head-branch: ['\bstscript\b', '\bslash-commands\b']
66+
67+🏷️ Tags / Folders:
68+- head-branch: ['\btags\b']
69+
70+πŸŽ™οΈ TTS / Voice:
71+- head-branch: ['\btts\b', '\bvoice\b']
72+
73+🌟 UX:
74+- head-branch: ['\bux\b']
75+
76+πŸ—ΊοΈ World Info:
77+- head-branch: ['\bworld-info\b', '\bwi\b']
.github/pr-auto-labels-by-files.yml+46 -0
@@ -0,0 +1,46 @@
1+####################################
2+# Labels based on changed files #
3+####################################
4+🏭 Backend Changes:
5+- changed-files:
6+ - any-glob-to-any-file:
7+ - "src/**"
8+ - "default/config.yaml"
9+ - "server.js"
10+ - "plugins.js"
11+ - "recover.js"
12+ - "webpack.config.js"
13+ - "Start.bat"
14+ - "start.sh"
15+ - "UpdateAndStart.bat"
16+ - "UpdateForkAndStart.bat"
17+
18+βš™οΈ config.yaml:
19+- changed-files:
20+ - any-glob-to-any-file:
21+ - "default/config.yaml"
22+
23+πŸ› οΈ Build Changes:
24+- changed-files:
25+ - any-glob-to-any-file:
26+ - ".github/workflows/**"
27+ - "docker/**"
28+ - ".dockerignore"
29+ - "Dockerfile"
30+ - "webpack.config.js"
31+
32+🌐 Language:
33+- changed-files:
34+ - any-glob-to-any-file:
35+ - "public/locales/**"
36+
37+πŸ“₯ Dependencies:
38+- changed-files:
39+ - any-glob-to-any-file:
40+ - "public/lib/**" # Every frontend lib counts as a dependency as well
41+ - "package.json"
42+ - "package-lock.json"
43+ - "tests/package.json"
44+ - "tests/package-lock.json"
45+ - "src/electron/package.json"
46+ - "src/electron/package-lock.json"
.github/workflows/add-comment-from-tag.yml+0 -28
@@ -1,28 +0,0 @@
1-# Based on a label applied to an issue, the bot will add a comment with some additional info
2-
3-name: 🎯 Auto-Reply to Labeled Tickets
4-on:
5- issues:
6- types:
7- - labeled
8- - unlabeled
9- pull_request_target:
10- types:
11- - labeled
12- - unlabeled
13-permissions:
14- contents: read
15- issues: write
16- pull-requests: write
17-
18-jobs:
19- comment:
20- runs-on: ubuntu-20.04
21- steps:
22- - name: Checkout
23- uses: actions/checkout@v2
24- - name: Label Commenter
25- uses: peaceiris/actions-label-commenter@v1
26- with:
27- config_file: .github/issue-auto-comments.yml
28- github_token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
28 \ No newline at end of file
.github/workflows/check-merge-conflicts.yml+0 -17
@@ -1,17 +0,0 @@
1-# Detect and label pull requests that have merge conflicts
2-name: πŸ—οΈ Check Merge Conflicts
3-on:
4- push:
5- branches:
6- - staging
7-jobs:
8- check-conflicts:
9- if: github.repository == 'SillyTavern/SillyTavern'
10- runs-on: ubuntu-latest
11- steps:
12- - uses: mschilde/auto-label-merge-conflicts@master
13- with:
14- CONFLICT_LABEL_NAME: "🚫 Merge Conflicts"
15- GITHUB_TOKEN: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
16- MAX_RETRIES: 5
17- WAIT_MS: 5000
17 \ No newline at end of file
.github/workflows/close-stale-issues.yml+0 -82
@@ -1,82 +0,0 @@
1-# Closes any issues that no longer have user interaction
2-name: 🎯 Close Stale Issues
3-
4-on:
5- workflow_dispatch:
6- schedule:
7- - cron: '0 0 * * *' # Runs every day at midnight UTC
8-
9-jobs:
10- stale:
11- runs-on: ubuntu-latest
12-
13- steps:
14- # Comment on, then close issues that haven't been updated for ages
15- - name: Close Stale Issues
16- uses: actions/stale@v4
17- with:
18- repo-token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
19- days-before-stale: 183
20- days-before-close: 7
21- operations-per-run: 30
22- remove-stale-when-updated: true
23- enable-statistics: true
24- stale-issue-message: >
25- This issue has gone 6 months without an update. To keep the ticket open, please indicate that it is still relevant in a comment below.
26- Otherwise it will be closed in 7 days.
27- stale-pr-message: >
28- This PR is stale because it has been open 6 months with no activity. Either remove the stale label or comment below with a short update,
29- otherwise this PR will be closed in 7 days.
30- close-issue-message: >
31- This issue was automatically closed because it has been stalled for over 6 months with no activity.
32- close-pr-message: >
33- This pull request was automatically closed because it has been stalled for over 6 months with no activity.
34- stale-issue-label: '⚰️ Stale'
35- close-issue-label: 'πŸ•ΈοΈ Inactive'
36- stale-pr-label: '⚰️ Stale'
37- close-pr-label: 'πŸ•ΈοΈ Inactive'
38- exempt-issue-labels: 'πŸ“Œ Keep Open'
39- exempt-pr-labels: 'πŸ“Œ Keep Open'
40- labels-to-add-when-unstale: 'πŸ“Œ Keep Open'
41-
42- # Comment on, then close issues that required a response from the user, but didn't get one
43- - name: Close Issues without Response
44- uses: actions/stale@v4
45- with:
46- repo-token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
47- days-before-stale: 7
48- days-before-close: 7
49- operations-per-run: 30
50- remove-stale-when-updated: true
51- stale-issue-message: >
52- Hi! Looks like additional info is required for this issue to be addressed.
53- Don't forget to provide this within the next few days to keep your ticket open.
54- close-issue-message: 'Issue closed due to no response from user.'
55- only-labels: '🚏 Awaiting User Response'
56- labels-to-remove-when-unstale: '🚏 Awaiting User Response, πŸ›‘ No Response'
57- stale-issue-label: 'πŸ›‘ No Response'
58- close-issue-label: 'πŸ•ΈοΈ Inactive'
59- exempt-issue-labels: 'πŸ“Œ Keep Open'
60- exempt-pr-labels: 'πŸ“Œ Keep Open'
61-
62- # Comment on issues that we should have replied to
63- - name: Notify Repo Owner to Respond
64- uses: actions/stale@v4
65- with:
66- repo-token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
67- days-before-stale: 7
68- days-before-close: 183
69- operations-per-run: 30
70- remove-stale-when-updated: true
71- stale-issue-message: Hey SillyTavern, - Don't forget to respond!
72- stale-pr-message: Hey SillyTavern, - Don't forget to respond!
73- only-labels: 'πŸ‘€ Awaiting Maintainer Response'
74- labels-to-remove-when-unstale: 'πŸ‘€ Awaiting Maintainer Response'
75- close-issue-message: 'Closed due to no response from repo author for over a year'
76- close-pr-message: 'Closed due to no response from repo author for over a year'
77- stale-issue-label: 'πŸ‘€ Awaiting Maintainer Response'
78- stale-pr-label: 'πŸ‘€ Awaiting Maintainer Response'
79- close-issue-label: 'πŸ•ΈοΈ Inactive'
80- close-pr-label: 'πŸ•ΈοΈ Inactive'
81- exempt-issue-labels: 'πŸ“Œ Keep Open'
82- exempt-pr-labels: 'πŸ“Œ Keep Open'
.github/workflows/get-pr-size.yml+0 -39
@@ -1,39 +0,0 @@
1-# Adds a comment to new PRs, showing the compressed size and size difference of new code
2-# And also labels the PR based on the number of lines changes
3-
4-name: 🌈 Check PR Size
5-on: [pull_request]
6-jobs:
7- build:
8- runs-on: ubuntu-latest
9- steps:
10- - name: Checkout
11- uses: actions/checkout@v2
12- # Find and comment with compressed size
13- - name: Get Compressed Size
14- uses: preactjs/compressed-size-action@v2
15- with:
16- repo-token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
17- pattern: './dist/**/*.{js,css,html}'
18- strip-hash: '\\b\\w{8}\\.'
19- exclude: '**/node_modules/**'
20- minimum-change-threshold: 100
21- # Check number of lines of code added
22- - name: Label based on Lines of Code
23- uses: codelytv/pr-size-labeler@v1
24- with:
25- GITHUB_TOKEN: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
26- xs_max_size: '10'
27- s_max_size: '100'
28- m_max_size: '500'
29- l_max_size: '1000'
30- s_label: '🟩 PR - Small'
31- m_label: '🟨 PR - Medium'
32- l_label: '🟧 PR - Large'
33- xl_label: 'πŸŸ₯ PR - XL'
34- fail_if_xl: 'false'
35- message_if_xl: >
36- It looks like this PR is very large (over 1000 lines).
37- Try to avoid addressing multiple issues in a single PR, and
38- in the future consider breaking large tasks down into smaller steps.
39- This it to make reviewing, testing, reverting and general quality management easier.
39 \ No newline at end of file
.github/workflows/issues-auto-manager.yml+107 -0
@@ -0,0 +1,107 @@
1+name: 🎯 Issues Manager
2+
3+on:
4+ issues:
5+ types: [opened, edited, labeled, unlabeled]
6+ # Re also listen to comments, to remove stale labels right away
7+ issue_comment:
8+ types: [created]
9+
10+jobs:
11+ label-on-content:
12+ name: Auto-Label Issues (Based on Issue Content)
13+ runs-on: ubuntu-latest
14+
15+ steps:
16+ - name: Auto-Label Issues (Based on Issue Content)
17+ # only auto label based on issue content once, on open (to prevent re-labeling removed labels)
18+ if: github.event.action == 'opened'
19+
20+ # Issue Labeler
21+ # https://github.com/marketplace/actions/regex-issue-labeler
22+ uses: github/issue-labeler@v3
23+ with:
24+ configuration-path: .github/issues-auto-labels.yml
25+ enable-versioned-regex: 0
26+ repo-token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
27+
28+ label-on-labels:
29+ name: Auto-Label Issues (Based on Issue Labels)
30+ runs-on: ubuntu-latest
31+
32+ steps:
33+ - name: βœ… Add "πŸ‘ Approved" for relevant labels
34+ if: contains(fromJSON('["πŸ‘©β€πŸ’» Good First Issue", "πŸ™ Help Wanted", "πŸͺ² Confirmed", "⚠️ High Priority", "❕ Medium Priority", "πŸ’€ Low Priority"]'), github.event.label.name)
35+ # πŸ€– Issues Helper
36+ # https://github.com/marketplace/actions/issues-helper
37+ uses: actions-cool/issues-helper@v3
38+ with:
39+ actions: 'add-labels'
40+ token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
41+ labels: 'πŸ‘ Approved'
42+
43+ - name: ❌ Remove progress labels when issue is marked done or stale
44+ if: contains(fromJSON('["βœ… Done", "βœ… Done (staging)", "⚰️ Stale", "❌ wontfix"]'), github.event.label.name)
45+ # πŸ€– Issues Helper
46+ # https://github.com/marketplace/actions/issues-helper
47+ uses: actions-cool/issues-helper@v3
48+ with:
49+ actions: 'remove-labels'
50+ token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
51+ labels: 'πŸ§‘β€πŸ’» In Progress,πŸ€” Unsure,πŸ€” Under Consideration'
52+
53+ - name: ❌ Remove temporary labels when confirmed labels are added
54+ if: contains(fromJSON('["❌ wontfix","πŸ‘ Approved","πŸ‘©β€πŸ’» Good First Issue"]'), github.event.label.name)
55+ # πŸ€– Issues Helper
56+ # https://github.com/marketplace/actions/issues-helper
57+ uses: actions-cool/issues-helper@v3
58+ with:
59+ actions: 'remove-labels'
60+ token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
61+ labels: 'πŸ€” Unsure,πŸ€” Under Consideration'
62+
63+ - name: ❌ Remove no bug labels when "πŸͺ² Confirmed" is added
64+ if: github.event.label.name == 'πŸͺ² Confirmed'
65+ # πŸ€– Issues Helper
66+ # https://github.com/marketplace/actions/issues-helper
67+ uses: actions-cool/issues-helper@v3
68+ with:
69+ actions: 'remove-labels'
70+ token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
71+ labels: 'βœ–οΈ Not Reproducible,βœ–οΈ Not A Bug'
72+
73+ remove-stale-label:
74+ name: Remove Stale Label on Comment
75+ runs-on: ubuntu-latest
76+ # Only run this on new comments, to automatically remove the stale label
77+ if: github.event_name == 'issue_comment' && github.actor != 'github-actions[bot]'
78+
79+ steps:
80+ - name: Remove Stale Label
81+ # πŸ€– Issues Helper
82+ # https://github.com/marketplace/actions/issues-helper
83+ uses: actions-cool/issues-helper@v3
84+ with:
85+ actions: 'remove-labels'
86+ token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
87+ issue-number: ${{ github.event.issue.number }}
88+ labels: '⚰️ Stale,πŸ•ΈοΈ Inactive,🚏 Awaiting User Response,πŸ›‘ No Response'
89+
90+ write-auto-comments:
91+ name: Post Issue Comments Based on Labels
92+ needs: [label-on-content, label-on-labels]
93+ runs-on: ubuntu-latest
94+
95+ steps:
96+ - name: Checkout Repository
97+ # Checkout
98+ # https://github.com/marketplace/actions/checkout
99+ uses: actions/checkout@v4
100+
101+ - name: Post Issue Comments Based on Labels
102+ # Label Commenter
103+ # https://github.com/marketplace/actions/label-commenter
104+ uses: peaceiris/actions-label-commenter@v1
105+ with:
106+ config_file: .github/issues-auto-comments.yml
107+ github_token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
.github/workflows/issues-updates-on-merge.yml+39 -0
@@ -0,0 +1,39 @@
1+name: 🎯 Update Issues on Push
2+
3+on:
4+ push:
5+ branches:
6+ - staging
7+ - release
8+
9+jobs:
10+ # This runs commits to staging/release, reading the commit messages. Check `pr-auto-manager.yml`:`update-linked-issues` for PR-linked updates.
11+ update-linked-issues:
12+ name: Update Issues on Push
13+ runs-on: ubuntu-latest
14+
15+ steps:
16+ - name: Checkout Repository
17+ # Checkout
18+ # https://github.com/marketplace/actions/checkout
19+ uses: actions/checkout@v4
20+
21+ - name: Extract Linked Issues from Commit Message
22+ id: extract_issues
23+ run: |
24+ ISSUES=$(git log -1 --pretty=%B | grep -oiE '(close|closes|closed|fix|fixes|fixed|resolve|resolves|resolved) #([0-9]+)' | awk '{print $2}' | tr -d '#' | jq -R -s -c 'split("\n")[:-1]')
25+ echo "issues=$ISSUES" >> $GITHUB_ENV
26+
27+ - name: Label Linked Issues
28+ id: label_linked_issues
29+ env:
30+ GH_TOKEN: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
31+ run: |
32+ for ISSUE in $(echo $issues | jq -r '.[]'); do
33+ echo "Updating issue #$ISSUE"
34+ if [ "${{ github.ref }}" == "refs/heads/staging" ]; then
35+ gh issue edit $ISSUE -R ${{ github.repository }} --add-label "βœ… Done (staging)"
36+ elif [ "${{ github.ref }}" == "refs/heads/release" ]; then
37+ gh issue edit $ISSUE -R ${{ github.repository }} --add-label "βœ… Done"
38+ fi
39+ done
.github/workflows/job-close-stale.yml+95 -0
@@ -0,0 +1,95 @@
1+name: 🎯 Close Stale Issues/PRs Workflow
2+
3+on:
4+ # Run the workflow every day
5+ workflow_dispatch:
6+ schedule:
7+ - cron: '0 0 * * *' # Runs every day at midnight UTC
8+
9+jobs:
10+ mark-inactivity:
11+ name: Mark Issues/PRs without Activity
12+ runs-on: ubuntu-latest
13+
14+ steps:
15+ - name: Mark Issues/PRs without Activity
16+ # Close Stale Issues and PRs
17+ # https://github.com/marketplace/actions/close-stale-issues
18+ uses: actions/stale@v9
19+ with:
20+ repo-token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
21+ days-before-stale: 183
22+ days-before-close: 7
23+ operations-per-run: 30
24+ remove-stale-when-updated: true
25+ enable-statistics: true
26+ stale-issue-message: >
27+ ⏳ This issue has been inactive for 6 months. If it's still relevant, drop a comment below to keep it open.
28+ Otherwise, it will be auto-closed in 7 days.
29+ stale-pr-message: >
30+ ⏳ This PR has been inactive for 6 months. If it's still relevant, update it or remove the stale label.
31+ Otherwise, it will be auto-closed in 7 days.
32+ close-issue-message: >
33+ πŸ”’ This issue was auto-closed due to inactivity for over 6 months.
34+ close-pr-message: >
35+ πŸ”’ This PR was auto-closed due to inactivity for over 6 months.
36+ stale-issue-label: '⚰️ Stale'
37+ close-issue-label: 'πŸ•ΈοΈ Inactive'
38+ stale-pr-label: '⚰️ Stale'
39+ close-pr-label: 'πŸ•ΈοΈ Inactive'
40+ exempt-issue-labels: 'πŸ“Œ Keep Open'
41+ exempt-pr-labels: 'πŸ“Œ Keep Open'
42+
43+ await-user-response:
44+ name: Mark Issues/PRs Awaiting User Response
45+ runs-on: ubuntu-latest
46+ needs: mark-inactivity
47+
48+ steps:
49+ - name: Mark Issues/PRs Awaiting User Response
50+ # Close Stale Issues and PRs
51+ # https://github.com/marketplace/actions/close-stale-issues
52+ uses: actions/stale@v9
53+ with:
54+ repo-token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
55+ days-before-stale: 7
56+ days-before-close: 7
57+ operations-per-run: 30
58+ remove-stale-when-updated: true
59+ stale-issue-message: >
60+ ⚠️ Hey! We need some more info to move forward with this issue.
61+ Please provide the requested details in the next few days to keep this ticket open.
62+ close-issue-message: >
63+ πŸ”’ This issue was auto-closed due to no response from user.
64+ only-labels: '🚏 Awaiting User Response'
65+ labels-to-remove-when-unstale: '🚏 Awaiting User Response'
66+ stale-issue-label: 'πŸ›‘ No Response'
67+ close-issue-label: 'πŸ•ΈοΈ Inactive'
68+ exempt-issue-labels: '🚧 Alternative Exists'
69+
70+ alternative-exists:
71+ name: Mark Issues with Alternative Exists
72+ runs-on: ubuntu-latest
73+ needs: await-user-response
74+
75+ steps:
76+ - name: Mark Issues with Alternative Exists
77+ # Close Stale Issues and PRs
78+ # https://github.com/marketplace/actions/close-stale-issues
79+ uses: actions/stale@v9
80+ with:
81+ repo-token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
82+ days-before-stale: 7
83+ days-before-close: 7
84+ operations-per-run: 30
85+ remove-stale-when-updated: true
86+ stale-issue-message: >
87+ πŸ”„ An alternative solution has been provided for this issue.
88+ Did this solve your problem? If so, we'll go ahead and close it.
89+ If you still need help, drop a comment within the next 7 days to keep this open.
90+ close-issue-message: >
91+ βœ… Closing this issue due to no confirmation on the alternative solution.
92+ only-labels: '🚧 Alternative Exists'
93+ stale-issue-label: '🚏 Awaiting User Response'
94+ close-issue-label: 'πŸ•ΈοΈ Inactive'
95+ exempt-issue-labels: 'πŸ“Œ Keep Open'
.github/workflows/labeler.yml+0 -19
@@ -1,19 +0,0 @@
1-name: "Issue Labeler"
2-on:
3- issues:
4- types: [opened, edited]
5-
6-permissions:
7- issues: write
8- contents: read
9-
10-jobs:
11- triage:
12- runs-on: ubuntu-latest
13- steps:
14- - uses: github/issue-labeler@v3.4
15- with:
16- configuration-path: .github/labeler.yml
17-# not-before: 2020-01-15T02:54:32Z # optional and will result in any issues prior to this timestamp to be ignored.
18- enable-versioned-regex: 0
19- repo-token: ${{ github.token }}
19 \ No newline at end of file
.github/workflows/manage-pending-labels-closed.yml+0 -17
@@ -1,17 +0,0 @@
1-# When a new comment is added to an issue, if it had the Stale or Awaiting User Response labels, then those labels will be removed
2-
3-name: 🎯 Remove Pending Labels on Close
4-on:
5- issues:
6- types: [closed]
7-jobs:
8- remove-labels:
9- runs-on: ubuntu-latest
10- steps:
11- - name: Remove Labels when Closed
12- uses: actions-cool/issues-helper@v2
13- with:
14- actions: remove-labels
15- token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
16- issue-number: ${{ github.event.issue.number }}
17- labels: '🚏 Awaiting User Response,⚰️ Stale,πŸ‘€ Awaiting Maintainer Response'
17 \ No newline at end of file
.github/workflows/manage-pending-labels.yml+0 -42
@@ -1,42 +0,0 @@
1-# When a new comment is added to an issue, if it had the Stale or Awaiting User Response labels, then those labels will be removed
2-
3-name: 🎯 Add/ Remove Awaiting Response Labels
4-on:
5- issue_comment:
6- types: [created]
7-jobs:
8- remove-stale:
9- runs-on: ubuntu-latest
10- if: ${{ github.event.comment.author_association != 'COLLABORATOR' && github.event.comment.author_association != 'OWNER' }}
11- steps:
12- - name: Remove Stale labels when Updated
13- uses: actions-cool/issues-helper@v2
14- with:
15- actions: remove-labels
16- token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
17- issue-number: ${{ github.event.issue.number }}
18- labels: '🚏 Awaiting User Response,⚰️ Stale'
19-
20- add-awaiting-author:
21- runs-on: ubuntu-latest
22- if: ${{!github.event.issue.pull_request && github.event.comment.author_association != 'COLLABORATOR' && github.event.comment.author_association != 'OWNER' && github.event.issue.state == 'open' }}
23- steps:
24- - name: Add Awaiting Author labels when Updated
25- uses: actions-cool/issues-helper@v2
26- with:
27- actions: add-labels
28- token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
29- issue-number: ${{ github.event.issue.number }}
30- labels: 'πŸ‘€ Awaiting Maintainer Response'
31-
32- remove-awaiting-author:
33- runs-on: ubuntu-latest
34- if: ${{ github.event.comment.author_association == 'OWNER' }}
35- steps:
36- - name: Remove Awaiting Author labels when Updated
37- uses: actions-cool/issues-helper@v2
38- with:
39- actions: remove-labels
40- token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
41- issue-number: ${{ github.event.issue.number }}
42- labels: 'πŸ‘€ Awaiting Maintainer Response'
42 \ No newline at end of file
.github/workflows/on-close-handler.yml+23 -0
@@ -0,0 +1,23 @@
1+name: 🎯 Issues/PRs On Close Handler
2+
3+on:
4+ issues:
5+ types: [closed]
6+ pull_request_target:
7+ types: [closed]
8+
9+jobs:
10+ remove-labels:
11+ name: Remove Pending Labels on Close
12+ runs-on: ubuntu-latest
13+
14+ steps:
15+ - name: Remove Pending Labels on Close
16+ # πŸ€– Issues Helper
17+ # https://github.com/marketplace/actions/issues-helper
18+ uses: actions-cool/issues-helper@v3
19+ with:
20+ actions: remove-labels
21+ token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
22+ issue-number: ${{ github.event.issue.number || github.event.pull_request.number }}
23+ labels: '🚏 Awaiting User Response,πŸ§‘β€πŸ’» In Progress,πŸ“Œ Keep Open,🚫 Merge Conflicts,πŸ”¬ Needs Testing,πŸ”¨ Needs Work,⚰️ Stale,β›” Waiting For External/Upstream'
.github/workflows/on-open-handler.yml+50 -0
@@ -0,0 +1,50 @@
1+name: 🎯 Issues/PRs Open Handler
2+
3+on:
4+ issues:
5+ types: [opened]
6+ pull_request_target:
7+ types: [opened]
8+
9+jobs:
10+ label-maintainer:
11+ name: Label if Author is a Repo Maintainer
12+ runs-on: ubuntu-latest
13+
14+ steps:
15+ - name: Label if Author is a Repo Maintainer
16+ # GitHub Script
17+ # https://github.com/marketplace/actions/github-script
18+ uses: actions/github-script@v7
19+ with:
20+ script: |
21+ // Get basic info
22+ const { owner, repo } = context.repo;
23+ const payload = context.payload;
24+ // Determine if it's an issue or a pull request
25+ const eventData = payload.issue || payload.pull_request;
26+ const username = eventData.user.login;
27+ const issue_number = eventData.number;
28+
29+ // Get the collaborator permission level for the user
30+ const { data: permissionData } = await github.repos.getCollaboratorPermissionLevel({
31+ owner,
32+ repo,
33+ username,
34+ });
35+
36+ const permission = permissionData.permission;
37+ console.log(`User ${username} has permission level: ${permission}`);
38+
39+ // Check if user is an admin or has maintain permissions
40+ if (['admin', 'maintain'].includes(permission)) {
41+ console.log(`Adding "Maintainer" label to issue/PR #${issue_number}`);
42+ await github.issues.addLabels({
43+ owner,
44+ repo,
45+ issue_number,
46+ labels: ['πŸ‘· Maintainer'],
47+ });
48+ } else {
49+ console.log(`User ${username} is not a repo maintainer.`);
50+ }
.github/workflows/pr-auto-manager.yml+182 -0
@@ -0,0 +1,182 @@
1+name: 🎯 Pull Request Manager
2+
3+on:
4+ pull_request_target:
5+ types: [opened, synchronize, reopened, edited, labeled, unlabeled, closed]
6+ pull_request_review_comment:
7+ types: [created]
8+
9+jobs:
10+ label-by-size:
11+ name: Apply Label for PR Size
12+ runs-on: ubuntu-latest
13+
14+ steps:
15+ - name: Label PR Size
16+ # Pull Request Size Labeler
17+ # https://github.com/marketplace/actions/pull-request-size-labeler
18+ uses: codelytv/pr-size-labeler@v1
19+ with:
20+ GITHUB_TOKEN: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
21+ xs_label: '🟩 ⬀○○○○'
22+ xs_max_size: '20'
23+ s_label: '🟩 ⬀⬀○○○'
24+ s_max_size: '100'
25+ m_label: '🟨 ⬀⬀⬀○○'
26+ m_max_size: '500'
27+ l_label: '🟧 ⬀⬀⬀⬀○'
28+ l_max_size: '1000'
29+ xl_label: 'πŸŸ₯ ⬀⬀⬀⬀⬀'
30+ fail_if_xl: 'false'
31+ github_api_url: 'https://api.github.com'
32+ files_to_ignore: |
33+ "package-lock.json"
34+ "public/lib/*"
35+
36+ label-by-branches:
37+ name: Apply Labels Based on Branch Name and Target Branch
38+ runs-on: ubuntu-latest
39+ # Only label once when PR is created or branches are changed, to allow manual label removal
40+ if: github.event.action == 'opened' || (github.event.action == 'synchronize' && (github.event.changes.base || github.event.changes.head))
41+
42+ steps:
43+ - name: Apply Labels Based on Branch Name and Target Branch
44+ # Pull Request Labeler
45+ # https://github.com/marketplace/actions/labeler
46+ uses: actions/labeler@v5
47+ with:
48+ configuration-path: .github/pr-auto-labels-by-branch.yml
49+ repo-token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
50+
51+ label-by-files:
52+ name: Apply Labels Based on Changed Files
53+ runs-on: ubuntu-latest
54+
55+ steps:
56+ - name: Apply Labels Based on Changed Files
57+ # Pull Request Labeler
58+ # https://github.com/marketplace/actions/labeler
59+ uses: actions/labeler@v5
60+ with:
61+ configuration-path: .github/pr-auto-labels-by-files.yml
62+ repo-token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
63+
64+ remove-stale-label:
65+ name: Remove Stale Label on Comment
66+ runs-on: ubuntu-latest
67+ # Only runs when this is not done by the github actions bot
68+ if: github.actor != 'github-actions[bot]'
69+
70+ steps:
71+ - name: Remove Stale Label
72+ # πŸ€– Issues Helper
73+ # https://github.com/marketplace/actions/issues-helper
74+ uses: actions-cool/issues-helper@v3
75+ with:
76+ actions: 'remove-labels'
77+ token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
78+ issue-number: ${{ github.event.pull_request.number }}
79+ labels: '⚰️ Stale'
80+
81+ check-merge-blocking-labels:
82+ name: Check Merge Blocking Labels
83+ needs: [label-by-branches, label-by-files]
84+ runs-on: ubuntu-latest
85+ # Run, even if the previous jobs were skipped/failed
86+ if: always()
87+
88+ steps:
89+ - name: Check Merge Blocking
90+ # GitHub Script
91+ # https://github.com/marketplace/actions/github-scriptLabels
92+ id: label-check
93+ uses: actions/github-script@v7
94+ with:
95+ script: |
96+ const prLabels = context.payload.pull_request.labels.map(label => label.name);
97+ const blockingLabels = [
98+ "β›” Don't Merge",
99+ "πŸ”¨ Needs Work",
100+ "πŸ”¬ Needs Testing",
101+ "β›” Waiting For External/Upstream",
102+ "❗ Against Release Branch",
103+ "πŸ’₯πŸ’£ Breaking Changes"
104+ ];
105+ const hasBlockingLabel = prLabels.some(label => blockingLabels.includes(label));
106+
107+ if (hasBlockingLabel) {
108+ console.log("Blocking label detected. Setting warning status.");
109+ await github.rest.checks.create({
110+ owner: context.repo.owner,
111+ repo: context.repo.repo,
112+ name: "PR Label Warning",
113+ head_sha: context.payload.pull_request.head.sha,
114+ status: "completed",
115+ conclusion: "neutral",
116+ output: {
117+ title: "Potential Merge Issue",
118+ summary: "This PR has a merge-blocking label. Proceed with caution."
119+ }
120+ });
121+ } else {
122+ console.log("No merge-blocking labels found.");
123+ }
124+
125+ write-auto-comments:
126+ name: Post PR Comments Based on Labels
127+ needs: [label-by-size, label-by-branches, label-by-files]
128+ runs-on: ubuntu-latest
129+ # Run, even if the previous jobs were skipped/failed
130+ if: always()
131+
132+ steps:
133+ - name: Checkout Repository
134+ # Checkout
135+ # https://github.com/marketplace/actions/checkout
136+ uses: actions/checkout@v4
137+
138+ - name: Post PR Comments Based on Labels
139+ # Label Commenter for PRs
140+ # https://github.com/marketplace/actions/label-commenter
141+ uses: peaceiris/actions-label-commenter@v1
142+ with:
143+ config_file: .github/pr-auto-comments.yml
144+ github_token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
145+
146+ # This runs on merged PRs to staging, reading the PR body and directly linked issues. Check `issues-updates-on-merge.yml`:`update-linked-issues` for commit-based updates.
147+ update-linked-issues:
148+ name: Update Issues on Staging Merge
149+ runs-on: ubuntu-latest
150+ if: github.event.pull_request.merged == true && github.event.pull_request.base.ref == 'staging'
151+
152+ steps:
153+ - name: Extract Linked Issues From PR Description
154+ id: extract_issues
155+ run: |
156+ ISSUES=$(jq -r '.pull_request.body' "$GITHUB_EVENT_PATH" | grep -oiE '(close|closes|closed|fix|fixes|fixed|resolve|resolves|resolved) #([0-9]+)' | awk '{print $2}' | tr -d '#' | jq -R -s -c 'split("\n")[:-1]')
157+ echo "issues=$ISSUES" >> $GITHUB_ENV
158+
159+ - name: Fetch Directly Linked Issues
160+ id: fetch_linked_issues
161+ run: |
162+ PR_NUMBER=${{ github.event.pull_request.number }}
163+ REPO=${{ github.repository }}
164+ API_URL="https://api.github.com/repos/$REPO/pulls/$PR_NUMBER/issues"
165+ ISSUES=$(curl -s -H "Authorization: token ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}" "$API_URL" | jq -r '.[].number' | jq -R -s -c 'split("\n")[:-1]')
166+ echo "linked_issues=$ISSUES" >> $GITHUB_ENV
167+
168+ - name: Merge Issue Lists
169+ id: merge_issues
170+ run: |
171+ ISSUES=$(jq -c -n --argjson a "$issues" --argjson b "$linked_issues" '$a + $b | unique')
172+ echo "final_issues=$ISSUES" >> $GITHUB_ENV
173+
174+ - name: Label Linked Issues
175+ id: label_linked_issues
176+ env:
177+ GH_TOKEN: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
178+ run: |
179+ for ISSUE in $(echo $final_issues | jq -r '.[]'); do
180+ echo "Updating issue #$ISSUE"
181+ gh issue edit $ISSUE -R ${{ github.repository }} --add-label "βœ… Done (staging)"
182+ done
.github/workflows/pr-check-merge-conflicts.yaml+24 -0
@@ -0,0 +1,24 @@
1+name: 🎯 Push Handler
2+
3+on:
4+ # So that PRs touching the same files as the push are updated
5+ push:
6+ # So that the `dirtyLabel` is removed if conflicts are resolved
7+ pull_request_target:
8+ types: [synchronize]
9+
10+jobs:
11+ check-merge-conflicts:
12+ name: Check Merge Conflicts
13+ runs-on: ubuntu-latest
14+
15+ steps:
16+ - name: Check Merge Conflicts
17+ # Label Conflicting Pull Requests
18+ # https://github.com/marketplace/actions/label-conflicting-pull-requests
19+ uses: eps1lon/actions-label-merge-conflict@v3
20+ with:
21+ dirtyLabel: '🚫 Merge Conflicts'
22+ repoToken: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
23+ commentOnDirty: >
24+ ⚠️ This PR has conflicts that need to be resolved before it can be merged.