From b44292803763085f7f78b856961a78f9374e9674 Mon Sep 17 00:00:00 2001
From: "sweep-ai[bot]" <128439645+sweep-ai[bot]@users.noreply.github.com>
Date: Thu, 12 Oct 2023 08:00:57 +0000
Subject: [PATCH 01/27] Create sweep.yaml
---
sweep.yaml | 46 ++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 46 insertions(+)
create mode 100644 sweep.yaml
diff --git a/sweep.yaml b/sweep.yaml
new file mode 100644
index 000000000..36532abcf
--- /dev/null
+++ b/sweep.yaml
@@ -0,0 +1,46 @@
+# Sweep AI turns bugs & feature requests into code changes (https://sweep.dev)
+# For details on our config file, check out our docs at https://docs.sweep.dev/usage/config
+
+# This setting contains a list of rules that Sweep will check for. If any of these rules are broken in a new commit, Sweep will create an pull request to fix the broken rule.
+rules:
+- "All docstrings and comments should be up to date."
+- "Do not include large chunks of commented-out code."
+ - "Ensure that all error logs use traceback during exceptions."
+ - "Avoid using `import pdb; pdb.set_trace()` in production code."
+ - "Do not include debug log or print statements in production code."
+ - "Ensure that the code is properly formatted and follows consistent styling."
+
+# This is the branch that Sweep will develop from and make pull requests to. Most people use 'main' or 'master' but some users also use 'dev' or 'staging'.
+branch: 'main'
+
+# By default Sweep will read the logs and outputs from your existing Github Actions. To disable this, set this to false.
+gha_enabled: True
+
+# This is the description of your project. It will be used by sweep when creating PRs. You can tell Sweep what's unique about your project, what frameworks you use, or anything else you want.
+#
+# Example:
+#
+# description: sweepai/sweep is a python project. The main api endpoints are in sweepai/api.py. Write code that adheres to PEP8.
+description: ''
+
+# This sets whether to create pull requests as drafts. If this is set to True, then all pull requests will be created as drafts and GitHub Actions will not be triggered.
+draft: False
+
+# This is a list of directories that Sweep will not be able to edit.
+blocked_dirs: []
+
+# This is a list of documentation links that Sweep will use to help it understand your code. You can add links to documentation for any packages you use here.
+#
+# Example:
+#
+# docs:
+# - PyGitHub: ["https://pygithub.readthedocs.io/en/latest/", "We use pygithub to interact with the GitHub API"]
+docs: []
+
+# Sandbox executes commands in a sandboxed environment to validate code changes after every edit to guarantee pristine code. For more details, see the [Sandbox](./sandbox) page.
+sandbox:
+ install:
+ - trunk init
+ check:
+ - trunk fmt {file_path}
+ - trunk check --fix --print-failures {file_path}
From b4476cddc33557b410aab5809391ce673f8f127e Mon Sep 17 00:00:00 2001
From: "sweep-ai[bot]" <128439645+sweep-ai[bot]@users.noreply.github.com>
Date: Thu, 12 Oct 2023 08:00:58 +0000
Subject: [PATCH 02/27] Create sweep template
---
.github/ISSUE_TEMPLATE/sweep-template.yml | 14 ++++++++++++++
1 file changed, 14 insertions(+)
create mode 100644 .github/ISSUE_TEMPLATE/sweep-template.yml
diff --git a/.github/ISSUE_TEMPLATE/sweep-template.yml b/.github/ISSUE_TEMPLATE/sweep-template.yml
new file mode 100644
index 000000000..98811de19
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/sweep-template.yml
@@ -0,0 +1,14 @@
+name: Sweep Issue
+title: 'Sweep: '
+description: For small bugs, features, refactors, and tests to be handled by Sweep, an AI-powered junior developer.
+labels: sweep
+body:
+ - type: textarea
+ id: description
+ attributes:
+ label: Details
+ description: Tell Sweep where and what to edit and provide enough context for a new developer to the codebase
+ placeholder: |
+ Bugs: The bug might be in ... file. Here are the logs: ...
+ Features: the new endpoint should use the ... class from ... file because it contains ... logic.
+ Refactors: We are migrating this function to ... version because ...
From 0abdc2c801268b6e9f285f05ce529b9af4547ec8 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E3=82=A2=E3=83=AC=E3=82=AF=E3=82=B5=E3=83=B3=E3=83=80?=
=?UTF-8?q?=E3=83=BC=2Eeth?= <4975670+pavlovcik@users.noreply.github.com>
Date: Thu, 12 Oct 2023 08:05:30 +0000
Subject: [PATCH 03/27] Update sweep.yaml
---
sweep.yaml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/sweep.yaml b/sweep.yaml
index 36532abcf..64eba4665 100644
--- a/sweep.yaml
+++ b/sweep.yaml
@@ -11,7 +11,7 @@ rules:
- "Ensure that the code is properly formatted and follows consistent styling."
# This is the branch that Sweep will develop from and make pull requests to. Most people use 'main' or 'master' but some users also use 'dev' or 'staging'.
-branch: 'main'
+branch: 'development'
# By default Sweep will read the logs and outputs from your existing Github Actions. To disable this, set this to false.
gha_enabled: True
From bc4baaf2a9c9b4f3e899ba28ec2494f446360ff9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E3=82=A2=E3=83=AC=E3=82=AF=E3=82=B5=E3=83=B3=E3=83=80?=
=?UTF-8?q?=E3=83=BC=2Eeth?= <4975670+pavlovcik@users.noreply.github.com>
Date: Sun, 15 Oct 2023 19:02:18 +0000
Subject: [PATCH 04/27] Update ubiquibot-config.yml
---
.github/ubiquibot-config.yml | 74 +-----------------------------------
1 file changed, 1 insertion(+), 73 deletions(-)
diff --git a/.github/ubiquibot-config.yml b/.github/ubiquibot-config.yml
index e9fbd647d..8d1741fbf 100644
--- a/.github/ubiquibot-config.yml
+++ b/.github/ubiquibot-config.yml
@@ -1,73 +1 @@
-privateKeyEncrypted: ""
-promotionComment: "
If you've enjoyed your experience in the DevPool, we'd appreciate your support. Follow Ubiquity on GitHub and star this repo. Your endorsement means the world to us and helps us grow!
We are excited to announce that the DevPool and UbiquiBot are now available to partners! Our ideal collaborators are globally distributed crypto-native organizations, who actively work on open source on GitHub, and excel in research & development. If you can introduce us to the repository maintainers in these types of companies, we have a special bonus in store for you!
"
-
-evmNetworkId: 100
-priceMultiplier: 1
-issueCreatorMultiplier: 3
-maxConcurrentAssigns: 2
-permitMaxPrice: 1000
-
-disableAnalytics: true
-commentIncentives: true
-assistivePricing: true
-registerWalletWithVerification: false
-
-timeLabels:
- - name: "Time: <1 Hour"
- - name: "Time: <2 Hours"
- - name: "Time: <4 Hours"
- - name: "Time: <1 Day"
- - name: "Time: <1 Week"
-
-priorityLabels:
- - name: "Priority: 1 (Normal)"
- - name: "Priority: 2 (Medium)"
- - name: "Priority: 3 (High)"
- - name: "Priority: 4 (Urgent)"
- - name: "Priority: 5 (Emergency)"
-
-incentives:
- comment:
- elements:
- code: 1
- img: 0
- h1: 1
- h2: 1
- h3: 1
- h4: 1
- h5: 1
- h6: 1
- li: 0.5
- a: 1
- blockquote: 0
- i: 0
- totals:
- word: 0.1
-
-commandSettings:
- - name: start
- enabled: true
- - name: stop
- enabled: true
- - name: wallet
- enabled: true
- - name: payout
- enabled: true
- - name: multiplier
- enabled: true
- - name: query
- enabled: true
- - name: allow
- enabled: true
- - name: autopay
- enabled: true
- - name: ask
- enabled: true
- - name: review
- enabled: true
-
-# publicAccessControl:
-# setLabel: true
-# fundExternalClosedIssue: true
-
-openAITokenLimit: 8000
\ No newline at end of file
+priceMultiplier: 2
From 326a2b7e8655d827e2e6f05b01114913d10b349b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E3=82=A2=E3=83=AC=E3=82=AF=E3=82=B5=E3=83=B3=E3=83=80?=
=?UTF-8?q?=E3=83=BC=2Eeth?= <4975670+pavlovcik@users.noreply.github.com>
Date: Thu, 2 Nov 2023 16:15:53 +0900
Subject: [PATCH 05/27] Delete .github/ISSUE_TEMPLATE/sweep-template.yml
---
.github/ISSUE_TEMPLATE/sweep-template.yml | 14 --------------
1 file changed, 14 deletions(-)
delete mode 100644 .github/ISSUE_TEMPLATE/sweep-template.yml
diff --git a/.github/ISSUE_TEMPLATE/sweep-template.yml b/.github/ISSUE_TEMPLATE/sweep-template.yml
deleted file mode 100644
index 98811de19..000000000
--- a/.github/ISSUE_TEMPLATE/sweep-template.yml
+++ /dev/null
@@ -1,14 +0,0 @@
-name: Sweep Issue
-title: 'Sweep: '
-description: For small bugs, features, refactors, and tests to be handled by Sweep, an AI-powered junior developer.
-labels: sweep
-body:
- - type: textarea
- id: description
- attributes:
- label: Details
- description: Tell Sweep where and what to edit and provide enough context for a new developer to the codebase
- placeholder: |
- Bugs: The bug might be in ... file. Here are the logs: ...
- Features: the new endpoint should use the ... class from ... file because it contains ... logic.
- Refactors: We are migrating this function to ... version because ...
From bcdd53fa48c9ab5a9fdc4d96191c56e487eced27 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E3=82=A2=E3=83=AC=E3=82=AF=E3=82=B5=E3=83=B3=E3=83=80?=
=?UTF-8?q?=E3=83=BC=2Eeth?= <4975670+pavlovcik@users.noreply.github.com>
Date: Tue, 14 Nov 2023 11:40:40 +0900
Subject: [PATCH 06/27] Delete .github/ubiquibot-config.yml
---
.github/ubiquibot-config.yml | 1 -
1 file changed, 1 deletion(-)
delete mode 100644 .github/ubiquibot-config.yml
diff --git a/.github/ubiquibot-config.yml b/.github/ubiquibot-config.yml
deleted file mode 100644
index 8d1741fbf..000000000
--- a/.github/ubiquibot-config.yml
+++ /dev/null
@@ -1 +0,0 @@
-priceMultiplier: 2
From 5f3c94ebe66931550f45e3bcc568d07648c04227 Mon Sep 17 00:00:00 2001
From: Korrrba
Date: Tue, 28 Nov 2023 12:46:11 +0100
Subject: [PATCH 07/27] chore: add knip ci workflow
Resolves: #897
---
.github/workflows/knip.yml | 28 ++++++++++++++++++++++++++++
package.json | 4 +++-
2 files changed, 31 insertions(+), 1 deletion(-)
create mode 100644 .github/workflows/knip.yml
diff --git a/.github/workflows/knip.yml b/.github/workflows/knip.yml
new file mode 100644
index 000000000..1be7f0c04
--- /dev/null
+++ b/.github/workflows/knip.yml
@@ -0,0 +1,28 @@
+name: Knip
+
+on:
+ pull_request:
+
+permissions: write-all
+
+jobs:
+ run-knip:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v3
+
+ - name: Setup Node
+ uses: actions/setup-node@v3
+ with:
+ node-version: "18.14.1"
+
+ - name: Install toolchain
+ run: yarn install
+
+ - name: Report knip results to pull request
+ uses: gitcoindev/knip-reporter@v1.2.9
+ with:
+ verbose: true
+ comment_id: ${{ github.workflow }}-reporter
+ command_script_name: knip-ci
diff --git a/package.json b/package.json
index 2830f3051..b87cc1072 100644
--- a/package.json
+++ b/package.json
@@ -16,6 +16,8 @@
"build:serverless": "ncc build src/index.ts -o ./",
"build": "tsc",
"clean": "rimraf ./dist ./node_modules",
+ "knip": "knip",
+ "knip-ci": "knip --no-exit-code --reporter jsonExt",
"preformat": "yarn lint:prettier",
"format": "yarn lint:eslint",
"lint": "yarn lint:prettier:check && yarn lint:eslint",
@@ -78,7 +80,7 @@
"@types/source-map-support": "^0.5.6",
"eslint": "^8.43.0",
"jest": "^29.6.2",
- "knip": "^2.33.4",
+ "knip": "^2.43.0",
"octokit": "^3.1.2",
"rimraf": "3.0.2",
"source-map-support": "^0.5.21",
From 72f5fe2e0a454f4ceb8378f88359ef53f70c44e7 Mon Sep 17 00:00:00 2001
From: Korrrba
Date: Tue, 28 Nov 2023 12:53:47 +0100
Subject: [PATCH 08/27] chore: add knip.ts configuration skeleton
Resolves: #897
---
knip.json | 4 ----
knip.ts | 11 +++++++++++
tsconfig.json | 2 +-
3 files changed, 12 insertions(+), 5 deletions(-)
delete mode 100644 knip.json
create mode 100644 knip.ts
diff --git a/knip.json b/knip.json
deleted file mode 100644
index 9d5789ccc..000000000
--- a/knip.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{
- "entry": ["src/index.ts"],
- "project": ["**/*.ts"]
-}
diff --git a/knip.ts b/knip.ts
new file mode 100644
index 000000000..4894f6ad5
--- /dev/null
+++ b/knip.ts
@@ -0,0 +1,11 @@
+import type { KnipConfig } from "knip";
+
+const config: KnipConfig = {
+ entry: ["src/index.ts"],
+ project: ["src/**/*.ts"],
+ ignore: ["src/types/config.ts"],
+ ignoreExportsUsedInFile: true,
+ ignoreDependencies: [],
+};
+
+export default config;
diff --git a/tsconfig.json b/tsconfig.json
index b9259e753..7da22171c 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -62,6 +62,6 @@
"sourceMap": true
},
"include": ["src/"],
- "exclude": ["src/coverage/"],
+ "exclude": ["src/coverage/", "knip.ts"],
"compileOnSave": false
}
From 7ab24dcae1091ee68a8f03fb5cc9f060bd8dd1b1 Mon Sep 17 00:00:00 2001
From: korrrba <88761781+gitcoindev@users.noreply.github.com>
Date: Wed, 6 Dec 2023 23:01:37 +0100
Subject: [PATCH 09/27] Update knip.yml to use knip-reporter v2.1.2 and node
20.x
---
.github/workflows/knip.yml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/.github/workflows/knip.yml b/.github/workflows/knip.yml
index 1be7f0c04..bc6a23c0c 100644
--- a/.github/workflows/knip.yml
+++ b/.github/workflows/knip.yml
@@ -15,13 +15,13 @@ jobs:
- name: Setup Node
uses: actions/setup-node@v3
with:
- node-version: "18.14.1"
+ node-version: 20.x
- name: Install toolchain
run: yarn install
- name: Report knip results to pull request
- uses: gitcoindev/knip-reporter@v1.2.9
+ uses: gitcoindev/knip-reporter@v2.1.2
with:
verbose: true
comment_id: ${{ github.workflow }}-reporter
From 1a9e6686ff4b49062d84e684d58c3492ad2c2687 Mon Sep 17 00:00:00 2001
From: Korrrba
Date: Mon, 11 Dec 2023 07:42:39 +0100
Subject: [PATCH 10/27] chore: switch knip-reporter to latest upstream release
Version 2.1.0 released with export annotations support and additional
tests.
---
.github/workflows/knip.yml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/.github/workflows/knip.yml b/.github/workflows/knip.yml
index bc6a23c0c..18b0e8e0a 100644
--- a/.github/workflows/knip.yml
+++ b/.github/workflows/knip.yml
@@ -15,13 +15,13 @@ jobs:
- name: Setup Node
uses: actions/setup-node@v3
with:
- node-version: 20.x
+ node-version: 20.10
- name: Install toolchain
run: yarn install
- name: Report knip results to pull request
- uses: gitcoindev/knip-reporter@v2.1.2
+ uses: codex-/knip-reporter@v2.1.0
with:
verbose: true
comment_id: ${{ github.workflow }}-reporter
From ac3c2a42f4c9e31d64b28b96f5bfdc77537e6f0b Mon Sep 17 00:00:00 2001
From: Korrrba
Date: Mon, 11 Dec 2023 11:16:37 +0100
Subject: [PATCH 11/27] chore: set node LTS and knip v2 tag
---
.github/workflows/knip.yml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/.github/workflows/knip.yml b/.github/workflows/knip.yml
index 18b0e8e0a..f0512ce24 100644
--- a/.github/workflows/knip.yml
+++ b/.github/workflows/knip.yml
@@ -15,13 +15,13 @@ jobs:
- name: Setup Node
uses: actions/setup-node@v3
with:
- node-version: 20.10
+ node-version: 20.10.x
- name: Install toolchain
run: yarn install
- name: Report knip results to pull request
- uses: codex-/knip-reporter@v2.1.0
+ uses: codex-/knip-reporter@v2
with:
verbose: true
comment_id: ${{ github.workflow }}-reporter
From 2243c38ff84389ec25be91f6ecbe6c53c79aebda Mon Sep 17 00:00:00 2001
From: Korrrba
Date: Mon, 11 Dec 2023 13:31:34 +0100
Subject: [PATCH 12/27] chore: use Codex-/knip-reporter
---
.github/workflows/knip.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.github/workflows/knip.yml b/.github/workflows/knip.yml
index f0512ce24..2c9deb495 100644
--- a/.github/workflows/knip.yml
+++ b/.github/workflows/knip.yml
@@ -21,7 +21,7 @@ jobs:
run: yarn install
- name: Report knip results to pull request
- uses: codex-/knip-reporter@v2
+ uses: Codex-/knip-reporter@v2
with:
verbose: true
comment_id: ${{ github.workflow }}-reporter
From 970419c6e750d96a2a677d0c8b3647c91930e7c1 Mon Sep 17 00:00:00 2001
From: Korrrba
Date: Fri, 15 Dec 2023 00:20:19 +0100
Subject: [PATCH 13/27] chore: upgrade knip to v3.7 with dev depencies
typescript 5.0.4 and node types
Also set explicit anntations in knip.yml.
---
.github/workflows/knip.yml | 2 ++
package.json | 8 ++++----
2 files changed, 6 insertions(+), 4 deletions(-)
diff --git a/.github/workflows/knip.yml b/.github/workflows/knip.yml
index 2c9deb495..9fff1ee22 100644
--- a/.github/workflows/knip.yml
+++ b/.github/workflows/knip.yml
@@ -26,3 +26,5 @@ jobs:
verbose: true
comment_id: ${{ github.workflow }}-reporter
command_script_name: knip-ci
+ annotations: true
+ ignore_results: false
diff --git a/package.json b/package.json
index b87cc1072..9e0a62661 100644
--- a/package.json
+++ b/package.json
@@ -17,7 +17,7 @@
"build": "tsc",
"clean": "rimraf ./dist ./node_modules",
"knip": "knip",
- "knip-ci": "knip --no-exit-code --reporter jsonExt",
+ "knip-ci": "knip --no-exit-code --reporter json",
"preformat": "yarn lint:prettier",
"format": "yarn lint:eslint",
"lint": "yarn lint:prettier:check && yarn lint:eslint",
@@ -76,16 +76,16 @@
"@types/libsodium-wrappers": "^0.7.10",
"@types/lodash": "^4.14.197",
"@types/markdown-it": "^13.0.4",
- "@types/node": "^14.18.37",
+ "@types/node": "^18.0.0",
"@types/source-map-support": "^0.5.6",
"eslint": "^8.43.0",
"jest": "^29.6.2",
- "knip": "^2.43.0",
+ "knip": "^3.7.1",
"octokit": "^3.1.2",
"rimraf": "3.0.2",
"source-map-support": "^0.5.21",
"ts-jest": "^29.1.1",
- "typescript": "^4.9.5"
+ "typescript": "^5.0.4"
},
"engines": {
"node": ">=18"
From 57c9ec6d6f577eac941b4fa1d758d4cae589ae29 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E3=82=A2=E3=83=AC=E3=82=AF=E3=82=B5=E3=83=B3=E3=83=80?=
=?UTF-8?q?=E3=83=BC=2Eeth?= <4975670+pavlovcik@users.noreply.github.com>
Date: Sat, 23 Dec 2023 19:17:13 +0900
Subject: [PATCH 14/27] chore: update environment variable property names
---
.github/workflows/release.yml | 4 ++--
.github/workflows/update-config.yml | 4 ++--
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 3f366d621..fd84f4f64 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -21,8 +21,8 @@ jobs:
uses: tibdex/github-app-token@v1.7.0
id: get_installation_token
with:
- app_id: ${{ secrets.UBIQUITY_BOUNTY_BOT_APP_ID }}
- private_key: ${{ secrets.UBIQUITY_BOUNTY_BOT_PRIVATE_KEY }}
+ app_id: ${{ secrets.APP_ID }}
+ private_key: ${{ secrets.APP_PRIVATE_KEY }}
#
diff --git a/.github/workflows/update-config.yml b/.github/workflows/update-config.yml
index c93d04bfb..f9733fbd2 100644
--- a/.github/workflows/update-config.yml
+++ b/.github/workflows/update-config.yml
@@ -24,8 +24,8 @@ jobs:
uses: tibdex/github-app-token@v1.7.0
id: get_installation_token
with:
- app_id: ${{ secrets.UBIQUITY_BOUNTY_BOT_APP_ID }}
- private_key: ${{ secrets.UBIQUITY_BOUNTY_BOT_PRIVATE_KEY }}
+ app_id: ${{ secrets.APP_ID }}
+ private_key: ${{ secrets.APP_PRIVATE_KEY }}
- name: Update Config Params and Create Pull Requests
run: |
From 234cfd15797397baae3e20fe4c557389490f1b87 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E3=82=A2=E3=83=AC=E3=82=AF=E3=82=B5=E3=83=B3=E3=83=80?=
=?UTF-8?q?=E3=83=BC=2Eeth?= <4975670+pavlovcik@users.noreply.github.com>
Date: Sat, 23 Dec 2023 19:25:03 +0900
Subject: [PATCH 15/27] chore: delete deprecated actions
---
.github/workflows/bot.yml | 84 -------------------------
.github/workflows/qa-automation.yml | 35 -----------
.github/workflows/release.yml | 4 +-
.github/workflows/update-config.yml | 98 -----------------------------
4 files changed, 2 insertions(+), 219 deletions(-)
delete mode 100644 .github/workflows/bot.yml
delete mode 100644 .github/workflows/qa-automation.yml
delete mode 100644 .github/workflows/update-config.yml
diff --git a/.github/workflows/bot.yml b/.github/workflows/bot.yml
deleted file mode 100644
index fa5fedab5..000000000
--- a/.github/workflows/bot.yml
+++ /dev/null
@@ -1,84 +0,0 @@
-name: Calculate Bounty Based on Events
-on:
- push:
- issues:
- types:
- - labeled
- - unlabeled
- - assigned
- - opened
- - closed
- issue_comment:
- types:
- - created
- - edited
-
-jobs:
- calculate_bounty_job:
- # ignore events invoked by bots
- if: >-
- github.event.pull_request.payload.sender.type != 'Bot' && github.repository != 'ubiquity/ubiquibot'
- runs-on: ubuntu-latest
- name: Calculate Bounty with UbiquiBot
- steps:
- # To use this repository's private action,
- # you must check out the repository
- - name: Checkout
- uses: actions/checkout@v3
-
- - name: Setup Node
- uses: actions/setup-node@v3
- with:
- node-version: "18.14.1"
-
- - name: Install
- run: yarn install
-
- - name: Authenticate as UbiquiBot
- uses: tibdex/github-app-token@v1.7.0
- id: get_installation_token
- with:
- app_id: 346074
- # https://github.com/organizations/ubiquibot/settings/apps/ubiquibot-qa/installations
- # https://github.com/apps/ubiquibot-qa/installations/new/permissions?target_id=4975670
- # https://github.com/settings/installations/38790399
- private_key: |
- -----BEGIN RSA PRIVATE KEY-----
- MIIEpQIBAAKCAQEA3QM8hM2PNtmZVDu9fMWCznTw4FefZ2JXe+3ong4TX4G/d3QD
- jhjRp5PvyPI+nsK0u/22pFCduwUGTFfKxGrMfnqsoBI+S5zUm8gfViX0NGzM7Xqn
- EPfTyu3gTKfaJ2G9/JXTNx02iW95vgWAq7W/g4l6VdM/RbzQkYH/Ixn7CAxxXd3Y
- /Lvjw4Mo7TkWsdpwx3x7Jzdbf6RvT/7lD1bAEciOv28XxVsaEKt7JN/a0HqKullc
- 7JR5jyKEhg9NjXdj1UnHhN5SNg5PorXk3FAhFiBAQZbgOpWyxzfnvBagM+MUr/Iw
- Zf0pm/XuR3vfjYYyxJEeyXPTRO3MmsVrUz4yKQIDAQABAoIBAQDbx0MgQRXgkoSC
- GiI1eGe6jNmYDipq8YVTrOK8gfzL5ceTrx9158Jc5aT2a8bPs4lsxEEipzQi7T01
- H7x4lEekorMVPu8J2/wkqd5Xmch9dZBXu7d1DS1kyCZbtDMhJHZ8PjVawkcgZmVn
- DCvHFSZMVKL9w+NQoxG5EM+5hTV36qZ2rQ2d56yw+ZDBl7ghjyVSpeXZDm6HCeRf
- 0VaDf8hADi3awnwOTpoq0qgoUbuA+QZhwdNgF2KWQTlEL+m59Dv+774uaZTzrRf/
- 73UCbI5Ukw5sP4VK/4Gs3rKXjD9G/gpRqcTDtaj0HSA/Id/iYxTkW8lP+YlZSW7C
- ggkbNASBAoGBAPRHEhWSAd6NST5po3XCWBZwOvEjSW+4vZN/octQJ0lKG5cvPxsi
- p8k8M2vd65VKT9uyVAG89JVcE50E6sGE52JD5u5yLLqcCWYRzo2g1hzcnoZVECQt
- l80CvhEKCkaAD1ZSsCEeasj5A+UUaHMWLfcP3xWCB3H+Bs7BVs2qWtYRAoGBAOee
- W4cZxU2z7uPP3uu119tebYtCwDYFSWLhOm784iLHEaw82dP58Anu9gHe3Ph6nK42
- Ec3NH7C8CmaP42Q47wMTXW47NJcC626PfuBYFj43DtkiuRBEjE8kVyXFjFBTN66K
- /y+BCeNekXcmlX3l7/K9OINXsrxDzsxO2z3sJiKZAoGBAM5WUiJCSK3ybhH4LYjE
- 9p9NgZw6kEd8pzW2M7aHKAgyPwf/crC7HztOTKkqtVpPgRE0mt00/OxE8JRLmPiK
- CODqNmDntHyUXSQImo7rcrDCcm1J4O6OTJFxZZcDAhb3CP2Drx7qkIzeOrn/+RJt
- g7oTf/6s7RkO2DVA/s+OvFfhAoGATRHNZNv3Yg6gS9+MTqRYah82liMk8BS8QZGu
- LuYonOfegpBQ7w74h2WjKCYvIuMxpWpKbE933wgC8fOo911WcpCMAzTiH+mRy10m
- G6JT7GnHoArEx5v3kBIIiYH9WXEHUyXfGcB3ONfr0VjeX2EWgY/i8RlKWQi7FBKd
- MzKT0ekCgYEAmLNlBi5/krNJ79lhxErr/6zZw8ltAXa7uVcOUd8FNE0B9ppm2WI7
- RoF1Gt57QIS+TdRQFMkNgd7fyq4+kotQBjuRQIfDOPhKXVnopeFJOFJkAGRc4Saa
- BGZvyfK5g8aSy8Wtg4Lj7/wL4pEde4cm8AF4K0wbb3AfbDBB0GQk6N8=
- -----END RSA PRIVATE KEY-----
-
- - name: Invoke the UbiquiBot
- id: UbiquiBot
- env:
- GITHUB_TOKEN: ${{steps.get_installation_token.outputs.token}}
- LOGDNA_INGESTION_KEY: '53239bc82c0a1a156e32f943d4995656'
- SUPABASE_URL: 'https://yymbokdvicqbgzutuiwt.supabase.co'
- SUPABASE_KEY: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6Inl5bWJva2R2aWNxYmd6dXR1aXd0Iiwicm9sZSI6ImFub24iLCJpYXQiOjE2ODUxMTIwMzcsImV4cCI6MjAwMDY4ODAzN30.A9r4j_hlHu79HLlFY4FStPdgEc-I5SiD-MX7YGKdWyo'
- X25519_PRIVATE_KEY: 'QCDb30UHUkwJAGhLWC-R2N0PiEbd4vQY6qH2Wloybyo'
- FOLLOW_UP_TIME: '4 days'
- DISQUALIFY_TIME: '7 days'
- run: yarn start:serverless
diff --git a/.github/workflows/qa-automation.yml b/.github/workflows/qa-automation.yml
deleted file mode 100644
index 2b8aafa53..000000000
--- a/.github/workflows/qa-automation.yml
+++ /dev/null
@@ -1,35 +0,0 @@
-name: Automate QA
-
-on:
- pull_request_target:
- types:
- - review_requested
- branches: [development, main]
-
-jobs:
- add-to-project:
- env:
- ADD_TO_PROJECT_PAT: ${{ secrets.ADD_TO_PROJECT_PAT }}
- name: Add issue to project
- runs-on: ubuntu-latest
- permissions:
- contents: read
-
- steps:
- - name: Add PR to QA project
- if: contains(github.event.pull_request.requested_reviewers.*.login, 'Draeieg')
- uses: actions/add-to-project@v0.5.0
- with:
- project-url: https://github.com/orgs/ubiquity/projects/23
- github-token: ${{ env.ADD_TO_PROJECT_PAT }}
-
- - name: Create QA Issue
- if: contains(github.event.pull_request.requested_reviewers.*.login, 'Draeieg')
- uses: dacbd/create-issue-action@v1
- with:
- token: ${{ env.ADD_TO_PROJECT_PAT }}
- owner: ubiquibot
- repo: staging
- title: QA for ${{ github.event.pull_request.title }}
- body: |
- Testing pr ${{ github.event.pull_request.number }}
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 3f366d621..fd84f4f64 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -21,8 +21,8 @@ jobs:
uses: tibdex/github-app-token@v1.7.0
id: get_installation_token
with:
- app_id: ${{ secrets.UBIQUITY_BOUNTY_BOT_APP_ID }}
- private_key: ${{ secrets.UBIQUITY_BOUNTY_BOT_PRIVATE_KEY }}
+ app_id: ${{ secrets.APP_ID }}
+ private_key: ${{ secrets.APP_PRIVATE_KEY }}
#
diff --git a/.github/workflows/update-config.yml b/.github/workflows/update-config.yml
deleted file mode 100644
index c93d04bfb..000000000
--- a/.github/workflows/update-config.yml
+++ /dev/null
@@ -1,98 +0,0 @@
-name: Pull Request Action
-permissions: write-all
-on:
- workflow_dispatch:
-
-env:
- GH_TOKEN: ${{ secrets.ADD_TO_PROJECT_PAT }}
-
-jobs:
- build:
- runs-on: ubuntu-latest
- steps:
-
- - name: Check out repository
- uses: actions/checkout@v3
-
- - name: Install jq and yq
- run: |
- sudo apt-get -y install jq
- sudo wget https://github.com/mikefarah/yq/releases/latest/download/yq_linux_amd64 -O /usr/bin/yq
- sudo chmod +x /usr/bin/yq
-
- - name: Get UbiquiBot Token
- uses: tibdex/github-app-token@v1.7.0
- id: get_installation_token
- with:
- app_id: ${{ secrets.UBIQUITY_BOUNTY_BOT_APP_ID }}
- private_key: ${{ secrets.UBIQUITY_BOUNTY_BOT_PRIVATE_KEY }}
-
- - name: Update Config Params and Create Pull Requests
- run: |
- urls=$(curl -sSL https://raw.githubusercontent.com/ubiquity/devpool-directory/development/projects.json | jq -r '.urls[]')
-
- for url in $urls
- do
- repoName=$(basename $url)
- ownerName=$(echo $url | awk -F/ '{print $(NF-1)}')
-
- git clone $url $repoName
- cd $repoName
- defaultBranch=$(git branch --show-current)
-
- # make a branch to update config #
- git branch update
- git checkout update
-
- curl -sSL https://raw.githubusercontent.com/ubiquity/ubiquibot/development/ubiquibot-config-default.json > default.json
- declare -A param_mapping=(
- ["evm-network-id"]="network-id chain-id"
- ["price-multiplier"]="base-multiplier"
- #add more configs as needed
- )
-
- ### update configs ###
- # Iterate over the mapping and perform updates using sed
- for new_param in "${!param_mapping[@]}"
- do
- old_params="${param_mapping[$new_param]}"
- for old_param in $old_params
- do
- # only update param if the old ones exist
- exist_old_param=$(yq "has(\"$old_param\")" .github/ubiquibot-config.yml)
- if $exist_old_param; then
- yq ".$new_param = .$old_param | del(.$old_param)" .github/ubiquibot-config.yml > temp.yml
- mv temp.yml .github/ubiquibot-config.yml
- fi
- done
- # if new param still doesent exist add default from ubiquibot-config-default.json
- exist_new_param=$(yq "has(\"$new_param\")" .github/ubiquibot-config.yml)
- if ! $exist_new_param; then
- echo adding
- def_val=$(jq -r ".[\"$new_param\"]" ubiquibot-config-default.json)
- yq ".$new_param=$def_val" .github/ubiquibot-config.yml > temp.yml
- mv temp.yml .github/ubiquibot-config.yml
- fi
- done
-
- git config user.email "113181824+UbiquiBot[bot]@users.noreply.github.com"
- git config user.name "UbiquiBot[bot]"
-
- git add .github/ubiquibot-config.yml
- git commit -m "build: use latest ubiquibot config setup"
- git remote set-url origin https://${{ secrets.ADD_TO_PROJECT_PAT }}@github.com/$ownerName/$repoName.git
- git push -f origin update
-
- curl -L \
- -X POST \
- -H "Accept: application/vnd.github+json" \
- -H "Authorization: Bearer ${{ steps.get_installation_token.outputs.token }}"\
- -H "X-GitHub-Api-Version: 2022-11-28" \
- https://api.github.com/repos/$ownerName/$repoName/pulls \
- -d '{
- "title": "build: use latest ubiquibot config setup",
- "base": "'"$defaultBranch"'",
- "head": "update"
- }'
- cd ..
- done
\ No newline at end of file
From 4fd8b91f7eb8f425932fadeda5c13217c35b5ce9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E3=82=A2=E3=83=AC=E3=82=AF=E3=82=B5=E3=83=B3=E3=83=80?=
=?UTF-8?q?=E3=83=BC=2Eeth?= <4975670+pavlovcik@users.noreply.github.com>
Date: Sat, 23 Dec 2023 21:10:49 +0900
Subject: [PATCH 16/27] chore: bump node to latest lts
---
.github/workflows/build.yml | 2 +-
.nvmrc | 2 +-
package.json | 2 +-
3 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 973953d53..ae1b13c2f 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -13,7 +13,7 @@ jobs:
- name: Setup Node
uses: actions/setup-node@v3
with:
- node-version: "18.16.0"
+ node-version: "20.10.0"
- name: Install
run: yarn install
diff --git a/.nvmrc b/.nvmrc
index a5e8bba26..790e1105f 100644
--- a/.nvmrc
+++ b/.nvmrc
@@ -1 +1 @@
-v20.3.0
+v20.10.0
diff --git a/package.json b/package.json
index 807d2253b..3f9884a9e 100644
--- a/package.json
+++ b/package.json
@@ -85,7 +85,7 @@
"typescript": "^4.9.5"
},
"engines": {
- "node": ">=18"
+ "node": ">=20.10.0"
},
"lint-staged": {
"*.{ts,json}": [
From d5180e5649a0806e62a2b135d74c4d2a30a2bc43 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E3=82=A2=E3=83=AC=E3=82=AF=E3=82=B5=E3=83=B3=E3=83=80?=
=?UTF-8?q?=E3=83=BC=2Eeth?= <4975670+pavlovcik@users.noreply.github.com>
Date: Sat, 23 Dec 2023 21:24:46 +0900
Subject: [PATCH 17/27] chore: bump node to lts
---
.github/workflows/build.yml | 2 +-
.github/workflows/conventional-commits.yml | 1 -
.github/workflows/qa-automation.yml | 35 --------
.github/workflows/update-config.yml | 98 ----------------------
.nvmrc | 2 +-
package.json | 2 +-
6 files changed, 3 insertions(+), 137 deletions(-)
delete mode 100644 .github/workflows/qa-automation.yml
delete mode 100644 .github/workflows/update-config.yml
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 973953d53..ae1b13c2f 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -13,7 +13,7 @@ jobs:
- name: Setup Node
uses: actions/setup-node@v3
with:
- node-version: "18.16.0"
+ node-version: "20.10.0"
- name: Install
run: yarn install
diff --git a/.github/workflows/conventional-commits.yml b/.github/workflows/conventional-commits.yml
index 6482cd5e2..1f943d1bb 100644
--- a/.github/workflows/conventional-commits.yml
+++ b/.github/workflows/conventional-commits.yml
@@ -3,7 +3,6 @@ name: Conventional Commits
on:
pull_request:
push:
- branches: [development]
jobs:
conventional-commits:
diff --git a/.github/workflows/qa-automation.yml b/.github/workflows/qa-automation.yml
deleted file mode 100644
index 2b8aafa53..000000000
--- a/.github/workflows/qa-automation.yml
+++ /dev/null
@@ -1,35 +0,0 @@
-name: Automate QA
-
-on:
- pull_request_target:
- types:
- - review_requested
- branches: [development, main]
-
-jobs:
- add-to-project:
- env:
- ADD_TO_PROJECT_PAT: ${{ secrets.ADD_TO_PROJECT_PAT }}
- name: Add issue to project
- runs-on: ubuntu-latest
- permissions:
- contents: read
-
- steps:
- - name: Add PR to QA project
- if: contains(github.event.pull_request.requested_reviewers.*.login, 'Draeieg')
- uses: actions/add-to-project@v0.5.0
- with:
- project-url: https://github.com/orgs/ubiquity/projects/23
- github-token: ${{ env.ADD_TO_PROJECT_PAT }}
-
- - name: Create QA Issue
- if: contains(github.event.pull_request.requested_reviewers.*.login, 'Draeieg')
- uses: dacbd/create-issue-action@v1
- with:
- token: ${{ env.ADD_TO_PROJECT_PAT }}
- owner: ubiquibot
- repo: staging
- title: QA for ${{ github.event.pull_request.title }}
- body: |
- Testing pr ${{ github.event.pull_request.number }}
diff --git a/.github/workflows/update-config.yml b/.github/workflows/update-config.yml
deleted file mode 100644
index f9733fbd2..000000000
--- a/.github/workflows/update-config.yml
+++ /dev/null
@@ -1,98 +0,0 @@
-name: Pull Request Action
-permissions: write-all
-on:
- workflow_dispatch:
-
-env:
- GH_TOKEN: ${{ secrets.ADD_TO_PROJECT_PAT }}
-
-jobs:
- build:
- runs-on: ubuntu-latest
- steps:
-
- - name: Check out repository
- uses: actions/checkout@v3
-
- - name: Install jq and yq
- run: |
- sudo apt-get -y install jq
- sudo wget https://github.com/mikefarah/yq/releases/latest/download/yq_linux_amd64 -O /usr/bin/yq
- sudo chmod +x /usr/bin/yq
-
- - name: Get UbiquiBot Token
- uses: tibdex/github-app-token@v1.7.0
- id: get_installation_token
- with:
- app_id: ${{ secrets.APP_ID }}
- private_key: ${{ secrets.APP_PRIVATE_KEY }}
-
- - name: Update Config Params and Create Pull Requests
- run: |
- urls=$(curl -sSL https://raw.githubusercontent.com/ubiquity/devpool-directory/development/projects.json | jq -r '.urls[]')
-
- for url in $urls
- do
- repoName=$(basename $url)
- ownerName=$(echo $url | awk -F/ '{print $(NF-1)}')
-
- git clone $url $repoName
- cd $repoName
- defaultBranch=$(git branch --show-current)
-
- # make a branch to update config #
- git branch update
- git checkout update
-
- curl -sSL https://raw.githubusercontent.com/ubiquity/ubiquibot/development/ubiquibot-config-default.json > default.json
- declare -A param_mapping=(
- ["evm-network-id"]="network-id chain-id"
- ["price-multiplier"]="base-multiplier"
- #add more configs as needed
- )
-
- ### update configs ###
- # Iterate over the mapping and perform updates using sed
- for new_param in "${!param_mapping[@]}"
- do
- old_params="${param_mapping[$new_param]}"
- for old_param in $old_params
- do
- # only update param if the old ones exist
- exist_old_param=$(yq "has(\"$old_param\")" .github/ubiquibot-config.yml)
- if $exist_old_param; then
- yq ".$new_param = .$old_param | del(.$old_param)" .github/ubiquibot-config.yml > temp.yml
- mv temp.yml .github/ubiquibot-config.yml
- fi
- done
- # if new param still doesent exist add default from ubiquibot-config-default.json
- exist_new_param=$(yq "has(\"$new_param\")" .github/ubiquibot-config.yml)
- if ! $exist_new_param; then
- echo adding
- def_val=$(jq -r ".[\"$new_param\"]" ubiquibot-config-default.json)
- yq ".$new_param=$def_val" .github/ubiquibot-config.yml > temp.yml
- mv temp.yml .github/ubiquibot-config.yml
- fi
- done
-
- git config user.email "113181824+UbiquiBot[bot]@users.noreply.github.com"
- git config user.name "UbiquiBot[bot]"
-
- git add .github/ubiquibot-config.yml
- git commit -m "build: use latest ubiquibot config setup"
- git remote set-url origin https://${{ secrets.ADD_TO_PROJECT_PAT }}@github.com/$ownerName/$repoName.git
- git push -f origin update
-
- curl -L \
- -X POST \
- -H "Accept: application/vnd.github+json" \
- -H "Authorization: Bearer ${{ steps.get_installation_token.outputs.token }}"\
- -H "X-GitHub-Api-Version: 2022-11-28" \
- https://api.github.com/repos/$ownerName/$repoName/pulls \
- -d '{
- "title": "build: use latest ubiquibot config setup",
- "base": "'"$defaultBranch"'",
- "head": "update"
- }'
- cd ..
- done
\ No newline at end of file
diff --git a/.nvmrc b/.nvmrc
index a5e8bba26..790e1105f 100644
--- a/.nvmrc
+++ b/.nvmrc
@@ -1 +1 @@
-v20.3.0
+v20.10.0
diff --git a/package.json b/package.json
index 807d2253b..3f9884a9e 100644
--- a/package.json
+++ b/package.json
@@ -85,7 +85,7 @@
"typescript": "^4.9.5"
},
"engines": {
- "node": ">=18"
+ "node": ">=20.10.0"
},
"lint-staged": {
"*.{ts,json}": [
From 59902675ff93253c5c54cbe4cf20e7a36e7f93f3 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E3=82=A2=E3=83=AC=E3=82=AF=E3=82=B5=E3=83=B3=E3=83=80?=
=?UTF-8?q?=E3=83=BC=2Eeth?=
Date: Sat, 17 Feb 2024 18:54:23 +0900
Subject: [PATCH 18/27] chore: migrate to bun
---
.github/workflows/build.yml | 11 +-
.github/workflows/e2e-test.yml | 12 +-
.husky/commit-msg | 2 +-
.husky/pre-commit | 2 +-
.vscode/settings.json | 7 -
.yarnrc.yml | 1 -
CONTRIBUTING.md | 10 +-
README.md | 22 +-
bun.lockb | Bin 0 -> 474206 bytes
netlify.toml | 2 +-
package.json | 12 +-
supabase/README.md | 12 +-
sweep.yaml | 46 -
yarn.lock | 19756 -------------------------------
14 files changed, 38 insertions(+), 19857 deletions(-)
delete mode 100644 .vscode/settings.json
delete mode 100644 .yarnrc.yml
create mode 100755 bun.lockb
delete mode 100644 sweep.yaml
delete mode 100644 yarn.lock
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 6a0ada3a6..a8555d0dc 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -11,24 +11,19 @@ jobs:
- name: Checkout repository
uses: actions/checkout@v3
- - name: Enable Corepack and Install Correct Yarn Version
- run: |
- corepack enable
- yarn set version 4.0.2
-
- name: Setup Node
uses: actions/setup-node@v3
with:
node-version: "20.10.0"
- name: Install
- run: yarn install
+ run: npm install -g bun
- name: Local Build
- run: yarn build
+ run: bun build
- name: Lint
- run: yarn format
+ run: bun format
run-migration:
runs-on: ubuntu-latest
diff --git a/.github/workflows/e2e-test.yml b/.github/workflows/e2e-test.yml
index c7ce743b6..7710228d6 100644
--- a/.github/workflows/e2e-test.yml
+++ b/.github/workflows/e2e-test.yml
@@ -10,18 +10,18 @@ jobs:
steps:
- name: Checkout repository
- uses: actions/checkout@v3
+ uses: actions/checkout@v4
- name: Setup Node
- uses: actions/setup-node@v3
+ uses: actions/setup-node@v4
with:
- node-version: "18.16.0"
+ node-version: "20.10.0"
- name: Install
- run: yarn install
+ run: npm install bun -g && bun install
- name: Build
- run: yarn build
+ run: bun build
- name: Test
env:
@@ -49,4 +49,4 @@ jobs:
WEBHOOK_SECRET: ${{ secrets.WEBHOOK_SECRET }}
X25519_PRIVATE_KEY: "QCDb30UHUkwJAGhLWC-R2N0PiEbd4vQY6qH2Wloybyo"
- run: "yarn test"
+ run: "bun test"
diff --git a/.husky/commit-msg b/.husky/commit-msg
index f2b882190..e4d3df482 100755
--- a/.husky/commit-msg
+++ b/.husky/commit-msg
@@ -1,4 +1,4 @@
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"
-yarn commitlint --edit "$1"
+bun commitlint --edit "$1"
diff --git a/.husky/pre-commit b/.husky/pre-commit
index 3bc4b0f16..eb534d6f2 100755
--- a/.husky/pre-commit
+++ b/.husky/pre-commit
@@ -2,4 +2,4 @@
. "$(dirname "$0")/_/husky.sh"
# Run lint-staged first
-yarn lint-staged --verbose
+bun lint-staged --verbose
diff --git a/.vscode/settings.json b/.vscode/settings.json
deleted file mode 100644
index 5fe93694d..000000000
--- a/.vscode/settings.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "files.exclude": {
- "dist": true,
- "node_modules": true
- },
- "explorer.excludeGitIgnore": false
-}
diff --git a/.yarnrc.yml b/.yarnrc.yml
deleted file mode 100644
index 3186f3f07..000000000
--- a/.yarnrc.yml
+++ /dev/null
@@ -1 +0,0 @@
-nodeLinker: node-modules
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index dd80c5d5f..f1556abe4 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -13,8 +13,8 @@ We'd also love PRs. If you're thinking of a large PR, we advise opening up an is
## Submitting a pull request
1. Fork and clone the repository.
-2. Configure and install the dependencies: `yarn install`.
-3. Make sure the tests pass on your machine: `yarn test`. These tests also apply the linter, so there's no need to lint separately.
+2. Configure and install the dependencies: `bun install`.
+3. Make sure the tests pass on your machine: `bun test`. These tests also apply the linter, so there's no need to lint separately.
4. Create a new branch: `git checkout -b my-branch-name`.
5. Make your change, add tests, and make sure the tests still pass. You can find the tests in the `src/tests` directory.
6. Push to your fork and submit a pull request.
@@ -31,9 +31,9 @@ Work in Progress pull requests are also welcome to get feedback early on, or if
## Running the project locally
1. Fork and clone the repository.
-2. Install dependencies: `yarn install`.
-3. Build the project: `yarn build`.
-4. Start the project: `yarn start:watch`.
+2. Install dependencies: `bun install`.
+3. Build the project: `bun build`.
+4. Start the project: `bun start:watch`.
## Environment Setup
diff --git a/README.md b/README.md
index ed6d9b09d..af9f96c58 100644
--- a/README.md
+++ b/README.md
@@ -24,12 +24,12 @@ Ubiquity DAO's GitHub Bot for Automating DevPool Management.
git clone https://github.com/ubiquity/ubiquibot.git
cd ubiquibot
-yarn
-yarn build (to compile your changes)
+bun
+bun build (to compile your changes)
-yarn build --watch (to locally auto compile your changes)
+bun build --watch (to locally auto compile your changes)
-yarn start:watch
+bun start:watch
## It's recommended to split terminals in your IDE while running above input
```
@@ -228,12 +228,12 @@ Supabase comes with a [readme](https://github.com/ubiquity/ubiquibot/blob/develo
### This options will require you to have a local Docker installation (under the hood it is required by Supabase) refer to [Supabase Docs](https://supabase.com/docs)
```
-yarn supabase start
+bun supabase start
```
## Check Supabase Status (locally)
```
-yarn supabase status
+bun supabase status
```

@@ -252,16 +252,16 @@ DISQUALIFY_TIME="7 days" // 7 days
```
-3. `Make sure you have Node => 20.10.0 && yarn`
+3. `Make sure you have Node => 20.10.0 && bun`
4. Open 2 terminal instances:
- - in one instance run `yarn build --watch` (compiles the Typescript code)
- - in another instance run `yarn start:watch` (runs the bot locally)
+ - in one instance run `bun build --watch` (compiles the Typescript code)
+ - in another instance run `bun start:watch` (runs the bot locally)
5. Open `http://localhost:3000` and follow instructions to add the bot to one of your repositories.
At this point the `.env` files auto-fill the empty fields (`PRIVATE_KEY` and `APP_ID`) if it is not previously filled.
Now you can make changes to the repository on GitHub (e.g. add a task) and the bot should react.
-6. After adding the bot (as a installed app) to your github you will need to restart the aforementioned `yarn start:watch`` so CTRL-C to stop the node daemon and `yarn start:watch` again
+6. After adding the bot (as a installed app) to your github you will need to restart the aforementioned `bun start:watch`` so CTRL-C to stop the node daemon and `bun start:watch` again
You can, for example:
@@ -312,7 +312,7 @@ Make sure you have your local instance of [ubiquibot running](#quickstart).
## How to create a new release
-1. Update the version in package.json: `yarn version --new-version x.x.x`
+1. Update the version in package.json: `bun version --new-version x.x.x`
2. Commit and create a new tag: `git commit -am x.x.x && git tag -am x.x.x`
3. Push tags: `git push origin v"x.x.x"`
4. The Github action will create a release by recognizing the version tag
diff --git a/bun.lockb b/bun.lockb
new file mode 100755
index 0000000000000000000000000000000000000000..0a51642e2f85051bbd719293d7b17aefd7328e94
GIT binary patch
literal 474206
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®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