From 78bc0df35966c00cf820e54035dd7d103a653f21 Mon Sep 17 00:00:00 2001 From: ebndev <164093511+ebndev@users.noreply.github.com> Date: Fri, 23 Aug 2024 12:10:31 -0700 Subject: [PATCH 01/91] Update general.yml --- .github/DISCUSSION_TEMPLATE/general.yml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/.github/DISCUSSION_TEMPLATE/general.yml b/.github/DISCUSSION_TEMPLATE/general.yml index 71f42bc02..94fe5251a 100644 --- a/.github/DISCUSSION_TEMPLATE/general.yml +++ b/.github/DISCUSSION_TEMPLATE/general.yml @@ -1,5 +1,11 @@ -labels: [general] +labels: [General] body: +- type: markdown + attributes: + value: + ⚠️ Please note: flagged accounts, account takeovers, billing issues, and two-factor authentication recovery can only be resolved via your [GitHub Support](https://support.github.com/contact) ticket. ⚠️ + + Community Discussions team members are unable to assist with nor escalate your ticket, but we can assure you it is in the right place. It will be answered in the order it was received based on our team's resources and the amount of tickets ahead of yours. - type: dropdown attributes: label: Select Topic Area From 69a725c1311cd3502a13e35cc83e5065da6cc24a Mon Sep 17 00:00:00 2001 From: ebndev <164093511+ebndev@users.noreply.github.com> Date: Fri, 23 Aug 2024 12:12:19 -0700 Subject: [PATCH 02/91] Update general.yml --- .github/DISCUSSION_TEMPLATE/general.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/DISCUSSION_TEMPLATE/general.yml b/.github/DISCUSSION_TEMPLATE/general.yml index 94fe5251a..59827b8c5 100644 --- a/.github/DISCUSSION_TEMPLATE/general.yml +++ b/.github/DISCUSSION_TEMPLATE/general.yml @@ -3,7 +3,7 @@ body: - type: markdown attributes: value: - ⚠️ Please note: flagged accounts, account takeovers, billing issues, and two-factor authentication recovery can only be resolved via your [GitHub Support](https://support.github.com/contact) ticket. ⚠️ + ⚠️ This Community is not a support forum. Flagged accounts, account takeovers, billing issues, and two-factor authentication recovery can only be resolved via your [GitHub Support](https://support.github.com/contact) ticket. ⚠️ Community Discussions team members are unable to assist with nor escalate your ticket, but we can assure you it is in the right place. It will be answered in the order it was received based on our team's resources and the amount of tickets ahead of yours. - type: dropdown From 26246d295ab63e88d1aa908b960ec1d489515e30 Mon Sep 17 00:00:00 2001 From: ebndev <164093511+ebndev@users.noreply.github.com> Date: Tue, 27 Aug 2024 13:24:10 -0700 Subject: [PATCH 03/91] Update general.yml --- .github/DISCUSSION_TEMPLATE/general.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.github/DISCUSSION_TEMPLATE/general.yml b/.github/DISCUSSION_TEMPLATE/general.yml index 59827b8c5..299e57208 100644 --- a/.github/DISCUSSION_TEMPLATE/general.yml +++ b/.github/DISCUSSION_TEMPLATE/general.yml @@ -3,9 +3,7 @@ body: - type: markdown attributes: value: - ⚠️ This Community is not a support forum. Flagged accounts, account takeovers, billing issues, and two-factor authentication recovery can only be resolved via your [GitHub Support](https://support.github.com/contact) ticket. ⚠️ - - Community Discussions team members are unable to assist with nor escalate your ticket, but we can assure you it is in the right place. It will be answered in the order it was received based on our team's resources and the amount of tickets ahead of yours. + "⚠️ Please note: The Community can not help with account-related issues, such as resinstatement requests or help to escalate your [GitHub Support](https://support.github.com/contact) tickets. ⚠️" - type: dropdown attributes: label: Select Topic Area From 34ffe5c6a6042a06440ed863260d7176ecfcced8 Mon Sep 17 00:00:00 2001 From: Mike Griffin Date: Thu, 5 Sep 2024 12:43:30 +0100 Subject: [PATCH 04/91] Add some more debugging output --- .github/actions/add_feedback_comment | 2 ++ .github/lib/discussions.rb | 1 + 2 files changed, 3 insertions(+) diff --git a/.github/actions/add_feedback_comment b/.github/actions/add_feedback_comment index 183420f97..297be2369 100755 --- a/.github/actions/add_feedback_comment +++ b/.github/actions/add_feedback_comment @@ -39,5 +39,7 @@ puts "Checking #{node_id} for an existing feedback comment" exit unless Discussion.should_comment?(discussion_number: discussion_number, owner: owner, repo: repo) +puts "Adding a comment to the discussion" + discussion = Discussion.new(node_id) discussion.add_comment(body: body) diff --git a/.github/lib/discussions.rb b/.github/lib/discussions.rb index 9d9ae894f..77909ac76 100644 --- a/.github/lib/discussions.rb +++ b/.github/lib/discussions.rb @@ -309,6 +309,7 @@ def self.should_comment?(discussion_number: nil, owner: nil, repo: nil) } }.first + p response return false unless response[:labels].include?("Product Feedback") || response[:labels].include?("Bug") return false if response[:comments_by].include?("github-actions") From d22f188ec48fc63a021bf82cf06686b373c0aeee Mon Sep 17 00:00:00 2001 From: Mike Griffin Date: Thu, 5 Sep 2024 13:38:03 +0100 Subject: [PATCH 05/91] Show the mutate response --- .github/lib/github.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/lib/github.rb b/.github/lib/github.rb index 6428abf75..93edbbe25 100644 --- a/.github/lib/github.rb +++ b/.github/lib/github.rb @@ -51,6 +51,7 @@ def mutate(graphql:) response = @conn.post("/graphql") do |req| req.body = { query: graphql }.to_json end + p response JSON.parse(response.body) end From 9b61a6a6c99e10631c36d4e24e071033353c5260 Mon Sep 17 00:00:00 2001 From: Mike Griffin Date: Thu, 5 Sep 2024 15:00:05 +0100 Subject: [PATCH 06/91] Fix formatting for discussion templates --- .github/DISCUSSION_TEMPLATE/accessibility.yml | 3 +-- .github/DISCUSSION_TEMPLATE/general.yml | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/.github/DISCUSSION_TEMPLATE/accessibility.yml b/.github/DISCUSSION_TEMPLATE/accessibility.yml index 453177762..aa507dad7 100644 --- a/.github/DISCUSSION_TEMPLATE/accessibility.yml +++ b/.github/DISCUSSION_TEMPLATE/accessibility.yml @@ -2,8 +2,7 @@ labels: [Accessibility] body: - type: markdown attributes: - value: - + value: | ⚠️ This category is solely for discussions and feedback on [the digital accessibility of GitHub products](https://accessibility.github.com/). ⚠️ Please use this space for questions, bug reports, opportunities, and feedback related to making GitHub features accessible to users of all abilities. diff --git a/.github/DISCUSSION_TEMPLATE/general.yml b/.github/DISCUSSION_TEMPLATE/general.yml index 299e57208..9ff67eca4 100644 --- a/.github/DISCUSSION_TEMPLATE/general.yml +++ b/.github/DISCUSSION_TEMPLATE/general.yml @@ -2,8 +2,7 @@ labels: [General] body: - type: markdown attributes: - value: - "⚠️ Please note: The Community can not help with account-related issues, such as resinstatement requests or help to escalate your [GitHub Support](https://support.github.com/contact) tickets. ⚠️" + value: "⚠️ Please note: The Community can not help with account-related issues, such as reinstatement requests or help to escalate your [GitHub Support](https://support.github.com/contact) tickets. ⚠️" - type: dropdown attributes: label: Select Topic Area From 2a782bdcd778548870d57e70ecd9041d910e3971 Mon Sep 17 00:00:00 2001 From: Mike Griffin Date: Thu, 5 Sep 2024 15:06:07 +0100 Subject: [PATCH 07/91] Remove trailing space --- .github/DISCUSSION_TEMPLATE/general.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/DISCUSSION_TEMPLATE/general.yml b/.github/DISCUSSION_TEMPLATE/general.yml index 9ff67eca4..f7aa6a750 100644 --- a/.github/DISCUSSION_TEMPLATE/general.yml +++ b/.github/DISCUSSION_TEMPLATE/general.yml @@ -1,7 +1,7 @@ labels: [General] body: - type: markdown - attributes: + attributes: value: "⚠️ Please note: The Community can not help with account-related issues, such as reinstatement requests or help to escalate your [GitHub Support](https://support.github.com/contact) tickets. ⚠️" - type: dropdown attributes: From 759e148a36d42dfe23f55e25bfced157ef5929c1 Mon Sep 17 00:00:00 2001 From: Mike Griffin Date: Thu, 5 Sep 2024 15:20:42 +0100 Subject: [PATCH 08/91] Slight wording change --- .github/DISCUSSION_TEMPLATE/general.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/DISCUSSION_TEMPLATE/general.yml b/.github/DISCUSSION_TEMPLATE/general.yml index f7aa6a750..eb974c4ac 100644 --- a/.github/DISCUSSION_TEMPLATE/general.yml +++ b/.github/DISCUSSION_TEMPLATE/general.yml @@ -2,7 +2,8 @@ labels: [General] body: - type: markdown attributes: - value: "⚠️ Please note: The Community can not help with account-related issues, such as reinstatement requests or help to escalate your [GitHub Support](https://support.github.com/contact) tickets. ⚠️" + value: + ⚠️ The Community can not help with account-related issues, such as reinstatement requests or help to escalate your [GitHub Support](https://support.github.com/contact) tickets. ⚠️ - type: dropdown attributes: label: Select Topic Area From ce76699894628ede1d0d454d2cab1f7cd8145687 Mon Sep 17 00:00:00 2001 From: Mike Griffin Date: Fri, 6 Sep 2024 22:00:16 +0100 Subject: [PATCH 09/91] GraphQL requires triple quotes for multi line strings --- .github/lib/discussions.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/lib/discussions.rb b/.github/lib/discussions.rb index 77909ac76..943268128 100644 --- a/.github/lib/discussions.rb +++ b/.github/lib/discussions.rb @@ -200,7 +200,7 @@ def add_comment(body: nil) mutation { addDiscussionComment( input: { - body: "#{body}", + body: """#{body}""", discussionId: "#{self.id}", clientMutationId: "rubyGraphQL" } From f0c0410018333348e33a7fbb9359a7101aee08f2 Mon Sep 17 00:00:00 2001 From: Alida W <116678254+alidacodes@users.noreply.github.com> Date: Tue, 1 Oct 2024 19:31:46 +0000 Subject: [PATCH 10/91] update rexml to address vulnerability --- Gemfile.lock | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 7f38f5b9f..f7e74d797 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -37,7 +37,7 @@ GEM rack (3.0.9.1) rainbow (3.1.1) regexp_parser (2.9.0) - rexml (3.3.1) + rexml (3.3.6) strscan rubocop (1.62.0) json (~> 2.3) @@ -73,6 +73,7 @@ GEM PLATFORMS arm64-darwin-21 + x86_64-linux DEPENDENCIES faraday From 9a4172583659fa48131d6aab5450c555e5d1b8a0 Mon Sep 17 00:00:00 2001 From: Lili <92824518+queenofcorgis@users.noreply.github.com> Date: Thu, 17 Oct 2024 10:06:23 -0400 Subject: [PATCH 11/91] Update accessibility.yml --- .github/DISCUSSION_TEMPLATE/accessibility.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/DISCUSSION_TEMPLATE/accessibility.yml b/.github/DISCUSSION_TEMPLATE/accessibility.yml index aa507dad7..58e4fcfe1 100644 --- a/.github/DISCUSSION_TEMPLATE/accessibility.yml +++ b/.github/DISCUSSION_TEMPLATE/accessibility.yml @@ -2,7 +2,7 @@ labels: [Accessibility] body: - type: markdown attributes: - value: | + value: ⚠️ This category is solely for discussions and feedback on [the digital accessibility of GitHub products](https://accessibility.github.com/). ⚠️ Please use this space for questions, bug reports, opportunities, and feedback related to making GitHub features accessible to users of all abilities. From 682cfe9355bfa4bba5b6c1c4d0cb5eb34ea6ab20 Mon Sep 17 00:00:00 2001 From: Novium <177693636+novium2@users.noreply.github.com> Date: Wed, 23 Oct 2024 20:27:33 -0700 Subject: [PATCH 12/91] Update accessibility.yml added qsg --- .github/DISCUSSION_TEMPLATE/accessibility.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/DISCUSSION_TEMPLATE/accessibility.yml b/.github/DISCUSSION_TEMPLATE/accessibility.yml index 58e4fcfe1..375564c58 100644 --- a/.github/DISCUSSION_TEMPLATE/accessibility.yml +++ b/.github/DISCUSSION_TEMPLATE/accessibility.yml @@ -7,7 +7,7 @@ body: Please use this space for questions, bug reports, opportunities, and feedback related to making GitHub features accessible to users of all abilities. - To ensure you receive a timely response and connect with the proper team(s), please post in the correct category, questions about access, 2FA, and SMS belong in the [General category](https://github.com/orgs/community/discussions/categories/general?discussions_q=is%3Aopen+category%3AGeneral). Discussions that are posted in the wrong category may be moved. Users who post spam or violate of our [Code of Conduct](https://github.com/github/.github/blob/95e9dcb0b8b70a25cdb75de29f600812a07eb996/CODE_OF_CONDUCT.md) will be blocked. + To ensure you receive a timely response and connect with the proper team(s), please post in the correct category, questions about access, 2FA, and SMS belong in the [General category](https://github.com/orgs/community/discussions/categories/general?discussions_q=is%3Aopen+category%3AGeneral). Discussions that are posted in the wrong category may be moved. If you are unsure where to go, please consult the [quick start guide](https://github.com/orgs/community/discussions/141947). Users who post spam or violate of our [Code of Conduct](https://github.com/github/.github/blob/95e9dcb0b8b70a25cdb75de29f600812a07eb996/CODE_OF_CONDUCT.md) will be blocked. - type: dropdown attributes: label: Select Topic Area From f6c42bce9b29f84f3bc5af17b4dc4b13958daf33 Mon Sep 17 00:00:00 2001 From: Novium <177693636+novium2@users.noreply.github.com> Date: Wed, 23 Oct 2024 20:28:55 -0700 Subject: [PATCH 13/91] Update accessibility.yml --- .github/DISCUSSION_TEMPLATE/accessibility.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/DISCUSSION_TEMPLATE/accessibility.yml b/.github/DISCUSSION_TEMPLATE/accessibility.yml index 375564c58..882ee9f2f 100644 --- a/.github/DISCUSSION_TEMPLATE/accessibility.yml +++ b/.github/DISCUSSION_TEMPLATE/accessibility.yml @@ -7,7 +7,9 @@ body: Please use this space for questions, bug reports, opportunities, and feedback related to making GitHub features accessible to users of all abilities. - To ensure you receive a timely response and connect with the proper team(s), please post in the correct category, questions about access, 2FA, and SMS belong in the [General category](https://github.com/orgs/community/discussions/categories/general?discussions_q=is%3Aopen+category%3AGeneral). Discussions that are posted in the wrong category may be moved. If you are unsure where to go, please consult the [quick start guide](https://github.com/orgs/community/discussions/141947). Users who post spam or violate of our [Code of Conduct](https://github.com/github/.github/blob/95e9dcb0b8b70a25cdb75de29f600812a07eb996/CODE_OF_CONDUCT.md) will be blocked. + - To ensure you receive a timely response and connect with the proper team(s), please post in the correct category, questions about access, 2FA, and SMS belong in the [General category](https://github.com/orgs/community/discussions/categories/general?discussions_q=is%3Aopen+category%3AGeneral). + - Discussions that are posted in the wrong category may be moved. If you are unsure where to go, please consult the [quick start guide](https://github.com/orgs/community/discussions/141947). + - Users who post spam or violate of our [Code of Conduct](https://github.com/github/.github/blob/95e9dcb0b8b70a25cdb75de29f600812a07eb996/CODE_OF_CONDUCT.md) will be blocked. - type: dropdown attributes: label: Select Topic Area From 784ec825857c2025bf6785da7ecc28e6c3514d9c Mon Sep 17 00:00:00 2001 From: Novium <177693636+novium2@users.noreply.github.com> Date: Wed, 23 Oct 2024 20:29:37 -0700 Subject: [PATCH 14/91] Update accessibility.yml --- .github/DISCUSSION_TEMPLATE/accessibility.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/DISCUSSION_TEMPLATE/accessibility.yml b/.github/DISCUSSION_TEMPLATE/accessibility.yml index 882ee9f2f..2512d6380 100644 --- a/.github/DISCUSSION_TEMPLATE/accessibility.yml +++ b/.github/DISCUSSION_TEMPLATE/accessibility.yml @@ -8,7 +8,9 @@ body: Please use this space for questions, bug reports, opportunities, and feedback related to making GitHub features accessible to users of all abilities. - To ensure you receive a timely response and connect with the proper team(s), please post in the correct category, questions about access, 2FA, and SMS belong in the [General category](https://github.com/orgs/community/discussions/categories/general?discussions_q=is%3Aopen+category%3AGeneral). + - Discussions that are posted in the wrong category may be moved. If you are unsure where to go, please consult the [quick start guide](https://github.com/orgs/community/discussions/141947). + - Users who post spam or violate of our [Code of Conduct](https://github.com/github/.github/blob/95e9dcb0b8b70a25cdb75de29f600812a07eb996/CODE_OF_CONDUCT.md) will be blocked. - type: dropdown attributes: From e49b3387516ebaf82e44e8a3daeece4a45855cd3 Mon Sep 17 00:00:00 2001 From: Novium <177693636+novium2@users.noreply.github.com> Date: Wed, 23 Oct 2024 20:31:31 -0700 Subject: [PATCH 15/91] Update accessibility.yml --- .github/DISCUSSION_TEMPLATE/accessibility.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/DISCUSSION_TEMPLATE/accessibility.yml b/.github/DISCUSSION_TEMPLATE/accessibility.yml index 2512d6380..4f9248d79 100644 --- a/.github/DISCUSSION_TEMPLATE/accessibility.yml +++ b/.github/DISCUSSION_TEMPLATE/accessibility.yml @@ -3,11 +3,12 @@ body: - type: markdown attributes: value: - ⚠️ This category is solely for discussions and feedback on [the digital accessibility of GitHub products](https://accessibility.github.com/). ⚠️ + > [!Caution] + ** This category is solely for discussions and feedback on [the digital accessibility of GitHub products](https://accessibility.github.com/). Please use this space for questions, bug reports, opportunities, and feedback related to making GitHub features accessible to users of all abilities. - - To ensure you receive a timely response and connect with the proper team(s), please post in the correct category, questions about access, 2FA, and SMS belong in the [General category](https://github.com/orgs/community/discussions/categories/general?discussions_q=is%3Aopen+category%3AGeneral). + - To ensure you receive a timely response and connect with the proper team(s), please post in the correct category. Questions about access, 2FA, and SMS belong in the [General category](https://github.com/orgs/community/discussions/categories/general?discussions_q=is%3Aopen+category%3AGeneral). - Discussions that are posted in the wrong category may be moved. If you are unsure where to go, please consult the [quick start guide](https://github.com/orgs/community/discussions/141947). From 35071929d3d80f3e9b08ca6d4f1b9a102aca73a9 Mon Sep 17 00:00:00 2001 From: Novium <177693636+novium2@users.noreply.github.com> Date: Wed, 23 Oct 2024 20:35:42 -0700 Subject: [PATCH 16/91] Update accessibility.yml --- .github/DISCUSSION_TEMPLATE/accessibility.yml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/DISCUSSION_TEMPLATE/accessibility.yml b/.github/DISCUSSION_TEMPLATE/accessibility.yml index 4f9248d79..e9bf834f8 100644 --- a/.github/DISCUSSION_TEMPLATE/accessibility.yml +++ b/.github/DISCUSSION_TEMPLATE/accessibility.yml @@ -3,10 +3,9 @@ body: - type: markdown attributes: value: - > [!Caution] - ** This category is solely for discussions and feedback on [the digital accessibility of GitHub products](https://accessibility.github.com/). + This category is for discussions and feedback related to [the digital accessibility of GitHub products](https://accessibility.github.com/). - Please use this space for questions, bug reports, opportunities, and feedback related to making GitHub features accessible to users of all abilities. + ⚠️ Please use this space for questions, bug reports, opportunities, and feedback related to making GitHub features accessible to users of all abilities only.⚠️ - To ensure you receive a timely response and connect with the proper team(s), please post in the correct category. Questions about access, 2FA, and SMS belong in the [General category](https://github.com/orgs/community/discussions/categories/general?discussions_q=is%3Aopen+category%3AGeneral). From 632bef3edac8290b662077dc89d065e0d5671608 Mon Sep 17 00:00:00 2001 From: Novium <177693636+novium2@users.noreply.github.com> Date: Wed, 23 Oct 2024 20:39:21 -0700 Subject: [PATCH 17/91] Update actions.yml --- .github/DISCUSSION_TEMPLATE/actions.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/DISCUSSION_TEMPLATE/actions.yml b/.github/DISCUSSION_TEMPLATE/actions.yml index f1c3bf3a2..7cdfa4a57 100644 --- a/.github/DISCUSSION_TEMPLATE/actions.yml +++ b/.github/DISCUSSION_TEMPLATE/actions.yml @@ -1,5 +1,8 @@ labels: [Actions] body: +- type: markdown + attributes: + value: This category is for discussions, questions, and tips about Github Actions. If you are unsure where to start, please check out our [Quick Start Guide](https://github.com/orgs/community/discussions/141947) - type: dropdown attributes: label: Select Topic Area From 1bd63a17a604bdb0f2183817ae4518a3228e0cc4 Mon Sep 17 00:00:00 2001 From: Novium <177693636+novium2@users.noreply.github.com> Date: Wed, 23 Oct 2024 20:42:44 -0700 Subject: [PATCH 18/91] Update api-and-webhooks.yml --- .github/DISCUSSION_TEMPLATE/api-and-webhooks.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/DISCUSSION_TEMPLATE/api-and-webhooks.yml b/.github/DISCUSSION_TEMPLATE/api-and-webhooks.yml index 6a5dcdd58..a817a8cb2 100644 --- a/.github/DISCUSSION_TEMPLATE/api-and-webhooks.yml +++ b/.github/DISCUSSION_TEMPLATE/api-and-webhooks.yml @@ -1,5 +1,9 @@ labels: [API and Webhooks] body: +- type: markdown + attributes: + value: Here's where you can create a post to discuss API and webhooks. For all other topics, please check out our [Quick Start Guide](https://github.com/orgs/community/discussions/141947) + - type: dropdown attributes: label: Select Topic Area From 2096fc1b99de5000e8989a541ee4864210a1c738 Mon Sep 17 00:00:00 2001 From: Novium <177693636+novium2@users.noreply.github.com> Date: Wed, 23 Oct 2024 20:44:29 -0700 Subject: [PATCH 19/91] Update code-search-and-navigation.yml --- .github/DISCUSSION_TEMPLATE/code-search-and-navigation.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/DISCUSSION_TEMPLATE/code-search-and-navigation.yml b/.github/DISCUSSION_TEMPLATE/code-search-and-navigation.yml index 336948916..fcce1b643 100644 --- a/.github/DISCUSSION_TEMPLATE/code-search-and-navigation.yml +++ b/.github/DISCUSSION_TEMPLATE/code-search-and-navigation.yml @@ -1,5 +1,9 @@ labels: [Code Search and Navigation] body: +- type: markdown + attributes: + value: Share your thoughts, suggestions, and feedback about code search and navigation here. For all other topics, please check out our [Quick Start Guide](https://github.com/orgs/community/discussions/141947) + - type: dropdown attributes: label: Select Topic Area From 5029ccd1a1f13a4f34af3499311549853e025813 Mon Sep 17 00:00:00 2001 From: Novium <177693636+novium2@users.noreply.github.com> Date: Wed, 23 Oct 2024 20:45:30 -0700 Subject: [PATCH 20/91] Update code-security.yml --- .github/DISCUSSION_TEMPLATE/code-security.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/DISCUSSION_TEMPLATE/code-security.yml b/.github/DISCUSSION_TEMPLATE/code-security.yml index c166f9645..761e596e1 100644 --- a/.github/DISCUSSION_TEMPLATE/code-security.yml +++ b/.github/DISCUSSION_TEMPLATE/code-security.yml @@ -1,5 +1,9 @@ labels: [Code Security] body: +- type: markdown + attributes: + value: Start a discussion about code security here. For all other topics, please check out our [Quick Start Guide](https://github.com/orgs/community/discussions/141947) + - type: dropdown attributes: label: Select Topic Area @@ -17,4 +21,4 @@ body: label: Body description: Start your discussion! validations: - required: true \ No newline at end of file + required: true From fa2592b4deb7a644e545d8bdde179a881f97c8c3 Mon Sep 17 00:00:00 2001 From: Novium <177693636+novium2@users.noreply.github.com> Date: Wed, 23 Oct 2024 20:46:28 -0700 Subject: [PATCH 21/91] Update codespaces.yml --- .github/DISCUSSION_TEMPLATE/codespaces.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/DISCUSSION_TEMPLATE/codespaces.yml b/.github/DISCUSSION_TEMPLATE/codespaces.yml index 4722569f2..6ce23fd62 100644 --- a/.github/DISCUSSION_TEMPLATE/codespaces.yml +++ b/.github/DISCUSSION_TEMPLATE/codespaces.yml @@ -1,5 +1,9 @@ labels: [Codespaces] body: +- type: markdown + attributes: + value: Create a discussion about Codespaces here. For all other topics, please check out our [Quick Start Guide.](https://github.com/orgs/community/discussions/141947) + - type: dropdown id: topic attributes: From 40bfe0bd8aa5d4fdf44f8abbafe494d7f1955a17 Mon Sep 17 00:00:00 2001 From: Novium <177693636+novium2@users.noreply.github.com> Date: Wed, 23 Oct 2024 20:48:05 -0700 Subject: [PATCH 22/91] Update copilot.yml --- .github/DISCUSSION_TEMPLATE/copilot.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/DISCUSSION_TEMPLATE/copilot.yml b/.github/DISCUSSION_TEMPLATE/copilot.yml index ac3e7320d..d2b65b526 100644 --- a/.github/DISCUSSION_TEMPLATE/copilot.yml +++ b/.github/DISCUSSION_TEMPLATE/copilot.yml @@ -1,5 +1,9 @@ labels: [Copilot] body: +- type: markdown + attributes: + value: Start a discussion about Copilot here. For all other topics, please check out our [Quick Start Guide](https://github.com/orgs/community/discussions/141947) + - type: dropdown attributes: label: Select Topic Area From 53030897285081c7d2bc01d471232a39c3d47891 Mon Sep 17 00:00:00 2001 From: Novium <177693636+novium2@users.noreply.github.com> Date: Wed, 23 Oct 2024 20:52:11 -0700 Subject: [PATCH 23/91] Update discussions.yml --- .github/DISCUSSION_TEMPLATE/discussions.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/DISCUSSION_TEMPLATE/discussions.yml b/.github/DISCUSSION_TEMPLATE/discussions.yml index c6547585f..26059e888 100644 --- a/.github/DISCUSSION_TEMPLATE/discussions.yml +++ b/.github/DISCUSSION_TEMPLATE/discussions.yml @@ -7,7 +7,8 @@ body: The Discussions category is NOT meant to be a place for any old discussion regarding GitHub or programming — [the General category](https://github.com/orgs/community/discussions/categories/general) is a more appropriate space for misc topics. To ensure you receive a timely response and connect with the proper team(s), please post in the correct category by using the corresponding product category. - NOTE: If you post in this category about topics other than GitHub Discussions, your post may be moved or deleted without warning. Users who post spam or violate of our [Code of Conduct](https://github.com/github/.github/blob/95e9dcb0b8b70a25cdb75de29f600812a07eb996/CODE_OF_CONDUCT.md) will be blocked. + NOTE: If you post in this category about topics other than GitHub Discussions, your post may be moved or deleted without warning. Users who post spam or violate of our [Code of Conduct](https://github.com/github/.github/blob/95e9dcb0b8b70a25cdb75de29f600812a07eb996/CODE_OF_CONDUCT.md) will be blocked. If you're unsure where to go, please consult our [Quick Start Guide](https://github.com/orgs/community/discussions/141947) + - type: dropdown attributes: label: Select Topic Area From 436fc4898b29e232cbdd579978b07324a0fb35cb Mon Sep 17 00:00:00 2001 From: Novium <177693636+novium2@users.noreply.github.com> Date: Wed, 23 Oct 2024 20:53:12 -0700 Subject: [PATCH 24/91] Update enterprise.yml --- .github/DISCUSSION_TEMPLATE/enterprise.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/DISCUSSION_TEMPLATE/enterprise.yml b/.github/DISCUSSION_TEMPLATE/enterprise.yml index f18530be4..f3746d6ba 100644 --- a/.github/DISCUSSION_TEMPLATE/enterprise.yml +++ b/.github/DISCUSSION_TEMPLATE/enterprise.yml @@ -1,5 +1,8 @@ labels: [Enterprise] body: +- type: markdown + attributes: + value: Share your thoughts, suggestions, and feedback about Github Enterprise here. For all other topics, please check out our [Quick Start Guide](https://github.com/orgs/community/discussions/141947) - type: dropdown attributes: label: Select Topic Area From a350acf78899fee74c649f1501a656cdf2bf0f54 Mon Sep 17 00:00:00 2001 From: Novium <177693636+novium2@users.noreply.github.com> Date: Wed, 23 Oct 2024 20:53:56 -0700 Subject: [PATCH 25/91] Update feed.yml --- .github/DISCUSSION_TEMPLATE/feed.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/DISCUSSION_TEMPLATE/feed.yml b/.github/DISCUSSION_TEMPLATE/feed.yml index 904944aba..1fb039320 100644 --- a/.github/DISCUSSION_TEMPLATE/feed.yml +++ b/.github/DISCUSSION_TEMPLATE/feed.yml @@ -1,5 +1,8 @@ labels: [Feed] body: +- type: markdown + attributes: + value: Share your thoughts, suggestions, and feedback about Github's feed here. For all other topics, please check out our [Quick Start Guide](https://github.com/orgs/community/discussions/141947) - type: dropdown attributes: label: Select Topic Area From 519ab020a2f3390d4dfa852bfd23cc8bba34c64c Mon Sep 17 00:00:00 2001 From: Novium <177693636+novium2@users.noreply.github.com> Date: Wed, 23 Oct 2024 20:55:34 -0700 Subject: [PATCH 26/91] Update general.yml --- .github/DISCUSSION_TEMPLATE/general.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/DISCUSSION_TEMPLATE/general.yml b/.github/DISCUSSION_TEMPLATE/general.yml index eb974c4ac..3c45ff17d 100644 --- a/.github/DISCUSSION_TEMPLATE/general.yml +++ b/.github/DISCUSSION_TEMPLATE/general.yml @@ -4,6 +4,8 @@ body: attributes: value: ⚠️ The Community can not help with account-related issues, such as reinstatement requests or help to escalate your [GitHub Support](https://support.github.com/contact) tickets. ⚠️ +- If you are new and are unsure where to start, please check out our [Quick Start Guide](https://github.com/orgs/community/discussions/141947). + - type: dropdown attributes: label: Select Topic Area From ecea374517869731573c16d4bc1841be19608e75 Mon Sep 17 00:00:00 2001 From: Tom Elliott Date: Thu, 24 Oct 2024 02:38:23 -0400 Subject: [PATCH 27/91] Revert "Update general.yml" This reverts commit 519ab020a2f3390d4dfa852bfd23cc8bba34c64c. --- .github/DISCUSSION_TEMPLATE/general.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/DISCUSSION_TEMPLATE/general.yml b/.github/DISCUSSION_TEMPLATE/general.yml index 3c45ff17d..eb974c4ac 100644 --- a/.github/DISCUSSION_TEMPLATE/general.yml +++ b/.github/DISCUSSION_TEMPLATE/general.yml @@ -4,8 +4,6 @@ body: attributes: value: ⚠️ The Community can not help with account-related issues, such as reinstatement requests or help to escalate your [GitHub Support](https://support.github.com/contact) tickets. ⚠️ -- If you are new and are unsure where to start, please check out our [Quick Start Guide](https://github.com/orgs/community/discussions/141947). - - type: dropdown attributes: label: Select Topic Area From 935a54832994c8ebefe502a09694dc1de0315dc7 Mon Sep 17 00:00:00 2001 From: Tom Elliott Date: Thu, 24 Oct 2024 02:38:38 -0400 Subject: [PATCH 28/91] Revert "Update feed.yml" This reverts commit a350acf78899fee74c649f1501a656cdf2bf0f54. --- .github/DISCUSSION_TEMPLATE/feed.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.github/DISCUSSION_TEMPLATE/feed.yml b/.github/DISCUSSION_TEMPLATE/feed.yml index 1fb039320..904944aba 100644 --- a/.github/DISCUSSION_TEMPLATE/feed.yml +++ b/.github/DISCUSSION_TEMPLATE/feed.yml @@ -1,8 +1,5 @@ labels: [Feed] body: -- type: markdown - attributes: - value: Share your thoughts, suggestions, and feedback about Github's feed here. For all other topics, please check out our [Quick Start Guide](https://github.com/orgs/community/discussions/141947) - type: dropdown attributes: label: Select Topic Area From d6ae7c437fcc2b2910c2c61025fe4568f7533ea3 Mon Sep 17 00:00:00 2001 From: Tom Elliott Date: Thu, 24 Oct 2024 02:39:04 -0400 Subject: [PATCH 29/91] Revert "Update enterprise.yml" This reverts commit 436fc4898b29e232cbdd579978b07324a0fb35cb. --- .github/DISCUSSION_TEMPLATE/enterprise.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.github/DISCUSSION_TEMPLATE/enterprise.yml b/.github/DISCUSSION_TEMPLATE/enterprise.yml index f3746d6ba..f18530be4 100644 --- a/.github/DISCUSSION_TEMPLATE/enterprise.yml +++ b/.github/DISCUSSION_TEMPLATE/enterprise.yml @@ -1,8 +1,5 @@ labels: [Enterprise] body: -- type: markdown - attributes: - value: Share your thoughts, suggestions, and feedback about Github Enterprise here. For all other topics, please check out our [Quick Start Guide](https://github.com/orgs/community/discussions/141947) - type: dropdown attributes: label: Select Topic Area From 564faffc3768ef766dc1260fe936e1d1a6dff9cc Mon Sep 17 00:00:00 2001 From: Tom Elliott Date: Thu, 24 Oct 2024 02:39:14 -0400 Subject: [PATCH 30/91] Revert "Update copilot.yml" This reverts commit 40bfe0bd8aa5d4fdf44f8abbafe494d7f1955a17. --- .github/DISCUSSION_TEMPLATE/copilot.yml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.github/DISCUSSION_TEMPLATE/copilot.yml b/.github/DISCUSSION_TEMPLATE/copilot.yml index d2b65b526..ac3e7320d 100644 --- a/.github/DISCUSSION_TEMPLATE/copilot.yml +++ b/.github/DISCUSSION_TEMPLATE/copilot.yml @@ -1,9 +1,5 @@ labels: [Copilot] body: -- type: markdown - attributes: - value: Start a discussion about Copilot here. For all other topics, please check out our [Quick Start Guide](https://github.com/orgs/community/discussions/141947) - - type: dropdown attributes: label: Select Topic Area From 122e5524be9974d70f447a35289c4f869d2d7bcc Mon Sep 17 00:00:00 2001 From: Tom Elliott Date: Thu, 24 Oct 2024 02:39:25 -0400 Subject: [PATCH 31/91] Revert "Update codespaces.yml" This reverts commit fa2592b4deb7a644e545d8bdde179a881f97c8c3. --- .github/DISCUSSION_TEMPLATE/codespaces.yml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.github/DISCUSSION_TEMPLATE/codespaces.yml b/.github/DISCUSSION_TEMPLATE/codespaces.yml index 6ce23fd62..4722569f2 100644 --- a/.github/DISCUSSION_TEMPLATE/codespaces.yml +++ b/.github/DISCUSSION_TEMPLATE/codespaces.yml @@ -1,9 +1,5 @@ labels: [Codespaces] body: -- type: markdown - attributes: - value: Create a discussion about Codespaces here. For all other topics, please check out our [Quick Start Guide.](https://github.com/orgs/community/discussions/141947) - - type: dropdown id: topic attributes: From 21b7a7ec964138542d294172453003a2fa27c360 Mon Sep 17 00:00:00 2001 From: Tom Elliott Date: Thu, 24 Oct 2024 02:39:38 -0400 Subject: [PATCH 32/91] Revert "Update code-security.yml" This reverts commit 5029ccd1a1f13a4f34af3499311549853e025813. --- .github/DISCUSSION_TEMPLATE/code-security.yml | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/.github/DISCUSSION_TEMPLATE/code-security.yml b/.github/DISCUSSION_TEMPLATE/code-security.yml index 761e596e1..c166f9645 100644 --- a/.github/DISCUSSION_TEMPLATE/code-security.yml +++ b/.github/DISCUSSION_TEMPLATE/code-security.yml @@ -1,9 +1,5 @@ labels: [Code Security] body: -- type: markdown - attributes: - value: Start a discussion about code security here. For all other topics, please check out our [Quick Start Guide](https://github.com/orgs/community/discussions/141947) - - type: dropdown attributes: label: Select Topic Area @@ -21,4 +17,4 @@ body: label: Body description: Start your discussion! validations: - required: true + required: true \ No newline at end of file From 2ebe3983771994477dd10f8d16343431f025e305 Mon Sep 17 00:00:00 2001 From: Tom Elliott Date: Thu, 24 Oct 2024 02:39:52 -0400 Subject: [PATCH 33/91] Revert "Update code-search-and-navigation.yml" This reverts commit 2096fc1b99de5000e8989a541ee4864210a1c738. --- .github/DISCUSSION_TEMPLATE/code-search-and-navigation.yml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.github/DISCUSSION_TEMPLATE/code-search-and-navigation.yml b/.github/DISCUSSION_TEMPLATE/code-search-and-navigation.yml index fcce1b643..336948916 100644 --- a/.github/DISCUSSION_TEMPLATE/code-search-and-navigation.yml +++ b/.github/DISCUSSION_TEMPLATE/code-search-and-navigation.yml @@ -1,9 +1,5 @@ labels: [Code Search and Navigation] body: -- type: markdown - attributes: - value: Share your thoughts, suggestions, and feedback about code search and navigation here. For all other topics, please check out our [Quick Start Guide](https://github.com/orgs/community/discussions/141947) - - type: dropdown attributes: label: Select Topic Area From 61c6ab8af01e5851310fd2b069285b4d83dab35c Mon Sep 17 00:00:00 2001 From: Tom Elliott Date: Thu, 24 Oct 2024 02:40:07 -0400 Subject: [PATCH 34/91] Revert "Update api-and-webhooks.yml" This reverts commit 1bd63a17a604bdb0f2183817ae4518a3228e0cc4. --- .github/DISCUSSION_TEMPLATE/api-and-webhooks.yml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.github/DISCUSSION_TEMPLATE/api-and-webhooks.yml b/.github/DISCUSSION_TEMPLATE/api-and-webhooks.yml index a817a8cb2..6a5dcdd58 100644 --- a/.github/DISCUSSION_TEMPLATE/api-and-webhooks.yml +++ b/.github/DISCUSSION_TEMPLATE/api-and-webhooks.yml @@ -1,9 +1,5 @@ labels: [API and Webhooks] body: -- type: markdown - attributes: - value: Here's where you can create a post to discuss API and webhooks. For all other topics, please check out our [Quick Start Guide](https://github.com/orgs/community/discussions/141947) - - type: dropdown attributes: label: Select Topic Area From 11f2ebe6fc2a03bb9ef2a2c7bd718069d3fb0255 Mon Sep 17 00:00:00 2001 From: Tom Elliott Date: Thu, 24 Oct 2024 02:40:18 -0400 Subject: [PATCH 35/91] Revert "Update actions.yml" This reverts commit 632bef3edac8290b662077dc89d065e0d5671608. --- .github/DISCUSSION_TEMPLATE/actions.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.github/DISCUSSION_TEMPLATE/actions.yml b/.github/DISCUSSION_TEMPLATE/actions.yml index 7cdfa4a57..f1c3bf3a2 100644 --- a/.github/DISCUSSION_TEMPLATE/actions.yml +++ b/.github/DISCUSSION_TEMPLATE/actions.yml @@ -1,8 +1,5 @@ labels: [Actions] body: -- type: markdown - attributes: - value: This category is for discussions, questions, and tips about Github Actions. If you are unsure where to start, please check out our [Quick Start Guide](https://github.com/orgs/community/discussions/141947) - type: dropdown attributes: label: Select Topic Area From 490e3e931166f9c8d7a984562e108dcd924eb32f Mon Sep 17 00:00:00 2001 From: Tom Elliott Date: Thu, 24 Oct 2024 02:40:35 -0400 Subject: [PATCH 36/91] Revert "Update accessibility.yml" This reverts commit 35071929d3d80f3e9b08ca6d4f1b9a102aca73a9. --- .github/DISCUSSION_TEMPLATE/accessibility.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/DISCUSSION_TEMPLATE/accessibility.yml b/.github/DISCUSSION_TEMPLATE/accessibility.yml index e9bf834f8..4f9248d79 100644 --- a/.github/DISCUSSION_TEMPLATE/accessibility.yml +++ b/.github/DISCUSSION_TEMPLATE/accessibility.yml @@ -3,9 +3,10 @@ body: - type: markdown attributes: value: - This category is for discussions and feedback related to [the digital accessibility of GitHub products](https://accessibility.github.com/). + > [!Caution] + ** This category is solely for discussions and feedback on [the digital accessibility of GitHub products](https://accessibility.github.com/). - ⚠️ Please use this space for questions, bug reports, opportunities, and feedback related to making GitHub features accessible to users of all abilities only.⚠️ + Please use this space for questions, bug reports, opportunities, and feedback related to making GitHub features accessible to users of all abilities. - To ensure you receive a timely response and connect with the proper team(s), please post in the correct category. Questions about access, 2FA, and SMS belong in the [General category](https://github.com/orgs/community/discussions/categories/general?discussions_q=is%3Aopen+category%3AGeneral). From 9d2705af2f57662b6164d980ebb5ca9007fc2f53 Mon Sep 17 00:00:00 2001 From: Tom Elliott Date: Thu, 24 Oct 2024 02:43:01 -0400 Subject: [PATCH 37/91] Revert "Update accessibility.yml" This reverts commit 784ec825857c2025bf6785da7ecc28e6c3514d9c. --- .github/DISCUSSION_TEMPLATE/accessibility.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.github/DISCUSSION_TEMPLATE/accessibility.yml b/.github/DISCUSSION_TEMPLATE/accessibility.yml index 4f9248d79..d6042f00e 100644 --- a/.github/DISCUSSION_TEMPLATE/accessibility.yml +++ b/.github/DISCUSSION_TEMPLATE/accessibility.yml @@ -7,11 +7,8 @@ body: ** This category is solely for discussions and feedback on [the digital accessibility of GitHub products](https://accessibility.github.com/). Please use this space for questions, bug reports, opportunities, and feedback related to making GitHub features accessible to users of all abilities. - - To ensure you receive a timely response and connect with the proper team(s), please post in the correct category. Questions about access, 2FA, and SMS belong in the [General category](https://github.com/orgs/community/discussions/categories/general?discussions_q=is%3Aopen+category%3AGeneral). - - Discussions that are posted in the wrong category may be moved. If you are unsure where to go, please consult the [quick start guide](https://github.com/orgs/community/discussions/141947). - - Users who post spam or violate of our [Code of Conduct](https://github.com/github/.github/blob/95e9dcb0b8b70a25cdb75de29f600812a07eb996/CODE_OF_CONDUCT.md) will be blocked. - type: dropdown attributes: From 3a63d2a21009d8a724773a73cce272b5dea9325e Mon Sep 17 00:00:00 2001 From: Tom Elliott Date: Thu, 24 Oct 2024 02:47:43 -0400 Subject: [PATCH 38/91] Revert "Update accessibility.yml" This reverts commit f6c42bce9b29f84f3bc5af17b4dc4b13958daf33. --- .github/DISCUSSION_TEMPLATE/accessibility.yml | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/.github/DISCUSSION_TEMPLATE/accessibility.yml b/.github/DISCUSSION_TEMPLATE/accessibility.yml index d6042f00e..6554abbc5 100644 --- a/.github/DISCUSSION_TEMPLATE/accessibility.yml +++ b/.github/DISCUSSION_TEMPLATE/accessibility.yml @@ -3,13 +3,11 @@ body: - type: markdown attributes: value: - > [!Caution] - ** This category is solely for discussions and feedback on [the digital accessibility of GitHub products](https://accessibility.github.com/). + ⚠️ This category is solely for discussions and feedback on [the digital accessibility of GitHub products](https://accessibility.github.com/). ⚠️ Please use this space for questions, bug reports, opportunities, and feedback related to making GitHub features accessible to users of all abilities. - - To ensure you receive a timely response and connect with the proper team(s), please post in the correct category. Questions about access, 2FA, and SMS belong in the [General category](https://github.com/orgs/community/discussions/categories/general?discussions_q=is%3Aopen+category%3AGeneral). - - Discussions that are posted in the wrong category may be moved. If you are unsure where to go, please consult the [quick start guide](https://github.com/orgs/community/discussions/141947). - - Users who post spam or violate of our [Code of Conduct](https://github.com/github/.github/blob/95e9dcb0b8b70a25cdb75de29f600812a07eb996/CODE_OF_CONDUCT.md) will be blocked. + + To ensure you receive a timely response and connect with the proper team(s), please post in the correct category, questions about access, 2FA, and SMS belong in the [General category](https://github.com/orgs/community/discussions/categories/general?discussions_q=is%3Aopen+category%3AGeneral). Discussions that are posted in the wrong category may be moved. Users who post spam or violate of our [Code of Conduct](https://github.com/github/.github/blob/95e9dcb0b8b70a25cdb75de29f600812a07eb996/CODE_OF_CONDUCT.md) will be blocked. - type: dropdown attributes: label: Select Topic Area From 03b6369c55708327d44f440d41b2fec999a71559 Mon Sep 17 00:00:00 2001 From: Tom Elliott Date: Thu, 24 Oct 2024 02:49:57 -0400 Subject: [PATCH 39/91] Revert "Update discussions.yml" This reverts commit 53030897285081c7d2bc01d471232a39c3d47891. --- .github/DISCUSSION_TEMPLATE/discussions.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/DISCUSSION_TEMPLATE/discussions.yml b/.github/DISCUSSION_TEMPLATE/discussions.yml index 26059e888..c6547585f 100644 --- a/.github/DISCUSSION_TEMPLATE/discussions.yml +++ b/.github/DISCUSSION_TEMPLATE/discussions.yml @@ -7,8 +7,7 @@ body: The Discussions category is NOT meant to be a place for any old discussion regarding GitHub or programming — [the General category](https://github.com/orgs/community/discussions/categories/general) is a more appropriate space for misc topics. To ensure you receive a timely response and connect with the proper team(s), please post in the correct category by using the corresponding product category. - NOTE: If you post in this category about topics other than GitHub Discussions, your post may be moved or deleted without warning. Users who post spam or violate of our [Code of Conduct](https://github.com/github/.github/blob/95e9dcb0b8b70a25cdb75de29f600812a07eb996/CODE_OF_CONDUCT.md) will be blocked. If you're unsure where to go, please consult our [Quick Start Guide](https://github.com/orgs/community/discussions/141947) - + NOTE: If you post in this category about topics other than GitHub Discussions, your post may be moved or deleted without warning. Users who post spam or violate of our [Code of Conduct](https://github.com/github/.github/blob/95e9dcb0b8b70a25cdb75de29f600812a07eb996/CODE_OF_CONDUCT.md) will be blocked. - type: dropdown attributes: label: Select Topic Area From 2438afcae7cb409c8132ea7758fbc28a85117352 Mon Sep 17 00:00:00 2001 From: Ashley Nicolson Date: Fri, 1 Nov 2024 14:24:07 +0000 Subject: [PATCH 40/91] Update Actions discussion category template to include deprecation notice for Actions --- .github/DISCUSSION_TEMPLATE/actions.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/DISCUSSION_TEMPLATE/actions.yml b/.github/DISCUSSION_TEMPLATE/actions.yml index f1c3bf3a2..21737227b 100644 --- a/.github/DISCUSSION_TEMPLATE/actions.yml +++ b/.github/DISCUSSION_TEMPLATE/actions.yml @@ -1,5 +1,10 @@ labels: [Actions] body: +- type: markdown + attributes: + value: | + ### Important News for Actions users 📣 👀 + #### ⚠️ [Upcoming deprecation of v3 of the artifact actions](https://github.com/orgs/community/discussions/142581) - upgrade to v4 as soon as possible. - type: dropdown attributes: label: Select Topic Area From b241588cb7c1f915c4d5f733a66b0aa58ec3f566 Mon Sep 17 00:00:00 2001 From: Alida W Date: Tue, 19 Nov 2024 17:06:06 -0500 Subject: [PATCH 41/91] introduces new automations for managing incident-based discussions --- .../check_open_incident_discussions.rb | 16 ++ .github/actions/close_incident_discussions.rb | 32 +++ .github/actions/open_incident_discussion.rb | 38 +++ .github/actions/post_incident_summary.rb | 22 ++ .github/actions/update_incident_discussion.rb | 16 ++ .github/lib/discussions.rb | 252 ++++++++++++++++++ .github/lib/github.rb | 1 + .github/src/incident_resolved.png | Bin 0 -> 161543 bytes .../workflows/close-incident-discussions.yml | 37 +++ .../workflows/open-incident-discussion.yml | 30 +++ .github/workflows/post-incident-summary.yml | 40 +++ .../workflows/update-incident-discussion.yml | 40 +++ .ruby-version | 2 +- Gemfile.lock | 1 + 14 files changed, 526 insertions(+), 1 deletion(-) create mode 100755 .github/actions/check_open_incident_discussions.rb create mode 100755 .github/actions/close_incident_discussions.rb create mode 100755 .github/actions/open_incident_discussion.rb create mode 100755 .github/actions/post_incident_summary.rb create mode 100755 .github/actions/update_incident_discussion.rb create mode 100644 .github/src/incident_resolved.png create mode 100644 .github/workflows/close-incident-discussions.yml create mode 100644 .github/workflows/open-incident-discussion.yml create mode 100644 .github/workflows/post-incident-summary.yml create mode 100644 .github/workflows/update-incident-discussion.yml diff --git a/.github/actions/check_open_incident_discussions.rb b/.github/actions/check_open_incident_discussions.rb new file mode 100755 index 000000000..b10514515 --- /dev/null +++ b/.github/actions/check_open_incident_discussions.rb @@ -0,0 +1,16 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true + +require_relative "../lib/github" +require_relative "../lib/discussion" +require "active_support" +require "active_support/core_ext/date_and_time/calculations" +require "active_support/core_ext/numeric/time" + +# this action checks for any open incident discussions older than 2 days, returns an array of discussion IDs + +discussions = Discussion.find_open_incident_discussions(owner: "community", repo: "community") + +discussions.keep_if { |d| Time.parse(d["createdAt"]) < 2.days.ago }.map! { |d| d["id"] } + +`echo "DISCUSSION_IDS"=#{discussions} >> $GITHUB_OUTPUT` diff --git a/.github/actions/close_incident_discussions.rb b/.github/actions/close_incident_discussions.rb new file mode 100755 index 000000000..b854463cc --- /dev/null +++ b/.github/actions/close_incident_discussions.rb @@ -0,0 +1,32 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true + +require_relative "../lib/github" +require_relative "../lib/discussion" + +# This script finds the incident discussion, ensures an answer has been marked, and then closes the discussion. + +discussion_ids = ENV["DISCUSSION_IDS"] + +discussion_ids = discussion_ids.delete("[]")&.split(", ") + +if discussion_ids.length == 0 + puts "No discussion IDs provided, exiting" + exit +end + +discussion_ids.each do |d_id| + # if a public summary has not been provided, find the most recent incident comment and mark it as the answer + unless Discussion.is_answered?(id: d_id) + comment_id = Discussion.find_most_recent_incident_comment_id(id: d_id, actor_login: "github-actions") + + unless comment_id.nil? + Discussion.mark_comment_as_answer(comment_id:) + end + + body = "![A dark background with two security-themed abstract shapes positioned in the top left and bottom right corners. In the center of the image, bold white text reads \\\"Incident Resolved\\\" with a white Octocat logo.](https://github.com/community/incident-discussion-bot/blob/main/.github/src/incident_resolved.png?raw=true) \n #{Discussion.find_by_id(id: d_id)["body"]}" + Discussion.update_discussion(id: d_id, body:) + end + + Discussion.close_as_resolved(id: d_id) +end diff --git a/.github/actions/open_incident_discussion.rb b/.github/actions/open_incident_discussion.rb new file mode 100755 index 000000000..d5ddbe76e --- /dev/null +++ b/.github/actions/open_incident_discussion.rb @@ -0,0 +1,38 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true + +require_relative "../lib/github" +require_relative "../lib/discussion" +require "active_support/core_ext/date_time" + +# This script takes context from a received webhook and creates a new discussion in the correct discussion category + +repo_id = "MDEwOlJlcG9zaXRvcnkzMDE1NzMzNDQ=" +announcements_category_id = "DIC_kwDOEfmk4M4CQbR2" +incident_label_id = "LA_kwDOEfmk4M8AAAABpaZlTA" + +date = Time.now.strftime("%Y-%m-%d") + +# we need to take the provided input and generate a new post +title = "[#{date}] Incident Thread" + +body = <<~BODY +## :exclamation: An incident has been declared: + +**#{ENV['PUBLIC_TITLE']}** + +_Subscribe to this Discussion for updates on this incident. Please upvote or emoji react instead of commenting +1 on the Discussion to avoid overwhelming the thread. Any account guidance specific to this incident will be shared in thread and on the [Incident Status Page](#{ENV['INCIDENT_URL']})._ +BODY + +# we need to create a new discussion in the correct category with the correct label +begin + Discussion.create_incident_discussion( + repo_id:, + title:, + body:, + category_id: announcements_category_id, + labels: [incident_label_id] + ) +rescue => ArgumentError + puts "ERROR: One or more arguments missing. #{ArgumentError.message}" +end diff --git a/.github/actions/post_incident_summary.rb b/.github/actions/post_incident_summary.rb new file mode 100755 index 000000000..d81b565ff --- /dev/null +++ b/.github/actions/post_incident_summary.rb @@ -0,0 +1,22 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true + +require_relative "../lib/github" +require_relative "../lib/discussion" + +# This script takes the public incident summary, adds it as a comment to the incident, and then marks that comment as the answer. + +# first, we must identify the correct incident to update, in the case where there are multiple open incident discussions. +open_discussions = Discussion.find_open_incident_discussions(owner: "community", repo: "community") +selected_incident = open_discussions.keep_if { |d| d["body"].include?("#{ENV["INCIDENT_SLUG"]}") }.first + +# add the summary as a comment to the discussion +summary = "### Incident Summary \n #{ENV["INCIDENT_PUBLIC_SUMMARY"]}" +comment_id = Discussion.add_comment_with_id(id: selected_incident["id"], body: summary) + +# mark this new comment as the answer +Discussion.mark_comment_as_answer(comment_id:) + +# update the post body to include the resolved picture +updated_body = "![A dark background with two security-themed abstract shapes positioned in the top left and bottom right corners. In the center of the image, bold white text reads \"Incident Resolved\" with a white Octocat logo.](https://github.com/community/incident-discussion-bot/blob/main/.github/src/incident_resolved.png?raw=true) \n \n #{selected_incident["body"]}" +Discussion.update_discussion(id: selected_incident["id"], body: updated_body) diff --git a/.github/actions/update_incident_discussion.rb b/.github/actions/update_incident_discussion.rb new file mode 100755 index 000000000..0f0922349 --- /dev/null +++ b/.github/actions/update_incident_discussion.rb @@ -0,0 +1,16 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true + +require_relative "../lib/github" +require_relative "../lib/discussion" + +# This script takes the context from the latest update dispatch event and updates the active incident discussion + +# first, we must identify the correct incident to update, in the case where there are multiple open incident discussions. +open_discussions = Discussion.find_open_incident_discussions(owner: "community", repo: "community") +selected_incident = open_discussions.keep_if { |d| d["body"].include?("#{ENV["INCIDENT_SLUG"]}") }.first["id"] + +# next, we need to update the discussion with the new information +body = "### Update \n #{ENV["INCIDENT_MESSAGE"]}" + +Discussion.add_comment_with_id(id: selected_incident, body:) diff --git a/.github/lib/discussions.rb b/.github/lib/discussions.rb index 943268128..c16dadd80 100644 --- a/.github/lib/discussions.rb +++ b/.github/lib/discussions.rb @@ -316,4 +316,256 @@ def self.should_comment?(discussion_number: nil, owner: nil, repo: nil) true end + + def self.create_incident_discussion(repo_id:, title:, body:, category_id:, labels:) + # create a new discussion in the specified category, applies the incident label, and returns the discussion id + return if repo_id.nil? || title.nil? || body.nil? || category_id.nil? + + query = <<~QUERY + mutation { + createDiscussion( + input: { + categoryId: "#{category_id}", + repositoryId: "#{repo_id}", + clientMutationId: "rubyGraphQL", + title: "#{title}", + body: "#{body}" + } + ) { + clientMutationId + discussion { + id + } + } + } + QUERY + + incident_discussion_id = GitHub.new.mutate(graphql: query).dig("data", "createDiscussion", "discussion", "id") + + if labels + addLabel = <<~QUERY + mutation { + addLabelsToLabelable( + input: { + labelIds: #{labels}, + labelableId: "#{incident_discussion_id}", + clientMutationId: "rubyGraphQL" + } + ) { + clientMutationId + + } + } + QUERY + + + GitHub.new.mutate(graphql: addLabel) + end + + incident_discussion_id + end + + def self.add_comment_with_id(id:, body:) + return if id.nil? || body.nil? + # adds a comment to the given discussion + query = <<~QUERY + mutation { + addDiscussionComment( + input: { + body: "#{body}", + discussionId: "#{id}", + clientMutationId: "rubyGraphQL" + } + ) { + clientMutationId + comment { + id + body + } + } + } + QUERY + + GitHub.new.mutate(graphql: query).dig("data", "addDiscussionComment", "comment", "id") + end + + def self.mark_comment_as_answer(comment_id:) + # marks the given comment as the answer + return if comment_id.nil? + + query = <<~QUERY + mutation { + markDiscussionCommentAsAnswer( + input: { + id: "#{comment_id}", + clientMutationId: "rubyGraphQL" + } + ) { + clientMutationId + discussion { + id + answer { + id + } + } + } + } + QUERY + + GitHub.new.mutate(graphql: query) + end + + def self.update_discussion(id:, body:) + return if id.nil? || body.nil? + puts "body: #{body}" + + query = <<~QUERY + mutation { + updateDiscussion( + input: { + discussionId: "#{id}", + body: "#{body}", + clientMutationId: "rubyGraphQL" + } + ) { + clientMutationId + discussion { + id + } + } + } + QUERY + + GitHub.new.mutate(graphql: query) + end + + def self.find_most_recent_incident_comment_id(id:, actor_login:) + # finds the most recent comment generated by an incident action + return nil if id.nil? || actor_login.nil? + + query = <<~QUERY + query { + node(id: "#{id}") { + ... on Discussion { + id + comments(last: 10) { + nodes{ + id + createdAt + author { + login + } + } + } + } + } + } + QUERY + + # with the results, get an array of comments from the given actor login sorted by most recent + comments = GitHub.new.post(graphql: query).first.dig("comments", "nodes") + + return nil if comments.empty? + + filtered_comments = comments.keep_if { |comment| comment["author"]["login"] == actor_login } + &.sort_by { |comment| comment["createdAt"] } + .reverse + + # return the most recent comment's ID + return nil if filtered_comments.empty? + filtered_comments.first["id"] + end + + def self.find_open_incident_discussions(owner:, repo:) + return [] if owner.nil? || repo.nil? + + searchquery = "repo:#{owner}/#{repo} is:open author:github-actions label:\\\"Incident \:exclamation\:\\\"" + + query = <<~QUERY + { + search( + first: 100 + query: "#{searchquery}" + type: DISCUSSION + ) { + discussionCount + ...Results + } + rateLimit { + limit + cost + remaining + resetAt + } + } + fragment Results on SearchResultItemConnection { + nodes { + ... on Discussion { + id + createdAt + body + } + } + } + QUERY + + GitHub.new.post(graphql: query).first&.dig("nodes") + end + + def self.find_by_id(id:) + return if id.nil? + + query = <<~QUERY + query { + node(id: "#{id}") { + ... on Discussion { + id + body + } + } + } + QUERY + + GitHub.new.post(graphql: query).first&.dig("node") + end + + def self.close_as_resolved(id:) + # closes the post as resolved + + query = <<~QUERY + mutation { + closeDiscussion( + input: { + discussionId: "#{id}", + reason: RESOLVED, + clientMutationId: "rubyGraphQL" + } + ) { + clientMutationId + discussion { + id + } + } + } + QUERY + + GitHub.new.mutate(graphql: query) + end + + def self.is_answered?(id:) + # checks if the post is answered + + query = <<~QUERY + query { + node(id: #{id}) { + ... on Discussion { + id + isAnswered + } + } + } + QUERY + + GitHub.new.post(graphql: query)&.first&.dig("isAnswered") + end end diff --git a/.github/lib/github.rb b/.github/lib/github.rb index 93edbbe25..6e8496faa 100644 --- a/.github/lib/github.rb +++ b/.github/lib/github.rb @@ -37,6 +37,7 @@ def post(graphql:) node = JSON.parse(response.body).dig("data", "repository") node = JSON.parse(response.body).dig("data", "search") if node.nil? + node = JSON.parse(response.body).dig("data", "node") if node.nil? # for when the query is not a repository or search nodes << node break unless node&.dig("pageInfo", "hasNextPage") diff --git a/.github/src/incident_resolved.png b/.github/src/incident_resolved.png new file mode 100644 index 0000000000000000000000000000000000000000..efb1a10721fced72e84030bc65b1a4a8164f1bcf GIT binary patch literal 161543 zcmZs@by$>L*EUWLLk%e%gQNmdL+8*SpolagFm$(c%}~-HNVkGgLr91;(kV!HcX#=5 z|K8v8J?|&?AH#7B$92uM_u6Zn`&{Q*`wD-lrhtz_g@b~Eg0G|~`w9gG1Brry<_<)= z|4;Md9b6O?DHJ7H=xYzuod(|@=4PJr^@f=rZ+W?z4+ikyIJrQ!r?Fu;R0lvSFwa!S zM7zeeu+>d_wGxT9nwn(!>B!(F55Jv;9dXH_taowsaQ;My5+jch4XHXR6oDerhJx01 z-M7<_HSX3p?p9*4`z@>Cyl>9?43FuKEaJLu?6!LEboyp-eEWNu=nJwp`+pWfYcl;h zXlwjn>b(q4?{4?~&sxOm>AhDLWll6INn_DoN#Q7>J^^Fq2mH?$F#^)Ajxonoe#wT_ z3levO>$>tQ8Hr4{v*(+~qs!g|lNz-Dx%7YCw{V%=j0P67n?7SN^P7&gk^HklQndDc zq`JY#-F)r-iJ1g%Kk@&s8~*duW`;+}SkjgU4g21I`bC?5EaUonbQwp8rl0p{&%Yad z6S1wy_ z+S1<5b)09uiyL>lN|IoCdCCxrb!{1chhMCJc1#6daizI3s?aD^j{^eJ7xG+KFK-hWq z41D|ad`Rr?wN(tv``m1d$`Gm z;l~sTzq_TsIk;bf2!-9KfBmK6GBg`(%GLb$=XX;MNDyX3={~(orPBZQxBs#8XSAr_ zjeV8}zWWxVq5j9{p)N_c*7NltcWG)fetk*>4icWCFu^QWFLfpoYJr*p!GbTUXMK4D z7Y;|GFoKga$&txFCmJz(pPli!ei1$}P4im?Of4(~6y9kkyx7)s$(88<@o2>zlsuGM z&$EooHTx^1}ztb7QtDRp-W-%rDgYZ)&r$7D(L15r|h=oWJj&SyY=I z@SPnye*139vuyS#=y-Z04cwfoh~=2gU=#$EMtcKO8gp*`t~YJ<2NtLR-ga1um^3W%{hUw z+{5=VG;Q|rt><;g{Ka6_MaE=G%DQajS$p|lY!e&(YaPV?o z$|@Q<6QGJq_)SsWa)<#r-__FOXU`_ob!^Q3i6d2aDqladx#bppwE%85`)X!rR2K-&wVksZR)Gr z;(C1F_0s;5~oO}&w1DOiS$Xsb6zLR$Vw6iVH7 zN%4GNIC!_lMMl>4oRF+Pz3W$1%6dNsI&Phw=W?Ka(`7%czt3@&kNu9E*N2BYgTo^V zENL`ZuKJ~(2t$|2q~#a2_t@p`v*>a@=Q6Ht=v&`#`J239JqUL`&8!m-pj-Cw3=1D7 z{aAWdM$u|G$8g|B?fJyn?GPBlvOG`e7k%n;LfIW=rE&Z*dbQRI!iugB@~KtXEmfBK zKP-oP02H7=xcivR3S3LTcD3R2tglYoXEOD?H9D0v-MOwx_c2R>)RN-B;jYv{iL0)x zySt`8TmFCAhN(~3ADGqS?x~R!5W{}9`t}FzGm+hs-C7I_bMwZ=xM-Ta4F1!z^ZgB;W61U+w~InJWTxR<8bpSOY>)Z_=1MhQd!I|3b+!4v+^MUb+EpbtyvZyoz0>ht8dbBHNTGKB4zH_&7HGJBpOCA; zeaynhh)G^AKCRj1wcL?0kY9Itq?CyF(HTs(uf)d zuoe9tgnIj|p0v_1!Z%D;a8=FQYEG%Lj$_x1GK3j?$^^-$`=-K|t_Y>EV(h0{lU6zA z=>K&R`7zUbn7S<0^KA0X`OKvOu=t(wUziKVOw!C&MpoFyFpeYLrrG_D3jT~#?|ytI z0v|BQat5_2%Rq}Ta7DQp9FtM}VsozX7(YNZ%e#>dU(DVcOVr#3Fw(nfFN^QQU(M(o z4L@Z}9km(?i1m)m_qA_!Nj{^}#X__FTp3lBV9~&_FHrGpQlT4?u$G^@=+m0tT`JuR zA$d2}C6xGBO-Mz+cFJcl=FMpZ?%V4OefNQ#5vMbSJxR8Hj=$owd5hFzAmAWKyYX06 z+gC{G^V-^#3vFJDT7hI}C?VAj-uE~5GA(uXsHcHJ4Ti%O+BrYtUYR$xaZ|>+x+doj zvQ%0OPE`KG&o4{H3ss2iP#(ncA z5DJ~Has-V6&qA$qHEDGpd)FLv2JTLSnW8BCIW~D1k0W0tf#ikgEx+Vp<#ncqN@?rw zTk@}Sf0HU29?VR1@J!WZ6@Am%J45Gz`OLKK{t%dBX(&FWG&~!uo~H(ft2s<;tE1!S z1+eY4NW|sd+Hxz_CmFFUI=0r<>%TXJ4d%)l|9F44P6;%-Yp>~aX3nLmO6Z=In2>QsdBZ#w)q zW($KOMaaz2(-CdO)5^Oy;pxrld+F1;^1`2k;5bTr3G0}nodD@+8B4#`nW%I-gz7Qr z=OOT)rKhHMl>wv|dF2Z8HU5E# zj8QDz*O0~R^%BFjyquH>d({;EbZJza*1#Df1{EN_{DS32U%2jER^R#o{+fIUBP#<# z9=;24ygGo@*q$x94dEVIGjxLh1aliFkr7FVd~+HJcDOn0q?*Ge;9-uWXCN}|N$DBnQwx-sXn!gI z-+#8cp9G(uw4vJPl-03MUJucnNOQpwg~8(akGrTQzqJT|;sZWV`gY%dy9jNNoGACb zqj2X416rVG_-EJXFC8c7@vh)OVMB{ZiYd<%H8^H;3wK5CfD!Qe3TIHH^TE0vDRLuDZqfQAbm>Xvu9}2*3r?Ohh>#o3VgLi%(Br8w}0F zxC!~{q~A^xHWJ!cYtb;ZOLIMeIaQ92w4^o`^W4?MA(o=p>lJsTtfOf#c*9o1aBT)E>sgX>cWRPMM;F4dG;hnLOPGj`^Qo44NyYmQ7jqmDn_P1qT z4hOu#G*4=wPX-r(yfH!C)9kN)13rjYQHMV7J z2LS7Y-E$=a6JleB`)ERwbgDOZQ_2c8~l_v47B;3NM>$^!=0)s-h|-~#-MmN z1Xd*z*-`NcA%NY0Z8(p6TERe~T6r(KN=_v52oi?VMMAPEY>h?tsd z#bcy(oW5%=MsB=>OS%B4(DZ8A1nT4`<-^Qeyshf7b-CYqc1&`K-c^k_T>b*-2mcH4 ziql?DL|vqwKk;`EzMD~GfLWPlLw(>$ilj{Gf#~(Kx)t3*`0kTpKztBZgUJN_l$}&p z4Y?`Nw{#wP^8t@yfgrhK#4LO$JCU=1J+v0eF6=V@)hbqyGRvvO?9N6_dXD1$v$>d; z2@8=SWEJ~}_Y7*Huqf3edVyD248wY^b5R&IKuiNFtiGw4S&4Yb@X%o@aA=6YKQ7|^ojWKUDhgjtLlmhfr^UL6NV1JOqv+ytJutCm zp-rMR?oj{*HXsJs9)5m1=xr*IzLD`JwdrJgMEsB73gZtH;Blq+%5(jQ#g&{=3Tdv$ zo-dZMWP{ndGeckiS2+eBxJi~&F zy`*aVG-RT1s0XUo+eUBv$SkdetekS>{h2AJme2rC zW+|=h3>>+A`#dh09e!AKe&f5&q%Bcs`kN#u2A*mgi3d8ib!hnQs5Z@RKMDY2n-)Vz z({pw(@z2)pVG}0>ibd**##B;BiM>8Z?%T@JFW~Bo!spmp21pdfNo9={4d5O~H=;J~ zZB=NivzR?zDfa!WvAI{IL`JHm$#F;l6ltv?#-!xVh4Ss}Eu*W1TwvREX4^5Y*m~U{ zR^m4UgRMj?R5rv>74L)E^UUf@zCilb%0&*zp@g2J-LFt1UELtJVxLb(~38=)?E zXBx_I=B}{bXj+a2OJv;Z9Ann& z1gv6Jkee3Kwa>1)yI13~oI4_#&Lo>0k(foQe{Hv@PaG+5im3@3w_4BX{9B760i0PI zeKc{o^6=L*8zT5iOgra+Qa{ExEHnfnoJzv8tMEAaI9>*PCn6Q4sQ!YE zL?6qESkHM_>(zyTG`wvplqP|x(@hH>@qwxAvdTiT<{soF1 z0Yj#Y7$Q#l^T&L?S{xDqvMB{rAA$5=3qwjnG=V!55Q!5;0X$3|JWMPZ+^nBsp4Sne zoq7L1v^8`c^V%|>{(nXMKbmbUTJO`B%Y|mwG~XBd$lv>wL)BD1%-&1aE^qx5wvf+2EgF6*;09s$cNQqae8^$jVR zpJIi%cltpS;$aR$t+L*0bSH}HJyqaiWuc|M6hIhd!ek6I=Nh2PB*?aL4LHP+4!Ktr z7A!BYc^ny{L0QTD2`&sgS*C~Y)akV;PUF4iDEwNPuaI=}DwcfIwa)a45!K9zi>ns^ zyL#|`e+f1?T~)&!WuTTXmXXcY8~hd%9le=pn1|}b`z0P=D0^0Fq1iGvf{!xdu}yV# z!$o@8U5w#n zv*Sz)CX>#HXS4B(1Z4m-T z<##3LF#}#>{nIgL%*RvDVGv0Pb*b#%(a0g;>NJ)eCJd#`HB(D9$+4*2WRZ^*S==d{ zwr?2=24y@i02zQMoQ9)d$5_0sZz617w+t4%-~03G31h^~ws-E(>-T<$YvsLq5Kc%# z9GYi@nVw_(T;k`mekqr1stlfbDo}y5ix*=m81xuT2YG^az^5j{2W|^ zSiU6}BH9kv@KEGT-2DhqB-0u8@;f zu@e$;(SP&?W?Y6HBWySwAuyt`SxGqPM#f@;=wz3CbHudst6PKqc- zS`Ha?R)eVUL02w6jY1f)BDy%<8#h8hDGRpPq0ECNtro8%&3V!~-mbyeY2k4Oqv?o6 zymVw9%K?5W%(24tksf`>g)E)}B%VCZ!L{V0#+yxwDq#kw>OQ~KqbmpLtTL#F)KK}Iu03Q>J;?@tUV>eF~ zVxTlN%__s)Ev_{vc;A zk?Q#_wuu<138waz-6pkx(&zZ8p|M8l;Gq=9iDgsyy-c~-B_`7%=80rFm!q-$`Kyuw zy33XvvJ&@)A*B3>0y?UEJ$OEiT&x;5Jad3biCP8S@MP#F52-s=Pm6PJ&?6Pq1qeaw zI4*dvh`E%JY@w&RT8|jn4b0Z?A?s4+Y^u zcBDJl=Xdaa+ROo(0EmjfeNtRVW^!|F5i1_uxH%rtoUTb;h*Z7=?)~$FSHcN^;jUk#X8BwKk^Bd`<{zJlT4sg3M(K% zLwKNlDR<_^z+J93Qa5;y&M04>V&c5aGbna7L9lmQbSc*p|3J~92|=^Lke-2;UB&qi zw}=WoKS~~Mfxr0?!O*mTknqn8o%{4c

jU!FgJJ;z#{07{!W!^5pVFt0XT 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 UG)!G%3GPDkg^n6V)gti!0BOJZasU7T literal 0 HcmV?d00001 diff --git a/.github/workflows/close-incident-discussions.yml b/.github/workflows/close-incident-discussions.yml new file mode 100644 index 000000000..40b2dd682 --- /dev/null +++ b/.github/workflows/close-incident-discussions.yml @@ -0,0 +1,37 @@ +name: Close incident discussion after time elapsed + +on: + workflow_dispatch: + schedule: + # daily at midnight + - cron: "0 0 * * *" + +jobs: + close_incident_post: + runs-on: ubuntu-latest + permissions: + actions: read + contents: read + discussions: write + steps: + - name: Checkout Repository + uses: actions/checkout@v4 + + - name: Set up Ruby + uses: ruby/setup-ruby@7bae1d00b5db9166f4f0fc47985a3a5702cb58f0 + + - name: Bundle install + run: bundle install + + - name: Get applicable incident discussion IDs + id: get_discussion_ids + run: .github/actions/check_open_incident_discussions.rb + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Close incident discussions + id: close_discussions + run: .github/actions/close_incident_discussions.rb + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + DISCUSSION_IDS: ${{ steps.get_discussion_ids.outputs.DISCUSSION_IDS }} diff --git a/.github/workflows/open-incident-discussion.yml b/.github/workflows/open-incident-discussion.yml new file mode 100644 index 000000000..3b0067941 --- /dev/null +++ b/.github/workflows/open-incident-discussion.yml @@ -0,0 +1,30 @@ +name: Open a new discussion when an incident is declared + +on: + repository_dispatch: + types: [incident-declared] + +jobs: + open_discussion: + runs-on: ubuntu-latest + permissions: + actions: read + contents: read + discussions: write + steps: + - name: Checkout Repository + uses: actions/checkout@v4 + + - name: Set up Ruby + uses: ruby/setup-ruby@7bae1d00b5db9166f4f0fc47985a3a5702cb58f0 + + - name: Bundle install + run: bundle install + + - name: Open discussion + id: open_discussion + run: .github/actions/open_incident_discussion.rb + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + PUBLIC_TITLE: ${{ github.event.client_payload.publicTitle }} + INCIDENT_URL: ${{ github.event.client_payload.incidentLink }} diff --git a/.github/workflows/post-incident-summary.yml b/.github/workflows/post-incident-summary.yml new file mode 100644 index 000000000..a86b016c7 --- /dev/null +++ b/.github/workflows/post-incident-summary.yml @@ -0,0 +1,40 @@ +name: Post incident summary to incident discussion + +on: + repository_dispatch: + types: [incident-public-summary] + +jobs: + post_summary: + runs-on: ubuntu-latest + permissions: + actions: read + contents: read + discussions: write + steps: + - name: Checkout Repository + uses: actions/checkout@v4 + + - name: Set up Ruby + uses: ruby/setup-ruby@7bae1d00b5db9166f4f0fc47985a3a5702cb58f0 + + - name: Bundle install + run: bundle install + + - name: Get incident URL slug + id: incident_slug + uses: actions/github-script@v7 + with: + result-encoding: string + script: | + const url = "${{ github.event.client_payload.incidentLink }}" + const slug = url.split('/').pop(); + return slug + + - name: Add comment to incident discussion + id: add_comment + run: .github/actions/post_incident_summary.rb + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + INCIDENT_SLUG: ${{ steps.incident_slug.outputs.result }} + INCIDENT_PUBLIC_SUMMARY: ${{ github.event.client_payload.message }} diff --git a/.github/workflows/update-incident-discussion.yml b/.github/workflows/update-incident-discussion.yml new file mode 100644 index 000000000..63ce19fdc --- /dev/null +++ b/.github/workflows/update-incident-discussion.yml @@ -0,0 +1,40 @@ +name: Update current incident discussion with new information + +on: + repository_dispatch: + types: [incident-public-update] + +jobs: + update_discussion: + runs-on: ubuntu-latest + permissions: + actions: read + contents: read + discussions: write + steps: + - name: Checkout Repository + uses: actions/checkout@v4 + + - name: Set up Ruby + uses: ruby/setup-ruby@7bae1d00b5db9166f4f0fc47985a3a5702cb58f0 + + - name: Bundle install + run: bundle install + + - name: Get incident URL slug + id: incident_slug + uses: actions/github-script@v7 + with: + result-encoding: string + script: | + const url = "${{ github.event.client_payload.incidentLink }}" + const slug = url.split('/').pop(); + return slug + + - name: Add comment to incident discussion + id: add_comment + run: .github/actions/update_incident_discussion.rb + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + INCIDENT_SLUG: ${{ steps.incident_slug.outputs.result }} + INCIDENT_MESSAGE: ${{ github.event.client_payload.message }} diff --git a/.ruby-version b/.ruby-version index ef538c281..fa7adc7ac 100644 --- a/.ruby-version +++ b/.ruby-version @@ -1 +1 @@ -3.1.2 +3.3.5 diff --git a/Gemfile.lock b/Gemfile.lock index f7e74d797..3d5c0301f 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -73,6 +73,7 @@ GEM PLATFORMS arm64-darwin-21 + arm64-darwin-24 x86_64-linux DEPENDENCIES From 383dfa3021733b1ef29278c2adfbbf9eed21166d Mon Sep 17 00:00:00 2001 From: Alida W Date: Wed, 20 Nov 2024 10:44:26 -0500 Subject: [PATCH 42/91] call some methods on an instance, simply close operation --- .../check_open_incident_discussions.rb | 16 --------- .github/actions/close_incident_discussions.rb | 13 +++++--- .github/actions/post_incident_summary.rb | 10 +++--- .github/actions/update_incident_discussion.rb | 7 ++-- .github/lib/discussions.rb | 33 ++----------------- .../workflows/close-incident-discussions.yml | 7 ---- 6 files changed, 21 insertions(+), 65 deletions(-) delete mode 100755 .github/actions/check_open_incident_discussions.rb diff --git a/.github/actions/check_open_incident_discussions.rb b/.github/actions/check_open_incident_discussions.rb deleted file mode 100755 index b10514515..000000000 --- a/.github/actions/check_open_incident_discussions.rb +++ /dev/null @@ -1,16 +0,0 @@ -#!/usr/bin/env ruby -# frozen_string_literal: true - -require_relative "../lib/github" -require_relative "../lib/discussion" -require "active_support" -require "active_support/core_ext/date_and_time/calculations" -require "active_support/core_ext/numeric/time" - -# this action checks for any open incident discussions older than 2 days, returns an array of discussion IDs - -discussions = Discussion.find_open_incident_discussions(owner: "community", repo: "community") - -discussions.keep_if { |d| Time.parse(d["createdAt"]) < 2.days.ago }.map! { |d| d["id"] } - -`echo "DISCUSSION_IDS"=#{discussions} >> $GITHUB_OUTPUT` diff --git a/.github/actions/close_incident_discussions.rb b/.github/actions/close_incident_discussions.rb index b854463cc..ef952b3ec 100755 --- a/.github/actions/close_incident_discussions.rb +++ b/.github/actions/close_incident_discussions.rb @@ -3,12 +3,15 @@ require_relative "../lib/github" require_relative "../lib/discussion" +require "active_support" +require "active_support/core_ext/date_and_time/calculations" +require "active_support/core_ext/numeric/time" -# This script finds the incident discussion, ensures an answer has been marked, and then closes the discussion. +# this action checks for any open incident discussions older than 2 days, and then closes them -discussion_ids = ENV["DISCUSSION_IDS"] +discussions = Discussion.find_open_incident_discussions(owner: "community", repo: "incident-discussion-bot") -discussion_ids = discussion_ids.delete("[]")&.split(", ") +discussion_ids = discussions.keep_if { |d| Time.parse(d["createdAt"]) < 2.days.ago }.map! { |d| d["id"] } if discussion_ids.length == 0 puts "No discussion IDs provided, exiting" @@ -24,8 +27,8 @@ Discussion.mark_comment_as_answer(comment_id:) end - body = "![A dark background with two security-themed abstract shapes positioned in the top left and bottom right corners. In the center of the image, bold white text reads \\\"Incident Resolved\\\" with a white Octocat logo.](https://github.com/community/incident-discussion-bot/blob/main/.github/src/incident_resolved.png?raw=true) \n #{Discussion.find_by_id(id: d_id)["body"]}" - Discussion.update_discussion(id: d_id, body:) + updated_body = "![A dark background with two security-themed abstract shapes positioned in the top left and bottom right corners. In the center of the image, bold white text reads \\\"Incident Resolved\\\" with a white Octocat logo.](https://github.com/community/incident-discussion-bot/blob/main/.github/src/incident_resolved.png?raw=true) \n #{Discussion.find_by_id(id: d_id)["body"]}" + Discussion.update_discussion(id: d_id, body: updated_body) end Discussion.close_as_resolved(id: d_id) diff --git a/.github/actions/post_incident_summary.rb b/.github/actions/post_incident_summary.rb index d81b565ff..c847536b1 100755 --- a/.github/actions/post_incident_summary.rb +++ b/.github/actions/post_incident_summary.rb @@ -7,16 +7,18 @@ # This script takes the public incident summary, adds it as a comment to the incident, and then marks that comment as the answer. # first, we must identify the correct incident to update, in the case where there are multiple open incident discussions. -open_discussions = Discussion.find_open_incident_discussions(owner: "community", repo: "community") +open_discussions = Discussion.find_open_incident_discussions(owner: "community", repo: "incident-discussion-bot") selected_incident = open_discussions.keep_if { |d| d["body"].include?("#{ENV["INCIDENT_SLUG"]}") }.first +discussion = Discussion.new(id: selected_incident["id"]) # add the summary as a comment to the discussion summary = "### Incident Summary \n #{ENV["INCIDENT_PUBLIC_SUMMARY"]}" -comment_id = Discussion.add_comment_with_id(id: selected_incident["id"], body: summary) +comment_id = discussion.add_comment(body: summary).dig("data", "addDiscussionComment", "comment", "id") # mark this new comment as the answer +# (note that we don't need the discussion's context for this, so we don't call it on the instance of Discussion but on the struct) Discussion.mark_comment_as_answer(comment_id:) # update the post body to include the resolved picture -updated_body = "![A dark background with two security-themed abstract shapes positioned in the top left and bottom right corners. In the center of the image, bold white text reads \"Incident Resolved\" with a white Octocat logo.](https://github.com/community/incident-discussion-bot/blob/main/.github/src/incident_resolved.png?raw=true) \n \n #{selected_incident["body"]}" -Discussion.update_discussion(id: selected_incident["id"], body: updated_body) +updated_body = "![A dark background with two security-themed abstract shapes positioned in the top left and bottom right corners. In the center of the image, bold white text reads \\\"Incident Resolved\\\" with a white Octocat logo.](https://github.com/community/incident-discussion-bot/blob/main/.github/src/incident_resolved.png?raw=true) \n \n #{selected_incident["body"]}" +Discussion.update_discussion(body: updated_body) diff --git a/.github/actions/update_incident_discussion.rb b/.github/actions/update_incident_discussion.rb index 0f0922349..2348110d1 100755 --- a/.github/actions/update_incident_discussion.rb +++ b/.github/actions/update_incident_discussion.rb @@ -7,10 +7,11 @@ # This script takes the context from the latest update dispatch event and updates the active incident discussion # first, we must identify the correct incident to update, in the case where there are multiple open incident discussions. -open_discussions = Discussion.find_open_incident_discussions(owner: "community", repo: "community") +open_discussions = Discussion.find_open_incident_discussions(owner: "community", repo: "incident-discussion-bot") selected_incident = open_discussions.keep_if { |d| d["body"].include?("#{ENV["INCIDENT_SLUG"]}") }.first["id"] +discussion = Discussion.new(id: selected_incident) # next, we need to update the discussion with the new information -body = "### Update \n #{ENV["INCIDENT_MESSAGE"]}" +update = "### Update \n #{ENV["INCIDENT_MESSAGE"]}" -Discussion.add_comment_with_id(id: selected_incident, body:) +discussion.add_comment(body: update) diff --git a/.github/lib/discussions.rb b/.github/lib/discussions.rb index c16dadd80..a4628957c 100644 --- a/.github/lib/discussions.rb +++ b/.github/lib/discussions.rb @@ -335,6 +335,7 @@ def self.create_incident_discussion(repo_id:, title:, body:, category_id:, label clientMutationId discussion { id + body } } } @@ -358,35 +359,8 @@ def self.create_incident_discussion(repo_id:, title:, body:, category_id:, label } QUERY - GitHub.new.mutate(graphql: addLabel) end - - incident_discussion_id - end - - def self.add_comment_with_id(id:, body:) - return if id.nil? || body.nil? - # adds a comment to the given discussion - query = <<~QUERY - mutation { - addDiscussionComment( - input: { - body: "#{body}", - discussionId: "#{id}", - clientMutationId: "rubyGraphQL" - } - ) { - clientMutationId - comment { - id - body - } - } - } - QUERY - - GitHub.new.mutate(graphql: query).dig("data", "addDiscussionComment", "comment", "id") end def self.mark_comment_as_answer(comment_id:) @@ -417,7 +391,6 @@ def self.mark_comment_as_answer(comment_id:) def self.update_discussion(id:, body:) return if id.nil? || body.nil? - puts "body: #{body}" query = <<~QUERY mutation { @@ -479,7 +452,7 @@ def self.find_most_recent_incident_comment_id(id:, actor_login:) def self.find_open_incident_discussions(owner:, repo:) return [] if owner.nil? || repo.nil? - searchquery = "repo:#{owner}/#{repo} is:open author:github-actions label:\\\"Incident \:exclamation\:\\\"" + searchquery = "repo:#{owner}/#{repo} is:open author:github-actions[bot] label:\\\"Incident \:exclamation\:\\\"" query = <<~QUERY { @@ -526,7 +499,7 @@ def self.find_by_id(id:) } QUERY - GitHub.new.post(graphql: query).first&.dig("node") + GitHub.new.post(graphql: query).first end def self.close_as_resolved(id:) diff --git a/.github/workflows/close-incident-discussions.yml b/.github/workflows/close-incident-discussions.yml index 40b2dd682..8e7e9a0aa 100644 --- a/.github/workflows/close-incident-discussions.yml +++ b/.github/workflows/close-incident-discussions.yml @@ -23,15 +23,8 @@ jobs: - name: Bundle install run: bundle install - - name: Get applicable incident discussion IDs - id: get_discussion_ids - run: .github/actions/check_open_incident_discussions.rb - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - name: Close incident discussions id: close_discussions run: .github/actions/close_incident_discussions.rb env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - DISCUSSION_IDS: ${{ steps.get_discussion_ids.outputs.DISCUSSION_IDS }} From c25a37864a845346919566b0fc1b93a2c15bc11a Mon Sep 17 00:00:00 2001 From: Alida W Date: Wed, 20 Nov 2024 10:45:58 -0500 Subject: [PATCH 43/91] repo name --- .github/actions/close_incident_discussions.rb | 2 +- .github/actions/post_incident_summary.rb | 2 +- .github/actions/update_incident_discussion.rb | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/actions/close_incident_discussions.rb b/.github/actions/close_incident_discussions.rb index ef952b3ec..2f36ed03b 100755 --- a/.github/actions/close_incident_discussions.rb +++ b/.github/actions/close_incident_discussions.rb @@ -9,7 +9,7 @@ # this action checks for any open incident discussions older than 2 days, and then closes them -discussions = Discussion.find_open_incident_discussions(owner: "community", repo: "incident-discussion-bot") +discussions = Discussion.find_open_incident_discussions(owner: "community", repo: "community") discussion_ids = discussions.keep_if { |d| Time.parse(d["createdAt"]) < 2.days.ago }.map! { |d| d["id"] } diff --git a/.github/actions/post_incident_summary.rb b/.github/actions/post_incident_summary.rb index c847536b1..29e4cac5a 100755 --- a/.github/actions/post_incident_summary.rb +++ b/.github/actions/post_incident_summary.rb @@ -7,7 +7,7 @@ # This script takes the public incident summary, adds it as a comment to the incident, and then marks that comment as the answer. # first, we must identify the correct incident to update, in the case where there are multiple open incident discussions. -open_discussions = Discussion.find_open_incident_discussions(owner: "community", repo: "incident-discussion-bot") +open_discussions = Discussion.find_open_incident_discussions(owner: "community", repo: "community") selected_incident = open_discussions.keep_if { |d| d["body"].include?("#{ENV["INCIDENT_SLUG"]}") }.first discussion = Discussion.new(id: selected_incident["id"]) diff --git a/.github/actions/update_incident_discussion.rb b/.github/actions/update_incident_discussion.rb index 2348110d1..d9ff6ca7b 100755 --- a/.github/actions/update_incident_discussion.rb +++ b/.github/actions/update_incident_discussion.rb @@ -7,7 +7,7 @@ # This script takes the context from the latest update dispatch event and updates the active incident discussion # first, we must identify the correct incident to update, in the case where there are multiple open incident discussions. -open_discussions = Discussion.find_open_incident_discussions(owner: "community", repo: "incident-discussion-bot") +open_discussions = Discussion.find_open_incident_discussions(owner: "community", repo: "community") selected_incident = open_discussions.keep_if { |d| d["body"].include?("#{ENV["INCIDENT_SLUG"]}") }.first["id"] discussion = Discussion.new(id: selected_incident) From 9e7fc7f1c846b39d7da4625571cf079a514ca653 Mon Sep 17 00:00:00 2001 From: Alida W Date: Thu, 21 Nov 2024 13:03:38 -0500 Subject: [PATCH 44/91] missing parameter --- .github/actions/post_incident_summary.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/actions/post_incident_summary.rb b/.github/actions/post_incident_summary.rb index 29e4cac5a..1921d8f8b 100755 --- a/.github/actions/post_incident_summary.rb +++ b/.github/actions/post_incident_summary.rb @@ -21,4 +21,4 @@ # update the post body to include the resolved picture updated_body = "![A dark background with two security-themed abstract shapes positioned in the top left and bottom right corners. In the center of the image, bold white text reads \\\"Incident Resolved\\\" with a white Octocat logo.](https://github.com/community/incident-discussion-bot/blob/main/.github/src/incident_resolved.png?raw=true) \n \n #{selected_incident["body"]}" -Discussion.update_discussion(body: updated_body) +Discussion.update_discussion(id: discussion.id, body: updated_body) From 5f3514dca71dfc3eb2cfd8a1d7608e195b42d440 Mon Sep 17 00:00:00 2001 From: Alida W Date: Fri, 22 Nov 2024 10:35:48 -0500 Subject: [PATCH 45/91] addressing feedback: refactor to return objects, not hashes --- .github/actions/close_incident_discussions.rb | 18 ++--- .github/actions/post_incident_summary.rb | 10 +-- .github/actions/update_incident_discussion.rb | 4 +- .github/lib/discussions.rb | 75 ++++++++----------- 4 files changed, 43 insertions(+), 64 deletions(-) diff --git a/.github/actions/close_incident_discussions.rb b/.github/actions/close_incident_discussions.rb index 2f36ed03b..41b6bbd74 100755 --- a/.github/actions/close_incident_discussions.rb +++ b/.github/actions/close_incident_discussions.rb @@ -9,27 +9,25 @@ # this action checks for any open incident discussions older than 2 days, and then closes them -discussions = Discussion.find_open_incident_discussions(owner: "community", repo: "community") +discussions = Discussion.find_open_incident_discussions(owner: "community", repo: "community").keep_if { |d| d.created_at < 2.days.ago } -discussion_ids = discussions.keep_if { |d| Time.parse(d["createdAt"]) < 2.days.ago }.map! { |d| d["id"] } - -if discussion_ids.length == 0 +if discussions.length == 0 puts "No discussion IDs provided, exiting" exit end -discussion_ids.each do |d_id| +discussions.each do |d| # if a public summary has not been provided, find the most recent incident comment and mark it as the answer - unless Discussion.is_answered?(id: d_id) - comment_id = Discussion.find_most_recent_incident_comment_id(id: d_id, actor_login: "github-actions") + unless d.is_answered? + comment_id = d.find_most_recent_incident_comment_id(actor_login: "github-actions") unless comment_id.nil? Discussion.mark_comment_as_answer(comment_id:) end - updated_body = "![A dark background with two security-themed abstract shapes positioned in the top left and bottom right corners. In the center of the image, bold white text reads \\\"Incident Resolved\\\" with a white Octocat logo.](https://github.com/community/incident-discussion-bot/blob/main/.github/src/incident_resolved.png?raw=true) \n #{Discussion.find_by_id(id: d_id)["body"]}" - Discussion.update_discussion(id: d_id, body: updated_body) + updated_body = "![A dark background with two security-themed abstract shapes positioned in the top left and bottom right corners. In the center of the image, bold white text reads \\\"Incident Resolved\\\" with a white Octocat logo.](https://github.com/community/incident-discussion-bot/blob/main/.github/src/incident_resolved.png?raw=true) \n #{d.body}" + d.update_discussion(body: updated_body) end - Discussion.close_as_resolved(id: d_id) + d.close_as_resolved end diff --git a/.github/actions/post_incident_summary.rb b/.github/actions/post_incident_summary.rb index 1921d8f8b..9564bf2e5 100755 --- a/.github/actions/post_incident_summary.rb +++ b/.github/actions/post_incident_summary.rb @@ -7,18 +7,16 @@ # This script takes the public incident summary, adds it as a comment to the incident, and then marks that comment as the answer. # first, we must identify the correct incident to update, in the case where there are multiple open incident discussions. -open_discussions = Discussion.find_open_incident_discussions(owner: "community", repo: "community") -selected_incident = open_discussions.keep_if { |d| d["body"].include?("#{ENV["INCIDENT_SLUG"]}") }.first -discussion = Discussion.new(id: selected_incident["id"]) +selected_discussion = Discussion.find_open_incident_discussions(owner: "community", repo: "community").keep_if { |d| d.body.include?("#{ENV["INCIDENT_SLUG"]}") }.first # add the summary as a comment to the discussion summary = "### Incident Summary \n #{ENV["INCIDENT_PUBLIC_SUMMARY"]}" -comment_id = discussion.add_comment(body: summary).dig("data", "addDiscussionComment", "comment", "id") +comment_id = selected_discussion.add_comment(body: summary).dig("data", "addDiscussionComment", "comment", "id") # mark this new comment as the answer # (note that we don't need the discussion's context for this, so we don't call it on the instance of Discussion but on the struct) Discussion.mark_comment_as_answer(comment_id:) # update the post body to include the resolved picture -updated_body = "![A dark background with two security-themed abstract shapes positioned in the top left and bottom right corners. In the center of the image, bold white text reads \\\"Incident Resolved\\\" with a white Octocat logo.](https://github.com/community/incident-discussion-bot/blob/main/.github/src/incident_resolved.png?raw=true) \n \n #{selected_incident["body"]}" -Discussion.update_discussion(id: discussion.id, body: updated_body) +updated_body = "![A dark background with two security-themed abstract shapes positioned in the top left and bottom right corners. In the center of the image, bold white text reads \\\"Incident Resolved\\\" with a white Octocat logo.](https://github.com/community/incident-discussion-bot/blob/main/.github/src/incident_resolved.png?raw=true) \n \n #{selected_discussion.body}" +selected_discussion.update_discussion(id: discussion.id, body: updated_body) diff --git a/.github/actions/update_incident_discussion.rb b/.github/actions/update_incident_discussion.rb index d9ff6ca7b..b1a4c5691 100755 --- a/.github/actions/update_incident_discussion.rb +++ b/.github/actions/update_incident_discussion.rb @@ -7,9 +7,7 @@ # This script takes the context from the latest update dispatch event and updates the active incident discussion # first, we must identify the correct incident to update, in the case where there are multiple open incident discussions. -open_discussions = Discussion.find_open_incident_discussions(owner: "community", repo: "community") -selected_incident = open_discussions.keep_if { |d| d["body"].include?("#{ENV["INCIDENT_SLUG"]}") }.first["id"] -discussion = Discussion.new(id: selected_incident) +discussion = Discussion.find_open_incident_discussions(owner: "community", repo: "community").keep_if { |d| d.body.include?("#{ENV["INCIDENT_SLUG"]}") }.first # next, we need to update the discussion with the new information update = "### Update \n #{ENV["INCIDENT_MESSAGE"]}" diff --git a/.github/lib/discussions.rb b/.github/lib/discussions.rb index a4628957c..d20341aaf 100644 --- a/.github/lib/discussions.rb +++ b/.github/lib/discussions.rb @@ -8,7 +8,10 @@ :id, :url, :title, - :labelled + :labelled, + :body, + :created_at, + :is_answered ) do def self.all(owner: nil, repo: nil) return [] if owner.nil? || repo.nil? @@ -389,14 +392,14 @@ def self.mark_comment_as_answer(comment_id:) GitHub.new.mutate(graphql: query) end - def self.update_discussion(id:, body:) - return if id.nil? || body.nil? + def update_discussion(body:) + return if body.nil? query = <<~QUERY mutation { updateDiscussion( input: { - discussionId: "#{id}", + discussionId: "#{self.id}", body: "#{body}", clientMutationId: "rubyGraphQL" } @@ -412,13 +415,13 @@ def self.update_discussion(id:, body:) GitHub.new.mutate(graphql: query) end - def self.find_most_recent_incident_comment_id(id:, actor_login:) + def find_most_recent_incident_comment_id(actor_login:) # finds the most recent comment generated by an incident action - return nil if id.nil? || actor_login.nil? + return nil if actor_login.nil? query = <<~QUERY query { - node(id: "#{id}") { + node(id: "#{self.id}") { ... on Discussion { id comments(last: 10) { @@ -475,41 +478,40 @@ def self.find_open_incident_discussions(owner:, repo:) nodes { ... on Discussion { id - createdAt - body - } - } - } - QUERY - - GitHub.new.post(graphql: query).first&.dig("nodes") - end - - def self.find_by_id(id:) - return if id.nil? - - query = <<~QUERY - query { - node(id: "#{id}") { - ... on Discussion { - id + url + title body + createdAt + isAnswered } } } QUERY - GitHub.new.post(graphql: query).first + GitHub.new.post(graphql: query) + .map! { |r| r.dig('nodes') } + .flatten + .map do |d| + Discussion.new( + d["id"], + d["url"], + d["title"], + false, # :labelled + d["body"], + d["createdAt"], + d["isAnswered"] + ) + end end - def self.close_as_resolved(id:) + def close_as_resolved # closes the post as resolved query = <<~QUERY mutation { closeDiscussion( input: { - discussionId: "#{id}", + discussionId: "#{self.id}", reason: RESOLVED, clientMutationId: "rubyGraphQL" } @@ -524,21 +526,4 @@ def self.close_as_resolved(id:) GitHub.new.mutate(graphql: query) end - - def self.is_answered?(id:) - # checks if the post is answered - - query = <<~QUERY - query { - node(id: #{id}) { - ... on Discussion { - id - isAnswered - } - } - } - QUERY - - GitHub.new.post(graphql: query)&.first&.dig("isAnswered") - end end From d0e98841202bca0b1ee9eebdacfa0e148d50ea45 Mon Sep 17 00:00:00 2001 From: Alida W Date: Fri, 22 Nov 2024 10:38:05 -0500 Subject: [PATCH 46/91] remove unneeded parameter --- .github/actions/post_incident_summary.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/actions/post_incident_summary.rb b/.github/actions/post_incident_summary.rb index 9564bf2e5..c925addf7 100755 --- a/.github/actions/post_incident_summary.rb +++ b/.github/actions/post_incident_summary.rb @@ -19,4 +19,4 @@ # update the post body to include the resolved picture updated_body = "![A dark background with two security-themed abstract shapes positioned in the top left and bottom right corners. In the center of the image, bold white text reads \\\"Incident Resolved\\\" with a white Octocat logo.](https://github.com/community/incident-discussion-bot/blob/main/.github/src/incident_resolved.png?raw=true) \n \n #{selected_discussion.body}" -selected_discussion.update_discussion(id: discussion.id, body: updated_body) +selected_discussion.update_discussion(body: updated_body) From 9f2062a642c0d187530565b44115da796db74666 Mon Sep 17 00:00:00 2001 From: Alida W <116678254+alidacodes@users.noreply.github.com> Date: Tue, 26 Nov 2024 08:57:12 -0500 Subject: [PATCH 47/91] Update comment to specify UTC timezone --- .github/workflows/close-incident-discussions.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/close-incident-discussions.yml b/.github/workflows/close-incident-discussions.yml index 8e7e9a0aa..1c18c538e 100644 --- a/.github/workflows/close-incident-discussions.yml +++ b/.github/workflows/close-incident-discussions.yml @@ -3,7 +3,7 @@ name: Close incident discussion after time elapsed on: workflow_dispatch: schedule: - # daily at midnight + # daily at midnight UTC - cron: "0 0 * * *" jobs: From b53ad64778d8496773d224072a7a738aa0923df3 Mon Sep 17 00:00:00 2001 From: Alida W <116678254+alidacodes@users.noreply.github.com> Date: Tue, 26 Nov 2024 11:18:23 -0500 Subject: [PATCH 48/91] Update date parsing and Gemfile dependencies --- .github/actions/close_incident_discussions.rb | 3 ++- Gemfile.lock | 10 +++------- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/.github/actions/close_incident_discussions.rb b/.github/actions/close_incident_discussions.rb index 41b6bbd74..7fd85a35c 100755 --- a/.github/actions/close_incident_discussions.rb +++ b/.github/actions/close_incident_discussions.rb @@ -6,10 +6,11 @@ require "active_support" require "active_support/core_ext/date_and_time/calculations" require "active_support/core_ext/numeric/time" +require "date" # this action checks for any open incident discussions older than 2 days, and then closes them -discussions = Discussion.find_open_incident_discussions(owner: "community", repo: "community").keep_if { |d| d.created_at < 2.days.ago } +discussions = Discussion.find_open_incident_discussions(owner: "community", repo: "community").keep_if { |d| DateTime.parse(d.created_at) < 2.days.ago } if discussions.length == 0 puts "No discussion IDs provided, exiting" diff --git a/Gemfile.lock b/Gemfile.lock index 3d5c0301f..c81d735cd 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -17,18 +17,14 @@ GEM concurrent-ruby (1.2.3) connection_pool (2.4.1) drb (2.2.1) - faraday (2.9.0) - faraday-net_http (>= 2.0, < 3.2) - faraday-net_http (3.1.0) - net-http + faraday (2.0.0) + ruby2_keywords (>= 0.0.4) i18n (1.14.4) concurrent-ruby (~> 1.0) json (2.7.1) language_server-protocol (3.17.0.3) minitest (5.22.2) mutex_m (0.2.0) - net-http (0.4.1) - uri parallel (1.24.0) parser (3.3.0.5) ast (~> 2.4.1) @@ -65,11 +61,11 @@ GEM rubocop (>= 1.33.0, < 2.0) rubocop-ast (>= 1.31.1, < 2.0) ruby-progressbar (1.13.0) + ruby2_keywords (0.0.5) strscan (3.1.0) tzinfo (2.0.6) concurrent-ruby (~> 1.0) unicode-display_width (2.5.0) - uri (0.13.0) PLATFORMS arm64-darwin-21 From b2cdb8fc7a4418a44240a5acfce4486c5c0368f7 Mon Sep 17 00:00:00 2001 From: Alida W <116678254+alidacodes@users.noreply.github.com> Date: Tue, 26 Nov 2024 11:24:34 -0500 Subject: [PATCH 49/91] Fix syntax error in close_incident_discussions.rb --- .github/actions/close_incident_discussions.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/actions/close_incident_discussions.rb b/.github/actions/close_incident_discussions.rb index 7fd85a35c..3e17e1a5e 100755 --- a/.github/actions/close_incident_discussions.rb +++ b/.github/actions/close_incident_discussions.rb @@ -19,7 +19,7 @@ discussions.each do |d| # if a public summary has not been provided, find the most recent incident comment and mark it as the answer - unless d.is_answered? + unless d.is_answered comment_id = d.find_most_recent_incident_comment_id(actor_login: "github-actions") unless comment_id.nil? From 7b46df6c6f90d54ce163308ba69971d2189f1208 Mon Sep 17 00:00:00 2001 From: Alida W Date: Tue, 26 Nov 2024 11:28:58 -0500 Subject: [PATCH 50/91] gemfile correction --- Gemfile.lock | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index c81d735cd..7e6da7695 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -17,14 +17,21 @@ GEM concurrent-ruby (1.2.3) connection_pool (2.4.1) drb (2.2.1) - faraday (2.0.0) - ruby2_keywords (>= 0.0.4) + faraday (2.12.1) + faraday-net_http (>= 2.0, < 3.5) + json + logger + faraday-net_http (3.4.0) + net-http (>= 0.5.0) i18n (1.14.4) concurrent-ruby (~> 1.0) json (2.7.1) language_server-protocol (3.17.0.3) + logger (1.6.1) minitest (5.22.2) mutex_m (0.2.0) + net-http (0.5.0) + uri parallel (1.24.0) parser (3.3.0.5) ast (~> 2.4.1) @@ -61,11 +68,11 @@ GEM rubocop (>= 1.33.0, < 2.0) rubocop-ast (>= 1.31.1, < 2.0) ruby-progressbar (1.13.0) - ruby2_keywords (0.0.5) strscan (3.1.0) tzinfo (2.0.6) concurrent-ruby (~> 1.0) unicode-display_width (2.5.0) + uri (1.0.2) PLATFORMS arm64-darwin-21 From 09ce1704d64055193987639323834e85fe22dfa2 Mon Sep 17 00:00:00 2001 From: Alida W Date: Tue, 3 Dec 2024 11:25:50 -0500 Subject: [PATCH 51/91] discussion -> discussions typo correction --- .github/actions/close_incident_discussions.rb | 2 +- .github/actions/open_incident_discussion.rb | 2 +- .github/actions/post_incident_summary.rb | 2 +- .github/actions/update_incident_discussion.rb | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/actions/close_incident_discussions.rb b/.github/actions/close_incident_discussions.rb index 3e17e1a5e..0eb7b6655 100755 --- a/.github/actions/close_incident_discussions.rb +++ b/.github/actions/close_incident_discussions.rb @@ -2,7 +2,7 @@ # frozen_string_literal: true require_relative "../lib/github" -require_relative "../lib/discussion" +require_relative "../lib/discussions" require "active_support" require "active_support/core_ext/date_and_time/calculations" require "active_support/core_ext/numeric/time" diff --git a/.github/actions/open_incident_discussion.rb b/.github/actions/open_incident_discussion.rb index d5ddbe76e..ad67a15ec 100755 --- a/.github/actions/open_incident_discussion.rb +++ b/.github/actions/open_incident_discussion.rb @@ -2,7 +2,7 @@ # frozen_string_literal: true require_relative "../lib/github" -require_relative "../lib/discussion" +require_relative "../lib/discussions" require "active_support/core_ext/date_time" # This script takes context from a received webhook and creates a new discussion in the correct discussion category diff --git a/.github/actions/post_incident_summary.rb b/.github/actions/post_incident_summary.rb index c925addf7..872f28ea5 100755 --- a/.github/actions/post_incident_summary.rb +++ b/.github/actions/post_incident_summary.rb @@ -2,7 +2,7 @@ # frozen_string_literal: true require_relative "../lib/github" -require_relative "../lib/discussion" +require_relative "../lib/discussions" # This script takes the public incident summary, adds it as a comment to the incident, and then marks that comment as the answer. diff --git a/.github/actions/update_incident_discussion.rb b/.github/actions/update_incident_discussion.rb index b1a4c5691..69ddb0cc3 100755 --- a/.github/actions/update_incident_discussion.rb +++ b/.github/actions/update_incident_discussion.rb @@ -2,7 +2,7 @@ # frozen_string_literal: true require_relative "../lib/github" -require_relative "../lib/discussion" +require_relative "../lib/discussions" # This script takes the context from the latest update dispatch event and updates the active incident discussion From 7d603772b51f8504328e146a6a88c3aed71d0bf0 Mon Sep 17 00:00:00 2001 From: Alida W Date: Mon, 9 Dec 2024 09:12:46 -0500 Subject: [PATCH 52/91] Updating logic to exit early if no discussion found --- .github/actions/close_incident_discussions.rb | 2 +- .github/actions/post_incident_summary.rb | 5 +++++ .github/actions/update_incident_discussion.rb | 5 +++++ 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/.github/actions/close_incident_discussions.rb b/.github/actions/close_incident_discussions.rb index 0eb7b6655..1790927bd 100755 --- a/.github/actions/close_incident_discussions.rb +++ b/.github/actions/close_incident_discussions.rb @@ -13,7 +13,7 @@ discussions = Discussion.find_open_incident_discussions(owner: "community", repo: "community").keep_if { |d| DateTime.parse(d.created_at) < 2.days.ago } if discussions.length == 0 - puts "No discussion IDs provided, exiting" + puts "No applicable discussions found, exiting" exit end diff --git a/.github/actions/post_incident_summary.rb b/.github/actions/post_incident_summary.rb index 872f28ea5..d405eca78 100755 --- a/.github/actions/post_incident_summary.rb +++ b/.github/actions/post_incident_summary.rb @@ -9,6 +9,11 @@ # first, we must identify the correct incident to update, in the case where there are multiple open incident discussions. selected_discussion = Discussion.find_open_incident_discussions(owner: "community", repo: "community").keep_if { |d| d.body.include?("#{ENV["INCIDENT_SLUG"]}") }.first +if selected_discussion.nil? + puts "No applicable discussion, exiting" + exit +end + # add the summary as a comment to the discussion summary = "### Incident Summary \n #{ENV["INCIDENT_PUBLIC_SUMMARY"]}" comment_id = selected_discussion.add_comment(body: summary).dig("data", "addDiscussionComment", "comment", "id") diff --git a/.github/actions/update_incident_discussion.rb b/.github/actions/update_incident_discussion.rb index 69ddb0cc3..8c14e7a75 100755 --- a/.github/actions/update_incident_discussion.rb +++ b/.github/actions/update_incident_discussion.rb @@ -9,6 +9,11 @@ # first, we must identify the correct incident to update, in the case where there are multiple open incident discussions. discussion = Discussion.find_open_incident_discussions(owner: "community", repo: "community").keep_if { |d| d.body.include?("#{ENV["INCIDENT_SLUG"]}") }.first +if discussion.nil? + puts "No applicable discussion, exiting" + exit +end + # next, we need to update the discussion with the new information update = "### Update \n #{ENV["INCIDENT_MESSAGE"]}" From 39dee0cc6dd75c0359745a1c873571c51b551793 Mon Sep 17 00:00:00 2001 From: Alida W Date: Tue, 7 Jan 2025 09:20:56 -0500 Subject: [PATCH 53/91] add workflow for 'incident-resolved' event type --- .github/actions/close_incident_discussions.rb | 2 +- .github/actions/post_incident_summary.rb | 8 ++-- .../actions/resolve_incident_discussion.rb | 15 +++++++ ...update-incident-discussion-as-resolved.yml | 39 +++++++++++++++++++ 4 files changed, 60 insertions(+), 4 deletions(-) create mode 100755 .github/actions/resolve_incident_discussion.rb create mode 100644 .github/workflows/update-incident-discussion-as-resolved.yml diff --git a/.github/actions/close_incident_discussions.rb b/.github/actions/close_incident_discussions.rb index 1790927bd..73cf37227 100755 --- a/.github/actions/close_incident_discussions.rb +++ b/.github/actions/close_incident_discussions.rb @@ -26,7 +26,7 @@ Discussion.mark_comment_as_answer(comment_id:) end - updated_body = "![A dark background with two security-themed abstract shapes positioned in the top left and bottom right corners. In the center of the image, bold white text reads \\\"Incident Resolved\\\" with a white Octocat logo.](https://github.com/community/incident-discussion-bot/blob/main/.github/src/incident_resolved.png?raw=true) \n #{d.body}" + updated_body = "![A dark background with two security-themed abstract shapes positioned in the top left and bottom right corners. In the center of the image, bold white text reads \\\"Incident Resolved\\\" with a white Octocat logo.](https://github.com/community/community/blob/main/.github/src/incident_resolved.png?raw=true) \n #{d.body}" d.update_discussion(body: updated_body) end diff --git a/.github/actions/post_incident_summary.rb b/.github/actions/post_incident_summary.rb index d405eca78..20b756fb0 100755 --- a/.github/actions/post_incident_summary.rb +++ b/.github/actions/post_incident_summary.rb @@ -22,6 +22,8 @@ # (note that we don't need the discussion's context for this, so we don't call it on the instance of Discussion but on the struct) Discussion.mark_comment_as_answer(comment_id:) -# update the post body to include the resolved picture -updated_body = "![A dark background with two security-themed abstract shapes positioned in the top left and bottom right corners. In the center of the image, bold white text reads \\\"Incident Resolved\\\" with a white Octocat logo.](https://github.com/community/incident-discussion-bot/blob/main/.github/src/incident_resolved.png?raw=true) \n \n #{selected_discussion.body}" -selected_discussion.update_discussion(body: updated_body) +# update the post body to include the resolved picture, but only if the post body has not already been updated. +unless selected_discussion.body.include?("https://github.com/community/community/blob/main/.github/src/incident_resolved.png?raw=true") + updated_body = "![A dark background with two security-themed abstract shapes positioned in the top left and bottom right corners. In the center of the image, bold white text reads \\\"Incident Resolved\\\" with a white Octocat logo.](https://github.com/community/community/blob/main/.github/src/incident_resolved.png?raw=true) \n \n #{selected_discussion.body}" + selected_discussion.update_discussion(body: updated_body) +end diff --git a/.github/actions/resolve_incident_discussion.rb b/.github/actions/resolve_incident_discussion.rb new file mode 100755 index 000000000..be37f98e2 --- /dev/null +++ b/.github/actions/resolve_incident_discussion.rb @@ -0,0 +1,15 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true + +require_relative "../lib/github" +require_relative "../lib/discussions" + +# This script acts when we receieve an incident resolved dispatch event to update the incident discussion. + +# first, we must identify the correct incident to update, in the case where there are multiple open incident discussions. +discussion = Discussion.find_open_incident_discussions(owner: "community", repo: "community").keep_if { |d| d.body.include?("#{ENV["INCIDENT_SLUG"]}") }.first + +discussion.add_comment(body: "### Incident Resolved \n This incident has been resolved.") +# update the post body to include the resolved picture +updated_body = "![A dark background with two security-themed abstract shapes positioned in the top left and bottom right corners. In the center of the image, bold white text reads \\\"Incident Resolved\\\" with a white Octocat logo.](https://github.com/community/community/blob/main/.github/src/incident_resolved.png?raw=true) \n \n #{discussion.body}" +discussion.update_discussion(body: updated_body) diff --git a/.github/workflows/update-incident-discussion-as-resolved.yml b/.github/workflows/update-incident-discussion-as-resolved.yml new file mode 100644 index 000000000..f092a467f --- /dev/null +++ b/.github/workflows/update-incident-discussion-as-resolved.yml @@ -0,0 +1,39 @@ +name: Mark incident discussion as resolved + +on: + repository_dispatch: + types: [incident-resolved] + +jobs: + resolve_discussion: + runs-on: ubuntu-latest + permissions: + actions: read + contents: read + discussions: write + steps: + - name: Checkout Repository + uses: actions/checkout@v4 + + - name: Set up Ruby + uses: ruby/setup-ruby@7bae1d00b5db9166f4f0fc47985a3a5702cb58f0 + + - name: Bundle install + run: bundle install + + - name: Get incident URL slug + id: incident_slug + uses: actions/github-script@v7 + with: + result-encoding: string + script: | + const url = "${{ github.event.client_payload.incidentLink }}" + const slug = url.split('/').pop(); + return slug + + - name: Mark incident discussion as resolved + id: mark_resolved + run: .github/actions/resolve_incident_discussion.rb + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + INCIDENT_SLUG: ${{ steps.incident_slug.outputs.result }} \ No newline at end of file From 1116cc17cedfb69a64c4fcc1f90e239a51d34b26 Mon Sep 17 00:00:00 2001 From: Alida W <116678254+alidacodes@users.noreply.github.com> Date: Thu, 9 Jan 2025 11:22:14 -0500 Subject: [PATCH 54/91] Update resolve_incident_discussion.rb to exit early --- .github/actions/resolve_incident_discussion.rb | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/actions/resolve_incident_discussion.rb b/.github/actions/resolve_incident_discussion.rb index be37f98e2..cafea375b 100755 --- a/.github/actions/resolve_incident_discussion.rb +++ b/.github/actions/resolve_incident_discussion.rb @@ -9,6 +9,11 @@ # first, we must identify the correct incident to update, in the case where there are multiple open incident discussions. discussion = Discussion.find_open_incident_discussions(owner: "community", repo: "community").keep_if { |d| d.body.include?("#{ENV["INCIDENT_SLUG"]}") }.first +if discussion.nil? + puts "No applicable discussion, exiting" + exit +end + discussion.add_comment(body: "### Incident Resolved \n This incident has been resolved.") # update the post body to include the resolved picture updated_body = "![A dark background with two security-themed abstract shapes positioned in the top left and bottom right corners. In the center of the image, bold white text reads \\\"Incident Resolved\\\" with a white Octocat logo.](https://github.com/community/community/blob/main/.github/src/incident_resolved.png?raw=true) \n \n #{discussion.body}" From a3f5bb732181af6fcda666f94be437e508ac42b7 Mon Sep 17 00:00:00 2001 From: Alida W <116678254+alidacodes@users.noreply.github.com> Date: Thu, 9 Jan 2025 13:39:04 -0500 Subject: [PATCH 55/91] Update close_incident_discussions.rb --- .github/actions/close_incident_discussions.rb | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/actions/close_incident_discussions.rb b/.github/actions/close_incident_discussions.rb index 73cf37227..7ed47a12b 100755 --- a/.github/actions/close_incident_discussions.rb +++ b/.github/actions/close_incident_discussions.rb @@ -26,8 +26,11 @@ Discussion.mark_comment_as_answer(comment_id:) end - updated_body = "![A dark background with two security-themed abstract shapes positioned in the top left and bottom right corners. In the center of the image, bold white text reads \\\"Incident Resolved\\\" with a white Octocat logo.](https://github.com/community/community/blob/main/.github/src/incident_resolved.png?raw=true) \n #{d.body}" - d.update_discussion(body: updated_body) + # an incident that has been declared as "resolved" should have already updated the post body, this is in case that step failed. + unless d.body.include?("https://github.com/community/community/blob/main/.github/src/incident_resolved.png?raw=true") + updated_body = "![A dark background with two security-themed abstract shapes positioned in the top left and bottom right corners. In the center of the image, bold white text reads \\\"Incident Resolved\\\" with a white Octocat logo.](https://github.com/community/community/blob/main/.github/src/incident_resolved.png?raw=true) \n #{d.body}" + d.update_discussion(body: updated_body) + end end d.close_as_resolved From 83b9d9d9612ad93d897707d0820cf7f5d2cfa779 Mon Sep 17 00:00:00 2001 From: Shiny Bright Star <88844700+shinybrightstar@users.noreply.github.com> Date: Thu, 6 Feb 2025 14:04:53 +0100 Subject: [PATCH 56/91] Update general.yml I added that achievements have been discontinued in the community to discourage badge hunters. --- .github/DISCUSSION_TEMPLATE/general.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/DISCUSSION_TEMPLATE/general.yml b/.github/DISCUSSION_TEMPLATE/general.yml index eb974c4ac..598ebb209 100644 --- a/.github/DISCUSSION_TEMPLATE/general.yml +++ b/.github/DISCUSSION_TEMPLATE/general.yml @@ -4,6 +4,10 @@ body: attributes: value: ⚠️ The Community can not help with account-related issues, such as reinstatement requests or help to escalate your [GitHub Support](https://support.github.com/contact) tickets. ⚠️ +- type: markdown + attributes: + value: + 📛 We made the decision to disable the ability to earn Achievements in our Community in order to discourage users from participating in coordinated or inauthentic activity like rapid questions and answers in order to earn badges. You can learn more about this decision in our announcement post here [Achievements will no longer be available in the Community](https://github.com/orgs/community/discussions/106536) 📛 - type: dropdown attributes: label: Select Topic Area From 0e1b9578ab8c5bd7f27db3cba880d609408ee5d4 Mon Sep 17 00:00:00 2001 From: Shiny Bright Star <88844700+shinybrightstar@users.noreply.github.com> Date: Thu, 6 Feb 2025 14:17:40 +0100 Subject: [PATCH 57/91] Update general.yml --- .github/DISCUSSION_TEMPLATE/general.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/DISCUSSION_TEMPLATE/general.yml b/.github/DISCUSSION_TEMPLATE/general.yml index 598ebb209..3a64c3d6d 100644 --- a/.github/DISCUSSION_TEMPLATE/general.yml +++ b/.github/DISCUSSION_TEMPLATE/general.yml @@ -7,7 +7,7 @@ body: - type: markdown attributes: value: - 📛 We made the decision to disable the ability to earn Achievements in our Community in order to discourage users from participating in coordinated or inauthentic activity like rapid questions and answers in order to earn badges. You can learn more about this decision in our announcement post here [Achievements will no longer be available in the Community](https://github.com/orgs/community/discussions/106536) 📛 + 📛 We made the decision to disable the ability to earn Achievements in our Community in order to discourage users from participating in coordinated or inauthentic activity like rapid questions and answers in order to earn badges. You can learn more about this decision in our announcement post here [Achievements will no longer be available in the Community](https://github.com/orgs/community/discussions/106536) 📛 - type: dropdown attributes: label: Select Topic Area From f9125f4162069cf3f498cd55b2d0f498069572f0 Mon Sep 17 00:00:00 2001 From: ebndev <164093511+ebndev@users.noreply.github.com> Date: Thu, 20 Feb 2025 13:20:33 -0800 Subject: [PATCH 58/91] Update projects-and-issues.yml --- .github/DISCUSSION_TEMPLATE/projects-and-issues.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/DISCUSSION_TEMPLATE/projects-and-issues.yml b/.github/DISCUSSION_TEMPLATE/projects-and-issues.yml index 50c5080c9..68aaa2561 100644 --- a/.github/DISCUSSION_TEMPLATE/projects-and-issues.yml +++ b/.github/DISCUSSION_TEMPLATE/projects-and-issues.yml @@ -38,7 +38,8 @@ body: - type: textarea attributes: label: Body - description: Start your discussion! + description: > + Start your discussion! placeholder: >- STOP! This category is only for discussions on GitHub Issues and GitHub Projects. GitHub Issues are the issues you open in a repo to From 2ff58f63ab5467b94465b73c4f2b2833ac1a48b8 Mon Sep 17 00:00:00 2001 From: ebndev <164093511+ebndev@users.noreply.github.com> Date: Thu, 20 Feb 2025 13:21:43 -0800 Subject: [PATCH 59/91] Update projects-and-issues.yml --- .github/DISCUSSION_TEMPLATE/projects-and-issues.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/DISCUSSION_TEMPLATE/projects-and-issues.yml b/.github/DISCUSSION_TEMPLATE/projects-and-issues.yml index 68aaa2561..b27369de4 100644 --- a/.github/DISCUSSION_TEMPLATE/projects-and-issues.yml +++ b/.github/DISCUSSION_TEMPLATE/projects-and-issues.yml @@ -40,6 +40,12 @@ body: label: Body description: > Start your discussion! + + STOP! This category is only for discussions on GitHub Issues and + GitHub Projects. GitHub Issues are the issues you open in a repo to + track your work. NOT issues you are having with GitHub or a GitHub + product. GitHub Projects are project boards you can create for example + Kanban boards, to track your work. NOT projects on GitHub. placeholder: >- STOP! This category is only for discussions on GitHub Issues and GitHub Projects. GitHub Issues are the issues you open in a repo to From 4e0530e6756c6c8acd3add44440ce21a1dd30506 Mon Sep 17 00:00:00 2001 From: ebndev <164093511+ebndev@users.noreply.github.com> Date: Thu, 20 Feb 2025 13:23:51 -0800 Subject: [PATCH 60/91] Update projects-and-issues.yml --- .../DISCUSSION_TEMPLATE/projects-and-issues.yml | 17 ++--------------- 1 file changed, 2 insertions(+), 15 deletions(-) diff --git a/.github/DISCUSSION_TEMPLATE/projects-and-issues.yml b/.github/DISCUSSION_TEMPLATE/projects-and-issues.yml index b27369de4..f765eb0a0 100644 --- a/.github/DISCUSSION_TEMPLATE/projects-and-issues.yml +++ b/.github/DISCUSSION_TEMPLATE/projects-and-issues.yml @@ -6,7 +6,7 @@ body: feature areas [Issues](https://docs.github.com/en/issues/tracking-your-work-with-issues/about-issues) and - [Projects](https://docs.github.com/en/issues/planning-and-tracking-with-projects/learning-about-projects/about-projects) + [Projects](https://docs.github.com/en/issues/planning-and-tracking-with-projects/learning-about-projects/about-projects), not issues you are experiencing with GitHub or projects hosted on GitHub. ⚠️ - type: dropdown attributes: @@ -38,26 +38,13 @@ body: - type: textarea attributes: label: Body - description: > - Start your discussion! - - STOP! This category is only for discussions on GitHub Issues and - GitHub Projects. GitHub Issues are the issues you open in a repo to - track your work. NOT issues you are having with GitHub or a GitHub - product. GitHub Projects are project boards you can create for example - Kanban boards, to track your work. NOT projects on GitHub. + description: Start your discussion! placeholder: >- STOP! This category is only for discussions on GitHub Issues and GitHub Projects. GitHub Issues are the issues you open in a repo to track your work. NOT issues you are having with GitHub or a GitHub product. GitHub Projects are project boards you can create for example Kanban boards, to track your work. NOT projects on GitHub. - - - We know the "issues" and ‘projects” naming conventions can be a little confusing. - - - To report an issue with another area of the GitHub, use the correct product category, if one does not exist, use the General category. To ensure you receive a timely response and connect with the proper team(s) make sure you are posting in the correct category. validations: required: true - type: checkboxes From 1a77bba78114527250b3bc0c9cecf2850021cf3b Mon Sep 17 00:00:00 2001 From: ebndev <164093511+ebndev@users.noreply.github.com> Date: Thu, 20 Feb 2025 13:28:38 -0800 Subject: [PATCH 61/91] Update projects-and-issues.yml --- .github/DISCUSSION_TEMPLATE/projects-and-issues.yml | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/.github/DISCUSSION_TEMPLATE/projects-and-issues.yml b/.github/DISCUSSION_TEMPLATE/projects-and-issues.yml index f765eb0a0..b8953164b 100644 --- a/.github/DISCUSSION_TEMPLATE/projects-and-issues.yml +++ b/.github/DISCUSSION_TEMPLATE/projects-and-issues.yml @@ -6,7 +6,7 @@ body: feature areas [Issues](https://docs.github.com/en/issues/tracking-your-work-with-issues/about-issues) and - [Projects](https://docs.github.com/en/issues/planning-and-tracking-with-projects/learning-about-projects/about-projects), not issues you are experiencing with GitHub or projects hosted on GitHub. + [Projects](https://docs.github.com/en/issues/planning-and-tracking-with-projects/learning-about-projects/about-projects). ⚠️ - type: dropdown attributes: @@ -40,11 +40,10 @@ body: label: Body description: Start your discussion! placeholder: >- - STOP! This category is only for discussions on GitHub Issues and - GitHub Projects. GitHub Issues are the issues you open in a repo to + STOP! GitHub Issues refers to the issues you open in a repo to track your work. NOT issues you are having with GitHub or a GitHub product. GitHub Projects are project boards you can create for example - Kanban boards, to track your work. NOT projects on GitHub. + Kanban boards, to track your work. NOT projects on GitHub. To ensure you receive a timely response by the correct team(s), make sure you are posting in the right category. validations: required: true - type: checkboxes From e120763d3f8c341e3c7de04b417c59dd113d0f9e Mon Sep 17 00:00:00 2001 From: Ashley Nicolson Date: Mon, 3 Mar 2025 12:43:38 +0000 Subject: [PATCH 62/91] Update github-education.yml --- .../DISCUSSION_TEMPLATE/github-education.yml | 32 ++++++++++--------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/.github/DISCUSSION_TEMPLATE/github-education.yml b/.github/DISCUSSION_TEMPLATE/github-education.yml index c2d50bccf..0e3ff8864 100644 --- a/.github/DISCUSSION_TEMPLATE/github-education.yml +++ b/.github/DISCUSSION_TEMPLATE/github-education.yml @@ -2,34 +2,36 @@ body: - type: markdown attributes: value: | - ## We’re really excited you’re here! 👋 🎉 Welcome to the GitHub Education community! 🎒 + #### Welcome! Before You Create a New Post... - type: markdown attributes: value: | - Before jumping into your conversation please read the hints and tips below to help you create a great discussion topic others would more likely respond to 💬 + Please read the **hints and tips** below. Your question might already have an answer waiting for you! + If you are new here and are unsure where to start, please check out our [Quick Start Guide](https://github.com/orgs/community/discussions/141947). 👈 - type: markdown attributes: value: | - #### Are you asking for help with your GitHub Global Campus application process? - * **Help us to help you** 👍 Provide as much relevant information about your application as possible including posting your **latest rejection reasons**. - * Do **not post** any personal information on the discussions boards e.g images of your evidence. + ### Let's first see if you need to create a discussion 🧠🔮 _We will attempt to read your mind..._ + - **"Where are my academic benefits?"** Do you have this approved status image? You'll usually receive your benefits after 3 days of this approval status. Patience, my friend, patience! 😎 **"Awesome. But it's been 5 days?"** 😅 If you haven’t received your benefits within 5 days of your approval status, then yes, create this discussion and we'll assist! + - **Check out our [SDP FAQ](https://github.com/orgs/community/discussions/111352) and [Educators FAQ](https://github.com/orgs/community/discussions/145312)** – It has the most commonly asked questions when applying including: + * ⏱️ [How long after I’ve been approved will I receive my academic benefits?](https://github.com/orgs/community/discussions/111352#how-long-after-ive-been-approved-will-i-receive-my-academic-benefits) + * 📩 [I don't have a school-issued email address, what other official proof of enrollment is accepted?](https://github.com/orgs/community/discussions/111352#i-dont-have-a-school-issued-email-address) + * ✈️ 💻 [How to enable Copilot Pro for GitHub Education verified students/teachers?](https://github.com/orgs/community/discussions/111352#enable-copilot-education) + ### Thanks, but I still want to join the conversation! 💬😄 _Love it! We're here for the banter_ + - **Can’t find your answer in our [SDP FAQ](https://github.com/orgs/community/discussions/111352)?** Then provide as much relevant information about your application as possible including posting your latest rejection reasons. + - **Calling all verified Educators** 📣 Did you know we have an exclusive teachers only discussions board you can access after being verified? 🤫 [Check it out here](https://github.com/community/Global-Campus-Teachers/discussions?new-dis) 👈 - #### Need Octernships project guidance? - * We **can not** provide specific project guidance and can only recommend you [reach out to your Octernships project maintainers](https://github.com/orgs/community/discussions/51456#discussioncomment-5542896) for instructions or to raise a bug. + Once you're ready to post, feel free to jump in. **We’re here to help!** 🌟 Ensure you have read our [Code of Conduct](https://github.com/community/community/blob/main/CODE_OF_CONDUCT.md). Remember **do not post** any personal information on the discussions boards e.g images of your evidence. - type: textarea id: conversation attributes: label: Hi everyone, - description: "Start your conversation below👇. Ensure you have read and adhere to our [Code of Conduct](https://github.com/community/community/blob/main/CODE_OF_CONDUCT.md). For more expectations around feedback responses - check out the [Community ReadMe](https://github.com/community/community#from-a-suggestion-to-a-shipped-feature)." + description: validations: required: true - type: markdown attributes: value: | - #### Anything else I should check before posting? 🤔 - * Check out the available documentation answering commonly asked questions: [Octernships FAQs](https://github.com/orgs/community/discussions/49380); [Student Developer Pack Application & FAQs](https://github.com/orgs/community/discussions/17814); [Campus Experts](https://education.github.com/students/experts). - * Search these boards for previous threads describing similar problems. ⭐ ***Hint:*** *search by rejection reason* - - type: markdown - attributes: - value: | - Remember to mark an [answer as "solved"](https://docs.github.com/en/discussions/collaborating-with-your-community-using-discussions/participating-in-a-discussion#marking-a-comment-as-an-answer) to help others with similar questions. ✅ + #### Anything else I could do to make my experience here more rewarding? 🤔 + * Remember to mark an [answer as "solved"](https://docs.github.com/en/discussions/collaborating-with-your-community-using-discussions/participating-in-a-discussion#marking-a-comment-as-an-answer) to help others with similar questions. ✅ + * Praise generously 💖 Thank members who have helped you and continue to support others within the community. ✨ From 8e1e27d68ac4742a5bfce4b15a363a3c682ff6ff Mon Sep 17 00:00:00 2001 From: Ashley Nicolson Date: Mon, 3 Mar 2025 18:36:46 +0000 Subject: [PATCH 63/91] Update github-education.yml --- .github/DISCUSSION_TEMPLATE/github-education.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/DISCUSSION_TEMPLATE/github-education.yml b/.github/DISCUSSION_TEMPLATE/github-education.yml index 0e3ff8864..e34d1bfb7 100644 --- a/.github/DISCUSSION_TEMPLATE/github-education.yml +++ b/.github/DISCUSSION_TEMPLATE/github-education.yml @@ -13,12 +13,12 @@ body: value: | ### Let's first see if you need to create a discussion 🧠🔮 _We will attempt to read your mind..._ - **"Where are my academic benefits?"** Do you have this approved status image? You'll usually receive your benefits after 3 days of this approval status. Patience, my friend, patience! 😎 **"Awesome. But it's been 5 days?"** 😅 If you haven’t received your benefits within 5 days of your approval status, then yes, create this discussion and we'll assist! - - **Check out our [SDP FAQ](https://github.com/orgs/community/discussions/111352) and [Educators FAQ](https://github.com/orgs/community/discussions/145312)** – It has the most commonly asked questions when applying including: - * ⏱️ [How long after I’ve been approved will I receive my academic benefits?](https://github.com/orgs/community/discussions/111352#how-long-after-ive-been-approved-will-i-receive-my-academic-benefits) + - **Check out our [SDP FAQ](https://gh.io/sdp-faq-nd) and [Educators FAQ](https://github.com/orgs/community/discussions/145312)** – It has the most commonly asked questions when applying including: + * ⏱️ [How long after I’ve been approved will I receive my academic benefits?](https://gh.io/faq-nd-long) * 📩 [I don't have a school-issued email address, what other official proof of enrollment is accepted?](https://github.com/orgs/community/discussions/111352#i-dont-have-a-school-issued-email-address) - * ✈️ 💻 [How to enable Copilot Pro for GitHub Education verified students/teachers?](https://github.com/orgs/community/discussions/111352#enable-copilot-education) + * ✈️ 💻 [How to enable Copilot Pro for GitHub Education verified students/teachers?](https://gh.io/faq-nd-copilot) ### Thanks, but I still want to join the conversation! 💬😄 _Love it! We're here for the banter_ - - **Can’t find your answer in our [SDP FAQ](https://github.com/orgs/community/discussions/111352)?** Then provide as much relevant information about your application as possible including posting your latest rejection reasons. + - **Can’t find your answer in our [SDP FAQ](https://gh.io/sdp-faq-nd)?** Then provide as much relevant information about your application as possible including posting your latest rejection reasons. - **Calling all verified Educators** 📣 Did you know we have an exclusive teachers only discussions board you can access after being verified? 🤫 [Check it out here](https://github.com/community/Global-Campus-Teachers/discussions?new-dis) 👈 Once you're ready to post, feel free to jump in. **We’re here to help!** 🌟 Ensure you have read our [Code of Conduct](https://github.com/community/community/blob/main/CODE_OF_CONDUCT.md). Remember **do not post** any personal information on the discussions boards e.g images of your evidence. From 10a35b8bd6db8f1e115712040873f30026575073 Mon Sep 17 00:00:00 2001 From: Lili <92824518+queenofcorgis@users.noreply.github.com> Date: Tue, 11 Mar 2025 12:49:35 -0400 Subject: [PATCH 64/91] Create Meet the Maintainers Sweepstakes Rules.md --- .../Meet the Maintainers Sweepstakes Rules.md | 74 +++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 docs/Meet the Maintainers Sweepstakes Rules.md diff --git a/docs/Meet the Maintainers Sweepstakes Rules.md b/docs/Meet the Maintainers Sweepstakes Rules.md new file mode 100644 index 000000000..b4dca0250 --- /dev/null +++ b/docs/Meet the Maintainers Sweepstakes Rules.md @@ -0,0 +1,74 @@ +### Meet the Maintainers March 2025 Random Prize Draw Terms and Conditions + +**1. Promoter** +The promoter of this prize draw is GitHub Community, a division of GitHub, Inc., located at 88 Colin P. Kelly Jr. Street, San Francisco, CA 94107, USA. + +**2. Eligibility** + +The prize draw is open to verified registered GitHub users who are at least 13 years old. +- Employees of GitHub, Microsoft, their immediate families, and anyone otherwise connected with the organization are not eligible to enter. +- Participants under 18 years must have parental or guardian consent to enter. +- The prize draw is void in countries where such promotions are prohibited by law. This includes, but is not limited to, the following countries: + - Belgium + - Poland + - Malaysia + - Brunei + - Bangladesh + - Italy + - Any other country where local laws prohibit free entry random prize draws + +**3. Entry Period** + +- The entry period begins on March 11, 2025 11:59 PM EST and ends on March 18, 2025, at 11:59 PM EST. + +**4. How to Enter** + +- To enter, participants must visit the designated forum discussion and ask a question. +- Entries must be original and not generated entirely by AI tools. AI tools may be used for grammar and spelling checks only. + +**5. Free Entry** + +- Participation in the prize draw is free, and no purchase is necessary to enter or win. + +**6. Parental/Guardian Consent** + +- If you are under 18 years old, you must have parental or guardian consent to enter the prize draw. By entering, you confirm that you have obtained such consent. + +**7. Selection of Winners** + +- Up to 5 winners will be selected at random from all eligible entries between March 11 and March 18, 2025. +- The draw will be conducted using a verifiably random process under the supervision of an independent person or by an independent entity. + +**8. Notification of Winners** + +- Winners will be notified via the discussion by March 25, 2025. +- Winners must fill out the form within 7 days to claim their prize. Failure to respond within this period may result in forfeiture of the prize, and GitHub Education reserves the right to select an alternative winner. + +**9. Prizes** + +- Each winner will receive a Github Shop voucher +- Prizes are non-transferable and no cash alternative is available. +- GitHub Community reserves the right to substitute any prize with another of equivalent value without giving notice. + +**10. Data Protection** + +- Participants’ personal data will be used solely for the purposes of administering the prize draw and in accordance with GitHub’s privacy policy. + +**11. General Conditions** + +- GitHub Community reserves the right to cancel or amend the prize draw and these terms and conditions without notice in the event of a catastrophe, war, civil or military disturbance, or any actual or anticipated breach of any applicable law or regulation or any other event outside GitHub Education’s control. +- GitHub Community is not responsible for inaccurate prize details supplied to any participant by any third party connected with this prize draw. + +**12. Governing Law** + +- This prize draw and these terms and conditions will be governed by the laws of the country where the participant resides, provided that such laws do not conflict with the laws of the United States. Any disputes will be subject to the non-exclusive jurisdiction of the courts of the country of the participant’s residence. + +**13. Limitation of Liability** + +- By entering, participants agree to release and hold harmless GitHub Community, GitHub, Inc., and Microsoft from any liability, illness, injury, death, loss, litigation, claim, or damage that may occur, directly or indirectly, whether caused by negligence or not, from such entrant’s participation in the prize draw and/or their acceptance, possession, use, or misuse of any prize or any portion thereof. + +**14. Sponsor** + +- The prize draw is sponsored by GitHub Community. + +For further information or any questions regarding the prize draw, please contact [queenofcorgis@github.com]. From 6ccd77a45d51478cb1c31bde9f1baea5e2fe813a Mon Sep 17 00:00:00 2001 From: Lili <92824518+queenofcorgis@users.noreply.github.com> Date: Mon, 31 Mar 2025 13:30:15 -0400 Subject: [PATCH 65/91] Create Spring 2025 GitHub Foundation Certification Prep Course Sweepstakes Official Rules.md --- ... Prep Course Sweepstakes Official Rules.md | 115 ++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 docs/Spring 2025 GitHub Foundation Certification Prep Course Sweepstakes Official Rules.md diff --git a/docs/Spring 2025 GitHub Foundation Certification Prep Course Sweepstakes Official Rules.md b/docs/Spring 2025 GitHub Foundation Certification Prep Course Sweepstakes Official Rules.md new file mode 100644 index 000000000..b399a7b24 --- /dev/null +++ b/docs/Spring 2025 GitHub Foundation Certification Prep Course Sweepstakes Official Rules.md @@ -0,0 +1,115 @@ +# MICROSOFT SPRING 2025 GITHUB FOUNDATIONS CERTIFICATION PREP COURSE SWEEPSTAKES + +## OFFICIAL RULES + +--- + +## SPONSOR + +These Official Rules ("Rules") govern the operation of the Microsoft Spring 2025 GitHub Foundations Certification Prep Course Sweepstakes ("Sweepstakes"). Microsoft Corporation, One Microsoft Way, Redmond, WA, 98052, USA, is the Sweepstakes sponsor ("Sponsor"). + +--- + +## DEFINITIONS + +In these Rules, "Microsoft", "we", "our", and "us" refer to Sponsor and "you" and "yourself" refers to a Sweepstakes participant, or the parent/legal guardian of any Sweepstakes entrant who has not reached the age of majority to contractually obligate themselves in their legal place of residence. By entering you (your parent/legal guardian if you are not the age of majority in your legal place of residence) agree to be bound by these Rules. + +--- + +## ENTRY PERIOD + +The Sweepstakes starts at **12:00 a.m. Pacific Time (PT) on March 31, 2025**, and ends at **11:59 p.m. PT on May 2, 2025** and will consist of five (5) weekly Entry Periods as follows (each an "Entry Period"): + +- **March 31, 2025, 12:00 a.m. PT – April 4, 2025, 11:59 p.m. PT** +- **April 5, 2025, 12:00 a.m. PT – April 11, 2025, 11:59 p.m. PT** +- **April 12, 2025, 12:00 a.m. PT – April 18, 2025, 11:59 p.m. PT** +- **April 19, 2025, 12:00 a.m. PT – April 25, 2025, 11:59 p.m. PT** +- **April 26, 2025, 12:00 a.m. PT – May 2, 2025, 11:59 p.m. PT** + +--- + +## ELIGIBILITY + +To enter, you must be **14 years of age or older** with an **active GitHub account**. If you are 14 years of age or older but have not reached the age of majority in your legal place of residence, then you must have consent of a parent/legal guardian. + +**Not eligible:** Employees and directors of Microsoft Corporation, its subsidiaries, affiliates, advertising agencies, and Sweepstakes Parties. Void in Cuba, Iran, North Korea, Sudan, Syria, Region of Crimea, Russia, and where prohibited. + +--- + +## HOW TO ENTER + +**No Purchase Necessary.** + +You will receive **one entry** by visiting the web site for the Sweepstakes at [GitHub Community Discussions](https://github.com/orgs/community/discussions/) and completing any of the following tasks: + +- Answer a knowledge check +- Share resources +- Ask questions +- Create a study guide + +**Entry limit:** One per person per weekly Entry Period. + +Attempts to submit multiple entries using multiple accounts or automated methods will result in disqualification. + +--- + +## WINNER SELECTION AND NOTIFICATION + +Pending confirmation of eligibility, **twenty-five (25) potential prize winners** will be selected by Microsoft or their Agent in a random drawing from among all eligible entries within **7 days** following the end of the Entry Period. + +Winners will be notified within **7 days** following the drawing. If a selected winner cannot be contacted, is ineligible, or fails to claim their prize, an alternate winner will be selected. A maximum of three alternate winners will be chosen before prizes go unawarded. + +--- + +## PRIZES + +### Twenty-Five (25) Grand Prizes + +Each winner will receive a **GitHub Certification voucher**. + +- **Approximate Retail Value (ARV):** $50.00 +- **Total ARV of all prizes:** $1,250 + +Only one (1) prize per person overall. **No substitution, transfer, or assignment of prize permitted.** Microsoft reserves the right to substitute a prize of equal or greater value if the offered prize is unavailable. + +Prizes will be sent no later than **28 days after winner selection**. + +**Taxes on the prize are the sole responsibility of the winner.** By accepting a prize, you agree that Microsoft may use your entry, name, image, and hometown online and in print in connection with this Sweepstakes. + +--- + +## ODDS + +The odds of winning depend on the number of eligible entries received. + +--- + +## GENERAL CONDITIONS AND RELEASE OF LIABILITY + +To the extent allowed by law, by entering you agree to release and hold harmless **Microsoft**, its parents, partners, subsidiaries, affiliates, employees, and agents from any liability related to this Sweepstakes. + +Microsoft reserves the right to **cancel, change, or suspend** the Sweepstakes due to unforeseen circumstances affecting the integrity of the contest. + +If you attempt to **cheat, hack, or commit fraud**, Microsoft may disqualify you and seek damages. + +--- + +## USE OF YOUR ENTRY + +Personal data provided while entering this Sweepstakes will be used **only for administration and operation** of this Sweepstakes in accordance with the [Microsoft Privacy Statement](https://privacy.microsoft.com/). + +--- + +## GOVERNING LAW + +This Sweepstakes is governed by the **laws of the State of Washington**, and participants consent to the **exclusive jurisdiction and venue** of its courts for any disputes. + +--- + +## WINNERS LIST + +To receive a list of winners, send an email to **lgalante@microsoft.com** with the subject line: + +> *Spring 2025 GitHub Foundations Certification Prep Course Sweepstakes winners* + +within **30 days of May 2, 2025**. From beea29b4f912d17f2809e9a339f710aa6416f2c3 Mon Sep 17 00:00:00 2001 From: Akash <95834130+Akash1134@users.noreply.github.com> Date: Tue, 1 Apr 2025 14:46:58 +0530 Subject: [PATCH 66/91] Update copilot.yml Updated text to guide users to the VSCode repo --- .github/DISCUSSION_TEMPLATE/copilot.yml | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/.github/DISCUSSION_TEMPLATE/copilot.yml b/.github/DISCUSSION_TEMPLATE/copilot.yml index ac3e7320d..958bc1006 100644 --- a/.github/DISCUSSION_TEMPLATE/copilot.yml +++ b/.github/DISCUSSION_TEMPLATE/copilot.yml @@ -3,7 +3,7 @@ body: - type: dropdown attributes: label: Select Topic Area - description: What would you like to discuss? + description: What would you like to discuss about GitHub Copilot? options: - "Question" - "Product Feedback" @@ -13,8 +13,11 @@ body: validations: required: true - type: textarea - attributes: - label: Body - description: Start your discussion! - validations: - required: true + attributes: + label: Body + description: Start your discussion! + placeholder: >- + 💬 Note! If your query is related to Visual Studio Code in Copilot, please open an issue in the [Visual Studio Code repo](https://github.com/microsoft/vscode-copilot-release/issues) for better assistance from our team. + + + From cddf4594f61953b87b2871d31a467246cc9b2db2 Mon Sep 17 00:00:00 2001 From: Akash <95834130+Akash1134@users.noreply.github.com> Date: Wed, 2 Apr 2025 18:07:01 +0530 Subject: [PATCH 67/91] Update copilot.yml --- .github/DISCUSSION_TEMPLATE/copilot.yml | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/.github/DISCUSSION_TEMPLATE/copilot.yml b/.github/DISCUSSION_TEMPLATE/copilot.yml index 958bc1006..3c16e9933 100644 --- a/.github/DISCUSSION_TEMPLATE/copilot.yml +++ b/.github/DISCUSSION_TEMPLATE/copilot.yml @@ -5,19 +5,17 @@ body: label: Select Topic Area description: What would you like to discuss about GitHub Copilot? options: - - "Question" - - "Product Feedback" - - "Bug" - - "Show & Tell" - - "General" + - Question + - Product Feedback + - Bug + - General validations: required: true - type: textarea - attributes: - label: Body - description: Start your discussion! - placeholder: >- - 💬 Note! If your query is related to Visual Studio Code in Copilot, please open an issue in the [Visual Studio Code repo](https://github.com/microsoft/vscode-copilot-release/issues) for better assistance from our team. - - - + attributes: + label: Body + description: Start your discussion! + placeholder: >- + Note! If your query is related to Visual Studio Code in Copilot, please open an issue in the [Visual Studio Code repo](https://github.com/microsoft/vscode-copilot-release/issues) for better assistance from our team. + validations: + required: true From 3b510285f0ea384e09facd4c477f53d4d7b9cee9 Mon Sep 17 00:00:00 2001 From: Code Atlas Date: Thu, 3 Apr 2025 11:12:09 -0300 Subject: [PATCH 68/91] Update discussions template.yml Updated the discussions template. --- .github/DISCUSSION_TEMPLATE/discussions.yml | 68 +++++++++++++-------- 1 file changed, 44 insertions(+), 24 deletions(-) diff --git a/.github/DISCUSSION_TEMPLATE/discussions.yml b/.github/DISCUSSION_TEMPLATE/discussions.yml index c6547585f..8005dbacd 100644 --- a/.github/DISCUSSION_TEMPLATE/discussions.yml +++ b/.github/DISCUSSION_TEMPLATE/discussions.yml @@ -1,28 +1,48 @@ +title: "" labels: [Discussions] body: -- type: markdown - attributes: - value: | - ⚠️ This category is solely for discussions and feedback on [the GitHub Discussions product](https://github.com/features/discussions). ⚠️ + - type: markdown + attributes: + value: | + ⚠️ This category is solely for discussions and feedback on [the GitHub Discussions product](https://github.com/features/discussions). ⚠️ - The Discussions category is NOT meant to be a place for any old discussion regarding GitHub or programming — [the General category](https://github.com/orgs/community/discussions/categories/general) is a more appropriate space for misc topics. To ensure you receive a timely response and connect with the proper team(s), please post in the correct category by using the corresponding product category. + [GitHub Discussions](https://github.com/features/discussions) is a product within GitHub that allows users to talk, ask questions, and share ideas. Discussions are meant for open-ended conversations. - NOTE: If you post in this category about topics other than GitHub Discussions, your post may be moved or deleted without warning. Users who post spam or violate of our [Code of Conduct](https://github.com/github/.github/blob/95e9dcb0b8b70a25cdb75de29f600812a07eb996/CODE_OF_CONDUCT.md) will be blocked. -- type: dropdown - attributes: - label: Select Topic Area - description: What would you like to discuss? - options: - - "Question" - - "Product Feedback" - - "Bug" - - "Show & Tell" - - "General" - validations: - required: true -- type: textarea - attributes: - label: Body - description: Start your discussion! - validations: - required: true + ### ✅ Dos - Use this category if your post is about + - How to enable or configure **GitHub Discussions** in a repository or organization + - Questions about **GitHub Discussions** features, such as marking answers, organizing threads or using moderation tools. + - Bugs or issues specifically related to **GitHub Discussions** 🐞 + - Suggestions or feedback to improve the **GitHub Discussions** product 💬 + + ### 🚫 Dont's - Please, don't use this category for: + - General troubleshooting, water cooler conversations or off-topic questions - have you tried General or Programming Help? + - Feedback that doesn't directly relate to _GitHub Discussions_, that feedback belong somewhere else, use this [quick guide](https://github.com/orgs/community/discussions/151702) to help. + + ### 📚 Need help understanding how GitHub Discussions works? + Read the official documentation: [GitHub Discussions Docs](https://docs.github.com/en/discussions) + + - type: dropdown + attributes: + label: "Discussion Type" + description: What would you like to discuss? + options: + - "Product Feedback" + - "Question" + - "Bug" + - "Show & Tell" + - "General" + validations: + required: true + - type: textarea + attributes: + label: "Discussion Content" + description: Start your discussion! + validations: + pattern: "^.{1000,}$" + regexFlags: "s" + note: "Must have at least 1000 characters" + - type: markdown + attributes: + value: 'I understand the terms of this agreement.' + validations: + required: true From cce9056113b024049bf8d4c36172cb3615a0b25b Mon Sep 17 00:00:00 2001 From: Lili <92824518+queenofcorgis@users.noreply.github.com> Date: Thu, 3 Apr 2025 10:18:56 -0400 Subject: [PATCH 69/91] Update discussions.yml --- .github/DISCUSSION_TEMPLATE/discussions.yml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/.github/DISCUSSION_TEMPLATE/discussions.yml b/.github/DISCUSSION_TEMPLATE/discussions.yml index 8005dbacd..6a8d20ecf 100644 --- a/.github/DISCUSSION_TEMPLATE/discussions.yml +++ b/.github/DISCUSSION_TEMPLATE/discussions.yml @@ -41,8 +41,3 @@ body: pattern: "^.{1000,}$" regexFlags: "s" note: "Must have at least 1000 characters" - - type: markdown - attributes: - value: 'I understand the terms of this agreement.' - validations: - required: true From 14b9ea7e70a17e73c7ec0979285fca43eb2f496e Mon Sep 17 00:00:00 2001 From: Code Atlas Date: Thu, 3 Apr 2025 13:28:02 -0300 Subject: [PATCH 70/91] Update discussions.yml --- .github/DISCUSSION_TEMPLATE/discussions.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/DISCUSSION_TEMPLATE/discussions.yml b/.github/DISCUSSION_TEMPLATE/discussions.yml index 6a8d20ecf..22ad7c981 100644 --- a/.github/DISCUSSION_TEMPLATE/discussions.yml +++ b/.github/DISCUSSION_TEMPLATE/discussions.yml @@ -14,7 +14,7 @@ body: - Bugs or issues specifically related to **GitHub Discussions** 🐞 - Suggestions or feedback to improve the **GitHub Discussions** product 💬 - ### 🚫 Dont's - Please, don't use this category for: + ### 🚫 Don'ts - Please, don't use this category for: - General troubleshooting, water cooler conversations or off-topic questions - have you tried General or Programming Help? - Feedback that doesn't directly relate to _GitHub Discussions_, that feedback belong somewhere else, use this [quick guide](https://github.com/orgs/community/discussions/151702) to help. From 8ee0e064268139efb32fd1c8d194e0872eb86017 Mon Sep 17 00:00:00 2001 From: Lili <92824518+queenofcorgis@users.noreply.github.com> Date: Thu, 10 Apr 2025 09:39:05 -0400 Subject: [PATCH 71/91] Create Accessibility Skills Student Series Spring 2025.md --- ...ility Skills Student Series Spring 2025.md | 73 +++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 docs/Accessibility Skills Student Series Spring 2025.md diff --git a/docs/Accessibility Skills Student Series Spring 2025.md b/docs/Accessibility Skills Student Series Spring 2025.md new file mode 100644 index 000000000..34161747a --- /dev/null +++ b/docs/Accessibility Skills Student Series Spring 2025.md @@ -0,0 +1,73 @@ +### Accessibility Skills Student Series Spring 2025 Random Prize Draw Terms and Conditions + +**1. Promoter** +The promoter of this prize draw is GitHub Education, a division of GitHub, Inc., located at 88 Colin P. Kelly Jr. Street, San Francisco, CA 94107, USA. + +**2. Eligibility** + +The prize draw is open to verified registered students of GitHub Education who are at least 13 years old. +- Participants under 18 years must have parental or guardian consent to enter. +- Employees of GitHub, Microsoft, their immediate families, and anyone otherwise connected with the organization are not eligible to enter. +- The prize draw is void in countries where such promotions are prohibited by law. This includes, but is not limited to, the following countries: + - Belgium + - Poland + - Malaysia + - Brunei + - Bangladesh + - Italy + - Any other country where local laws prohibit free entry random prize draws + +**3. Entry Period** + +- The entry period begins on April 14, 2025, 11:59 PM EST and ends on May 15, 2025, at 11:59 PM EST. + +**4. How to Enter** + +- To to receive an entry, participants must visit the designated forum discussion and complete the challenge for that week + +**5. Free Entry** + +- Participation in the prize draw is free, and no purchase is necessary to enter or win. + +**6. Parental/Guardian Consent** + +- If you are under 18 years old, you must have parental or guardian consent to enter the prize draw. By entering, you confirm that you have obtained such consent. + +**7. Selection of Winners** + +- Up to 10 winners will be selected at random from all eligible entries between May 15 and May 22, 2025. +- The draw will be conducted using a verifiably random process under the supervision of an independent person or by an independent entity. + +**8. Notification of Winners** + +- Winners will be notified via the email associated with their GitHub account by May 31, 2025. +- Winners must respond to the notification within 7 days to claim their prize. Failure to respond within this period may result in forfeiture of the prize, and GitHub Education reserves the right to select an alternative winner. + +**9. Prizes** + +- Each winner will receive GitHub swag, which may include items such as T-shirts, stickers, or other branded merchandise. +- Prizes are non-transferable and no cash alternative is available. +- GitHub Education reserves the right to substitute any prize with another of equivalent value without giving notice. + +**10. Data Protection** + +- Participants’ personal data will be used solely for the purposes of administering the prize draw and in accordance with GitHub’s privacy policy. + +**11. General Conditions** + +- GitHub Education reserves the right to cancel or amend the prize draw and these terms and conditions without notice in the event of a catastrophe, war, civil or military disturbance, or any actual or anticipated breach of any applicable law or regulation or any other event outside GitHub Education’s control. +- GitHub Education is not responsible for inaccurate prize details supplied to any participant by any third party connected with this prize draw. + +**12. Governing Law** + +- This prize draw and these terms and conditions will be governed by the laws of the country where the participant resides, provided that such laws do not conflict with the laws of the United States. Any disputes will be subject to the non-exclusive jurisdiction of the courts of the country of the participant’s residence. + +**13. Limitation of Liability** + +- By entering, participants agree to release and hold harmless GitHub Education, GitHub, Inc., and Microsoft from any liability, illness, injury, death, loss, litigation, claim, or damage that may occur, directly or indirectly, whether caused by negligence or not, from such entrant’s participation in the prize draw and/or their acceptance, possession, use, or misuse of any prize or any portion thereof. + +**14. Sponsor** + +- The prize draw is sponsored by GitHub Education. + +For further information or any questions regarding the prize draw, please contact [morganersery1@github.com]. From 93025ea37ae858ef4c95f26ee25bf852c5048225 Mon Sep 17 00:00:00 2001 From: Akash <95834130+Akash1134@users.noreply.github.com> Date: Tue, 15 Apr 2025 12:38:04 +0530 Subject: [PATCH 72/91] Update copilot.yml Updated the category form as a part of our [category restructuring initiative](https://github.com/github/community-engagement/issues/4679#issuecomment-2804004511) --- .github/DISCUSSION_TEMPLATE/copilot.yml | 28 +++++++++++++++++-------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/.github/DISCUSSION_TEMPLATE/copilot.yml b/.github/DISCUSSION_TEMPLATE/copilot.yml index 3c16e9933..99fd3d009 100644 --- a/.github/DISCUSSION_TEMPLATE/copilot.yml +++ b/.github/DISCUSSION_TEMPLATE/copilot.yml @@ -1,21 +1,31 @@ -labels: [Copilot] body: - type: dropdown attributes: - label: Select Topic Area - description: What would you like to discuss about GitHub Copilot? + label: 🌟 Welcome to the GitHub Copilot category. + description: What would you like to discuss about GitHub Copilot? Choose your topic area. options: - - Question - - Product Feedback - - Bug - - General + - 🤔 Question + - ☑️ Product Feedback + - 🐞 Bug Report + - 💬 General validations: required: true +- type: markdown + attributes: + value: | + #### Explore our [Copilot FAQs](https://github.com/orgs/community/discussions/144674) and [GitHub Docs](https://docs.github.com/en/copilot) for comprehensive guidance! + - 💡 **Quick Tip:** For general development questions or detailed code issues, try [Chat with Copilot](https://docs.github.com/en/enterprise-cloud@latest/copilot/using-github-copilot/copilot-chat/asking-github-copilot-questions-in-github) first, it might have the answer you need before posting here. + - 🛠️ For issues related to Visual Studio Code in Copilot, please open an issue in the [Visual Studio Code repo](https://github.com/microsoft/vscode-copilot-release/issues). + - 🔍 Are you a student/teacher looking to enable Copilot Pro? [Read our guide](https://gh.io/faq-nd-copilot) - type: textarea attributes: - label: Body + label: 📝 Discussion Body description: Start your discussion! placeholder: >- - Note! If your query is related to Visual Studio Code in Copilot, please open an issue in the [Visual Studio Code repo](https://github.com/microsoft/vscode-copilot-release/issues) for better assistance from our team. + Provide a detailed description of your discussion (e.g., What issue are you facing? What feedback do you have? What question do you need answered?) validations: required: true +- type: markdown + attributes: + value: | + #### Don't forget to mark an [answer as "solved"](https://docs.github.com/en/discussions/collaborating-with-your-community-using-discussions/participating-in-a-discussion#marking-a-comment-as-an-answer) to help others with similar questions. ✅ From afe399ad812298635b4ee1125adddae3a736e91b Mon Sep 17 00:00:00 2001 From: Akash <95834130+Akash1134@users.noreply.github.com> Date: Thu, 17 Apr 2025 20:03:00 +0530 Subject: [PATCH 73/91] Update and rename copilot.yml to copilot-conversations.yml Added our new Category Form with category now renamed to Copilot Conversations --- ...{copilot.yml => copilot-conversations.yml} | 41 +++++++++++++------ 1 file changed, 29 insertions(+), 12 deletions(-) rename .github/DISCUSSION_TEMPLATE/{copilot.yml => copilot-conversations.yml} (66%) diff --git a/.github/DISCUSSION_TEMPLATE/copilot.yml b/.github/DISCUSSION_TEMPLATE/copilot-conversations.yml similarity index 66% rename from .github/DISCUSSION_TEMPLATE/copilot.yml rename to .github/DISCUSSION_TEMPLATE/copilot-conversations.yml index 99fd3d009..283df038f 100644 --- a/.github/DISCUSSION_TEMPLATE/copilot.yml +++ b/.github/DISCUSSION_TEMPLATE/copilot-conversations.yml @@ -1,25 +1,42 @@ body: +- type: markdown + attributes: + value: | + #### Explore our [Copilot FAQs](https://github.com/orgs/community/discussions/144674) and [GitHub Docs](https://docs.github.com/en/copilot) for comprehensive guidance! + - 💡 **Quick Tip:** For general development questions or detailed code issues, try [Chat with Copilot](https://docs.github.com/en/enterprise-cloud@latest/copilot/using-github-copilot/copilot-chat/asking-github-copilot-questions-in-github) first, it might have the answer you need before posting here. + - 🛠️ For bugs and feature requests related to VS Code in Copilot, please open an issue in our [VS Code](https://github.com/microsoft/vscode-copilot-release/issues). + - 🔍 Are you a student/teacher looking to enable Copilot Pro? [Read our guide](https://gh.io/faq-nd-copilot) - type: dropdown attributes: - label: 🌟 Welcome to the GitHub Copilot category. + label: Select Topic Area description: What would you like to discuss about GitHub Copilot? Choose your topic area. options: - - 🤔 Question - - ☑️ Product Feedback - - 🐞 Bug Report - - 💬 General + - Question + - Product Feedback + - Bug + - General validations: required: true -- type: markdown +- type: dropdown + id: feature-area attributes: - value: | - #### Explore our [Copilot FAQs](https://github.com/orgs/community/discussions/144674) and [GitHub Docs](https://docs.github.com/en/copilot) for comprehensive guidance! - - 💡 **Quick Tip:** For general development questions or detailed code issues, try [Chat with Copilot](https://docs.github.com/en/enterprise-cloud@latest/copilot/using-github-copilot/copilot-chat/asking-github-copilot-questions-in-github) first, it might have the answer you need before posting here. - - 🛠️ For issues related to Visual Studio Code in Copilot, please open an issue in the [Visual Studio Code repo](https://github.com/microsoft/vscode-copilot-release/issues). - - 🔍 Are you a student/teacher looking to enable Copilot Pro? [Read our guide](https://gh.io/faq-nd-copilot) + label: Copilot Feature Area + description: Which Copilot feature or product area is your discussion related to? + options: + - General + - Copilot in GitHub + - Copilot Workspace + - Copilot Agent Mode + - Copilot Enterprise + - Account Related + - VS Code + - Visual Studio + - JetBrains & Xcode + validations: + required: true - type: textarea attributes: - label: 📝 Discussion Body + label: Body description: Start your discussion! placeholder: >- Provide a detailed description of your discussion (e.g., What issue are you facing? What feedback do you have? What question do you need answered?) From ac60b480dba9b1d056249d287e9523683da80644 Mon Sep 17 00:00:00 2001 From: Akash <95834130+Akash1134@users.noreply.github.com> Date: Thu, 17 Apr 2025 20:04:57 +0530 Subject: [PATCH 74/91] Update .github/DISCUSSION_TEMPLATE/copilot-conversations.yml Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .github/DISCUSSION_TEMPLATE/copilot-conversations.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/DISCUSSION_TEMPLATE/copilot-conversations.yml b/.github/DISCUSSION_TEMPLATE/copilot-conversations.yml index 283df038f..c159a51a6 100644 --- a/.github/DISCUSSION_TEMPLATE/copilot-conversations.yml +++ b/.github/DISCUSSION_TEMPLATE/copilot-conversations.yml @@ -31,7 +31,7 @@ body: - Account Related - VS Code - Visual Studio - - JetBrains & Xcode + - JetBrains & Xcode validations: required: true - type: textarea From fe469995079e62f456f6e0784dd5850a2c105d50 Mon Sep 17 00:00:00 2001 From: Akash <95834130+Akash1134@users.noreply.github.com> Date: Thu, 17 Apr 2025 20:38:16 +0530 Subject: [PATCH 75/91] Create copilot_labeller.yml --- .github/workflows/copilot_labeller.yml | 146 +++++++++++++++++++++++++ 1 file changed, 146 insertions(+) create mode 100644 .github/workflows/copilot_labeller.yml diff --git a/.github/workflows/copilot_labeller.yml b/.github/workflows/copilot_labeller.yml new file mode 100644 index 000000000..4dcc842fd --- /dev/null +++ b/.github/workflows/copilot_labeller.yml @@ -0,0 +1,146 @@ +name: Copilot Templated Discussions + +on: + discussion: + types: [created] + +jobs: + label-copilot-discussion: + runs-on: ubuntu-latest + if: ${{ contains(github.event.discussion.category.name, 'Copilot') }} + + steps: + - name: Get discussion body html + id: get_discussion_body_html + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + OWNER: ${{ github.repository_owner }} + REPO: ${{ github.event.repository.name }} + DISCUSSION_NUMBER: ${{ github.event.discussion.number }} + run: | + gh api graphql -F owner=$OWNER -F name=$REPO -F number=$DISCUSSION_NUMBER -f query=' + query($owner: String!, $name: String!, $number: Int!) { + repository(owner: $owner, name: $name){ + discussion(number: $number) { + bodyHTML + id + } + } + }' > discussion_data.json + + echo 'DISCUSSION_BODY_HTML='$(jq '.data.repository.discussion.bodyHTML' discussion_data.json) >> $GITHUB_ENV + echo 'DISCUSSION_ID='$(jq '.data.repository.discussion.id' discussion_data.json) >> $GITHUB_ENV + + - run: npm install jsdom + + - name: Get selected Copilot feature area + id: get_selected_feature_area + uses: actions/github-script@v6 + with: + result-encoding: string + script: | + try { + const jsdom = require('jsdom'); + const { JSDOM } = jsdom; + const { DISCUSSION_BODY_HTML } = process.env + + const fragment = JSDOM.fragment(DISCUSSION_BODY_HTML); + const featureAreaHeaders = fragment.querySelectorAll("h3"); + const featureAreaHeader = Array.from(featureAreaHeaders).find(header => + header.textContent.trim().toLowerCase().includes('copilot feature area')); + if (!featureAreaHeader) { + return ""; + } + + const selectedAreaElement = featureAreaHeader.nextElementSibling; + if (!selectedAreaElement) { + return ""; + } + + const selectedArea = selectedAreaElement.textContent.trim(); + // Simplify area matching by converting to lowercase + const selectedAreaLower = selectedArea.toLowerCase(); + + // Valid Copilot feature areas (case insensitive matching) + const validAreas = { + "vs code": "VS Code", + "visual studio": "Visual Studio", + "jetbrains & xcode": "JetBrains & Xcode", + "copilot in github": "Copilot in GitHub", + "copilot workspace": "Copilot Workspace", + "copilot edits and code review": "Copilot Edits and Code Review", + "copilot agent mode": "Copilot Agent Mode", + "copilot enterprise": "Copilot Enterprise", + "copilot billing or account‑related": "Copilot Billing or Account‑Related", + "other copilot areas": "Other Copilot Areas" + }; + + // Try to find a matching area (case insensitive) + for (const [key, value] of Object.entries(validAreas)) { + if (selectedAreaLower.includes(key)) { + return value; // Return the properly cased label + } + } + + // If no match found, check if it's exactly one of our valid areas + // This helps with unexpected formatting or spacing + if (selectedArea && Object.values(validAreas).includes(selectedArea)) { + return selectedArea; + } + + // Default to "Other Copilot Areas" if we can't find a specific match + if (selectedArea) { + return "Other Copilot Areas"; + } + + return ""; + } catch (error) { + console.error(error); + return ""; + } + + - name: Fetch label id for selected area + id: fetch_label_id + if: ${{ steps.get_selected_feature_area.outputs.result != '' }} + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + OWNER: ${{ github.repository_owner }} + REPO: ${{ github.event.repository.name }} + AREA: ${{ steps.get_selected_feature_area.outputs.result }} + run: | + gh api graphql -F owner=$OWNER -F name=$REPO -F topic="$AREA" -f query=' + query($owner: String!, $name: String!, $topic: String) { + repository(owner: $owner, name: $name){ + labels(first: 1, query: $topic) { + edges { + node { + id + name + } + } + } + } + }' > repository_label_data.json + + echo 'LABEL_ID='$(jq '.data.repository.labels.edges[].node | .id ' repository_label_data.json) >> $GITHUB_ENV + + - name: Label the discussion + if: ${{ steps.get_selected_feature_area.outputs.result != '' }} + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + gh api graphql -f query=' + mutation($labelableId: ID!, $labelIds: [ID!]!) { + addLabelsToLabelable(input: {labelableId: $labelableId, labelIds: $labelIds}) { + labelable { + labels(first: 10) { + edges { + node { + id + name + } + } + } + } + } + }' -f labelableId=$DISCUSSION_ID -f labelIds[]=$LABEL_ID From d688374edf71e88fb41cad8c4d3334c9ec9cda58 Mon Sep 17 00:00:00 2001 From: Akash <95834130+Akash1134@users.noreply.github.com> Date: Thu, 17 Apr 2025 20:40:58 +0530 Subject: [PATCH 76/91] Update .github/workflows/copilot_labeller.yml Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .github/workflows/copilot_labeller.yml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/workflows/copilot_labeller.yml b/.github/workflows/copilot_labeller.yml index 4dcc842fd..693dd3b03 100644 --- a/.github/workflows/copilot_labeller.yml +++ b/.github/workflows/copilot_labeller.yml @@ -28,9 +28,8 @@ jobs: } }' > discussion_data.json - echo 'DISCUSSION_BODY_HTML='$(jq '.data.repository.discussion.bodyHTML' discussion_data.json) >> $GITHUB_ENV - echo 'DISCUSSION_ID='$(jq '.data.repository.discussion.id' discussion_data.json) >> $GITHUB_ENV - + echo 'DISCUSSION_BODY_HTML='$(jq -r '.data.repository.discussion.bodyHTML' discussion_data.json) >> $GITHUB_ENV + echo 'DISCUSSION_ID='$(jq -r '.data.repository.discussion.id' discussion_data.json) >> $GITHUB_ENV - run: npm install jsdom - name: Get selected Copilot feature area From dc4cf4922c5c3e634123396430a3aad80f231d0b Mon Sep 17 00:00:00 2001 From: Akash <95834130+Akash1134@users.noreply.github.com> Date: Thu, 17 Apr 2025 20:43:41 +0530 Subject: [PATCH 77/91] Update .github/workflows/copilot_labeller.yml Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .github/workflows/copilot_labeller.yml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/.github/workflows/copilot_labeller.yml b/.github/workflows/copilot_labeller.yml index 693dd3b03..afbdc536c 100644 --- a/.github/workflows/copilot_labeller.yml +++ b/.github/workflows/copilot_labeller.yml @@ -121,10 +121,14 @@ jobs: } }' > repository_label_data.json - echo 'LABEL_ID='$(jq '.data.repository.labels.edges[].node | .id ' repository_label_data.json) >> $GITHUB_ENV + LABEL_ID=$(jq -r '.data.repository.labels.edges[0]?.node?.id // empty' repository_label_data.json) + if [ -z "$LABEL_ID" ]; then + echo "No matching label found for the selected area. Skipping labeling step." + fi + echo "LABEL_ID=$LABEL_ID" >> $GITHUB_ENV - name: Label the discussion - if: ${{ steps.get_selected_feature_area.outputs.result != '' }} + if: ${{ steps.get_selected_feature_area.outputs.result != '' && env.LABEL_ID != '' }} env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | From ed69be1dffd9610629717438f9ccefd02cda3bb4 Mon Sep 17 00:00:00 2001 From: Akash <95834130+Akash1134@users.noreply.github.com> Date: Thu, 17 Apr 2025 22:03:52 +0530 Subject: [PATCH 78/91] Update copilot-conversations.yml --- .github/DISCUSSION_TEMPLATE/copilot-conversations.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/DISCUSSION_TEMPLATE/copilot-conversations.yml b/.github/DISCUSSION_TEMPLATE/copilot-conversations.yml index c159a51a6..e078a3347 100644 --- a/.github/DISCUSSION_TEMPLATE/copilot-conversations.yml +++ b/.github/DISCUSSION_TEMPLATE/copilot-conversations.yml @@ -4,7 +4,7 @@ body: value: | #### Explore our [Copilot FAQs](https://github.com/orgs/community/discussions/144674) and [GitHub Docs](https://docs.github.com/en/copilot) for comprehensive guidance! - 💡 **Quick Tip:** For general development questions or detailed code issues, try [Chat with Copilot](https://docs.github.com/en/enterprise-cloud@latest/copilot/using-github-copilot/copilot-chat/asking-github-copilot-questions-in-github) first, it might have the answer you need before posting here. - - 🛠️ For bugs and feature requests related to VS Code in Copilot, please open an issue in our [VS Code](https://github.com/microsoft/vscode-copilot-release/issues). + - 🛠️ For bugs and feature requests related to Copilot in VS Code, please open an issue in our [VS Code](https://github.com/microsoft/vscode-copilot-release/issues). - 🔍 Are you a student/teacher looking to enable Copilot Pro? [Read our guide](https://gh.io/faq-nd-copilot) - type: dropdown attributes: From 74f19aa5c4b7f5afa9e38c023e7b6316c977a9bf Mon Sep 17 00:00:00 2001 From: Akash <95834130+Akash1134@users.noreply.github.com> Date: Fri, 18 Apr 2025 11:55:03 +0530 Subject: [PATCH 79/91] Update copilot-conversations.yml --- .github/DISCUSSION_TEMPLATE/copilot-conversations.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/DISCUSSION_TEMPLATE/copilot-conversations.yml b/.github/DISCUSSION_TEMPLATE/copilot-conversations.yml index e078a3347..1e0743ac4 100644 --- a/.github/DISCUSSION_TEMPLATE/copilot-conversations.yml +++ b/.github/DISCUSSION_TEMPLATE/copilot-conversations.yml @@ -4,7 +4,7 @@ body: value: | #### Explore our [Copilot FAQs](https://github.com/orgs/community/discussions/144674) and [GitHub Docs](https://docs.github.com/en/copilot) for comprehensive guidance! - 💡 **Quick Tip:** For general development questions or detailed code issues, try [Chat with Copilot](https://docs.github.com/en/enterprise-cloud@latest/copilot/using-github-copilot/copilot-chat/asking-github-copilot-questions-in-github) first, it might have the answer you need before posting here. - - 🛠️ For bugs and feature requests related to Copilot in VS Code, please open an issue in our [VS Code](https://github.com/microsoft/vscode-copilot-release/issues). + - 🛠️ For bugs and feature requests related to Copilot in VS Code, please open an issue in our [VS Code Copilot repo](https://github.com/microsoft/vscode-copilot-release/issues). - 🔍 Are you a student/teacher looking to enable Copilot Pro? [Read our guide](https://gh.io/faq-nd-copilot) - type: dropdown attributes: From 788f1653a88f512ffec979f6b172ed2e65fb95e4 Mon Sep 17 00:00:00 2001 From: Akash <95834130+Akash1134@users.noreply.github.com> Date: Tue, 29 Apr 2025 15:24:03 +0530 Subject: [PATCH 80/91] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index fbbb5d566..0300d0f68 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ In this repository, you will find categories for various product areas. Feel fre | 🔁 [API and Webhooks](https://github.com/orgs/community/discussions/categories/api-and-webhooks) | [GitHub API](https://docs.github.com/en/rest) and [GitHub Webhooks](https://docs.github.com/en/developers/webhooks-and-events/webhooks/about-webhook) | | 🔎 [Code Search & Navigation](https://github.com/orgs/community/discussions/categories/code-search-and-navigation) | [Code Search & Navigation](https://cs.github.com/about) | | 💻 [Codespaces](https://github.com/orgs/community/discussions/categories/codespaces) | [GitHub Codespaces](https://github.com/features/codespaces) | -| 👩‍✈️ [Copilot](https://github.com/orgs/community/discussions/categories/copilot) | [GitHub Copilot](https://copilot.github.com/) | +| :copilot: [Copilot Conversations](https://github.com/orgs/community/discussions/categories/copilot-conversations) | [GitHub Copilot](https://copilot.github.com/) | | 🤖 [Code Security](https://github.com/orgs/community/discussions/categories/code-security) | [GitHub Code Security](https://github.com/features/security) | | 🗣️ [Discussions](https://github.com/orgs/community/discussions/categories/discussions) | [GitHub Discussions](https://docs.github.com/en/discussions) | | 🌐 [Feed](https://github.com/orgs/community/discussions/categories/feed) | [GitHub Feed](https://github.blog/2022-03-22-improving-your-github-feed/) | From 23cd1d4ed8bc478cfe4ea216d501f7201879da80 Mon Sep 17 00:00:00 2001 From: Ashley Nicolson Date: Tue, 27 May 2025 18:54:56 +0100 Subject: [PATCH 81/91] Update actions.yml Discussions Template --- .github/DISCUSSION_TEMPLATE/actions.yml | 57 +++++++++++++++++++++---- 1 file changed, 48 insertions(+), 9 deletions(-) diff --git a/.github/DISCUSSION_TEMPLATE/actions.yml b/.github/DISCUSSION_TEMPLATE/actions.yml index 21737227b..20add0190 100644 --- a/.github/DISCUSSION_TEMPLATE/actions.yml +++ b/.github/DISCUSSION_TEMPLATE/actions.yml @@ -3,23 +3,62 @@ body: - type: markdown attributes: value: | - ### Important News for Actions users 📣 👀 - #### ⚠️ [Upcoming deprecation of v3 of the artifact actions](https://github.com/orgs/community/discussions/142581) - upgrade to v4 as soon as possible. + 🚀 **Welcome to the Actions Category!** 🚀 + + Automate, customize, and execute your software development workflows right in your repository with [GitHub Actions](https://docs.github.com/en/actions)! + + **Why are you here?** + - **Have a Question?** Maybe you're stuck on workflow syntax, curious about best practices, or want to know how to use a specific GitHub Actions feature. Select "Question" to get help from the community! + - **Product Feedback?** Do you have ideas to improve GitHub Actions, or want to share what works (or doesn't) for you? Select "Product Feedback" to help shape the future of GitHub Actions. + - **Found a Bug?** If something isn't working as expected, let us know by selecting "Bug" so we can investigate and improve the platform. + + After choosing your reason, pick the topic or product area that best matches your discussion. + + **Quick links:** [Actions Documentation](https://docs.github.com/en/actions), [Workflow Syntax Guide](https://docs.github.com/en/actions/writing-workflows/workflow-syntax-for-github-actions), [Example Workflows](https://docs.github.com/en/actions/use-cases-and-examples), and [Security Best Practices](https://docs.github.com/en/actions/security-for-github-actions) + + **Recent News:** + - [Latest Breaking Changes](https://github.blog/changelog/label/actions) + - type: dropdown + id: reason attributes: - label: Select Topic Area - description: What would you like to discuss? + label: Why are you starting this discussion? + description: Tell us your goal! Are you asking a question, giving feedback, reporting a bug, or sharing something cool? options: - "Question" - "Product Feedback" - "Bug" - - "Show & Tell" - - "General" + default: 0 validations: required: true +- type: dropdown + id: topic + attributes: + label: What GitHub Actions topic or product is this about? + description: | + Choose the single topic or product area most relevant to your discussion. Only one can be selected here. + + If your post covers additional themes or topics, don't worry! Our team and automation will do our best to add extra labels based on the content of your discussion details. + + This helps us get you the best answers and feedback! + options: + - "ARC (Actions Runner Controller)" + - "Actions Runner Image" + - "Actions Runner" + - "Actions Checkout" + - "Actions Cache" + - "Workflow Deployment" + - "Workflow Configuration" + - "Schedule & Cron Jobs" + - "Metrics & Insights" + - "Misc" + default: 9 + validations: + required: false - type: textarea attributes: - label: Body - description: Start your discussion! + label: Discussion Details + description: >- + Share your question, feedback, or story! Include links, code, or screenshots for more context. Tip: Reference the docs https://docs.github.com/en/actions or relevant changelogs for details. validations: - required: true + required: true From 53f4ba685dd2f58b522d6ecc497c8ffaae6629e1 Mon Sep 17 00:00:00 2001 From: Ashley Nicolson Date: Tue, 27 May 2025 19:15:44 +0100 Subject: [PATCH 82/91] Create actions_labeller.yml (New Workflow to assign multiple labels) --- .github/workflows/actions_labeller.yml | 303 +++++++++++++++++++++++++ 1 file changed, 303 insertions(+) create mode 100644 .github/workflows/actions_labeller.yml diff --git a/.github/workflows/actions_labeller.yml b/.github/workflows/actions_labeller.yml new file mode 100644 index 000000000..37da2603e --- /dev/null +++ b/.github/workflows/actions_labeller.yml @@ -0,0 +1,303 @@ +name: Auto-Label Discussions for Actions Category + +on: + discussion: + types: [created] + +jobs: + label-actions-discussion: + if: ${{ contains(github.event.discussion.category.name, 'Actions') }} + runs-on: ubuntu-latest + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Global authentication for gh CLI + steps: + - name: Get discussion body html + id: get_discussion_body_html + env: + OWNER: ${{ github.repository_owner }} + REPO: ${{ github.event.repository.name }} + DISCUSSION_NUMBER: ${{ github.event.discussion.number }} + run: | + gh api graphql -F owner=$OWNER -F name=$REPO -F number=$DISCUSSION_NUMBER -f query=' + query($owner: String!, $name: String!, $number: Int!) { + repository(owner: $owner, name: $name){ + discussion(number: $number) { + bodyHTML + id + } + } + }' > discussion_data.json + + echo 'DISCUSSION_BODY_HTML='$(jq -r '.data.repository.discussion.bodyHTML' discussion_data.json) >> $GITHUB_ENV + echo 'DISCUSSION_ID='$(jq -r '.data.repository.discussion.id' discussion_data.json) >> $GITHUB_ENV + + - run: npm install jsdom + + + - name: Extract Title and Body Text + id: extract_text + uses: actions/github-script@v6 + env: + DISCUSSION_BODY_HTML: ${{ env.DISCUSSION_BODY_HTML }} + DISCUSSION_TITLE: ${{ github.event.discussion.title }} + with: + result-encoding: string + script: | + const jsdom = require('jsdom'); + const { JSDOM } = jsdom; + const { DISCUSSION_BODY_HTML } = process.env; + const fragment = JSDOM.fragment(DISCUSSION_BODY_HTML); + let body = ''; + // Find all

and

pairs + const h3s = Array.from(fragment.querySelectorAll('h3')); + h3s.forEach(h3 => { + const heading = h3.textContent.trim(); + let p = h3.nextElementSibling; + while (p && p.tagName !== 'P') p = p.nextElementSibling; + if (!p) return; + if (heading === 'Discussion Details') { + body = p.textContent.trim(); + } + }); + // Remove leading/trailing quotes from body + body = body.replace(/^['\"]+|['\"]+$/g, ''); + const title = process.env.DISCUSSION_TITLE || ''; + core.info(`Extracted title: ${title}`); + core.info(`Extracted body: ${body}`); + return JSON.stringify({ title, body }); + + - name: Extract Primary and Secondary Topic Areas + id: extract_topics + uses: actions/github-script@v6 + with: + result-encoding: string + script: | + const jsdom = require('jsdom'); + const { JSDOM } = jsdom; + const { DISCUSSION_BODY_HTML } = process.env; + const fragment = JSDOM.fragment(DISCUSSION_BODY_HTML); + let primary = ''; + let secondary = ''; + // Find all

and

pairs (form headings as h3, answers as p) + const h3s = Array.from(fragment.querySelectorAll('h3')); + h3s.forEach(h3 => { + const heading = h3.textContent.trim(); + // Look for the next

sibling after each heading + let p = h3.nextElementSibling; + while (p && p.tagName !== 'P') p = p.nextElementSibling; + if (!p) return; + if (heading === 'Why are you starting this discussion?') { + primary = p.textContent.trim(); + } + if (heading === 'What GitHub Actions topic or product is this about?') { + secondary = p.textContent.trim(); + } + }); + core.info(`Extracted primary topic: ${primary}`); + core.info(`Extracted secondary topic: ${secondary}`); + return JSON.stringify({ primary, secondary }); + + - name: Auto-label by keyword search + id: auto_label_keywords + uses: actions/github-script@v6 + with: + result-encoding: string + script: | + // Keyphrase to label mapping + const labelMap = [ + { + label: 'Workflow Deployment', + keywords: [ + "deployment error", + "publish artifact", + "release failure", + "deployment target", + "github pages", + "deployment issue", + "release workflow", + "target environment" + ] + }, + { + label: 'Workflow Configuration', + keywords: [ + "yaml syntax", + "job dependency", + "setup error", + "workflow file", + "configuration issue", + "matrix strategy", + "define env", + "secret management", + "environment setup", + "config job" + ] + }, + { + label: 'Schedule & Cron Jobs', + keywords: [ + "cron job", + "scheduled workflow", + "timing issue", + "delay trigger", + "timezone error", + "periodic run", + "recurring schedule", + "interval workflow", + "scheduled trigger", + "cron expression" + ] + }, + { + label: 'Metrics & Insights', + keywords: [ + "usage metrics", + "performance trend", + "analytics graph", + "stats dashboard", + "timeseries graph", + "insight report", + "metric tracking", + "workflow analytics", + "performance metric", + "statistics report" + ] + } + ]; + const miscLabel = 'Misc'; + let title = ''; + let body = ''; + try { + const parsed = JSON.parse(`${{ steps.extract_text.outputs.result }}`); + title = parsed.title || ''; + body = parsed.body || ''; + } catch (e) {} + const text = (title + ' ' + body).toLowerCase(); + let foundLabel = miscLabel; + core.info(`Auto-label debug: text to match: '${text}'`); + for (const map of labelMap) { + core.info(`Auto-label debug: checking label '${map.label}' with keywords: ${map.keywords.join(', ')}`); + for (const k of map.keywords) { + if (text.includes(k)) { + core.info(`Auto-label debug: matched keyword '${k}' for label '${map.label}'`); + foundLabel = map.label; + break; + } + } + if (foundLabel !== miscLabel) break; + } + core.info(`Auto-label debug: selected label: '${foundLabel}'`); + return foundLabel; + - name: Fetch label ID for primary topic + id: fetch_primary_label_id + env: + OWNER: ${{ github.repository_owner }} + REPO: ${{ github.event.repository.name }} + TOPIC: ${{ fromJson(steps.extract_topics.outputs.result).primary }} + run: | + echo "DEBUG: Fetching label for primary topic: $TOPIC" + gh api graphql -F owner=$OWNER -F name=$REPO -F topic="$TOPIC" -f query=' + query($owner: String!, $name: String!, $topic: String) { + repository(owner: $owner, name: $name) { + labels(first: 1, query: $topic) { + edges { + node { + id + name + } + } + } + } + } + ' > primary_label_data.json + + PRIMARY_LABEL_ID=$(jq -r '.data.repository.labels.edges[0]?.node?.id // empty' primary_label_data.json) + echo "PRIMARY_LABEL_ID=$PRIMARY_LABEL_ID" >> $GITHUB_ENV + + - name: Fetch label ID for secondary topic + id: fetch_secondary_label_id + env: + OWNER: ${{ github.repository_owner }} + REPO: ${{ github.event.repository.name }} + TOPIC: ${{ fromJson(steps.extract_topics.outputs.result).secondary }} + run: | + echo "DEBUG: Fetching label for secondary topic: $TOPIC" + gh api graphql -F owner=$OWNER -F name=$REPO -F topic="$TOPIC" -f query=' + query($owner: String!, $name: String!, $topic: String) { + repository(owner: $owner, name: $name) { + labels(first: 1, query: $topic) { + edges { + node { + id + name + } + } + } + } + } + ' > secondary_label_data.json + + SECONDARY_LABEL_ID=$(jq -r '.data.repository.labels.edges[0]?.node?.id // empty' secondary_label_data.json) + echo "SECONDARY_LABEL_ID=$SECONDARY_LABEL_ID" >> $GITHUB_ENV + - name: Fetch label ID for auto-label + id: fetch_auto_label_id + env: + OWNER: ${{ github.repository_owner }} + REPO: ${{ github.event.repository.name }} + TOPIC: ${{ steps.auto_label_keywords.outputs.result }} + run: | + gh api graphql -F owner=$OWNER -F name=$REPO -F topic="$TOPIC" -f query=' + query($owner: String!, $name: String!, $topic: String) { + repository(owner: $owner, name: $name) { + labels(first: 1, query: $topic) { + edges { + node { + id + name + } + } + } + } + }' > auto_label_data.json + + AUTO_LABEL_ID=$(jq -r '.data.repository.labels.edges[0]?.node?.id // empty' auto_label_data.json) + echo "AUTO_LABEL_ID=$AUTO_LABEL_ID" >> $GITHUB_ENV + + - name: Apply labels to discussion + if: ${{ env.PRIMARY_LABEL_ID != '' || env.SECONDARY_LABEL_ID != '' || env.AUTO_LABEL_ID != '' }} + run: | + echo "DEBUG: PRIMARY_LABEL_ID=$PRIMARY_LABEL_ID" + echo "DEBUG: SECONDARY_LABEL_ID=$SECONDARY_LABEL_ID" + echo "DEBUG: AUTO_LABEL_ID=$AUTO_LABEL_ID" + LABEL_IDS=() + if [ -n "$PRIMARY_LABEL_ID" ]; then + LABEL_IDS+=("$PRIMARY_LABEL_ID") + fi + if [ -n "$SECONDARY_LABEL_ID" ]; then + LABEL_IDS+=("$SECONDARY_LABEL_ID") + fi + if [ -n "$AUTO_LABEL_ID" ]; then + LABEL_IDS+=("$AUTO_LABEL_ID") + fi + + # Deduplicate LABEL_IDS + LABEL_IDS=($(printf "%s\n" "${LABEL_IDS[@]}" | awk '!seen[$0]++')) + echo "DEBUG: LABEL_IDS to apply: ${LABEL_IDS[@]}" + + # Apply labels + gh api graphql -f query=' + mutation($labelableId: ID!, $labelIds: [ID!]!) { + addLabelsToLabelable(input: {labelableId: $labelableId, labelIds: $labelIds}) { + labelable { + labels(first: 10) { + edges { + node { + id + name + } + } + } + } + } + } + ' -f labelableId=$DISCUSSION_ID $(printf -- "-f labelIds[]=%s " "${LABEL_IDS[@]}") From 6caa5d0b2deddc7f2ecbadb6090cc20b4592ef3e Mon Sep 17 00:00:00 2001 From: Akash <95834130+Akash1134@users.noreply.github.com> Date: Wed, 25 Jun 2025 14:22:22 +0530 Subject: [PATCH 83/91] Update copilot-conversations.yml --- .github/DISCUSSION_TEMPLATE/copilot-conversations.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/DISCUSSION_TEMPLATE/copilot-conversations.yml b/.github/DISCUSSION_TEMPLATE/copilot-conversations.yml index 1e0743ac4..b4270cc50 100644 --- a/.github/DISCUSSION_TEMPLATE/copilot-conversations.yml +++ b/.github/DISCUSSION_TEMPLATE/copilot-conversations.yml @@ -4,7 +4,7 @@ body: value: | #### Explore our [Copilot FAQs](https://github.com/orgs/community/discussions/144674) and [GitHub Docs](https://docs.github.com/en/copilot) for comprehensive guidance! - 💡 **Quick Tip:** For general development questions or detailed code issues, try [Chat with Copilot](https://docs.github.com/en/enterprise-cloud@latest/copilot/using-github-copilot/copilot-chat/asking-github-copilot-questions-in-github) first, it might have the answer you need before posting here. - - 🛠️ For bugs and feature requests related to Copilot in VS Code, please open an issue in our [VS Code Copilot repo](https://github.com/microsoft/vscode-copilot-release/issues). + - 🛠️ For bugs and feature requests related to Copilot in VS Code, please open an issue in our [VS Code repo](https://github.com/microsoft/vscode/issues). If your issue is related to Copilot Chat, please [visit our FAQ](https://aka.ms/vscode-report-ai-feedback). - 🔍 Are you a student/teacher looking to enable Copilot Pro? [Read our guide](https://gh.io/faq-nd-copilot) - type: dropdown attributes: From 98443f20fecd26b5619de086f803b91f5903629e Mon Sep 17 00:00:00 2001 From: Akash <95834130+Akash1134@users.noreply.github.com> Date: Wed, 25 Jun 2025 14:26:47 +0530 Subject: [PATCH 84/91] Update copilot-conversations.yml --- .github/DISCUSSION_TEMPLATE/copilot-conversations.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/DISCUSSION_TEMPLATE/copilot-conversations.yml b/.github/DISCUSSION_TEMPLATE/copilot-conversations.yml index 1e0743ac4..8512a1dc0 100644 --- a/.github/DISCUSSION_TEMPLATE/copilot-conversations.yml +++ b/.github/DISCUSSION_TEMPLATE/copilot-conversations.yml @@ -26,7 +26,8 @@ body: - General - Copilot in GitHub - Copilot Workspace - - Copilot Agent Mode + - Copilot Agent Mode + - Copilot Coding Agent - Copilot Enterprise - Account Related - VS Code From 9434a175ed0c158750595b1efa8a609dbef907ad Mon Sep 17 00:00:00 2001 From: Akash <95834130+Akash1134@users.noreply.github.com> Date: Wed, 25 Jun 2025 14:45:59 +0530 Subject: [PATCH 85/91] Update copilot_labeller.yml --- .github/workflows/copilot_labeller.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/copilot_labeller.yml b/.github/workflows/copilot_labeller.yml index afbdc536c..e428a213a 100644 --- a/.github/workflows/copilot_labeller.yml +++ b/.github/workflows/copilot_labeller.yml @@ -69,6 +69,7 @@ jobs: "copilot workspace": "Copilot Workspace", "copilot edits and code review": "Copilot Edits and Code Review", "copilot agent mode": "Copilot Agent Mode", + "copilot coding agent": "Copilot Coding Agent", "copilot enterprise": "Copilot Enterprise", "copilot billing or account‑related": "Copilot Billing or Account‑Related", "other copilot areas": "Other Copilot Areas" From ae50d1ce70efc7783b17c6335b10f2c01bfcbc9e Mon Sep 17 00:00:00 2001 From: ebndev <164093511+ebndev@users.noreply.github.com> Date: Wed, 9 Jul 2025 11:26:42 -0700 Subject: [PATCH 86/91] Create npm.yml --- .github/DISCUSSION_TEMPLATE/npm.yml | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 .github/DISCUSSION_TEMPLATE/npm.yml diff --git a/.github/DISCUSSION_TEMPLATE/npm.yml b/.github/DISCUSSION_TEMPLATE/npm.yml new file mode 100644 index 000000000..fe53d944a --- /dev/null +++ b/.github/DISCUSSION_TEMPLATE/npm.yml @@ -0,0 +1,20 @@ +labels: [npm] +body: +- type: dropdown + attributes: + label: Select Topic Area + description: What would you like to discuss? + options: + - "Question" + - "Product Feedback" + - "Bug" + - "Show & Tell" + - "General" + validations: + required: true +- type: textarea + attributes: + label: Body + description: Start your discussion! + validations: + required: true From c46b8f9b04fbef70890ed06359c397e665829140 Mon Sep 17 00:00:00 2001 From: ebndev <164093511+ebndev@users.noreply.github.com> Date: Tue, 15 Jul 2025 16:45:21 -0700 Subject: [PATCH 87/91] Update actions_labeller.yml to improve discussion handling... ...and auto-labeling functionality with enhanced sanitization. --- .github/workflows/actions_labeller.yml | 118 +++++++++++++------------ 1 file changed, 63 insertions(+), 55 deletions(-) diff --git a/.github/workflows/actions_labeller.yml b/.github/workflows/actions_labeller.yml index 37da2603e..929426d5c 100644 --- a/.github/workflows/actions_labeller.yml +++ b/.github/workflows/actions_labeller.yml @@ -9,11 +9,11 @@ jobs: if: ${{ contains(github.event.discussion.category.name, 'Actions') }} runs-on: ubuntu-latest env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Global authentication for gh CLI + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} steps: - name: Get discussion body html id: get_discussion_body_html - env: + env: OWNER: ${{ github.repository_owner }} REPO: ${{ github.event.repository.name }} DISCUSSION_NUMBER: ${{ github.event.discussion.number }} @@ -30,9 +30,8 @@ jobs: echo 'DISCUSSION_BODY_HTML='$(jq -r '.data.repository.discussion.bodyHTML' discussion_data.json) >> $GITHUB_ENV echo 'DISCUSSION_ID='$(jq -r '.data.repository.discussion.id' discussion_data.json) >> $GITHUB_ENV - - - run: npm install jsdom + - run: npm install jsdom dompurify - name: Extract Title and Body Text id: extract_text @@ -48,7 +47,6 @@ jobs: const { DISCUSSION_BODY_HTML } = process.env; const fragment = JSDOM.fragment(DISCUSSION_BODY_HTML); let body = ''; - // Find all

and

pairs const h3s = Array.from(fragment.querySelectorAll('h3')); h3s.forEach(h3 => { const heading = h3.textContent.trim(); @@ -59,7 +57,6 @@ jobs: body = p.textContent.trim(); } }); - // Remove leading/trailing quotes from body body = body.replace(/^['\"]+|['\"]+$/g, ''); const title = process.env.DISCUSSION_TITLE || ''; core.info(`Extracted title: ${title}`); @@ -69,6 +66,8 @@ jobs: - name: Extract Primary and Secondary Topic Areas id: extract_topics uses: actions/github-script@v6 + env: + DISCUSSION_BODY_HTML: ${{ env.DISCUSSION_BODY_HTML }} with: result-encoding: string script: | @@ -78,11 +77,9 @@ jobs: const fragment = JSDOM.fragment(DISCUSSION_BODY_HTML); let primary = ''; let secondary = ''; - // Find all

