diff --git a/.github/workflows/code/create-checklist-comment.js b/.github/workflows/code/create-checklist-comment.js
new file mode 100644
index 0000000000000000000000000000000000000000..f59b6f7516501d28f41416550f1d2f110861832f
--- /dev/null
+++ b/.github/workflows/code/create-checklist-comment.js
@@ -0,0 +1,13 @@
+module.exports = async ({github, context}) => {
+ const pathToChecklist = './e2e/checklist.md'
+ const fs = require('fs')
+ const { promisify } = require('util')
+ const asyncReadFile = promisify(fs.readFile)
+ const text = await asyncReadFile(pathToChecklist, 'utf-8')
+ github.rest.issues.createComment({
+ issue_number: context.issue.number,
+ owner: context.repo.owner,
+ repo: context.repo.repo,
+ body: text
+ })
+}
diff --git a/.github/workflows/code/minimise-all-checklist-comments.js b/.github/workflows/code/minimise-all-checklist-comments.js
new file mode 100644
index 0000000000000000000000000000000000000000..9d530c1457204b07a3dbe4f2f97531eaab255ab4
--- /dev/null
+++ b/.github/workflows/code/minimise-all-checklist-comments.js
@@ -0,0 +1,94 @@
+module.exports = async ({github, context}) => {
+
+ const querySpec = `query($owner:String!, $name:String!, $issueNumber:Int!, $cursor:String) {
+ repository(owner: $owner, name: $name) {
+ pullRequest(number: $issueNumber) {
+ title
+ comments(first:50, after: $cursor){
+ totalCount
+ edges{
+ node {
+ author{
+ login
+ }
+ bodyText,
+ isMinimized,
+ id
+ }
+ cursor
+ }
+ }
+ }
+ }
+ }`
+ const variables = {
+ owner: context.repo.owner,
+ name: context.repo.repo,
+ issueNumber: context.issue.number,
+ }
+ const results = []
+ let cursor, totalCount = 0
+
+ const query = async ({ cursor }) => {
+ const resp = await github.graphql(querySpec, {
+ ...variables,
+ cursor
+ })
+ const {totalCount = 0, edges = [] } = (() => {
+ try {
+ return resp.repository.pullRequest.comments
+ } catch (e) {
+ console.warn('accessor error', e)
+ return {}
+ }
+ })()
+ return {
+ results: edges.map(edge => edge.node),
+ cursor: (() => {
+ try {
+ return edges[edges.length - 1].cursor
+ } catch (e) {
+ return null
+ }
+ })(),
+ totalCount
+ }
+ }
+
+ do {
+ const {
+ results: queryResults,
+ cursor: queryCursor,
+ totalCount: queryTotalCount
+ } = await query({ cursor })
+ results.push(...queryResults)
+ cursor = queryCursor
+ totalCount = queryTotalCount
+ } while(!!cursor && totalCount > results.length)
+
+ const commentsToMinimize = results.filter(res => res.author.login === 'github-actions' && !res.isMinimized)
+
+ const mutation = `mutation($minComInput: MinimizeCommentInput!) {
+ minimizeComment(input: $minComInput) {
+ clientMutationId
+ minimizedComment{
+ minimizedReason
+ viewerCanMinimize
+ isMinimized
+ }
+ }
+ }`
+
+ console.log(`Minimizing ${commentsToMinimize.length} previous checklist comments.`)
+
+ for (const result of results) {
+ const mutationVariable = {
+ "minComInput": {
+ "subjectId": result.id,
+ "classifier": "OUTDATED",
+ "clientMutationId": "gha"
+ }
+ }
+ await github.graphql(mutation, mutationVariable)
+ }
+}
diff --git a/.github/workflows/manual_e2e.yml b/.github/workflows/manual_e2e.yml
new file mode 100644
index 0000000000000000000000000000000000000000..27877ea0cb6cb3167b8a8bc3833c392d63e02c14
--- /dev/null
+++ b/.github/workflows/manual_e2e.yml
@@ -0,0 +1,34 @@
+name: '[manual-e2e]'
+
+on:
+ pull_request:
+ branches:
+ - master
+
+jobs:
+ hide_previous_if_exists:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v2
+ with:
+ ref: 'master'
+ - uses: actions/github-script@v5
+ with:
+ script: |
+ const script = require('./.github/workflows/code/minimise-all-checklist-comments.js')
+ await script({github, context})
+
+ add_e2e_checklist:
+ needs: hide_previous_if_exists
+ runs-on: ubuntu-latest
+
+ steps:
+ - uses: actions/checkout@v2
+ with:
+ ref: 'master'
+ - name: 'Add checklist comment'
+ uses: actions/github-script@v5
+ with:
+ script: |
+ const script = require('./.github/workflows/code/create-checklist-comment.js')
+ await script({github, context})