├── .nvmrc
├── .gitignore
├── dist
└── package.json
├── assets
└── screenshot.png
├── .prettierrc.yml
├── .github
├── FUNDING.yml
└── workflows
│ └── release.yml
├── LICENSE
├── src
├── utils.js
├── schema.js
└── index.js
├── action.yml
├── package.json
├── README.md
└── CHANGELOG.md
/.nvmrc:
--------------------------------------------------------------------------------
1 | 20.9.0
2 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules
2 | .assets
3 |
--------------------------------------------------------------------------------
/dist/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "type": "module"
3 | }
4 |
--------------------------------------------------------------------------------
/assets/screenshot.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dessant/support-requests/HEAD/assets/screenshot.png
--------------------------------------------------------------------------------
/.prettierrc.yml:
--------------------------------------------------------------------------------
1 | singleQuote: true
2 | bracketSpacing: false
3 | arrowParens: 'avoid'
4 | trailingComma: 'none'
5 |
--------------------------------------------------------------------------------
/.github/FUNDING.yml:
--------------------------------------------------------------------------------
1 | github: dessant
2 | patreon: dessant
3 | custom:
4 | - https://armin.dev/go/paypal
5 | - https://armin.dev/go/bitcoin
6 |
--------------------------------------------------------------------------------
/.github/workflows/release.yml:
--------------------------------------------------------------------------------
1 | name: Create release
2 |
3 | on:
4 | push:
5 | tags:
6 | - 'v[0-9]+.[0-9]+.[0-9]+'
7 |
8 | jobs:
9 | release:
10 | name: Release on GitHub
11 | runs-on: ubuntu-22.04
12 | permissions:
13 | contents: write
14 | steps:
15 | - name: Create GitHub release
16 | uses: softprops/action-gh-release@v1
17 | with:
18 | tag_name: ${{ github.ref_name }}
19 | name: ${{ github.ref_name }}
20 | body: >
21 | Learn more about this release from the [changelog](https://github.com/dessant/support-requests/blob/main/CHANGELOG.md#changelog).
22 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2017-2023 Armin Sebastian
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/src/utils.js:
--------------------------------------------------------------------------------
1 | import core from '@actions/core';
2 | import github from '@actions/github';
3 | import {retry} from '@octokit/plugin-retry';
4 | import {throttling} from '@octokit/plugin-throttling';
5 |
6 | import {schema} from './schema.js';
7 |
8 | function getConfig() {
9 | const input = Object.fromEntries(
10 | Object.keys(schema.describe().keys).map(item => [item, core.getInput(item)])
11 | );
12 |
13 | const {error, value} = schema.validate(input, {abortEarly: false});
14 | if (error) {
15 | throw error;
16 | }
17 |
18 | return value;
19 | }
20 |
21 | function getClient(token) {
22 | const requestRetries = 3;
23 |
24 | const rateLimitCallback = function (
25 | retryAfter,
26 | options,
27 | octokit,
28 | retryCount
29 | ) {
30 | core.info(
31 | `Request quota exhausted for request ${options.method} ${options.url}`
32 | );
33 |
34 | if (retryCount < requestRetries) {
35 | core.info(`Retrying after ${retryAfter} seconds`);
36 |
37 | return true;
38 | }
39 | };
40 |
41 | const options = {
42 | request: {retries: requestRetries},
43 | throttle: {
44 | onSecondaryRateLimit: rateLimitCallback,
45 | onRateLimit: rateLimitCallback
46 | }
47 | };
48 |
49 | return github.getOctokit(token, options, retry, throttling);
50 | }
51 |
52 | export {getConfig, getClient};
53 |
--------------------------------------------------------------------------------
/src/schema.js:
--------------------------------------------------------------------------------
1 | import Joi from 'joi';
2 |
3 | const extendedJoi = Joi.extend(joi => {
4 | return {
5 | type: 'closeReason',
6 | base: joi.string(),
7 | coerce: {
8 | from: 'string',
9 | method(value, helpers) {
10 | value = value.trim();
11 | if (value === 'not planned') {
12 | value = 'not_planned';
13 | }
14 |
15 | return {value};
16 | }
17 | }
18 | };
19 | });
20 |
21 | const schema = Joi.object({
22 | 'github-token': Joi.string().trim().max(100),
23 |
24 | 'support-label': Joi.string().trim().max(50).default('support'),
25 |
26 | 'issue-comment': Joi.string()
27 | .trim()
28 | .max(10000)
29 | .allow('')
30 | .default(
31 | ':wave: @{issue-author}, we use the issue tracker exclusively ' +
32 | 'for bug reports and feature requests. However, this issue appears ' +
33 | 'to be a support request. Please use our support channels ' +
34 | 'to get help with the project.'
35 | ),
36 |
37 | 'close-issue': Joi.boolean().default(true),
38 |
39 | 'issue-close-reason': extendedJoi
40 | .closeReason()
41 | .valid('completed', 'not_planned')
42 | .default('not planned'),
43 |
44 | 'lock-issue': Joi.boolean().default(true),
45 |
46 | 'issue-lock-reason': Joi.string()
47 | .valid('resolved', 'off-topic', 'too heated', 'spam', '')
48 | .default('off-topic')
49 | });
50 |
51 | export {schema};
52 |
--------------------------------------------------------------------------------
/action.yml:
--------------------------------------------------------------------------------
1 | name: 'Support Requests'
2 | description: 'Comment on and close issues labeled as support requests'
3 | author: 'Armin Sebastian'
4 | inputs:
5 | github-token:
6 | description: 'GitHub access token'
7 | default: '${{ github.token }}'
8 | support-label:
9 | description: 'Label used to mark issues as support requests'
10 | default: 'support'
11 | issue-comment:
12 | description: 'Comment to post on issues marked as support requests, `{issue-author}` is an optional placeholder'
13 | default: >
14 | :wave: @{issue-author}, we use the issue tracker exclusively for bug reports
15 | and feature requests. However, this issue appears to be a support request.
16 | Please use our support channels to get help with the project.
17 | close-issue:
18 | description: 'Close issues marked as support requests, value must be either `true` or `false`'
19 | default: true
20 | issue-close-reason:
21 | description: 'Reason for closing issues, value must be either `completed` or `not planned`'
22 | default: 'not planned'
23 | lock-issue:
24 | description: Lock issues marked as support requests, value must be either `true` or `false`'
25 | default: false
26 | issue-lock-reason:
27 | description: 'Reason for locking issues, value must be one of `resolved`, `off-topic`, `too heated` or `spam`'
28 | default: 'off-topic'
29 | runs:
30 | using: 'node20'
31 | main: 'dist/index.js'
32 | branding:
33 | icon: 'help-circle'
34 | color: 'purple'
35 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "support-requests",
3 | "version": "4.0.0",
4 | "description": "A GitHub Action that comments on and closes issues labeled as support requests.",
5 | "author": "Armin Sebastian",
6 | "license": "MIT",
7 | "homepage": "https://github.com/dessant/support-requests",
8 | "repository": {
9 | "url": "https://github.com/dessant/support-requests.git",
10 | "type": "git"
11 | },
12 | "bugs": {
13 | "url": "https://github.com/dessant/support-requests/issues"
14 | },
15 | "type": "module",
16 | "main": "src/index.js",
17 | "scripts": {
18 | "build": "ncc build src/index.js -o dist",
19 | "update": "ncu --upgrade",
20 | "release": "commit-and-tag-version",
21 | "push": "git push --tags origin main"
22 | },
23 | "dependencies": {
24 | "@actions/core": "^1.10.1",
25 | "@actions/github": "^6.0.0",
26 | "@octokit/plugin-throttling": "^8.1.2",
27 | "@octokit/plugin-retry": "^6.0.1",
28 | "joi": "^17.11.0"
29 | },
30 | "devDependencies": {
31 | "@vercel/ncc": "^0.38.1",
32 | "commit-and-tag-version": "^12.0.0",
33 | "npm-check-updates": "^16.14.6",
34 | "prettier": "^3.1.0"
35 | },
36 | "engines": {
37 | "node": ">=20.0.0"
38 | },
39 | "keywords": [
40 | "github",
41 | "issues",
42 | "support",
43 | "label",
44 | "support issues",
45 | "label issues",
46 | "close issues",
47 | "automation",
48 | "github actions",
49 | "project management",
50 | "bot"
51 | ],
52 | "private": true
53 | }
54 |
--------------------------------------------------------------------------------
/src/index.js:
--------------------------------------------------------------------------------
1 | import core from '@actions/core';
2 | import github from '@actions/github';
3 |
4 | import {getConfig, getClient} from './utils.js';
5 |
6 | async function run() {
7 | try {
8 | const config = getConfig();
9 | const client = getClient(config['github-token']);
10 |
11 | const app = new App(config, client);
12 | if (github.context.payload.action === 'labeled') {
13 | await app.labeled();
14 | } else if (github.context.payload.action === 'unlabeled') {
15 | await app.unlabeled();
16 | } else if (github.context.payload.action === 'reopened') {
17 | await app.reopened();
18 | }
19 | } catch (err) {
20 | core.setFailed(err);
21 | }
22 | }
23 |
24 | class App {
25 | constructor(config, client) {
26 | this.config = config;
27 | this.client = client;
28 | }
29 |
30 | async labeled() {
31 | if (github.context.payload.label.name !== this.config['support-label']) {
32 | return;
33 | }
34 |
35 | const issueData = github.context.payload.issue;
36 | const issue = {...github.context.repo, issue_number: issueData.number};
37 |
38 | const comment = this.config['issue-comment'];
39 | if (comment) {
40 | core.debug(`Commenting (issue: ${issue.issue_number})`);
41 |
42 | const commentBody = comment.replace(
43 | /{issue-author}/,
44 | issueData.user.login
45 | );
46 | await this.ensureUnlock(
47 | issue,
48 | {
49 | active: issueData.locked,
50 | reason: issueData.active_lock_reason,
51 | restoreLock: !this.config['lock-issue']
52 | },
53 | () =>
54 | this.client.rest.issues
55 | .createComment({...issue, body: commentBody})
56 | .catch(err => core.warning(err.toString()))
57 | );
58 | }
59 |
60 | const closeReason = this.config['issue-close-reason'];
61 | if (
62 | this.config['close-issue'] &&
63 | (issueData.state === 'open' || issueData.state_reason !== closeReason)
64 | ) {
65 | core.debug(`Closing (issue: ${issue.issue_number})`);
66 |
67 | await this.client.rest.issues.update({
68 | ...issue,
69 | state: 'closed',
70 | state_reason: closeReason
71 | });
72 | }
73 |
74 | const lockReason = this.config['issue-lock-reason'] || null;
75 | if (
76 | this.config['lock-issue'] &&
77 | (!issueData.locked || issueData.active_lock_reason !== lockReason)
78 | ) {
79 | core.debug(`Locking (issue: ${issue.issue_number})`);
80 |
81 | const params = {...issue};
82 |
83 | if (lockReason) {
84 | params.lock_reason = lockReason;
85 | }
86 |
87 | // Lock reason is not updated when issue is locked
88 | // Issue is unlocked before posting comment
89 | if (issueData.active_lock_reason !== lockReason && !comment) {
90 | await this.client.rest.issues.unlock(issue);
91 | }
92 |
93 | await this.client.rest.issues.lock(params);
94 | }
95 | }
96 |
97 | async unlabeled() {
98 | if (github.context.payload.label.name !== this.config['support-label']) {
99 | return;
100 | }
101 |
102 | const issueData = github.context.payload.issue;
103 | const issue = {...github.context.repo, issue_number: issueData.number};
104 |
105 | if (this.config['close-issue'] && issueData.state === 'closed') {
106 | core.debug(`Reopening (issue: ${issue.issue_number})`);
107 |
108 | await this.client.rest.issues.update({...issue, state: 'open'});
109 | }
110 |
111 | if (this.config['lock-issue'] && issueData.locked) {
112 | core.debug(`Unlocking (issue: ${issue.issue_number})`);
113 |
114 | await this.client.rest.issues.unlock(issue);
115 | }
116 | }
117 |
118 | async reopened() {
119 | const issueData = github.context.payload.issue;
120 | const supportLabel = this.config['support-label'];
121 |
122 | if (!issueData.labels.map(label => label.name).includes(supportLabel)) {
123 | return;
124 | }
125 |
126 | const issue = {...github.context.repo, issue_number: issueData.number};
127 |
128 | core.debug(`Unlabeling (issue: ${issue.issue_number})`);
129 |
130 | await this.client.rest.issues.removeLabel({...issue, name: supportLabel});
131 |
132 | if (this.config['lock-issue'] && issueData.locked) {
133 | core.debug(`Unlocking (issue: ${issue.issue_number})`);
134 |
135 | await this.client.rest.issues.unlock(issue);
136 | }
137 | }
138 |
139 | async ensureUnlock(issue, lock, action) {
140 | if (lock.active) {
141 | if (!lock.hasOwnProperty('reason')) {
142 | const {data: issueData} = await this.client.rest.issues.get(issue);
143 | lock.reason = issueData.active_lock_reason;
144 | }
145 |
146 | await this.client.rest.issues.unlock(issue);
147 |
148 | let actionError;
149 | try {
150 | await action();
151 | } catch (err) {
152 | actionError = err;
153 | }
154 |
155 | if (lock.restoreLock) {
156 | if (lock.reason) {
157 | issue = {...issue, lock_reason: lock.reason};
158 | }
159 |
160 | await this.client.rest.issues.lock(issue);
161 | }
162 |
163 | if (actionError) {
164 | throw actionError;
165 | }
166 | } else {
167 | await action();
168 | }
169 | }
170 | }
171 |
172 | run();
173 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Support Requests
2 |
3 | Support Requests is a GitHub Action that comments on
4 | and closes issues labeled as support requests.
5 |
6 | 
7 |
8 | ## Supporting the Project
9 |
10 | The continued development of Support Requests is made possible
11 | thanks to the support of awesome backers. If you'd like to join them,
12 | please consider contributing with
13 | [Patreon](https://armin.dev/go/patreon?pr=support-requests&src=repo),
14 | [PayPal](https://armin.dev/go/paypal?pr=support-requests&src=repo) or
15 | [Bitcoin](https://armin.dev/go/bitcoin?pr=support-requests&src=repo).
16 |
17 | ## Description
18 |
19 | Support Requests is a specialized version of
20 | [Label Actions](https://github.com/dessant/label-actions),
21 | and it can perform the following actions when an issue
22 | is labeled, unlabeled or reopened:
23 |
24 | - The support label is added: leave a comment, close and lock the issue
25 | - The support label is removed: reopen and unlock the issue
26 | - The issue is reopened: remove the support label, unlock the issue
27 |
28 | ## Usage
29 |
30 | Create the `support-requests.yml` workflow file in the `.github/workflows`
31 | directory, use one of the [example workflows](#examples) to get started.
32 |
33 | ### Inputs
34 |
35 | The action can be configured using [input parameters](https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepswith).
36 |
37 |
38 | - **`github-token`**
39 | - GitHub access token, value must be `${{ github.token }}` or an encrypted
40 | secret that contains a [personal access token](#using-a-personal-access-token)
41 | - Optional, defaults to `${{ github.token }}`
42 | - **`support-label`**
43 | - Label used to mark issues as support requests
44 | - Optional, defaults to `support`
45 | - **`issue-comment`**
46 | - Comment to post on issues marked as support requests,
47 | `{issue-author}` is an optional placeholder
48 | - Optional, defaults to `:wave: @{issue-author}, we use the issue tracker
49 | exclusively for bug reports and feature requests. However, this issue
50 | appears to be a support request. Please use our support channels
51 | to get help with the project.`
52 | - **`close-issue`**
53 | - Close issues marked as support requests,
54 | value must be either `true` or `false`
55 | - Optional, defaults to `true`
56 | - **`issue-close-reason`**
57 | - Reason for closing issues, value must be
58 | either `completed` or `not planned`
59 | - Optional, defaults to `not planned`
60 | - **`lock-issue`**
61 | - Lock issues marked as support requests,
62 | value must be either `true` or `false`
63 | - Optional, defaults to `false`
64 | - **`issue-lock-reason`**
65 | - Reason for locking issues, value must be one
66 | of `resolved`, `off-topic`, `too heated` or `spam`
67 | - Optional, defaults to `off-topic`
68 |
69 | ## Examples
70 |
71 | The following workflow will comment on and close issues
72 | marked as support requests.
73 |
74 |
75 | ```yaml
76 | name: 'Support Requests'
77 |
78 | on:
79 | issues:
80 | types: [labeled, unlabeled, reopened]
81 |
82 | permissions:
83 | issues: write
84 |
85 | jobs:
86 | action:
87 | runs-on: ubuntu-latest
88 | steps:
89 | - uses: dessant/support-requests@v4
90 | ```
91 |
92 | ### Available input parameters
93 |
94 | This workflow declares all the available input parameters of the action
95 | and their default values. Any of the parameters can be omitted.
96 |
97 |
98 | ```yaml
99 | name: 'Support Requests'
100 |
101 | on:
102 | issues:
103 | types: [labeled, unlabeled, reopened]
104 |
105 | permissions:
106 | issues: write
107 |
108 | jobs:
109 | action:
110 | runs-on: ubuntu-latest
111 | steps:
112 | - uses: dessant/support-requests@v4
113 | with:
114 | github-token: ${{ github.token }}
115 | support-label: 'support'
116 | issue-comment: >
117 | :wave: @{issue-author}, we use the issue tracker exclusively
118 | for bug reports and feature requests. However, this issue appears
119 | to be a support request. Please use our support channels
120 | to get help with the project.
121 | close-issue: true
122 | issue-close-reason: 'not planned'
123 | lock-issue: false
124 | issue-lock-reason: 'off-topic'
125 | ```
126 |
127 | ### Using a personal access token
128 |
129 | The action uses an installation access token by default to interact with GitHub.
130 | You may also authenticate with a personal access token to perform actions
131 | as a GitHub user instead of the `github-actions` app.
132 |
133 | Create a [personal access token](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens#creating-a-personal-access-token-classic)
134 | with the `repo` or `public_repo` scopes enabled, and add the token as an
135 | [encrypted secret](https://docs.github.com/en/actions/security-guides/using-secrets-in-github-actions#creating-secrets-for-a-repository)
136 | for the repository or organization, then provide the action with the secret
137 | using the `github-token` input parameter.
138 |
139 |
140 | ```yaml
141 | steps:
142 | - uses: dessant/support-requests@v4
143 | with:
144 | github-token: ${{ secrets.PERSONAL_ACCESS_TOKEN }}
145 | ```
146 |
147 | ## License
148 |
149 | Copyright (c) 2017-2023 Armin Sebastian
150 |
151 | This software is released under the terms of the MIT License.
152 | See the [LICENSE](LICENSE) file for further information.
153 |
--------------------------------------------------------------------------------
/CHANGELOG.md:
--------------------------------------------------------------------------------
1 | # Changelog
2 |
3 | All notable changes to this project will be documented in this file. See [commit-and-tag-version](https://github.com/absolute-version/commit-and-tag-version) for commit guidelines.
4 |
5 | ## [4.0.0](https://github.com/dessant/support-requests/compare/v3.0.0...v4.0.0) (2023-11-15)
6 |
7 |
8 | ### ⚠ BREAKING CHANGES
9 |
10 | * the action now requires Node.js 20
11 |
12 | ### Features
13 |
14 | * set close reason ([cb26bc2](https://github.com/dessant/support-requests/commit/cb26bc2f96dccbf470d41a582ba8815e262928fa)), closes [#10](https://github.com/dessant/support-requests/issues/10)
15 |
16 |
17 | ### Bug Fixes
18 |
19 | * always apply close and lock reason ([7e8888e](https://github.com/dessant/support-requests/commit/7e8888e8b42b2ea7092921e6f6997484c8cb8366))
20 | * retry and throttle GitHub API requests ([2755608](https://github.com/dessant/support-requests/commit/2755608ece89dbb09f6d5d4e89ff0d3cb7440733))
21 | * update dependencies ([008bb20](https://github.com/dessant/support-requests/commit/008bb205a4a418c16886a3aa05ea457c3038e08c))
22 |
23 | ## [3.0.0](https://github.com/dessant/support-requests/compare/v2.1.2...v3.0.0) (2022-12-04)
24 |
25 |
26 | ### ⚠ BREAKING CHANGES
27 |
28 | * the action now requires Node.js 16
29 |
30 | ### Bug Fixes
31 |
32 | * update dependencies ([98a49e5](https://github.com/dessant/support-requests/commit/98a49e5fe14d2ac577c5040929acade12296b906))
33 | * update docs ([d40910d](https://github.com/dessant/support-requests/commit/d40910dc927308b57f739e1208a98dc383a7c33e))
34 |
35 | ### [2.1.2](https://github.com/dessant/support-requests/compare/v2.1.1...v2.1.2) (2021-10-02)
36 |
37 | ### [2.1.1](https://github.com/dessant/support-requests/compare/v2.1.0...v2.1.1) (2021-07-09)
38 |
39 |
40 | ### Bug Fixes
41 |
42 | * update GitHub API calls ([fa1e92b](https://github.com/dessant/support-requests/commit/fa1e92b447253f0739c784bec76cff1ffca26a74))
43 |
44 | ## [2.1.0](https://github.com/dessant/support-requests/compare/v2.0.1...v2.1.0) (2021-07-09)
45 |
46 |
47 | ### Features
48 |
49 | * default `github-token` to `github.token` ([#7](https://github.com/dessant/support-requests/issues/7)) ([731cce0](https://github.com/dessant/support-requests/commit/731cce00ca4b42a6ffd5daf63d11386d592c6567))
50 | * document the use of personal access tokens ([6ba0377](https://github.com/dessant/support-requests/commit/6ba0377537d5719b6b907feabd5e5e3057321cee))
51 |
52 |
53 | ### Bug Fixes
54 |
55 | * declare required permissions ([692a08a](https://github.com/dessant/support-requests/commit/692a08a4e543e181bc7feb42e2c7c7fe1b3c9d08))
56 | * lock temporarily unlocked issues even after an error ([182adbd](https://github.com/dessant/support-requests/commit/182adbde03cf78d5a21b696ed2023a2c3d7197c7))
57 |
58 | ### [2.0.1](https://github.com/dessant/support-requests/compare/v2.0.0...v2.0.1) (2021-01-01)
59 |
60 |
61 | ### Bug Fixes
62 |
63 | * update dependencies ([f502ca6](https://github.com/dessant/support-requests/commit/f502ca66a0381e462f29149e7e0b41eae901fc61))
64 |
65 | ## [2.0.0](https://github.com/dessant/support-requests/compare/v1.0.1...v2.0.0) (2020-08-24)
66 |
67 |
68 | ### ⚠ BREAKING CHANGES
69 |
70 | * The deployment method and configuration options have changed.
71 |
72 | ### Features
73 |
74 | * move to GitHub Actions ([4777aa0](https://github.com/dessant/support-requests/commit/4777aa0377f867dbeb97eccd63414255a1fc739a))
75 |
76 | ### [1.0.1](https://github.com/dessant/support-requests/compare/v1.0.0...v1.0.1) (2019-10-25)
77 |
78 |
79 | ### Bug Fixes
80 |
81 | * update dependencies ([7372f4f](https://github.com/dessant/support-requests/commit/7372f4f530e0c33f1d20a91ec3ee54adf137ea35))
82 |
83 | ## [1.0.0](https://github.com/dessant/support-requests/compare/v0.4.3...v1.0.0) (2019-06-10)
84 |
85 |
86 | ### Features
87 |
88 | * update dependencies ([64530c9](https://github.com/dessant/support-requests/commit/64530c9))
89 |
90 |
91 | ### BREAKING CHANGES
92 |
93 | * probot < 9.2.13 no longer supported.
94 |
95 |
96 |
97 |
98 | ## [0.4.3](https://github.com/dessant/support-requests/compare/v0.4.2...v0.4.3) (2019-01-20)
99 |
100 |
101 | ### Bug Fixes
102 |
103 | * apply stricter config validation ([c5b97f4](https://github.com/dessant/support-requests/commit/c5b97f4))
104 |
105 |
106 |
107 |
108 | ## [0.4.2](https://github.com/dessant/support-requests/compare/v0.4.1...v0.4.2) (2018-10-03)
109 |
110 |
111 | ### Bug Fixes
112 |
113 | * allow latest version of node ([df959cb](https://github.com/dessant/support-requests/commit/df959cb))
114 |
115 |
116 |
117 |
118 | ## [0.4.1](https://github.com/dessant/support-requests/compare/v0.4.0...v0.4.1) (2018-09-26)
119 |
120 |
121 | ### Bug Fixes
122 |
123 | * allow more versions of node to be used ([7481973](https://github.com/dessant/support-requests/commit/7481973))
124 |
125 |
126 |
127 |
128 | # [0.4.0](https://github.com/dessant/support-requests/compare/v0.3.1...v0.4.0) (2018-07-23)
129 |
130 |
131 | ### Features
132 |
133 | * notify maintainers about configuration errors ([6886c26](https://github.com/dessant/support-requests/commit/6886c26))
134 |
135 |
136 |
137 |
138 | ## [0.3.1](https://github.com/dessant/support-requests/compare/v0.3.0...v0.3.1) (2018-06-27)
139 |
140 |
141 |
142 |
143 | # [0.3.0](https://github.com/dessant/support-requests/compare/v0.2.1...v0.3.0) (2018-06-24)
144 |
145 |
146 | ### Bug Fixes
147 |
148 | * account for missing label object when label is removed ([eb1e76d](https://github.com/dessant/support-requests/commit/eb1e76d))
149 | * add `_extends` option to config schema ([62d0c05](https://github.com/dessant/support-requests/commit/62d0c05))
150 |
151 |
152 | ### Features
153 |
154 | * add option for setting lock reason ([e91b1c8](https://github.com/dessant/support-requests/commit/e91b1c8))
155 | * add support for mentioning the issue author ([b43e76e](https://github.com/dessant/support-requests/commit/b43e76e))
156 | * also comment when issue is locked and set lock reason ([67fad24](https://github.com/dessant/support-requests/commit/67fad24))
157 | * extend settings from a different repository ([6affa95](https://github.com/dessant/support-requests/commit/6affa95))
158 |
159 |
160 |
161 |
162 | ## [0.2.1](https://github.com/dessant/support-requests/compare/v0.2.0...v0.2.1) (2018-06-01)
163 |
164 |
165 | ### Bug Fixes
166 |
167 | * set main module path ([e9f828f](https://github.com/dessant/support-requests/commit/e9f828f))
168 |
169 |
170 |
171 |
172 | # [0.2.0](https://github.com/dessant/support-requests/compare/v0.1.2...v0.2.0) (2018-05-06)
173 |
174 |
175 | ### Features
176 |
177 | * validate config options ([2833846](https://github.com/dessant/support-requests/commit/2833846))
178 |
179 |
180 |
181 |
182 | ## [0.1.2](https://github.com/dessant/support-requests/compare/v0.1.1...v0.1.2) (2017-11-12)
183 |
184 |
185 | ### Bug Fixes
186 |
187 | * comment only if issue is not locked ([a68e322](https://github.com/dessant/support-requests/commit/a68e322))
188 |
189 |
190 |
191 |
192 | ## [0.1.1](https://github.com/dessant/support-requests/compare/v0.1.0...v0.1.1) (2017-11-11)
193 |
194 |
195 | ### Bug Fixes
196 |
197 | * set exact node and npm versions for Glitch deployment ([cbd8374](https://github.com/dessant/support-requests/commit/cbd8374))
198 |
199 |
200 |
201 |
202 | # 0.1.0 (2017-11-03)
203 |
--------------------------------------------------------------------------------