and

pairs (form headings as h3, answers as p) const h3s = Array.from(fragment.querySelectorAll('h3')); h3s.forEach(h3 => { const heading = h3.textContent.trim(); - // Look for the next

sibling after each heading let p = h3.nextElementSibling; while (p && p.tagName !== 'P') p = p.nextElementSibling; if (!p) return; @@ -100,78 +97,87 @@ jobs: - name: Auto-label by keyword search id: auto_label_keywords uses: actions/github-script@v6 + env: + EXTRACT_TEXT_RESULT: ${{ steps.extract_text.outputs.result }} with: result-encoding: string script: | - // Keyphrase to label mapping + const jsdom = require('jsdom'); + const { JSDOM } = jsdom; + const createDOMPurify = require('dompurify'); + const window = (new JSDOM('')).window; + const DOMPurify = createDOMPurify(window); + const labelMap = [ { label: 'Workflow Deployment', keywords: [ - "deployment error", - "publish artifact", - "release failure", - "deployment target", - "github pages", - "deployment issue", - "release workflow", - "target environment" - ] + "deployment error", + "publish artifact", + "release failure", + "deployment target", + "github pages", + "deployment issue", + "release workflow", + "target environment" + ] }, { label: 'Workflow Configuration', keywords: [ - "yaml syntax", - "job dependency", - "setup error", - "workflow file", - "configuration issue", - "matrix strategy", - "define env", - "secret management", - "environment setup", - "config job" - ] + "yaml syntax", + "job dependency", + "setup error", + "workflow file", + "configuration issue", + "matrix strategy", + "define env", + "secret management", + "environment setup", + "config job" + ] }, { label: 'Schedule & Cron Jobs', keywords: [ - "cron job", - "scheduled workflow", - "timing issue", - "delay trigger", - "timezone error", - "periodic run", - "recurring schedule", - "interval workflow", - "scheduled trigger", - "cron expression" - ] + "cron job", + "scheduled workflow", + "timing issue", + "delay trigger", + "timezone error", + "periodic run", + "recurring schedule", + "interval workflow", + "scheduled trigger", + "cron expression" + ] }, { label: 'Metrics & Insights', keywords: [ - "usage metrics", - "performance trend", - "analytics graph", - "stats dashboard", - "timeseries graph", - "insight report", - "metric tracking", - "workflow analytics", - "performance metric", - "statistics report" - ] + "usage metrics", + "performance trend", + "analytics graph", + "stats dashboard", + "timeseries graph", + "insight report", + "metric tracking", + "workflow analytics", + "performance metric", + "statistics report" + ] } ]; const miscLabel = 'Misc'; let title = ''; let body = ''; try { - const parsed = JSON.parse(`${{ steps.extract_text.outputs.result }}`); - title = parsed.title || ''; - body = parsed.body || ''; - } catch (e) {} + const parsed = JSON.parse(process.env.EXTRACT_TEXT_RESULT); + title = DOMPurify.sanitize(parsed.title || '', { ALLOWED_TAGS: [], ALLOWED_ATTR: [] }).trim(); + body = DOMPurify.sanitize(parsed.body || '', { ALLOWED_TAGS: [], ALLOWED_ATTR: [] }).trim(); + } catch (e) { + core.error('Failed to parse or sanitize discussion text: ' + e.message); + } const text = (title + ' ' + body).toLowerCase(); let foundLabel = miscLabel; core.info(`Auto-label debug: text to match: '${text}'`); @@ -188,6 +194,7 @@ jobs: } core.info(`Auto-label debug: selected label: '${foundLabel}'`); return foundLabel; + - name: Fetch label ID for primary topic id: fetch_primary_label_id env: @@ -239,6 +246,7 @@ jobs: SECONDARY_LABEL_ID=$(jq -r '.data.repository.labels.edges[0]?.node?.id // empty' secondary_label_data.json) echo "SECONDARY_LABEL_ID=$SECONDARY_LABEL_ID" >> $GITHUB_ENV + - name: Fetch label ID for auto-label id: fetch_auto_label_id env: From fa90e7441f0c447d14e77167ac2206598c052ac2 Mon Sep 17 00:00:00 2001 From: Lili <92824518+queenofcorgis@users.noreply.github.com> Date: Wed, 23 Jul 2025 10:09:49 -0400 Subject: [PATCH 88/91] Create Responsible-AI-for-Open-Source-Sweepstakes-Official-Rules.md --- ...-Open-Source-Sweepstakes-Official-Rules.md | 69 +++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 docs/Responsible-AI-for-Open-Source-Sweepstakes-Official-Rules.md diff --git a/docs/Responsible-AI-for-Open-Source-Sweepstakes-Official-Rules.md b/docs/Responsible-AI-for-Open-Source-Sweepstakes-Official-Rules.md new file mode 100644 index 000000000..535e2d1ce --- /dev/null +++ b/docs/Responsible-AI-for-Open-Source-Sweepstakes-Official-Rules.md @@ -0,0 +1,69 @@ +# MICROSOFT RESPONSIBLE AI FOR OPEN SOURCE SWEEPSTAKES +## OFFICIAL RULES + +### SPONSOR +These Official Rules (“Rules”) govern the operation of the Microsoft Responsible AI for Open Source Sweepstakes (“Sweepstakes”). Microsoft Corporation, One Microsoft Way, Redmond, WA, 98052, USA, is the Sweepstakes sponsor (“Sponsor”). + +### DEFINITIONS +In these Rules, "Microsoft", "we", "our", and "us" refer to Sponsor and “you” and "yourself" refers to a Sweepstakes participant, or the parent/legal guardian of any Sweepstakes entrant who has not reached the age of majority to contractually obligate themselves in their legal place of residence. By entering you (your parent/legal guardian if you are not the age of majority in your legal place of residence) agree to be bound by these Rules. + +### ENTRY PERIOD +The Sweepstakes starts at 12:00 a.m. Pacific Time (PT) on July 24, 2025, and ends at 11:59 p.m. PT on August 21, 2025 (“Entry Period”). + +### ELIGIBILITY +To enter, you must be 18 years of age or older. If you are 18 years of age or older but have not reached the age of majority in your legal place of residence, then you must have consent of a parent/legal guardian. + +Employees and directors of Microsoft Corporation and its subsidiaries, affiliates, advertising agencies, and Sweepstakes Parties are not eligible, nor are persons involved in the execution or administration of this promotion, or the family members of each above (parents, children, siblings, spouse/domestic partners, or individuals residing in the same household). Void in Cuba, Iran, North Korea, Sudan, Syria, Region of Crimea, Russia, and where prohibited. + +### HOW TO ENTER +No Purchase Necessary. + +You will receive one Sweepstakes entry when you participate in the marked discussion on the GitHub Community during our entry period. There will be three (3) different challenges in total where you’ll be able to comment on the discussion stating that you completed the challenge. Challenges vary from sharing insights of codebase deep dive with AI, rewriting a Pull Request, and posting your learnings from an AI-generated code review. To participate in the GitHub Community, you must have a free GitHub account which you can sign up for at GitHub.com. + +The entry limit is one entry per challenge (there are three challenges). + +Any attempt by you to obtain more than the stated number of entries by using multiple/different accounts, identities, registrations, logins, or any other methods will void your entries and you may be disqualified. Use of any automated system to participate is prohibited. + +We are not responsible for excess, lost, late, or incomplete entries. If disputed, entries will be deemed submitted by the “authorized account holder” of the email address, social media account, or other method used to enter. The “authorized account holder” is the natural person assigned to an email address by an internet or online service provider, or other organization responsible for assigning email addresses. + +### WINNER SELECTION AND NOTIFICATION +Pending confirmation of eligibility, potential prize winners will be selected by Microsoft or their Agent in a random drawing from among all eligible entries received within 7 days following the Entry Period. + +Winners will be notified via the contact information provided during entry no more than 7 days following the drawing with prize claim instructions, including submission deadlines. If a selected winner cannot be contacted, is ineligible, fails to claim a prize or fails to return any forms, the selected winner will forfeit their prize and an alternate winner will be selected time allowing. If you are a potential winner and you are 18 or older but have not reached the age of majority in your legal place of residence, we may require your parent/legal guardian to sign all required forms on your behalf. Only three alternate winners will be selected, after which unclaimed prizes will remain unawarded. + +### PRIZES +The following prizes will be awarded: + +Ten (10) Grand Prizes. Each winner will receive: +A(n) GitHub Shop voucher. Approximate Retail Value (ARV) $30.00. + +The ARV of electronic prizes is subject to price fluctuations in the consumer marketplace based on, among other things, any gap in time between the date the ARV is estimated for purposes of these Official Rules and the date the prize is awarded or redeemed. We will determine the value of the prize to be the fair market value at the time of prize award. + +The total Approximate Retail Value (ARV) of all prizes: $300 + +We will only award one (1) prize per person/company during the Entry Period. No more than the stated number of prizes will be awarded. No substitution, transfer, or assignment of prize permitted, except that Microsoft reserves the right to substitute a prize of equal or greater value in the event the offered prize is unavailable. Microsoft products awarded as prizes are awarded “AS IS” and WITHOUT WARRANTY OF ANY KIND, express or implied (including any implied warranty of merchantability or fitness for a particular purpose); you assume the entire risk of quality and performance, and should the prizes prove defective, you assume the entire cost of all necessary servicing or repair. This is so even if the Microsoft product mentions a warranty on its packaging, in a manual, or in marketing materials; no warranty applies to Microsoft products awarded as prizes. + +Microsoft does not give any warranty of any kind, express or implied (including any implied warranty of merchantability or fitness for a particular purpose) on products made by a company other than Microsoft that are awarded as prizes. Please contact the manufacturer to see if it is covered by that company’s warranty. + +Prizes will be sent no later than 28 days after winner selection. Prize winners may be required to complete and return prize claim and/or tax forms (“Forms”) within the deadline stated in the winner notification. Taxes on the prize, if any, are the sole responsibility of the winner, who is advised to seek independent counsel regarding the tax implications of accepting a prize. By accepting a prize, you agree that Microsoft may use your entry, name, image and hometown online and in print, or in any other media, in connection with this Sweepstakes without payment or compensation to you, except where prohibited by law. + +### ODDS +The odds of winning are based on the number of eligible entries received. + +### GENERAL CONDITIONS AND RELEASE OF LIABILITY +To the extent allowed by law, by entering you agree to release and hold harmless Microsoft and its respective parents, partners, subsidiaries, affiliates, employees, and agents from any and all liability or any injury, loss, or damage of any kind arising in connection with this Sweepstakes or any prize won. + +All local laws apply. The decisions of Microsoft are final and binding. + +We reserve the right to cancel, change, or suspend this Sweepstakes for any reason, including cheating, technology failure, catastrophe, war, or any other unforeseen or unexpected event that affects the integrity of this Sweepstakes, whether human or mechanical. If the integrity of the Sweepstakes cannot be restored, we may select winners from among all eligible entries received before we had to cancel, change or suspend the Sweepstakes. + +If you attempt or we have strong reason to believe that you have compromised the integrity or the legitimate operation of this Sweepstakes by cheating, hacking, creating a bot or other automated program, or by committing fraud in any way, we may seek damages from you to the full extent of the law and you may be banned from participation in future Microsoft promotions. + +### USE OF YOUR ENTRY +Personal data you provide while entering this Sweepstakes will be used by Microsoft and/or its agents and prize fulfillers acting on Microsoft’s behalf only for the administration and operation of this Sweepstakes and in accordance with the Microsoft Privacy Statement. + +### GOVERNING LAW +This Sweepstakes will be governed by the laws of the State of Washington, and you consent to the exclusive jurisdiction and venue of the courts of the State of Washington for any disputes arising out of this Sweepstakes. + +### WINNERS LIST +Send an email to lgalante@microsoft.com with the subject line “Responsible AI for Open Source Sweepstakes winners” within 30 days of August 21, 2025 to receive a list of winners that received a prize worth $25.00 or more. From a4c33b0275b34f5e83e85a600563fb6e66c62b50 Mon Sep 17 00:00:00 2001 From: Alida W Date: Tue, 12 Aug 2025 15:15:45 -0400 Subject: [PATCH 89/91] adjust cron job timing --- .github/workflows/close-dormant-discussions.yml | 4 ++-- .github/workflows/comment-on-dormant-discussions.yml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/close-dormant-discussions.yml b/.github/workflows/close-dormant-discussions.yml index 135b716c0..45bd9c1d0 100644 --- a/.github/workflows/close-dormant-discussions.yml +++ b/.github/workflows/close-dormant-discussions.yml @@ -3,8 +3,8 @@ name: Close out dormant discussions on: workflow_dispatch: schedule: - # At 01:23 every day - - cron: '23 1 * * *' + # At 01:25 every day + - cron: '25 1 * * *' jobs: build: diff --git a/.github/workflows/comment-on-dormant-discussions.yml b/.github/workflows/comment-on-dormant-discussions.yml index 929e08cf5..b4b812922 100644 --- a/.github/workflows/comment-on-dormant-discussions.yml +++ b/.github/workflows/comment-on-dormant-discussions.yml @@ -3,8 +3,8 @@ name: Comment on dormant discussions on: workflow_dispatch: schedule: - # At 03:23 every day - - cron: '23 3 * * *' + # At 03:25 every day + - cron: '25 3 * * *' jobs: build: From 98135a697a024592c1283c3423342231fe0f19f1 Mon Sep 17 00:00:00 2001 From: Alida W Date: Mon, 25 Aug 2025 10:31:26 -0400 Subject: [PATCH 90/91] Reject early if comment author is nil --- .github/lib/discussions.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/lib/discussions.rb b/.github/lib/discussions.rb index d20341aaf..5f9c607b2 100644 --- a/.github/lib/discussions.rb +++ b/.github/lib/discussions.rb @@ -443,7 +443,7 @@ def find_most_recent_incident_comment_id(actor_login:) return nil if comments.empty? - filtered_comments = comments.keep_if { |comment| comment["author"]["login"] == actor_login } + filtered_comments = comments.keep_if { |comment| comment["author"] && comment["author"]["login"] == actor_login } &.sort_by { |comment| comment["createdAt"] } .reverse From 572c1d81bc5f4630654e6932e4230444ab49644a Mon Sep 17 00:00:00 2001 From: Johanan Date: Tue, 26 Aug 2025 12:55:51 +0200 Subject: [PATCH 91/91] docs: Add link to GraphQL API documentation --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0300d0f68..0116bfb82 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ In this repository, you will find categories for various product areas. Feel fre |--- |--- | | 👍 [Accessibility](https://github.com/orgs/community/discussions/categories/accessibility) | [About Accessibility](https://docs.github.com/en/account-and-profile/setting-up-and-managing-your-personal-account-on-github/managing-personal-account-settings/managing-accessibility-settings#about-accessibility-settings) | | 🚢 [Actions](https://github.com/orgs/community/discussions/categories/actions) | [GitHub Actions](https://github.com/features/actions) | -| 🔁 [API and Webhooks](https://github.com/orgs/community/discussions/categories/api-and-webhooks) | [GitHub API](https://docs.github.com/en/rest) and [GitHub Webhooks](https://docs.github.com/en/developers/webhooks-and-events/webhooks/about-webhook) | +| 🔁 [API and Webhooks](https://github.com/orgs/community/discussions/categories/api-and-webhooks) | [GitHub REST API](https://docs.github.com/en/rest), [GitHub GraphQL API](https://docs.github.com/en/graphql), and [GitHub Webhooks](https://docs.github.com/en/developers/webhooks-and-events/webhooks/about-webhook) | | 🔎 [Code Search & Navigation](https://github.com/orgs/community/discussions/categories/code-search-and-navigation) | [Code Search & Navigation](https://cs.github.com/about) | | 💻 [Codespaces](https://github.com/orgs/community/discussions/categories/codespaces) | [GitHub Codespaces](https://github.com/features/codespaces) | | :copilot: [Copilot Conversations](https://github.com/orgs/community/discussions/categories/copilot-conversations) | [GitHub Copilot](https://copilot.github.com/) |