From 720c0826cea5f4e7474f93888154366c43ccf4fc Mon Sep 17 00:00:00 2001 From: Rob Pilling Date: Sat, 13 Sep 2025 11:55:34 +0100 Subject: [PATCH 01/23] Add CODEOWNERS --- .github/CODEOWNERS | 58 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 .github/CODEOWNERS diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 0000000000..c3480252c6 --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1,58 @@ +apps/btadv @bobrippling +apps/clkinfostopw @bobrippling +apps/ctrlpad @bobrippling +apps/drained @bobrippling +apps/pace @bobrippling +apps/popconlaunch @bobrippling +apps/promenu @bobrippling +apps/recorder @bobrippling +apps/rep @bobrippling +apps/tally @bobrippling +apps/widbattpwr @bobrippling +apps/widbtstates @bobrippling +apps/widhid @bobrippling + +apps/autoreset @thyttan +apps/bwclklite @thyttan +apps/chronlog @thyttan +apps/confthyttan @thyttan +apps/delaylock @thyttan +apps/dragboard @thyttan +apps/fastreset @thyttan +apps/gbdiscon @thyttan +apps/longpressbuzz @thyttan +apps/messagesmusic @thyttan +apps/msgtwscr @thyttan +apps/msgwakefup @thyttan +apps/podadrem @thyttan +apps/runplus @thyttan +apps/sevenmin @thyttan +apps/spotrem @thyttan +apps/swscroll @thyttan +apps/voldisp @thyttan +apps/widminbate @thyttan + +apps/chess @nxdefiant +apps/gpsautotime @nxdefiant +apps/gpsmagcourse @nxdefiant +apps/hidjoystick @nxdefiant +apps/hrmmar @nxdefiant +apps/miclock2 @nxdefiant +apps/myprofile @nxdefiant +apps/sleepphasealarm @nxdefiant +apps/sportmode @nxdefiant +apps/swipeinv @nxdefiant +apps/taglaunch @nxdefiant +apps/widalarmeta @nxdefiant +apps/widclkscrl @nxdefiant +apps/widhrzone @nxdefiant +apps/widshipbell @nxdefiant +apps/zambretti @nxdefiant + +apps/beeptest @bb0x88 + +apps/folderlaunch @bruceblore + +apps/txtreader @tonykakuuu + +apps/scrolly @retcurve From aa0aedcfe6ef980d798bc560a21cb09fad1bb893 Mon Sep 17 00:00:00 2001 From: Rob Pilling Date: Sat, 12 Jul 2025 17:30:52 +0100 Subject: [PATCH 02/23] Tag owners of apps when their app changes --- .github/CODEOWNERS | 58 -------------------------------- .github/workflows/pr-tagging.yml | 45 +++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 58 deletions(-) delete mode 100644 .github/CODEOWNERS create mode 100644 .github/workflows/pr-tagging.yml diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS deleted file mode 100644 index c3480252c6..0000000000 --- a/.github/CODEOWNERS +++ /dev/null @@ -1,58 +0,0 @@ -apps/btadv @bobrippling -apps/clkinfostopw @bobrippling -apps/ctrlpad @bobrippling -apps/drained @bobrippling -apps/pace @bobrippling -apps/popconlaunch @bobrippling -apps/promenu @bobrippling -apps/recorder @bobrippling -apps/rep @bobrippling -apps/tally @bobrippling -apps/widbattpwr @bobrippling -apps/widbtstates @bobrippling -apps/widhid @bobrippling - -apps/autoreset @thyttan -apps/bwclklite @thyttan -apps/chronlog @thyttan -apps/confthyttan @thyttan -apps/delaylock @thyttan -apps/dragboard @thyttan -apps/fastreset @thyttan -apps/gbdiscon @thyttan -apps/longpressbuzz @thyttan -apps/messagesmusic @thyttan -apps/msgtwscr @thyttan -apps/msgwakefup @thyttan -apps/podadrem @thyttan -apps/runplus @thyttan -apps/sevenmin @thyttan -apps/spotrem @thyttan -apps/swscroll @thyttan -apps/voldisp @thyttan -apps/widminbate @thyttan - -apps/chess @nxdefiant -apps/gpsautotime @nxdefiant -apps/gpsmagcourse @nxdefiant -apps/hidjoystick @nxdefiant -apps/hrmmar @nxdefiant -apps/miclock2 @nxdefiant -apps/myprofile @nxdefiant -apps/sleepphasealarm @nxdefiant -apps/sportmode @nxdefiant -apps/swipeinv @nxdefiant -apps/taglaunch @nxdefiant -apps/widalarmeta @nxdefiant -apps/widclkscrl @nxdefiant -apps/widhrzone @nxdefiant -apps/widshipbell @nxdefiant -apps/zambretti @nxdefiant - -apps/beeptest @bb0x88 - -apps/folderlaunch @bruceblore - -apps/txtreader @tonykakuuu - -apps/scrolly @retcurve diff --git a/.github/workflows/pr-tagging.yml b/.github/workflows/pr-tagging.yml new file mode 100644 index 0000000000..09ca1171ea --- /dev/null +++ b/.github/workflows/pr-tagging.yml @@ -0,0 +1,45 @@ +name: Tag app authors + +on: + pull_request: + types: [opened, synchronize] + +jobs: + mention-app-authors: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Install jq + run: | + sudo apt-get update + sudo apt-get install -y jq + + - name: Tag app authors + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + PR_NUMBER: ${{ github.event.pull_request.number }} + REPO: ${{ github.repository }} # this is the slug, so user/repo + run: | + git diff --name-only origin/master... -- apps/ \ + | grep -o 'apps/[^/]*' \ + | sort \ + | uniq \ + | while read d + do + author=$(jq -r '.author // ""' < "$d/metadata.json") + if test -z "$author" + then continue + fi + + echo "tagging @$author for \`$d\`" + done \ + | jq -Rsc '{body: .}' \ + | xargs -I{} curl \ + -fsSL \ + -H "Accept: application/vnd.github+json" \ + -H "Authorization: Bearer $GITHUB_TOKEN" \ + -H "Content-Type: application/json" \ + -H "X-GitHub-Api-Version: 2022-11-28" \ + -d {} \ + "https://api.github.com/repos/$REPO/issues/$PR_NUMBER/comments" From 57c36b1a1c89e5b2d5a81c2dfe66c64cfddf6aee Mon Sep 17 00:00:00 2001 From: Rob Pilling Date: Sat, 12 Jul 2025 17:45:54 +0100 Subject: [PATCH 03/23] Add authors for bobrippling, thyttan, nxdefiant and a few others --- apps/autoreset/metadata.json | 3 ++- apps/beeptest/metadata.json | 3 ++- apps/btadv/metadata.json | 3 ++- apps/bwclklite/metadata.json | 3 ++- apps/chess/metadata.json | 3 ++- apps/chronlog/metadata.json | 3 ++- apps/clkinfostopw/metadata.json | 3 ++- apps/confthyttan/metadata.json | 3 ++- apps/ctrlpad/metadata.json | 3 ++- apps/delaylock/metadata.json | 3 ++- apps/dragboard/metadata.json | 3 ++- apps/drained/metadata.json | 3 ++- apps/fastreset/metadata.json | 3 ++- apps/folderlaunch/metadata.json | 3 ++- apps/gbdiscon/metadata.json | 3 ++- apps/gpsautotime/metadata.json | 3 ++- apps/gpsmagcourse/metadata.json | 4 ++-- apps/hidjoystick/metadata.json | 3 ++- apps/hrmmar/metadata.json | 3 ++- apps/longpressbuzz/metadata.json | 3 ++- apps/messagesmusic/metadata.json | 3 ++- apps/miclock2/metadata.json | 3 ++- apps/msgtwscr/metadata.json | 3 ++- apps/msgwakefup/metadata.json | 3 ++- apps/myprofile/metadata.json | 3 ++- apps/pace/metadata.json | 3 ++- apps/podadrem/metadata.json | 3 ++- apps/popconlaunch/metadata.json | 3 ++- apps/promenu/metadata.json | 3 ++- apps/recorder/metadata.json | 3 ++- apps/rep/metadata.json | 3 ++- apps/runplus/metadata.json | 3 ++- apps/scrolly/metadata.json | 3 ++- apps/sevenmin/metadata.json | 3 ++- apps/sleepphasealarm/metadata.json | 3 ++- apps/sportmode/metadata.json | 3 ++- apps/spotrem/metadata.json | 3 ++- apps/swipeinv/metadata.json | 4 ++-- apps/swscroll/metadata.json | 3 ++- apps/taglaunch/metadata.json | 3 ++- apps/tally/metadata.json | 3 ++- apps/txtreader/metadata.json | 3 ++- apps/voldisp/metadata.json | 3 ++- apps/widalarmeta/metadata.json | 3 ++- apps/widbattpwr/metadata.json | 3 ++- apps/widbtstates/metadata.json | 3 ++- apps/widclkscrl/metadata.json | 3 ++- apps/widhid/metadata.json | 3 ++- apps/widhrzone/metadata.json | 3 ++- apps/widminbate/metadata.json | 3 ++- apps/widshipbell/metadata.json | 3 ++- apps/zambretti/metadata.json | 4 ++-- 52 files changed, 104 insertions(+), 55 deletions(-) diff --git a/apps/autoreset/metadata.json b/apps/autoreset/metadata.json index c8866924bc..4f93eb5644 100644 --- a/apps/autoreset/metadata.json +++ b/apps/autoreset/metadata.json @@ -13,5 +13,6 @@ ], "data":[ {"name":"autoreset.json"} - ] + ], + "author": "thyttan" } diff --git a/apps/beeptest/metadata.json b/apps/beeptest/metadata.json index 7c25a38488..bfe818e3f9 100644 --- a/apps/beeptest/metadata.json +++ b/apps/beeptest/metadata.json @@ -11,5 +11,6 @@ "storage": [ { "name": "beeptest.app.js", "url": "beeptest.js" }, { "name": "beeptest.img", "url": "app-icon.js", "evaluate": true } - ] + ], + "author": "bb0x88" } diff --git a/apps/btadv/metadata.json b/apps/btadv/metadata.json index 71a0fedaf4..e5eda9f2b9 100644 --- a/apps/btadv/metadata.json +++ b/apps/btadv/metadata.json @@ -11,5 +11,6 @@ "storage": [ {"name":"btadv.app.js","url":"app.js"}, {"name":"btadv.img","url":"icon.js","evaluate":true} - ] + ], + "author": "bobrippling" } diff --git a/apps/bwclklite/metadata.json b/apps/bwclklite/metadata.json index ef51f72fef..131aee7e5e 100644 --- a/apps/bwclklite/metadata.json +++ b/apps/bwclklite/metadata.json @@ -44,5 +44,6 @@ { "name": "bwclklite.setting.json" } - ] + ], + "author": "thyttan" } diff --git a/apps/chess/metadata.json b/apps/chess/metadata.json index 1e2885392f..421ef5894f 100644 --- a/apps/chess/metadata.json +++ b/apps/chess/metadata.json @@ -13,5 +13,6 @@ {"name":"chess.img","url":"app-icon.js","evaluate":true} ], "data": [{"name":"chess.json"}], - "screenshots": [ {"url":"screenshot.png"} ] + "screenshots": [ {"url":"screenshot.png"} ], + "author": "nxdefiant" } diff --git a/apps/chronlog/metadata.json b/apps/chronlog/metadata.json index 50a9166bf4..245a4b5a0c 100644 --- a/apps/chronlog/metadata.json +++ b/apps/chronlog/metadata.json @@ -10,5 +10,6 @@ "storage": [ {"name":"chronlog.app.js","url":"app.js"}, {"name":"chronlog.img","url":"app-icon.js","evaluate":true} - ] + ], + "author": "thyttan" } diff --git a/apps/clkinfostopw/metadata.json b/apps/clkinfostopw/metadata.json index f33f61dbbf..d833d488a6 100644 --- a/apps/clkinfostopw/metadata.json +++ b/apps/clkinfostopw/metadata.json @@ -11,5 +11,6 @@ "allow_emulator": true, "storage": [ {"name":"stopw.clkinfo.js","url":"clkinfo.js"} - ] + ], + "author": "bobrippling" } diff --git a/apps/confthyttan/metadata.json b/apps/confthyttan/metadata.json index e662879a76..ae8faf0b22 100644 --- a/apps/confthyttan/metadata.json +++ b/apps/confthyttan/metadata.json @@ -64,5 +64,6 @@ "url":"edgeclk.settings.json"}, {"name":"setting.json", "url":"setting.json"} - ] + ], + "author": "thyttan" } diff --git a/apps/ctrlpad/metadata.json b/apps/ctrlpad/metadata.json index 273dcdd7f7..fcefdfe714 100644 --- a/apps/ctrlpad/metadata.json +++ b/apps/ctrlpad/metadata.json @@ -12,5 +12,6 @@ "storage": [ {"name":"ctrlpad.boot.js","url":"main.js"}, {"name":"ctrlpad.img","url":"icon.js","evaluate":true} - ] + ], + "author": "bobrippling" } diff --git a/apps/delaylock/metadata.json b/apps/delaylock/metadata.json index 7441d822be..be348427ac 100644 --- a/apps/delaylock/metadata.json +++ b/apps/delaylock/metadata.json @@ -9,5 +9,6 @@ "readme": "README.md", "storage": [ {"name":"delaylock.boot.js","url":"boot.js"} - ] + ], + "author": "thyttan" } diff --git a/apps/dragboard/metadata.json b/apps/dragboard/metadata.json index c4596d7bdf..6bb6691d06 100644 --- a/apps/dragboard/metadata.json +++ b/apps/dragboard/metadata.json @@ -14,5 +14,6 @@ ], "data": [ {"name":"dragboard.json"} - ] + ], + "author": "thyttan" } diff --git a/apps/drained/metadata.json b/apps/drained/metadata.json index 8aaec1220b..d9f9ad7dd4 100644 --- a/apps/drained/metadata.json +++ b/apps/drained/metadata.json @@ -17,5 +17,6 @@ ], "data": [ {"name":"drained.setting.json"} - ] + ], + "author": "bobrippling" } diff --git a/apps/fastreset/metadata.json b/apps/fastreset/metadata.json index ccd5e1ce40..3211694832 100644 --- a/apps/fastreset/metadata.json +++ b/apps/fastreset/metadata.json @@ -10,5 +10,6 @@ "readme": "README.md", "storage": [ {"name":"fastreset.boot.js","url":"boot.js"} - ] + ], + "author": "thyttan" } diff --git a/apps/folderlaunch/metadata.json b/apps/folderlaunch/metadata.json index 9853c7dafe..6c69d03dfd 100644 --- a/apps/folderlaunch/metadata.json +++ b/apps/folderlaunch/metadata.json @@ -45,5 +45,6 @@ { "url": "screenshot2.png" } - ] + ], + "author": "bruceblore" } diff --git a/apps/gbdiscon/metadata.json b/apps/gbdiscon/metadata.json index 904b4c6a22..c5f01a2040 100644 --- a/apps/gbdiscon/metadata.json +++ b/apps/gbdiscon/metadata.json @@ -9,5 +9,6 @@ "storage": [ {"name":"gbdiscon.app.js","url":"app.js"}, {"name":"gbdiscon.img","url":"app-icon.js","evaluate":true} - ] + ], + "author": "thyttan" } diff --git a/apps/gpsautotime/metadata.json b/apps/gpsautotime/metadata.json index c852c6a3e7..ca5480bdde 100644 --- a/apps/gpsautotime/metadata.json +++ b/apps/gpsautotime/metadata.json @@ -12,5 +12,6 @@ {"name":"gpsautotime.wid.js","url":"widget.js"}, {"name":"gpsautotime.settings.js","url":"settings.js"} ], - "data": [{"name":"gpsautotime.json"}] + "data": [{"name":"gpsautotime.json"}], + "author": "nxdefiant" } diff --git a/apps/gpsmagcourse/metadata.json b/apps/gpsmagcourse/metadata.json index 057b01383f..36964c668d 100644 --- a/apps/gpsmagcourse/metadata.json +++ b/apps/gpsmagcourse/metadata.json @@ -14,6 +14,6 @@ {"name":"gpsmagcourse.wid.js","url":"widget.js"}, {"name":"gpsmagcourse.settings.js","url":"settings.js"} ], - "data": [{"name":"gpsmagcourse.json"}] + "data": [{"name":"gpsmagcourse.json"}], + "author": "nxdefiant" } - diff --git a/apps/hidjoystick/metadata.json b/apps/hidjoystick/metadata.json index c13ae2efa4..01c71dd8fa 100644 --- a/apps/hidjoystick/metadata.json +++ b/apps/hidjoystick/metadata.json @@ -10,5 +10,6 @@ "storage": [ {"name":"hidjoystick.app.js","url":"app.js"}, {"name":"hidjoystick.img","url":"app-icon.js","evaluate":true} - ] + ], + "author": "nxdefiant" } diff --git a/apps/hrmmar/metadata.json b/apps/hrmmar/metadata.json index 5ff49f3fc3..a5e7cfb986 100644 --- a/apps/hrmmar/metadata.json +++ b/apps/hrmmar/metadata.json @@ -14,5 +14,6 @@ {"name":"hrmfftelim","url":"fftelim.js"}, {"name":"hrmmar.settings.js","url":"settings.js"} ], - "data": [{"name":"hrmmar.json"}] + "data": [{"name":"hrmmar.json"}], + "author": "nxdefiant" } diff --git a/apps/longpressbuzz/metadata.json b/apps/longpressbuzz/metadata.json index 56e06f0bd1..701695e76f 100644 --- a/apps/longpressbuzz/metadata.json +++ b/apps/longpressbuzz/metadata.json @@ -10,5 +10,6 @@ "readme": "README.md", "storage": [ {"name":"longpressbuzz.0.boot.js","url":"boot.js"} - ] + ], + "author": "thyttan" } diff --git a/apps/messagesmusic/metadata.json b/apps/messagesmusic/metadata.json index eef528f557..35c03be8e1 100644 --- a/apps/messagesmusic/metadata.json +++ b/apps/messagesmusic/metadata.json @@ -14,5 +14,6 @@ {"name":"messagesmusic.app.js","url":"app.js"}, {"name":"messagesmusic.img","url":"app-icon.js","evaluate":true} ], - "dependencies":{"messages":"module"} + "dependencies":{"messages":"module"}, + "author": "thyttan" } diff --git a/apps/miclock2/metadata.json b/apps/miclock2/metadata.json index 6f586c6965..4ca51c88d1 100644 --- a/apps/miclock2/metadata.json +++ b/apps/miclock2/metadata.json @@ -12,5 +12,6 @@ "storage": [ {"name":"miclock2.app.js","url":"clock-mixed.js"}, {"name":"miclock2.img","url":"clock-mixed-icon.js","evaluate":true} - ] + ], + "author": "nxdefiant" } diff --git a/apps/msgtwscr/metadata.json b/apps/msgtwscr/metadata.json index 6f267ea011..de07c25a1d 100644 --- a/apps/msgtwscr/metadata.json +++ b/apps/msgtwscr/metadata.json @@ -9,5 +9,6 @@ "readme": "README.md", "storage": [ {"name":"msgtwscr.boot.js","url":"boot.js"} - ] + ], + "author": "thyttan" } diff --git a/apps/msgwakefup/metadata.json b/apps/msgwakefup/metadata.json index 857bebc0a8..b641333fc8 100644 --- a/apps/msgwakefup/metadata.json +++ b/apps/msgwakefup/metadata.json @@ -9,5 +9,6 @@ "readme": "README.md", "storage": [ {"name":"msgwakefup.boot.js","url":"boot.js"} - ] + ], + "author": "thyttan" } diff --git a/apps/myprofile/metadata.json b/apps/myprofile/metadata.json index 136de289be..fa872ead8d 100644 --- a/apps/myprofile/metadata.json +++ b/apps/myprofile/metadata.json @@ -14,5 +14,6 @@ ], "data": [ {"name":"myprofile.json"} - ] + ], + "author": "nxdefiant" } diff --git a/apps/pace/metadata.json b/apps/pace/metadata.json index 188802aa98..054b044af8 100644 --- a/apps/pace/metadata.json +++ b/apps/pace/metadata.json @@ -10,5 +10,6 @@ "storage": [ { "name": "pace.app.js","url": "app.js" }, { "name": "pace.img","url": "app-icon.js","evaluate": true } - ] + ], + "author": "bobrippling" } diff --git a/apps/podadrem/metadata.json b/apps/podadrem/metadata.json index c6c9f1f8e1..61aa5a4a6e 100644 --- a/apps/podadrem/metadata.json +++ b/apps/podadrem/metadata.json @@ -14,5 +14,6 @@ "storage": [ {"name":"podadrem.app.js","url":"app.js"}, {"name":"podadrem.img","url":"app-icon.js","evaluate":true} - ] + ], + "author": "thyttan" } diff --git a/apps/popconlaunch/metadata.json b/apps/popconlaunch/metadata.json index 012ca67650..0c4b956446 100644 --- a/apps/popconlaunch/metadata.json +++ b/apps/popconlaunch/metadata.json @@ -16,5 +16,6 @@ ], "data": [ {"name":"popcon.cache.json"} - ] + ], + "author": "bobrippling" } diff --git a/apps/promenu/metadata.json b/apps/promenu/metadata.json index cfbd1ebd8f..209665b027 100644 --- a/apps/promenu/metadata.json +++ b/apps/promenu/metadata.json @@ -15,5 +15,6 @@ {"name":"promenu.img","url":"promenuIcon.js","evaluate":true}, {"name":"promenu.settings.js","url":"settings.js"} ], - "data": [{"name":"promenu.settings.json"}] + "data": [{"name":"promenu.settings.json"}], + "author": "bobrippling" } diff --git a/apps/recorder/metadata.json b/apps/recorder/metadata.json index 7d8251a6c9..22a29502b5 100644 --- a/apps/recorder/metadata.json +++ b/apps/recorder/metadata.json @@ -21,5 +21,6 @@ "data": [ {"name":"recorder.json","url":"app-settings.json"}, {"wildcard":"recorder.log?.csv","storageFile":true} - ] + ], + "author": "bobrippling" } diff --git a/apps/rep/metadata.json b/apps/rep/metadata.json index 4d0e806a1e..c6a9e63ef1 100644 --- a/apps/rep/metadata.json +++ b/apps/rep/metadata.json @@ -13,5 +13,6 @@ {"name":"rep.settings.js","url":"settings.js"}, {"name":"rep.img","url":"app-icon.js","evaluate":true} ], - "data": [{"name":"rep.json"}] + "data": [{"name":"rep.json"}], + "author": "bobrippling" } diff --git a/apps/runplus/metadata.json b/apps/runplus/metadata.json index f26204123f..14d4102cfe 100644 --- a/apps/runplus/metadata.json +++ b/apps/runplus/metadata.json @@ -19,5 +19,6 @@ ], "data": [ {"name": "runplus.json"} - ] + ], + "author": "thyttan" } diff --git a/apps/scrolly/metadata.json b/apps/scrolly/metadata.json index 6194813afd..6021553ea2 100644 --- a/apps/scrolly/metadata.json +++ b/apps/scrolly/metadata.json @@ -17,5 +17,6 @@ ], "data": [ {"name":"scrolly.json"} - ] + ], + "author": "retcurve" } diff --git a/apps/sevenmin/metadata.json b/apps/sevenmin/metadata.json index 8a1867e4a0..3e79591024 100644 --- a/apps/sevenmin/metadata.json +++ b/apps/sevenmin/metadata.json @@ -12,5 +12,6 @@ "storage": [ {"name":"sevenmin.app.js", "url":"app.js"}, {"name":"sevenmin.img", "url":"app-icon.js","evaluate":true} - ] + ], + "author": "thyttan" } diff --git a/apps/sleepphasealarm/metadata.json b/apps/sleepphasealarm/metadata.json index 2ba003cf72..50b80dfda5 100644 --- a/apps/sleepphasealarm/metadata.json +++ b/apps/sleepphasealarm/metadata.json @@ -16,5 +16,6 @@ ], "data": [{"name":"sleepphasealarm.json"}], "interface": "interface.html", - "screenshots": [ {"url":"screenshot.png"}, {"url":"screenshot_log.png"} ] + "screenshots": [ {"url":"screenshot.png"}, {"url":"screenshot_log.png"} ], + "author": "nxdefiant" } diff --git a/apps/sportmode/metadata.json b/apps/sportmode/metadata.json index 65e7efee7c..369c9ed310 100644 --- a/apps/sportmode/metadata.json +++ b/apps/sportmode/metadata.json @@ -12,5 +12,6 @@ {"name":"sportmode.boot.js","url":"boot.js"}, {"name":"sportmode.settings.js","url":"settings.js"} ], - "data": [{"name":"sportmode.json"}] + "data": [{"name":"sportmode.json"}], + "author": "nxdefiant" } diff --git a/apps/spotrem/metadata.json b/apps/spotrem/metadata.json index 8ecc0d867c..a6f89b3b4b 100644 --- a/apps/spotrem/metadata.json +++ b/apps/spotrem/metadata.json @@ -13,5 +13,6 @@ "storage": [ {"name":"spotrem.app.js","url":"app.js"}, {"name":"spotrem.img","url":"app-icon.js","evaluate":true} - ] + ], + "author": "thyttan" } diff --git a/apps/swipeinv/metadata.json b/apps/swipeinv/metadata.json index 67c26a37d0..77ea27ef06 100644 --- a/apps/swipeinv/metadata.json +++ b/apps/swipeinv/metadata.json @@ -13,6 +13,6 @@ {"name":"swipeinv.boot.js","url":"boot.js"}, {"name":"swipeinv.settings.js","url":"settings.js"} ], - "data": [{"name":"swipeinv.json"}] + "data": [{"name":"swipeinv.json"}], + "author": "nxdefiant" } - diff --git a/apps/swscroll/metadata.json b/apps/swscroll/metadata.json index 20b52d129f..5e92b6f4ae 100644 --- a/apps/swscroll/metadata.json +++ b/apps/swscroll/metadata.json @@ -10,5 +10,6 @@ "supports": ["BANGLEJS2"], "storage": [ {"name":"swscroll.boot.js","url":"boot.js"} - ] + ], + "author": "thyttan" } diff --git a/apps/taglaunch/metadata.json b/apps/taglaunch/metadata.json index f8ead20f97..13cbf14503 100644 --- a/apps/taglaunch/metadata.json +++ b/apps/taglaunch/metadata.json @@ -14,5 +14,6 @@ {"name":"taglaunch.app.js","url":"app.js"}, {"name":"taglaunch.settings.js","url":"settings.js"} ], - "data": [{"name":"taglaunch.json"},{"name":"taglaunch.cache.json"}] + "data": [{"name":"taglaunch.json"},{"name":"taglaunch.cache.json"}], + "author": "nxdefiant" } diff --git a/apps/tally/metadata.json b/apps/tally/metadata.json index 98c74930d3..9acc812d88 100644 --- a/apps/tally/metadata.json +++ b/apps/tally/metadata.json @@ -17,5 +17,6 @@ "data": [ { "name": "tallycfg.json" }, { "name": "tallies.csv" } - ] + ], + "author": "bobrippling" } diff --git a/apps/txtreader/metadata.json b/apps/txtreader/metadata.json index d27c79d797..67672f91c7 100644 --- a/apps/txtreader/metadata.json +++ b/apps/txtreader/metadata.json @@ -12,5 +12,6 @@ "storage": [ {"name":"txtreader.app.js","url":"app.js"}, {"name":"txtreader.img","url":"app-icon.js","evaluate":true} - ] + ], + "author": "tonykakuuu" } diff --git a/apps/voldisp/metadata.json b/apps/voldisp/metadata.json index 3af0dc7fd9..6ab0110645 100644 --- a/apps/voldisp/metadata.json +++ b/apps/voldisp/metadata.json @@ -12,5 +12,6 @@ ], "storage": [ {"name":"voldisp.boot.js","url":"boot.js"} - ] + ], + "author": "thyttan" } diff --git a/apps/widalarmeta/metadata.json b/apps/widalarmeta/metadata.json index b3ae7aa1f0..50d9a70e30 100644 --- a/apps/widalarmeta/metadata.json +++ b/apps/widalarmeta/metadata.json @@ -14,5 +14,6 @@ {"name":"widalarmeta.wid.js","url":"widget.js"}, {"name":"widalarmeta.settings.js","url":"settings.js"} ], - "data": [{"name":"widalarmeta.json"}] + "data": [{"name":"widalarmeta.json"}], + "author": "nxdefiant" } diff --git a/apps/widbattpwr/metadata.json b/apps/widbattpwr/metadata.json index 2a41169ab4..91c63a9adb 100644 --- a/apps/widbattpwr/metadata.json +++ b/apps/widbattpwr/metadata.json @@ -15,5 +15,6 @@ "name": "widbattpwr.wid.js", "url": "widget.js" } - ] + ], + "author": "bobrippling" } diff --git a/apps/widbtstates/metadata.json b/apps/widbtstates/metadata.json index 1345752a3b..b625cdb5ed 100644 --- a/apps/widbtstates/metadata.json +++ b/apps/widbtstates/metadata.json @@ -10,5 +10,6 @@ "supports": ["BANGLEJS","BANGLEJS2"], "storage": [ {"name":"widbtstates.wid.js","url":"widget.js"} - ] + ], + "author": "bobrippling" } diff --git a/apps/widclkscrl/metadata.json b/apps/widclkscrl/metadata.json index 81221cbe43..ab80459b1c 100644 --- a/apps/widclkscrl/metadata.json +++ b/apps/widclkscrl/metadata.json @@ -9,5 +9,6 @@ "supports": ["BANGLEJS","BANGLEJS2"], "storage": [ {"name":"widclkscrl.wid.js","url":"widget.js"} - ] + ], + "author": "nxdefiant" } diff --git a/apps/widhid/metadata.json b/apps/widhid/metadata.json index b819c9b649..9ed10cfa2c 100644 --- a/apps/widhid/metadata.json +++ b/apps/widhid/metadata.json @@ -12,5 +12,6 @@ "storage": [ {"name":"widhid.wid.js","url":"wid.js"}, {"name":"widhid.img","url":"icon.js","evaluate":true} - ] + ], + "author": "bobrippling" } diff --git a/apps/widhrzone/metadata.json b/apps/widhrzone/metadata.json index 6d4f7bf5a4..0c3976ffe5 100644 --- a/apps/widhrzone/metadata.json +++ b/apps/widhrzone/metadata.json @@ -12,5 +12,6 @@ "storage": [ {"name":"widhrzone.wid.js","url":"widget.js"} ], - "dependencies": {"myprofile":"app"} + "dependencies": {"myprofile":"app"}, + "author": "nxdefiant" } diff --git a/apps/widminbate/metadata.json b/apps/widminbate/metadata.json index 5fed8eef5f..36dc23fddf 100644 --- a/apps/widminbate/metadata.json +++ b/apps/widminbate/metadata.json @@ -9,5 +9,6 @@ "supports" : ["BANGLEJS2", "BANGLEJS"], "storage": [ {"name":"widminbate.wid.js","url":"widget.js"} - ] + ], + "author": "thyttan" } diff --git a/apps/widshipbell/metadata.json b/apps/widshipbell/metadata.json index 1c4a7613e7..a76a34c00b 100644 --- a/apps/widshipbell/metadata.json +++ b/apps/widshipbell/metadata.json @@ -12,5 +12,6 @@ {"name":"widshipbell.wid.js","url":"widget.js"}, {"name":"widshipbell.settings.js","url":"settings.js"} ], - "data": [{"name":"widshipbell.json"}] + "data": [{"name":"widshipbell.json"}], + "author": "nxdefiant" } diff --git a/apps/zambretti/metadata.json b/apps/zambretti/metadata.json index a1fc0f263f..2725786792 100644 --- a/apps/zambretti/metadata.json +++ b/apps/zambretti/metadata.json @@ -15,6 +15,6 @@ {"name":"zambretti.boot.js","url":"boot.js"}, {"name":"zambretti.img","url":"app-icon.js","evaluate":true} ], - "data": [{"name":"zambretti.json"}, {"name":"zambretti.log.json"}] + "data": [{"name":"zambretti.json"}, {"name":"zambretti.log.json"}], + "author": "nxdefiant" } - From 0cbd33bf11708f487f59cab47e061ecf6fd388f1 Mon Sep 17 00:00:00 2001 From: Rob Pilling Date: Sat, 12 Jul 2025 17:47:30 +0100 Subject: [PATCH 04/23] Permit an "author" field --- bin/sanitycheck.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/bin/sanitycheck.js b/bin/sanitycheck.js index 27f3b7b0d3..2e728efbb9 100755 --- a/bin/sanitycheck.js +++ b/bin/sanitycheck.js @@ -163,7 +163,8 @@ const APP_KEYS = [ 'id', 'name', 'shortName', 'version', 'icon', 'screenshots', 'description', 'tags', 'type', 'sortorder', 'readme', 'custom', 'customConnect', 'interface', 'storage', 'data', 'supports', 'allow_emulator', - 'dependencies', 'provides_modules', 'provides_widgets', 'provides_features', "default" + 'dependencies', 'provides_modules', 'provides_widgets', 'provides_features', "default", + "author" ]; const STORAGE_KEYS = ['name', 'url', 'content', 'evaluate', 'noOverwite', 'supports', 'noOverwrite']; const DATA_KEYS = ['name', 'wildcard', 'storageFile', 'url', 'content', 'evaluate']; From e8d03219f2da83451c5ca9416be19be53ec86eb3 Mon Sep 17 00:00:00 2001 From: Rob Pilling Date: Sat, 12 Jul 2025 17:49:24 +0100 Subject: [PATCH 05/23] Fetch master ref --- .github/workflows/pr-tagging.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/pr-tagging.yml b/.github/workflows/pr-tagging.yml index 09ca1171ea..1a8da480f1 100644 --- a/.github/workflows/pr-tagging.yml +++ b/.github/workflows/pr-tagging.yml @@ -15,6 +15,11 @@ jobs: sudo apt-get update sudo apt-get install -y jq + - name: Fetch relevant refs + run: | + # fetch master and unshallow HEAD + git fetch origin --unshallow + - name: Tag app authors env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} From 9cb2bb22fffbf653c8e140b9fdfe3167ef50c18a Mon Sep 17 00:00:00 2001 From: Rob Pilling Date: Wed, 23 Jul 2025 18:25:07 +0100 Subject: [PATCH 06/23] Trim down pr-tagging action's permissions and error handling for curl --- .github/workflows/pr-tagging.yml | 35 +++++++++++++++++++------------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/.github/workflows/pr-tagging.yml b/.github/workflows/pr-tagging.yml index 1a8da480f1..7855c3f013 100644 --- a/.github/workflows/pr-tagging.yml +++ b/.github/workflows/pr-tagging.yml @@ -4,6 +4,10 @@ on: pull_request: types: [opened, synchronize] +permissions: + issues: write + pull-requests: write + jobs: mention-app-authors: runs-on: ubuntu-latest @@ -21,10 +25,6 @@ jobs: git fetch origin --unshallow - name: Tag app authors - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - PR_NUMBER: ${{ github.event.pull_request.number }} - REPO: ${{ github.repository }} # this is the slug, so user/repo run: | git diff --name-only origin/master... -- apps/ \ | grep -o 'apps/[^/]*' \ @@ -37,14 +37,21 @@ jobs: then continue fi - echo "tagging @$author for \`$d\`" + # disabled `@` for now to avoid spamming + echo "tagging $author for \`$d\`" done \ - | jq -Rsc '{body: .}' \ - | xargs -I{} curl \ - -fsSL \ - -H "Accept: application/vnd.github+json" \ - -H "Authorization: Bearer $GITHUB_TOKEN" \ - -H "Content-Type: application/json" \ - -H "X-GitHub-Api-Version: 2022-11-28" \ - -d {} \ - "https://api.github.com/repos/$REPO/issues/$PR_NUMBER/comments" + > comment.txt + + - name: Post comment + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + COMMENT_URL: https://api.github.com/repos/${{ github.repository }}/issues/${{ github.event.pull_request.number }}/comments + run: | + set -x + curl -fsSL \ + -X POST \ + -H "Accept: application/vnd.github+json" \ + -H "Authorization: Bearer $GITHUB_TOKEN" \ + -H "X-GitHub-Api-Version: 2022-11-28" \ + "$COMMENT_URL" \ + -d "$(jq -Rs '{"body": .}' Date: Sat, 13 Sep 2025 08:25:17 +0100 Subject: [PATCH 07/23] Move author field to below version --- apps/autoreset/metadata.json | 4 ++-- apps/beeptest/metadata.json | 4 ++-- apps/btadv/metadata.json | 4 ++-- apps/bwclklite/metadata.json | 4 ++-- apps/chess/metadata.json | 4 ++-- apps/chronlog/metadata.json | 4 ++-- apps/clkinfostopw/metadata.json | 4 ++-- apps/confthyttan/metadata.json | 4 ++-- apps/ctrlpad/metadata.json | 4 ++-- apps/delaylock/metadata.json | 4 ++-- apps/dragboard/metadata.json | 4 ++-- apps/drained/metadata.json | 4 ++-- apps/fastreset/metadata.json | 4 ++-- apps/folderlaunch/metadata.json | 4 ++-- apps/gbdiscon/metadata.json | 4 ++-- apps/gpsautotime/metadata.json | 4 ++-- apps/gpsmagcourse/metadata.json | 4 ++-- apps/hidjoystick/metadata.json | 4 ++-- apps/hrmmar/metadata.json | 4 ++-- apps/longpressbuzz/metadata.json | 4 ++-- apps/messagesmusic/metadata.json | 4 ++-- apps/miclock2/metadata.json | 4 ++-- apps/msgtwscr/metadata.json | 4 ++-- apps/msgwakefup/metadata.json | 4 ++-- apps/myprofile/metadata.json | 4 ++-- apps/pace/metadata.json | 4 ++-- apps/podadrem/metadata.json | 6 +++--- apps/popconlaunch/metadata.json | 4 ++-- apps/promenu/metadata.json | 4 ++-- apps/recorder/metadata.json | 4 ++-- apps/rep/metadata.json | 4 ++-- apps/runplus/metadata.json | 4 ++-- apps/scrolly/metadata.json | 6 +++--- apps/sevenmin/metadata.json | 4 ++-- apps/sleepphasealarm/metadata.json | 4 ++-- apps/sportmode/metadata.json | 4 ++-- apps/spotrem/metadata.json | 4 ++-- apps/swipeinv/metadata.json | 4 ++-- apps/swscroll/metadata.json | 4 ++-- apps/taglaunch/metadata.json | 4 ++-- apps/tally/metadata.json | 4 ++-- apps/txtreader/metadata.json | 4 ++-- apps/voldisp/metadata.json | 4 ++-- apps/widalarmeta/metadata.json | 4 ++-- apps/widbattpwr/metadata.json | 4 ++-- apps/widbtstates/metadata.json | 4 ++-- apps/widclkscrl/metadata.json | 4 ++-- apps/widhid/metadata.json | 4 ++-- apps/widhrzone/metadata.json | 4 ++-- apps/widminbate/metadata.json | 4 ++-- apps/widshipbell/metadata.json | 4 ++-- apps/zambretti/metadata.json | 4 ++-- 52 files changed, 106 insertions(+), 106 deletions(-) diff --git a/apps/autoreset/metadata.json b/apps/autoreset/metadata.json index 4f93eb5644..902ffb6cd3 100644 --- a/apps/autoreset/metadata.json +++ b/apps/autoreset/metadata.json @@ -1,6 +1,7 @@ { "id": "autoreset", "name": "Auto Reset", "version":"0.02", + "author": "thyttan", "description": "Sets a timeout to load the clock face. The timeout is stopped and started again upon user input.", "icon": "app.png", "type": "bootloader", @@ -13,6 +14,5 @@ ], "data":[ {"name":"autoreset.json"} - ], - "author": "thyttan" + ] } diff --git a/apps/beeptest/metadata.json b/apps/beeptest/metadata.json index bfe818e3f9..abc0fe6d2c 100644 --- a/apps/beeptest/metadata.json +++ b/apps/beeptest/metadata.json @@ -3,6 +3,7 @@ "name": "Beep Test", "shortName": "Beep Test", "version": "0.01", + "author": "bb0x88", "description": "Aerobic fitness test created by Léger & Lambert", "icon": "beeptest.png", "tags": "health", @@ -11,6 +12,5 @@ "storage": [ { "name": "beeptest.app.js", "url": "beeptest.js" }, { "name": "beeptest.img", "url": "app-icon.js", "evaluate": true } - ], - "author": "bb0x88" + ] } diff --git a/apps/btadv/metadata.json b/apps/btadv/metadata.json index e5eda9f2b9..58fd2e0ed0 100644 --- a/apps/btadv/metadata.json +++ b/apps/btadv/metadata.json @@ -3,6 +3,7 @@ "name": "btadv", "shortName": "btadv", "version": "0.04", + "author": "bobrippling", "description": "Advertise & export live heart rate, accel, pressure, GPS & mag data over bluetooth", "icon": "icon.png", "tags": "health,tool,sensors,bluetooth", @@ -11,6 +12,5 @@ "storage": [ {"name":"btadv.app.js","url":"app.js"}, {"name":"btadv.img","url":"icon.js","evaluate":true} - ], - "author": "bobrippling" + ] } diff --git a/apps/bwclklite/metadata.json b/apps/bwclklite/metadata.json index 131aee7e5e..19603178ea 100644 --- a/apps/bwclklite/metadata.json +++ b/apps/bwclklite/metadata.json @@ -2,6 +2,7 @@ "id": "bwclklite", "name": "BW Clock Lite", "version": "0.36", + "author": "thyttan", "description": "A very minimalistic clock. This version of BW Clock is quicker at the cost of the custom font.", "readme": "README.md", "icon": "app.png", @@ -44,6 +45,5 @@ { "name": "bwclklite.setting.json" } - ], - "author": "thyttan" + ] } diff --git a/apps/chess/metadata.json b/apps/chess/metadata.json index 421ef5894f..ac49d04c64 100644 --- a/apps/chess/metadata.json +++ b/apps/chess/metadata.json @@ -3,6 +3,7 @@ "name": "Chess", "shortName": "Chess", "version": "0.06", + "author": "nxdefiant", "description": "Chess game based on the [p4wn engine](https://p4wn.sourceforge.net/). Drag on the touchscreen to move the green cursor onto a piece, select it with a single touch and drag the now red cursor around. Release the piece with another touch to finish the move. The button opens a menu.", "icon": "app.png", "tags": "game", @@ -13,6 +14,5 @@ {"name":"chess.img","url":"app-icon.js","evaluate":true} ], "data": [{"name":"chess.json"}], - "screenshots": [ {"url":"screenshot.png"} ], - "author": "nxdefiant" + "screenshots": [ {"url":"screenshot.png"} ] } diff --git a/apps/chronlog/metadata.json b/apps/chronlog/metadata.json index 245a4b5a0c..1775de2f85 100644 --- a/apps/chronlog/metadata.json +++ b/apps/chronlog/metadata.json @@ -1,6 +1,7 @@ { "id": "chronlog", "name": "Chrono Logger", "version":"0.01", + "author": "thyttan", "description": "Record time active on a task, course, work or anything really.", "icon": "app.png", "tags": "logging,record,work,tasks", @@ -10,6 +11,5 @@ "storage": [ {"name":"chronlog.app.js","url":"app.js"}, {"name":"chronlog.img","url":"app-icon.js","evaluate":true} - ], - "author": "thyttan" + ] } diff --git a/apps/clkinfostopw/metadata.json b/apps/clkinfostopw/metadata.json index d833d488a6..4a85dd0ba2 100644 --- a/apps/clkinfostopw/metadata.json +++ b/apps/clkinfostopw/metadata.json @@ -2,6 +2,7 @@ "id": "clkinfostopw", "name": "Stop Watch Clockinfo", "version":"0.03", + "author": "bobrippling", "description": "A simple stopwatch, shown via clockinfo", "icon": "app.png", "type": "clkinfo", @@ -11,6 +12,5 @@ "allow_emulator": true, "storage": [ {"name":"stopw.clkinfo.js","url":"clkinfo.js"} - ], - "author": "bobrippling" + ] } diff --git a/apps/confthyttan/metadata.json b/apps/confthyttan/metadata.json index ae8faf0b22..cf199f66c2 100644 --- a/apps/confthyttan/metadata.json +++ b/apps/confthyttan/metadata.json @@ -1,6 +1,7 @@ { "id": "confthyttan", "name": "Thyttan's Default Config", "version":"0.06", + "author": "thyttan", "description": "A different default set of apps and configurations. Brings many quality of life improvements. Opinionated based on the creators taste. Read more below before installing.", "icon": "app.png", "type": "defaultconfig", @@ -64,6 +65,5 @@ "url":"edgeclk.settings.json"}, {"name":"setting.json", "url":"setting.json"} - ], - "author": "thyttan" + ] } diff --git a/apps/ctrlpad/metadata.json b/apps/ctrlpad/metadata.json index fcefdfe714..a4e1573239 100644 --- a/apps/ctrlpad/metadata.json +++ b/apps/ctrlpad/metadata.json @@ -3,6 +3,7 @@ "name": "Control Panel", "shortName": "ctrlpad", "version": "0.02", + "author": "bobrippling", "description": "Fast access (via a downward swipe) to common functions, such as bluetooth/HRM power and Do Not Disturb", "icon": "icon.png", "readme": "README.md", @@ -12,6 +13,5 @@ "storage": [ {"name":"ctrlpad.boot.js","url":"main.js"}, {"name":"ctrlpad.img","url":"icon.js","evaluate":true} - ], - "author": "bobrippling" + ] } diff --git a/apps/delaylock/metadata.json b/apps/delaylock/metadata.json index be348427ac..8a485fb0b5 100644 --- a/apps/delaylock/metadata.json +++ b/apps/delaylock/metadata.json @@ -1,6 +1,7 @@ { "id": "delaylock", "name": "Delayed Locking", "version":"0.01", + "author": "thyttan", "description": "Delay the locking of the screen to 5 seconds after the backlight turns off.", "icon": "app.png", "tags": "settings,configuration,backlight,touchscreen,screen", @@ -9,6 +10,5 @@ "readme": "README.md", "storage": [ {"name":"delaylock.boot.js","url":"boot.js"} - ], - "author": "thyttan" + ] } diff --git a/apps/dragboard/metadata.json b/apps/dragboard/metadata.json index 6bb6691d06..2819234918 100644 --- a/apps/dragboard/metadata.json +++ b/apps/dragboard/metadata.json @@ -1,6 +1,7 @@ { "id": "dragboard", "name": "Dragboard", "version":"0.10", + "author": "thyttan", "description": "A library for text input via swiping keyboard", "icon": "app.png", "type":"textinput", @@ -14,6 +15,5 @@ ], "data": [ {"name":"dragboard.json"} - ], - "author": "thyttan" + ] } diff --git a/apps/drained/metadata.json b/apps/drained/metadata.json index d9f9ad7dd4..1e80f24294 100644 --- a/apps/drained/metadata.json +++ b/apps/drained/metadata.json @@ -2,6 +2,7 @@ "id": "drained", "name": "Drained", "version": "0.08", + "author": "bobrippling", "description": "Switches to displaying a simple clock when the battery percentage is low, and disables some peripherals", "readme": "README.md", "icon": "icon.png", @@ -17,6 +18,5 @@ ], "data": [ {"name":"drained.setting.json"} - ], - "author": "bobrippling" + ] } diff --git a/apps/fastreset/metadata.json b/apps/fastreset/metadata.json index 3211694832..76632d1554 100644 --- a/apps/fastreset/metadata.json +++ b/apps/fastreset/metadata.json @@ -2,6 +2,7 @@ "name": "Fast Reset", "shortName":"Fast Reset", "version":"0.03", + "author": "thyttan", "description": "Reset the watch to the clock face by pressing the hardware button just a little bit longer than a click. If 'Fastload Utils' is installed this will typically be done with fastloading. A buzz acts as indicator.", "icon": "app.png", "type": "bootloader", @@ -10,6 +11,5 @@ "readme": "README.md", "storage": [ {"name":"fastreset.boot.js","url":"boot.js"} - ], - "author": "thyttan" + ] } diff --git a/apps/folderlaunch/metadata.json b/apps/folderlaunch/metadata.json index 6c69d03dfd..2701b4e46b 100644 --- a/apps/folderlaunch/metadata.json +++ b/apps/folderlaunch/metadata.json @@ -2,6 +2,7 @@ "id": "folderlaunch", "name": "Folder launcher", "version": "0.04", + "author": "bruceblore", "description": "Launcher that allows you to put your apps into folders", "icon": "icon.png", "type": "launch", @@ -45,6 +46,5 @@ { "url": "screenshot2.png" } - ], - "author": "bruceblore" + ] } diff --git a/apps/gbdiscon/metadata.json b/apps/gbdiscon/metadata.json index c5f01a2040..f962e58d94 100644 --- a/apps/gbdiscon/metadata.json +++ b/apps/gbdiscon/metadata.json @@ -2,6 +2,7 @@ "name": "Disconnect from Gadgetbridge", "shortName":"Disconnect Gadgetbridge", "version":"0.01", + "author": "thyttan", "description": "Disconnect from your android device by running this app. The app will forward you to your clock face immediately after triggering the command. (Gadgetbridge nightly required until version 82 is released)", "icon": "app.png", "tags": "android,gadgetbridge,bluetooth,bt", @@ -9,6 +10,5 @@ "storage": [ {"name":"gbdiscon.app.js","url":"app.js"}, {"name":"gbdiscon.img","url":"app-icon.js","evaluate":true} - ], - "author": "thyttan" + ] } diff --git a/apps/gpsautotime/metadata.json b/apps/gpsautotime/metadata.json index ca5480bdde..8c63c176de 100644 --- a/apps/gpsautotime/metadata.json +++ b/apps/gpsautotime/metadata.json @@ -3,6 +3,7 @@ "name": "GPS auto time", "shortName": "GPS auto time", "version": "0.04", + "author": "nxdefiant", "description": "A widget that automatically updates the Bangle.js time to the GPS time whenever there is a valid GPS fix.", "icon": "widget.png", "type": "widget", @@ -12,6 +13,5 @@ {"name":"gpsautotime.wid.js","url":"widget.js"}, {"name":"gpsautotime.settings.js","url":"settings.js"} ], - "data": [{"name":"gpsautotime.json"}], - "author": "nxdefiant" + "data": [{"name":"gpsautotime.json"}] } diff --git a/apps/gpsmagcourse/metadata.json b/apps/gpsmagcourse/metadata.json index 36964c668d..fc45c6cc5b 100644 --- a/apps/gpsmagcourse/metadata.json +++ b/apps/gpsmagcourse/metadata.json @@ -4,6 +4,7 @@ "shortName":"GPS/Compass course", "icon": "app.png", "version":"0.01", + "author": "nxdefiant", "description": "Replaces the GPS course with the compass heading when speed is slow or standing still to avoid the value from jumping randomly. For best experience also install \"Navigation Compass\", although not a requirement (see README).", "type": "bootloader", "tags": "outdoors,widget", @@ -14,6 +15,5 @@ {"name":"gpsmagcourse.wid.js","url":"widget.js"}, {"name":"gpsmagcourse.settings.js","url":"settings.js"} ], - "data": [{"name":"gpsmagcourse.json"}], - "author": "nxdefiant" + "data": [{"name":"gpsmagcourse.json"}] } diff --git a/apps/hidjoystick/metadata.json b/apps/hidjoystick/metadata.json index 01c71dd8fa..5662698736 100644 --- a/apps/hidjoystick/metadata.json +++ b/apps/hidjoystick/metadata.json @@ -3,6 +3,7 @@ "name": "Bluetooth Joystick", "shortName": "Joystick", "version": "0.02", + "author": "nxdefiant", "description": "Emulates a 2 axis/5 button Joystick using the accelerometer as stick input and buttons 1-3, touch left as button 4 and touch right as button 5. On Bangle.js 2 buttons 2-5 are emulated with the touchscreen.", "icon": "app.png", "tags": "bluetooth", @@ -10,6 +11,5 @@ "storage": [ {"name":"hidjoystick.app.js","url":"app.js"}, {"name":"hidjoystick.img","url":"app-icon.js","evaluate":true} - ], - "author": "nxdefiant" + ] } diff --git a/apps/hrmmar/metadata.json b/apps/hrmmar/metadata.json index a5e7cfb986..a35923fd5d 100644 --- a/apps/hrmmar/metadata.json +++ b/apps/hrmmar/metadata.json @@ -4,6 +4,7 @@ "shortName":"HRM MA removal", "icon": "app.png", "version":"0.02", + "author": "nxdefiant", "description": "Removes Motion Artifacts in Bangle.js's heart rate sensor data. **WARNING:** On Bangle.js 2 this has been found to make heart rate readings substantially less accurate in some cases.", "type": "bootloader", "tags": "health", @@ -14,6 +15,5 @@ {"name":"hrmfftelim","url":"fftelim.js"}, {"name":"hrmmar.settings.js","url":"settings.js"} ], - "data": [{"name":"hrmmar.json"}], - "author": "nxdefiant" + "data": [{"name":"hrmmar.json"}] } diff --git a/apps/longpressbuzz/metadata.json b/apps/longpressbuzz/metadata.json index 701695e76f..182d1a9e7f 100644 --- a/apps/longpressbuzz/metadata.json +++ b/apps/longpressbuzz/metadata.json @@ -2,6 +2,7 @@ "name": "Long Press, Buzz!", "shortName":"LPB", "version":"0.01", + "author": "thyttan", "description": "Buzz at boot after a long press to indicate the watch was reinitiated at your command.", "icon": "app.png", "type": "bootloader", @@ -10,6 +11,5 @@ "readme": "README.md", "storage": [ {"name":"longpressbuzz.0.boot.js","url":"boot.js"} - ], - "author": "thyttan" + ] } diff --git a/apps/messagesmusic/metadata.json b/apps/messagesmusic/metadata.json index 35c03be8e1..f09821163a 100644 --- a/apps/messagesmusic/metadata.json +++ b/apps/messagesmusic/metadata.json @@ -3,6 +3,7 @@ "name":"Messages Music", "shortName": "Music", "version":"0.05", + "author": "thyttan", "description": "Uses Messages library to push a music message which in turn displays Messages app music controls", "icon":"app.png", "type": "app", @@ -14,6 +15,5 @@ {"name":"messagesmusic.app.js","url":"app.js"}, {"name":"messagesmusic.img","url":"app-icon.js","evaluate":true} ], - "dependencies":{"messages":"module"}, - "author": "thyttan" + "dependencies":{"messages":"module"} } diff --git a/apps/miclock2/metadata.json b/apps/miclock2/metadata.json index 4ca51c88d1..16416ecdf1 100644 --- a/apps/miclock2/metadata.json +++ b/apps/miclock2/metadata.json @@ -2,6 +2,7 @@ "id": "miclock2", "name": "Mixed Clock 2", "version": "0.05", + "author": "nxdefiant", "description": "White color variant of the Mixed Clock with thicker clock hands for better readability in the bright sunlight, extra space under the clock for widgets and seconds in the digital clock.", "icon": "clock-mixed.png", "type": "clock", @@ -12,6 +13,5 @@ "storage": [ {"name":"miclock2.app.js","url":"clock-mixed.js"}, {"name":"miclock2.img","url":"clock-mixed-icon.js","evaluate":true} - ], - "author": "nxdefiant" + ] } diff --git a/apps/msgtwscr/metadata.json b/apps/msgtwscr/metadata.json index de07c25a1d..7c3883aef7 100644 --- a/apps/msgtwscr/metadata.json +++ b/apps/msgtwscr/metadata.json @@ -1,6 +1,7 @@ { "id": "msgtwscr", "name": "Message Twist to Scroll", "version":"0.01", + "author": "thyttan", "description": "Temporarily activate scroll on twist function when a new message triggers the message app.", "icon": "app.png", "tags": "messages,tweak,scroll", @@ -9,6 +10,5 @@ "readme": "README.md", "storage": [ {"name":"msgtwscr.boot.js","url":"boot.js"} - ], - "author": "thyttan" + ] } diff --git a/apps/msgwakefup/metadata.json b/apps/msgwakefup/metadata.json index b641333fc8..77decfed68 100644 --- a/apps/msgwakefup/metadata.json +++ b/apps/msgwakefup/metadata.json @@ -1,6 +1,7 @@ { "id": "msgwakefup", "name": "Message wake on face up", "version":"0.02", + "author": "thyttan", "description": "Temporarily activate wake on face up function when a new message is auto displayed.", "icon": "app.png", "tags": "messages,tweak", @@ -9,6 +10,5 @@ "readme": "README.md", "storage": [ {"name":"msgwakefup.boot.js","url":"boot.js"} - ], - "author": "thyttan" + ] } diff --git a/apps/myprofile/metadata.json b/apps/myprofile/metadata.json index fa872ead8d..8d0cf4db6b 100644 --- a/apps/myprofile/metadata.json +++ b/apps/myprofile/metadata.json @@ -4,6 +4,7 @@ "icon": "app.png", "type": "settings", "version":"0.02", + "author": "nxdefiant", "description": "Configure your personal profile. All settings are optional and only stored on the watch.", "readme": "README.md", "tags": "tool,utility", @@ -14,6 +15,5 @@ ], "data": [ {"name":"myprofile.json"} - ], - "author": "nxdefiant" + ] } diff --git a/apps/pace/metadata.json b/apps/pace/metadata.json index 054b044af8..830cdc6562 100644 --- a/apps/pace/metadata.json +++ b/apps/pace/metadata.json @@ -2,6 +2,7 @@ "id": "pace", "name": "Pace", "version": "0.06", + "author": "bobrippling", "description": "Show pace and time running splits", "icon": "app.png", "tags": "run,running,fitness,outdoors", @@ -10,6 +11,5 @@ "storage": [ { "name": "pace.app.js","url": "app.js" }, { "name": "pace.img","url": "app-icon.js","evaluate": true } - ], - "author": "bobrippling" + ] } diff --git a/apps/podadrem/metadata.json b/apps/podadrem/metadata.json index 61aa5a4a6e..75564d2a97 100644 --- a/apps/podadrem/metadata.json +++ b/apps/podadrem/metadata.json @@ -3,10 +3,11 @@ "name": "Podcast Addict Remote", "shortName": "PA Remote", "version": "0.11", + "author": "thyttan", "description": "Control Podcast Addict on your android device.", "readme": "README.md", "type": "app", - "tags": "remote,podcast,podcasts,radio,player,intent,intents,gadgetbridge,podadrem,pa remote", + "tags": "remote,podcast,podcasts,radio,player,intent,intents,gadgetbridge,podadrem,pa remote", "icon": "app.png", "screenshots" : [ {"url":"screenshot1.png"}, {"url":"screenshot2.png"} ], "supports": ["BANGLEJS2"], @@ -14,6 +15,5 @@ "storage": [ {"name":"podadrem.app.js","url":"app.js"}, {"name":"podadrem.img","url":"app-icon.js","evaluate":true} - ], - "author": "thyttan" + ] } diff --git a/apps/popconlaunch/metadata.json b/apps/popconlaunch/metadata.json index 0c4b956446..a97855855a 100644 --- a/apps/popconlaunch/metadata.json +++ b/apps/popconlaunch/metadata.json @@ -3,6 +3,7 @@ "name": "Popcon Launcher", "shortName": "Popcon", "version": "0.05", + "author": "bobrippling", "description": "Launcher modification - your launchers will display your favourite (popular) apps first. Overrides `readJSON`, may slow down your watch", "readme": "README.md", "icon": "app.png", @@ -16,6 +17,5 @@ ], "data": [ {"name":"popcon.cache.json"} - ], - "author": "bobrippling" + ] } diff --git a/apps/promenu/metadata.json b/apps/promenu/metadata.json index 209665b027..4cc831f99d 100644 --- a/apps/promenu/metadata.json +++ b/apps/promenu/metadata.json @@ -2,6 +2,7 @@ "id": "promenu", "name": "Pro Menu", "version": "0.15", + "author": "bobrippling", "description": "Replace the built in menu function. Supports Bangle.js 1 and Bangle.js 2.", "icon": "icon.png", "type": "bootloader", @@ -15,6 +16,5 @@ {"name":"promenu.img","url":"promenuIcon.js","evaluate":true}, {"name":"promenu.settings.js","url":"settings.js"} ], - "data": [{"name":"promenu.settings.json"}], - "author": "bobrippling" + "data": [{"name":"promenu.settings.json"}] } diff --git a/apps/recorder/metadata.json b/apps/recorder/metadata.json index 22a29502b5..083cc063c3 100644 --- a/apps/recorder/metadata.json +++ b/apps/recorder/metadata.json @@ -3,6 +3,7 @@ "name": "Recorder", "shortName": "Recorder", "version": "0.48", + "author": "bobrippling", "description": "Record GPS position, heart rate and more in the background, then download to your PC.", "icon": "app.png", "tags": "tool,outdoors,gps,widget,clkinfo", @@ -21,6 +22,5 @@ "data": [ {"name":"recorder.json","url":"app-settings.json"}, {"wildcard":"recorder.log?.csv","storageFile":true} - ], - "author": "bobrippling" + ] } diff --git a/apps/rep/metadata.json b/apps/rep/metadata.json index c6a9e63ef1..a89f6d2361 100644 --- a/apps/rep/metadata.json +++ b/apps/rep/metadata.json @@ -2,6 +2,7 @@ "id": "rep", "name": "Rep", "version":"0.03", + "author": "bobrippling", "description": "Time running reps, using a rep schedule/program uploaded via the app loader", "icon": "app.png", "tags": "run,running,fitness,outdoors", @@ -13,6 +14,5 @@ {"name":"rep.settings.js","url":"settings.js"}, {"name":"rep.img","url":"app-icon.js","evaluate":true} ], - "data": [{"name":"rep.json"}], - "author": "bobrippling" + "data": [{"name":"rep.json"}] } diff --git a/apps/runplus/metadata.json b/apps/runplus/metadata.json index 14d4102cfe..fc2f1ccec0 100644 --- a/apps/runplus/metadata.json +++ b/apps/runplus/metadata.json @@ -2,6 +2,7 @@ "id": "runplus", "name": "Run+", "version": "0.30", + "author": "thyttan", "description": "Displays distance, time, steps, cadence, pace and more for runners. Based on the Run app, but extended with additional screens for heart rate interval training and individual stat focus.", "icon": "app.png", "tags": "run,running,fitness,outdoors,gps,karvonen,karvonnen", @@ -19,6 +20,5 @@ ], "data": [ {"name": "runplus.json"} - ], - "author": "thyttan" + ] } diff --git a/apps/scrolly/metadata.json b/apps/scrolly/metadata.json index 6021553ea2..b073020be0 100644 --- a/apps/scrolly/metadata.json +++ b/apps/scrolly/metadata.json @@ -5,6 +5,7 @@ "icon": "app.png", "screenshots" : [ { "url":"screenshot.gif" } ], "version":"0.01", + "author": "retcurve", "description": "Scrolly is a simple app designed to display scrolling text across your screen in a clean and dynamic way. Perfect for announcements or just for fun!", "readme":"README.md", "type": "app", @@ -15,8 +16,7 @@ {"name":"scrolly.app.js","url":"app.js"}, {"name":"scrolly.img","url":"app-icon.js","evaluate":true} ], - "data": [ + "data": [ {"name":"scrolly.json"} - ], - "author": "retcurve" + ] } diff --git a/apps/sevenmin/metadata.json b/apps/sevenmin/metadata.json index 3e79591024..9c309675ba 100644 --- a/apps/sevenmin/metadata.json +++ b/apps/sevenmin/metadata.json @@ -2,6 +2,7 @@ "name": "Seven minute workout", "shortName": "7 min wo", "version": "0.02", + "author": "thyttan", "description": "A basic implementation of the famous consice workout", "icon": "icon.png", "type":"app", @@ -12,6 +13,5 @@ "storage": [ {"name":"sevenmin.app.js", "url":"app.js"}, {"name":"sevenmin.img", "url":"app-icon.js","evaluate":true} - ], - "author": "thyttan" + ] } diff --git a/apps/sleepphasealarm/metadata.json b/apps/sleepphasealarm/metadata.json index 50b80dfda5..2ae56eb1ca 100644 --- a/apps/sleepphasealarm/metadata.json +++ b/apps/sleepphasealarm/metadata.json @@ -3,6 +3,7 @@ "name": "SleepPhaseAlarm", "shortName": "SleepPhaseAlarm", "version": "0.18", + "author": "nxdefiant", "description": "Uses the accelerometer to estimate sleep and wake states with the principle of Estimation of Stationary Sleep-segments (ESS, see https://ubicomp.eti.uni-siegen.de/home/datasets/ichi14/index.html.en). This app will read the next alarm from the alarm application and will wake you up to 30 minutes early at the best guessed time when you are almost already awake.", "icon": "app.png", "tags": "tool,alarm", @@ -16,6 +17,5 @@ ], "data": [{"name":"sleepphasealarm.json"}], "interface": "interface.html", - "screenshots": [ {"url":"screenshot.png"}, {"url":"screenshot_log.png"} ], - "author": "nxdefiant" + "screenshots": [ {"url":"screenshot.png"}, {"url":"screenshot_log.png"} ] } diff --git a/apps/sportmode/metadata.json b/apps/sportmode/metadata.json index 369c9ed310..5f363ac708 100644 --- a/apps/sportmode/metadata.json +++ b/apps/sportmode/metadata.json @@ -4,6 +4,7 @@ "shortName":"Sport mode", "icon": "app.png", "version":"0.01", + "author": "nxdefiant", "description": "Allows to set the sport mode of the Heart rate monitor in app settings.", "type": "bootloader", "tags": "health", @@ -12,6 +13,5 @@ {"name":"sportmode.boot.js","url":"boot.js"}, {"name":"sportmode.settings.js","url":"settings.js"} ], - "data": [{"name":"sportmode.json"}], - "author": "nxdefiant" + "data": [{"name":"sportmode.json"}] } diff --git a/apps/spotrem/metadata.json b/apps/spotrem/metadata.json index a6f89b3b4b..1df56cb19c 100644 --- a/apps/spotrem/metadata.json +++ b/apps/spotrem/metadata.json @@ -2,6 +2,7 @@ "id": "spotrem", "name": "Remote for Spotify", "version": "0.13", + "author": "thyttan", "description": "Control spotify on your android device.", "readme": "README.md", "type": "app", @@ -13,6 +14,5 @@ "storage": [ {"name":"spotrem.app.js","url":"app.js"}, {"name":"spotrem.img","url":"app-icon.js","evaluate":true} - ], - "author": "thyttan" + ] } diff --git a/apps/swipeinv/metadata.json b/apps/swipeinv/metadata.json index 77ea27ef06..3941c1d070 100644 --- a/apps/swipeinv/metadata.json +++ b/apps/swipeinv/metadata.json @@ -4,6 +4,7 @@ "shortName":"Swipe inv.", "icon": "app.png", "version": "0.02", + "author": "nxdefiant", "description": "Inverts swipe direction globally or per app, see settings. If global inversion is enabled, you can unselect the inversion per app and vice versa.", "readme":"README.md", "type": "bootloader", @@ -13,6 +14,5 @@ {"name":"swipeinv.boot.js","url":"boot.js"}, {"name":"swipeinv.settings.js","url":"settings.js"} ], - "data": [{"name":"swipeinv.json"}], - "author": "nxdefiant" + "data": [{"name":"swipeinv.json"}] } diff --git a/apps/swscroll/metadata.json b/apps/swscroll/metadata.json index 5e92b6f4ae..ade720ab62 100644 --- a/apps/swscroll/metadata.json +++ b/apps/swscroll/metadata.json @@ -2,6 +2,7 @@ "id": "swscroll", "name": "Swipe menus", "version": "0.08", + "author": "thyttan", "description": "Replace built in E.showScroller to act on swipe instead of drag. Navigate menus in discrete steps instead of a continuous motion.", "readme": "README.md", "icon": "app.png", @@ -10,6 +11,5 @@ "supports": ["BANGLEJS2"], "storage": [ {"name":"swscroll.boot.js","url":"boot.js"} - ], - "author": "thyttan" + ] } diff --git a/apps/taglaunch/metadata.json b/apps/taglaunch/metadata.json index 13cbf14503..c4cafaa1c5 100644 --- a/apps/taglaunch/metadata.json +++ b/apps/taglaunch/metadata.json @@ -3,6 +3,7 @@ "name": "Tag Launcher", "shortName": "Taglauncher", "version": "0.08", + "author": "nxdefiant", "description": "Launcher that puts all applications into submenus based on their tag. With many applications installed this can result in a faster application selection than the linear access from the default launcher.", "readme": "README.md", "icon": "app.png", @@ -14,6 +15,5 @@ {"name":"taglaunch.app.js","url":"app.js"}, {"name":"taglaunch.settings.js","url":"settings.js"} ], - "data": [{"name":"taglaunch.json"},{"name":"taglaunch.cache.json"}], - "author": "nxdefiant" + "data": [{"name":"taglaunch.json"},{"name":"taglaunch.cache.json"}] } diff --git a/apps/tally/metadata.json b/apps/tally/metadata.json index 9acc812d88..3583dbaa5e 100644 --- a/apps/tally/metadata.json +++ b/apps/tally/metadata.json @@ -3,6 +3,7 @@ "name": "Tally Keeper", "shortName": "Tally", "version": "0.01", + "author": "bobrippling", "description": "Add to a tally from clock info", "icon": "app.png", "tags": "clkinfo", @@ -17,6 +18,5 @@ "data": [ { "name": "tallycfg.json" }, { "name": "tallies.csv" } - ], - "author": "bobrippling" + ] } diff --git a/apps/txtreader/metadata.json b/apps/txtreader/metadata.json index 67672f91c7..e6aff8e6ca 100644 --- a/apps/txtreader/metadata.json +++ b/apps/txtreader/metadata.json @@ -3,6 +3,7 @@ "name": "txtreader", "shortName": "txtreader", "version": "0.02", + "author": "tonykakuuu", "description": "Basic text reader with pages and a file selector.", "icon": "txtreader.png", "screenshots": [{"url":"screenshot_txtreader.png"}], @@ -12,6 +13,5 @@ "storage": [ {"name":"txtreader.app.js","url":"app.js"}, {"name":"txtreader.img","url":"app-icon.js","evaluate":true} - ], - "author": "tonykakuuu" + ] } diff --git a/apps/voldisp/metadata.json b/apps/voldisp/metadata.json index 6ab0110645..e8b539345a 100644 --- a/apps/voldisp/metadata.json +++ b/apps/voldisp/metadata.json @@ -1,6 +1,7 @@ { "id": "voldisp", "name": "Display Volume for Android", "version":"0.01", + "author": "thyttan", "description": "Display the media volume of your android device when it's changed. A bar shows up at the top of your Bangles screen. (Needs recent Gadgetbridge nightly or stable ver. 85 once out)", "icon": "app.png", "tags": "audio,media,android,volume,sound", @@ -12,6 +13,5 @@ ], "storage": [ {"name":"voldisp.boot.js","url":"boot.js"} - ], - "author": "thyttan" + ] } diff --git a/apps/widalarmeta/metadata.json b/apps/widalarmeta/metadata.json index 50d9a70e30..d07a811238 100644 --- a/apps/widalarmeta/metadata.json +++ b/apps/widalarmeta/metadata.json @@ -3,6 +3,7 @@ "name": "Alarm & Timer ETA", "shortName": "Alarm ETA", "version": "0.15", + "author": "nxdefiant", "description": "A widget that displays the time to the next Alarm or Timer in hours and minutes, maximum 24h (configurable).", "icon": "widget.png", "type": "widget", @@ -14,6 +15,5 @@ {"name":"widalarmeta.wid.js","url":"widget.js"}, {"name":"widalarmeta.settings.js","url":"settings.js"} ], - "data": [{"name":"widalarmeta.json"}], - "author": "nxdefiant" + "data": [{"name":"widalarmeta.json"}] } diff --git a/apps/widbattpwr/metadata.json b/apps/widbattpwr/metadata.json index 91c63a9adb..084dfb3e22 100644 --- a/apps/widbattpwr/metadata.json +++ b/apps/widbattpwr/metadata.json @@ -4,6 +4,7 @@ "shortName": "Batt Pwr", "icon": "widget.png", "version": "0.03", + "author": "bobrippling", "type": "widget", "supports": ["BANGLEJS2"], "readme": "README.md", @@ -15,6 +16,5 @@ "name": "widbattpwr.wid.js", "url": "widget.js" } - ], - "author": "bobrippling" + ] } diff --git a/apps/widbtstates/metadata.json b/apps/widbtstates/metadata.json index b625cdb5ed..88b3e15718 100644 --- a/apps/widbtstates/metadata.json +++ b/apps/widbtstates/metadata.json @@ -2,6 +2,7 @@ "id": "widbtstates", "name": "Bluetooth States", "version": "0.02", + "author": "bobrippling", "description": "If active, shows a white bluetooth icon, if connected, a blue one (nothing if sleeping)", "icon": "widget.png", "type": "widget", @@ -10,6 +11,5 @@ "supports": ["BANGLEJS","BANGLEJS2"], "storage": [ {"name":"widbtstates.wid.js","url":"widget.js"} - ], - "author": "bobrippling" + ] } diff --git a/apps/widclkscrl/metadata.json b/apps/widclkscrl/metadata.json index ab80459b1c..b722ed93fe 100644 --- a/apps/widclkscrl/metadata.json +++ b/apps/widclkscrl/metadata.json @@ -2,6 +2,7 @@ "id": "widclkscrl", "name": "Scrolling clock widget", "version": "0.01", + "author": "nxdefiant", "description": "A widget that displays the current date & time after unlocking the watch when not showing a fullscreen clock. The information is scrolled by in a two digit field, so this widget is kept tight.", "icon": "widget.png", "type": "widget", @@ -9,6 +10,5 @@ "supports": ["BANGLEJS","BANGLEJS2"], "storage": [ {"name":"widclkscrl.wid.js","url":"widget.js"} - ], - "author": "nxdefiant" + ] } diff --git a/apps/widhid/metadata.json b/apps/widhid/metadata.json index 9ed10cfa2c..3dad35b68c 100644 --- a/apps/widhid/metadata.json +++ b/apps/widhid/metadata.json @@ -3,6 +3,7 @@ "name": "Bluetooth Music Swipe Control Widget", "shortName": "BLE Swipe Widget", "version": "0.03", + "author": "bobrippling", "description": "Based on Swipe Bluetooth Music Controls (based on Bluetooth Music Controls). Swipe down to enable, then swipe up/down for volume, left/right for previous and next and tap for play/pause. Enable HID in settings, pair with your phone/computer, then use this widget to control music from your watch!", "icon": "icon.png", "readme": "README.md", @@ -12,6 +13,5 @@ "storage": [ {"name":"widhid.wid.js","url":"wid.js"}, {"name":"widhid.img","url":"icon.js","evaluate":true} - ], - "author": "bobrippling" + ] } diff --git a/apps/widhrzone/metadata.json b/apps/widhrzone/metadata.json index 0c3976ffe5..e8f76f6520 100644 --- a/apps/widhrzone/metadata.json +++ b/apps/widhrzone/metadata.json @@ -3,6 +3,7 @@ "name": "Heart rate zone widget", "shortName": "HRzone widget", "version": "0.02", + "author": "nxdefiant", "description": "Widget that displays the current out of five heart rate training zones 1. HEALTH (50-60% of max. HR, Recovery, grey), 2. FAT-B (60-70% of max. HR, burns fat, blue), 3. AROBIC (70-80% of max. HR, Endurance, green), 4. ANAROB (80-90% of max. HR, Speed, yellow), 5. MAX (90-100% of max. HR, red). Only visible when heart rate monitor is active and inside one of the zones. Requires to set the maximum heart rate in settings (if unsure set to 220-age).", "icon": "widget.png", "type": "widget", @@ -12,6 +13,5 @@ "storage": [ {"name":"widhrzone.wid.js","url":"widget.js"} ], - "dependencies": {"myprofile":"app"}, - "author": "nxdefiant" + "dependencies": {"myprofile":"app"} } diff --git a/apps/widminbate/metadata.json b/apps/widminbate/metadata.json index 36dc23fddf..f0f16b15ba 100644 --- a/apps/widminbate/metadata.json +++ b/apps/widminbate/metadata.json @@ -2,6 +2,7 @@ "name": "Extra Minimal Battery", "shortName":"ExtraMinBat", "version":"0.05", + "author": "thyttan", "description": "An extra minimal (only use system theme foreground colour) version of the battery widget that only appears if the battery is running low (below 30%)", "icon": "widget.png", "type": "widget", @@ -9,6 +10,5 @@ "supports" : ["BANGLEJS2", "BANGLEJS"], "storage": [ {"name":"widminbate.wid.js","url":"widget.js"} - ], - "author": "thyttan" + ] } diff --git a/apps/widshipbell/metadata.json b/apps/widshipbell/metadata.json index a76a34c00b..ec4a3772c2 100644 --- a/apps/widshipbell/metadata.json +++ b/apps/widshipbell/metadata.json @@ -3,6 +3,7 @@ "name": "Ship's bell Widget", "shortName": "Ship's bell", "version": "0.02", + "author": "nxdefiant", "description": "A widget that buzzes according to a nautical bell, one strike at 04:30, two strikes at 05:00, up to eight strikes at 08:00 and so on.", "icon": "widget.png", "type": "widget", @@ -12,6 +13,5 @@ {"name":"widshipbell.wid.js","url":"widget.js"}, {"name":"widshipbell.settings.js","url":"settings.js"} ], - "data": [{"name":"widshipbell.json"}], - "author": "nxdefiant" + "data": [{"name":"widshipbell.json"}] } diff --git a/apps/zambretti/metadata.json b/apps/zambretti/metadata.json index 2725786792..2c6d8df743 100644 --- a/apps/zambretti/metadata.json +++ b/apps/zambretti/metadata.json @@ -3,6 +3,7 @@ "name": "Zambretti Weather Forecaster", "shortName": "Zn. Weather", "version": "0.01", + "author": "nxdefiant", "description": "Zambretti Forecaster by Negretti and Zambra, uses the Barometer for empirical weather forecast in the Northern Hemisphere (see https://web.archive.org/web/20110610213848/http://www.meteormetrics.com/zambretti.htm), similar to weather stations. Watch must be stationary and its height above sea level set.", "icon": "app.png", "tags": "outdoors,weather", @@ -15,6 +16,5 @@ {"name":"zambretti.boot.js","url":"boot.js"}, {"name":"zambretti.img","url":"app-icon.js","evaluate":true} ], - "data": [{"name":"zambretti.json"}, {"name":"zambretti.log.json"}], - "author": "nxdefiant" + "data": [{"name":"zambretti.json"}, {"name":"zambretti.log.json"}] } From 7c5ec8720072fa66ee6441edfaab343c457cdd22 Mon Sep 17 00:00:00 2001 From: Rob Pilling Date: Sat, 13 Sep 2025 11:25:05 +0100 Subject: [PATCH 08/23] Move PR tagging logic to `pr-tag.js` --- .github/workflows/pr-tagging.yml | 19 ++---------- bin/pr-tag.js | 52 ++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+), 17 deletions(-) create mode 100644 bin/pr-tag.js diff --git a/.github/workflows/pr-tagging.yml b/.github/workflows/pr-tagging.yml index 7855c3f013..00bf8a2c96 100644 --- a/.github/workflows/pr-tagging.yml +++ b/.github/workflows/pr-tagging.yml @@ -17,7 +17,7 @@ jobs: - name: Install jq run: | sudo apt-get update - sudo apt-get install -y jq + sudo apt-get install -y jq nodejs - name: Fetch relevant refs run: | @@ -25,22 +25,7 @@ jobs: git fetch origin --unshallow - name: Tag app authors - run: | - git diff --name-only origin/master... -- apps/ \ - | grep -o 'apps/[^/]*' \ - | sort \ - | uniq \ - | while read d - do - author=$(jq -r '.author // ""' < "$d/metadata.json") - if test -z "$author" - then continue - fi - - # disabled `@` for now to avoid spamming - echo "tagging $author for \`$d\`" - done \ - > comment.txt + run: node bin/pr-tag.js > comment.txt - name: Post comment env: diff --git a/bin/pr-tag.js b/bin/pr-tag.js new file mode 100644 index 0000000000..b8318603fd --- /dev/null +++ b/bin/pr-tag.js @@ -0,0 +1,52 @@ +const { execSync } = require("child_process"); +const { readFileSync } = require("fs"); + +function usage(){ + console.log(`Usage: pr-tag.js [revision-range]`); + process.exit(2); +} + +let rev; +for(const arg of process.argv.slice(2)){ + if(/^-/.test(arg)) + usage(); + else if(!rev) + rev = arg; + else + usage(); +} + +if(!rev) rev = "origin/master..."; + +const apps = execSync( + `git diff --name-only ${rev} -- apps/ | + grep -o "apps/[^/]*" | + sort | + uniq`, + { encoding: "utf8" } +).split("\n").filter(x => x); + +if(apps.length === 0) process.exit(1); // pipeline failed + +const authorToApp = {}; + +for(const app of apps){ + const metadata = JSON.parse(readFileSync(`${app}/metadata.json`, "utf8")); + let authorField = metadata.author; + if(!authorField) continue; + + const authors = Array.isArray(authorField) ? authorField : [authorField]; + + for(const author of authors){ + if(!authorToApp[author]) + authorToApp[author] = new Set(); + + authorToApp[author].add(app); + } +} + +for(let [author, apps] of Object.entries(authorToApp)){ + apps = [...apps].sort(); + + console.log(`tagging ${author} for ${apps.join(", ")}`); +} From 8ee46e2a02037223b6bfa40d18f0377238ab5752 Mon Sep 17 00:00:00 2001 From: Rob Pilling Date: Sat, 13 Sep 2025 11:25:18 +0100 Subject: [PATCH 09/23] Update README with `author` metadata field --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 0bc5114500..eec0d0ef71 100644 --- a/README.md +++ b/README.md @@ -250,6 +250,7 @@ and which gives information about the app for the Launcher. "name": "Readable name", // readable name "shortName": "Short name", // short name for launcher "version": "0.01", // the version of this app + "author": "name", // name of app author (can be an array - ["author1", "author2"], used for tagging in PRs for the app) "description": "...", // long description (can contain markdown) "icon": "icon.png", // icon in apps/ "screenshots" : [ { "url":"screenshot.png" } ], // optional screenshot for app From db600c2cca8d3f0bdda11e0df5d77ce3f3b43465 Mon Sep 17 00:00:00 2001 From: Rob Pilling Date: Sat, 13 Sep 2025 11:48:11 +0100 Subject: [PATCH 10/23] Update example apps with `author` field --- apps/_example_app/metadata.json | 1 + apps/_example_clkinfo/metadata.json | 1 + apps/_example_clock/metadata.json | 1 + apps/_example_widget/metadata.json | 1 + 4 files changed, 4 insertions(+) diff --git a/apps/_example_app/metadata.json b/apps/_example_app/metadata.json index 42dfca2b8b..6e1751cd9b 100644 --- a/apps/_example_app/metadata.json +++ b/apps/_example_app/metadata.json @@ -2,6 +2,7 @@ "name": "My app's human readable name", "shortName":"Short Name", "version":"0.01", + "author": "gfwilliams", "description": "A detailed description of my great app", "icon": "app.png", "tags": "", diff --git a/apps/_example_clkinfo/metadata.json b/apps/_example_clkinfo/metadata.json index 83b8184d8c..22acdf8123 100644 --- a/apps/_example_clkinfo/metadata.json +++ b/apps/_example_clkinfo/metadata.json @@ -2,6 +2,7 @@ "name": "My clock info's human readable name", "shortName":"Short Name", "version":"0.01", + "author": "gfwilliams", "description": "A detailed description of my clock info", "icon": "icon.png", "type": "clkinfo", diff --git a/apps/_example_clock/metadata.json b/apps/_example_clock/metadata.json index d9150af3c2..3bce63fd33 100644 --- a/apps/_example_clock/metadata.json +++ b/apps/_example_clock/metadata.json @@ -2,6 +2,7 @@ "name": "My clock human readable name", "shortName":"Short Name", "version":"0.01", + "author": "gfwilliams", "description": "A detailed description of my clock", "icon": "icon.png", "screenshots": [{"url":"screenshot.png"}], diff --git a/apps/_example_widget/metadata.json b/apps/_example_widget/metadata.json index 8dc7c75c61..7122d72cb3 100644 --- a/apps/_example_widget/metadata.json +++ b/apps/_example_widget/metadata.json @@ -2,6 +2,7 @@ "name": "My widget's human readable name", "shortName":"Short Name", "version":"0.01", + "author": "gfwilliams", "description": "A detailed description of my great widget", "icon": "icon.png", "type": "widget", From e8d6da149f64ebfa57fd09e30079c507c23c9d2f Mon Sep 17 00:00:00 2001 From: Rob Pilling Date: Sat, 13 Sep 2025 11:49:29 +0100 Subject: [PATCH 11/23] pr-tag.js: move to main() function --- bin/pr-tag.js | 71 ++++++++++++++++++++++++++++----------------------- 1 file changed, 39 insertions(+), 32 deletions(-) diff --git a/bin/pr-tag.js b/bin/pr-tag.js index b8318603fd..2087aa5f41 100644 --- a/bin/pr-tag.js +++ b/bin/pr-tag.js @@ -6,47 +6,54 @@ function usage(){ process.exit(2); } -let rev; -for(const arg of process.argv.slice(2)){ - if(/^-/.test(arg)) - usage(); - else if(!rev) - rev = arg; - else - usage(); -} +function main() { + let rev; + for(const arg of process.argv.slice(2)){ + if(/^-/.test(arg)) + usage(); + else if(!rev) + rev = arg; + else + usage(); + } -if(!rev) rev = "origin/master..."; + if(!rev) rev = "origin/master..."; -const apps = execSync( - `git diff --name-only ${rev} -- apps/ | - grep -o "apps/[^/]*" | - sort | - uniq`, - { encoding: "utf8" } -).split("\n").filter(x => x); + const apps = execSync( + `git diff --name-only ${rev} -- apps/ | + grep -o "apps/[^/]*" | + sort | + uniq`, + { encoding: "utf8" } + ).split("\n").filter(x => x); -if(apps.length === 0) process.exit(1); // pipeline failed + if(apps.length === 0) process.exit(1); // pipeline failed -const authorToApp = {}; + const authorToApp = {}; -for(const app of apps){ - const metadata = JSON.parse(readFileSync(`${app}/metadata.json`, "utf8")); - let authorField = metadata.author; - if(!authorField) continue; + for(const app of apps){ + const metadata = JSON.parse(readFileSync(`${app}/metadata.json`, "utf8")); + let authorField = metadata.author; + if(!authorField) continue; - const authors = Array.isArray(authorField) ? authorField : [authorField]; + const authors = Array.isArray(authorField) ? authorField : [authorField]; - for(const author of authors){ - if(!authorToApp[author]) - authorToApp[author] = new Set(); + for(const author of authors){ + if(!authorToApp[author]) + authorToApp[author] = new Set(); - authorToApp[author].add(app); + authorToApp[author].add(app); + } } -} -for(let [author, apps] of Object.entries(authorToApp)){ - apps = [...apps].sort(); + for(let [author, apps] of Object.entries(authorToApp)){ + apps = [...apps].sort(); - console.log(`tagging ${author} for ${apps.join(", ")}`); + console.log(`tagging ${author} for ${apps.join(", ")}`); + } } + +main().catch(e => { + console.error(e); + process.exit(1); +}); From 580573215c581283edbddb1bf055d9bbdc905bc6 Mon Sep 17 00:00:00 2001 From: Rob Pilling Date: Sat, 13 Sep 2025 11:49:50 +0100 Subject: [PATCH 12/23] pr-tag.js: allow specifying to skip tagging (in PR description) --- .github/workflows/pr-tagging.yml | 4 ++ bin/pr-tag.js | 70 ++++++++++++++++++++++++++++++-- 2 files changed, 71 insertions(+), 3 deletions(-) diff --git a/.github/workflows/pr-tagging.yml b/.github/workflows/pr-tagging.yml index 00bf8a2c96..c1563f3eb4 100644 --- a/.github/workflows/pr-tagging.yml +++ b/.github/workflows/pr-tagging.yml @@ -25,6 +25,10 @@ jobs: git fetch origin --unshallow - name: Tag app authors + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + REPO: ${{ github.repository }} + PR_NUM: ${{ github.event.pull_request.number }} run: node bin/pr-tag.js > comment.txt - name: Post comment diff --git a/bin/pr-tag.js b/bin/pr-tag.js index 2087aa5f41..0d2228dbfb 100644 --- a/bin/pr-tag.js +++ b/bin/pr-tag.js @@ -1,15 +1,20 @@ const { execSync } = require("child_process"); const { readFileSync } = require("fs"); +const https = require("https"); function usage(){ - console.log(`Usage: pr-tag.js [revision-range]`); + console.log(`Usage: pr-tag.js [--local] [revision-range]`); + console.log(`--local: don't fetch the PR description - useful for local testing`); process.exit(2); } -function main() { +async function main() { + let local = false; let rev; for(const arg of process.argv.slice(2)){ - if(/^-/.test(arg)) + if(arg === "--local") + local = true; + else if(/^-/.test(arg)) usage(); else if(!rev) rev = arg; @@ -19,6 +24,11 @@ function main() { if(!rev) rev = "origin/master..."; + if(!local && await shouldSkip()){ + console.log("Skipping PR"); + process.exit(0); + } + const apps = execSync( `git diff --name-only ${rev} -- apps/ | grep -o "apps/[^/]*" | @@ -53,6 +63,60 @@ function main() { } } +// allow skipping of tagging if the PR description contains a specific message +async function shouldSkip() { + const desc = await fetchPRDesc({ + prNumber: getenv("PR_NUM"), + repo: getenv("REPO"), + token: getenv("GITHUB_TOKEN"), + }); + + return desc + .split("\n") + .filter(line => /^tag-bot: skip\s*$/.test(line)) + .length > 0; +} + +function fetchPRDesc({ prNumber, repo, token }) { + return new Promise((resolve, reject) => { + const options = { + hostname: "api.github.com", + path: `/repos/${repo}/pulls/${prNumber}`, + method: "GET", + headers: { + "User-Agent": "node.js", + "Authorization": `Bearer ${token}`, + "Accept": "application/vnd.github+json" + } + }; + + https.get(options, res => { + let data = ""; + res.on("data", chunk => data += chunk); + res.on("end", () => { + if (res.statusCode === 200) { + try { + resolve(JSON.parse(data).body); + } catch (e) { + reject(e); + } + } else { + reject(new Error(`GitHub API error: ${res.statusCode}`)); + } + }); + }).on("error", reject); + }); +} + +function getenv(name) { + const val = process.env[name]; + if(!val){ + console.error(`Need environment variable $${name}`); + process.exit(1); + } + return val; +} + main().catch(e => { console.error(e); process.exit(1); From 2872b59a8b73afd049b7401f2fa674ee5cc733d3 Mon Sep 17 00:00:00 2001 From: Rob Pilling Date: Sat, 13 Sep 2025 12:12:18 +0100 Subject: [PATCH 13/23] pr-tagging.yml: tweak descriptions --- .github/workflows/pr-tagging.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/pr-tagging.yml b/.github/workflows/pr-tagging.yml index c1563f3eb4..25bd513aec 100644 --- a/.github/workflows/pr-tagging.yml +++ b/.github/workflows/pr-tagging.yml @@ -14,7 +14,7 @@ jobs: steps: - uses: actions/checkout@v4 - - name: Install jq + - name: Install deps run: | sudo apt-get update sudo apt-get install -y jq nodejs @@ -31,7 +31,7 @@ jobs: PR_NUM: ${{ github.event.pull_request.number }} run: node bin/pr-tag.js > comment.txt - - name: Post comment + - name: Post output env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} COMMENT_URL: https://api.github.com/repos/${{ github.repository }}/issues/${{ github.event.pull_request.number }}/comments From 974b2f0e0051dd5539b94ae92fdcb5b2170de589 Mon Sep 17 00:00:00 2001 From: Rob Pilling Date: Sat, 13 Sep 2025 12:12:34 +0100 Subject: [PATCH 14/23] Emit debug info on stderr (so it doesn't get posted) --- bin/pr-tag.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/pr-tag.js b/bin/pr-tag.js index 0d2228dbfb..c0d753365c 100644 --- a/bin/pr-tag.js +++ b/bin/pr-tag.js @@ -25,7 +25,7 @@ async function main() { if(!rev) rev = "origin/master..."; if(!local && await shouldSkip()){ - console.log("Skipping PR"); + console.error("Skipping PR"); process.exit(0); } From 464901cbc28a56212d90d424ae6ad89d5ae1ffc7 Mon Sep 17 00:00:00 2001 From: Rob Pilling Date: Sat, 13 Sep 2025 12:14:17 +0100 Subject: [PATCH 15/23] pr-tag.js: factor out `fetchGH()` --- bin/pr-tag.js | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/bin/pr-tag.js b/bin/pr-tag.js index c0d753365c..3e68823764 100644 --- a/bin/pr-tag.js +++ b/bin/pr-tag.js @@ -78,10 +78,17 @@ async function shouldSkip() { } function fetchPRDesc({ prNumber, repo, token }) { + return fetchGH({ + path: `/repos/${repo}/pulls/${prNumber}`, + token + }).then(data => JSON.parse(data).body); +} + +function fetchGH({ path, token }) { return new Promise((resolve, reject) => { const options = { hostname: "api.github.com", - path: `/repos/${repo}/pulls/${prNumber}`, + path, method: "GET", headers: { "User-Agent": "node.js", @@ -96,7 +103,7 @@ function fetchPRDesc({ prNumber, repo, token }) { res.on("end", () => { if (res.statusCode === 200) { try { - resolve(JSON.parse(data).body); + resolve(data); } catch (e) { reject(e); } From 701eb8e3ee9a357d3b3e13be645d1f2332ba7c11 Mon Sep 17 00:00:00 2001 From: Rob Pilling Date: Sat, 13 Sep 2025 12:14:34 +0100 Subject: [PATCH 16/23] pr-tag.js: don't retag authors for the same apps --- bin/pr-tag.js | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/bin/pr-tag.js b/bin/pr-tag.js index 3e68823764..e05f6d40dc 100644 --- a/bin/pr-tag.js +++ b/bin/pr-tag.js @@ -56,7 +56,15 @@ async function main() { } } + const prevTags = await previousTags(); + for(let [author, apps] of Object.entries(authorToApp)){ + if(author in prevTags){ + apps = apps.difference(prevTags[author]); + if(apps.size === 0) + continue; + } + apps = [...apps].sort(); console.log(`tagging ${author} for ${apps.join(", ")}`); @@ -77,6 +85,37 @@ async function shouldSkip() { .length > 0; } +// returns { author: Set(apps) } +async function previousTags() { + const comments = await fetchPRComments({ + prNumber: getenv("PR_NUM"), + repo: getenv("REPO"), + token: getenv("GITHUB_TOKEN"), + }); + + const tags = {}; + + comments + .filter(({ user: { login, type } }) => type === "Bot" && login === "github-actions[bot]") + .map(({ body }) => body) + .flatMap(body => + body + .split("\n") + .map(line => { + const parts = line.split(" "); + if(parts.length === 4 && parts[0] === "tagging" && parts[2] === "for") + return { author: parts[1], app: parts[3].replace(/`/g, "") }; + }) + .filter(x => x) + ) + .forEach(({ author, app }) => { + if(!tags[author]) tags[author] = new Set(); + tags[author].add(app); + }); + + return tags; +} + function fetchPRDesc({ prNumber, repo, token }) { return fetchGH({ path: `/repos/${repo}/pulls/${prNumber}`, @@ -84,6 +123,13 @@ function fetchPRDesc({ prNumber, repo, token }) { }).then(data => JSON.parse(data).body); } +function fetchPRComments({ prNumber, repo, token }) { + return fetchGH({ + path: `/repos/${repo}/issues/${prNumber}/comments`, + token + }).then(data => JSON.parse(data)); +} + function fetchGH({ path, token }) { return new Promise((resolve, reject) => { const options = { From 02dce6b18d3a182f98c8dc5cc55fd14c2b8efe05 Mon Sep 17 00:00:00 2001 From: Rob Pilling Date: Sat, 13 Sep 2025 12:23:33 +0100 Subject: [PATCH 17/23] pr-tag.js: "polyfill" `Set.difference` --- bin/pr-tag.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/pr-tag.js b/bin/pr-tag.js index e05f6d40dc..5be1579f2c 100644 --- a/bin/pr-tag.js +++ b/bin/pr-tag.js @@ -60,7 +60,7 @@ async function main() { for(let [author, apps] of Object.entries(authorToApp)){ if(author in prevTags){ - apps = apps.difference(prevTags[author]); + apps = new Set([...apps].filter(app => !prevTags[author].has(app))); if(apps.size === 0) continue; } From 78948220fe6cc190532fb85df16c65319414e872 Mon Sep 17 00:00:00 2001 From: Rob Pilling Date: Sat, 13 Sep 2025 12:27:40 +0100 Subject: [PATCH 18/23] pr-tag.js: requote the apps --- bin/pr-tag.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/pr-tag.js b/bin/pr-tag.js index 5be1579f2c..d21a96d940 100644 --- a/bin/pr-tag.js +++ b/bin/pr-tag.js @@ -67,7 +67,7 @@ async function main() { apps = [...apps].sort(); - console.log(`tagging ${author} for ${apps.join(", ")}`); + console.log(`tagging ${author} for ${apps.map(a => `\`${a}\``).join(", ")}`); } } From b0c7b0814f6684d6fd5972cb9c9efd78ebbe450b Mon Sep 17 00:00:00 2001 From: Rob Pilling Date: Sun, 14 Sep 2025 07:08:32 +0100 Subject: [PATCH 19/23] pr-tag.js: add `debug()` --- bin/pr-tag.js | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/bin/pr-tag.js b/bin/pr-tag.js index d21a96d940..e634f76da0 100644 --- a/bin/pr-tag.js +++ b/bin/pr-tag.js @@ -25,7 +25,7 @@ async function main() { if(!rev) rev = "origin/master..."; if(!local && await shouldSkip()){ - console.error("Skipping PR"); + debug("Skipping PR"); process.exit(0); } @@ -44,6 +44,7 @@ async function main() { for(const app of apps){ const metadata = JSON.parse(readFileSync(`${app}/metadata.json`, "utf8")); let authorField = metadata.author; + debug(`Changed app: ${app}, author field: ${authorField}`); if(!authorField) continue; const authors = Array.isArray(authorField) ? authorField : [authorField]; @@ -61,8 +62,10 @@ async function main() { for(let [author, apps] of Object.entries(authorToApp)){ if(author in prevTags){ apps = new Set([...apps].filter(app => !prevTags[author].has(app))); - if(apps.size === 0) + if(apps.size === 0){ + debug(`Skipping ${author} - no new apps`); continue; + } } apps = [...apps].sort(); @@ -170,6 +173,10 @@ function getenv(name) { return val; } +function debug(...args) { + console.error(...args); +} + main().catch(e => { console.error(e); process.exit(1); From e57658e7991e2c112f04b92f4c29f2c35c44c6fb Mon Sep 17 00:00:00 2001 From: Rob Pilling Date: Sun, 14 Sep 2025 07:09:46 +0100 Subject: [PATCH 20/23] pr-tag.js: factor out line creation + fix line parsing (multiapp) --- bin/pr-tag.js | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/bin/pr-tag.js b/bin/pr-tag.js index e634f76da0..3bada5bc6b 100644 --- a/bin/pr-tag.js +++ b/bin/pr-tag.js @@ -68,12 +68,23 @@ async function main() { } } - apps = [...apps].sort(); - - console.log(`tagging ${author} for ${apps.map(a => `\`${a}\``).join(", ")}`); + console.log(makeLine({ author, apps })); } } +function makeLine({ author, apps }) { + apps = [...apps].sort(); + + return `tagging ${author} for ${apps.map(a => `\`${a}\``).join(", ")}` +} + +function parseLine(line) { + const parts = line.split(" "); + + if(parts.length >= 4 && parts[0] === "tagging" && parts[2] === "for") + return { author: parts[1], apps: parts.slice(3).map(app => app.replace(/[,`]/g, "")) }; +} + // allow skipping of tagging if the PR description contains a specific message async function shouldSkip() { const desc = await fetchPRDesc({ @@ -104,16 +115,13 @@ async function previousTags() { .flatMap(body => body .split("\n") - .map(line => { - const parts = line.split(" "); - if(parts.length === 4 && parts[0] === "tagging" && parts[2] === "for") - return { author: parts[1], app: parts[3].replace(/`/g, "") }; - }) + .map(parseLine) .filter(x => x) ) - .forEach(({ author, app }) => { + .forEach(({ author, apps }) => { if(!tags[author]) tags[author] = new Set(); - tags[author].add(app); + for(const app of apps) + tags[author].add(app); }); return tags; From 5b9a306b24ba6826010ea7d7df7d34830183be2d Mon Sep 17 00:00:00 2001 From: Rob Pilling Date: Sun, 14 Sep 2025 07:11:29 +0100 Subject: [PATCH 21/23] pr-tag.js: don't fetch comments / previous tags when --- bin/pr-tag.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/pr-tag.js b/bin/pr-tag.js index 3bada5bc6b..7068e824de 100644 --- a/bin/pr-tag.js +++ b/bin/pr-tag.js @@ -4,7 +4,7 @@ const https = require("https"); function usage(){ console.log(`Usage: pr-tag.js [--local] [revision-range]`); - console.log(`--local: don't fetch the PR description - useful for local testing`); + console.log(`--local: don't fetch the PR description, etc, just show the changes apps/authors`); process.exit(2); } @@ -57,7 +57,7 @@ async function main() { } } - const prevTags = await previousTags(); + const prevTags = local ? {} : await previousTags(); for(let [author, apps] of Object.entries(authorToApp)){ if(author in prevTags){ From c71f754781c54ddb0953e54bb91349cbfb3d2853 Mon Sep 17 00:00:00 2001 From: Rob Pilling Date: Sun, 14 Sep 2025 07:11:55 +0100 Subject: [PATCH 22/23] pr-tag.js: move comment posting into script --- .github/workflows/pr-tagging.yml | 16 +-------------- bin/pr-tag.js | 34 ++++++++++++++++++++++++++++---- 2 files changed, 31 insertions(+), 19 deletions(-) diff --git a/.github/workflows/pr-tagging.yml b/.github/workflows/pr-tagging.yml index 25bd513aec..d2f2264e29 100644 --- a/.github/workflows/pr-tagging.yml +++ b/.github/workflows/pr-tagging.yml @@ -29,18 +29,4 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} REPO: ${{ github.repository }} PR_NUM: ${{ github.event.pull_request.number }} - run: node bin/pr-tag.js > comment.txt - - - name: Post output - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - COMMENT_URL: https://api.github.com/repos/${{ github.repository }}/issues/${{ github.event.pull_request.number }}/comments - run: | - set -x - curl -fsSL \ - -X POST \ - -H "Accept: application/vnd.github+json" \ - -H "Authorization: Bearer $GITHUB_TOKEN" \ - -H "X-GitHub-Api-Version: 2022-11-28" \ - "$COMMENT_URL" \ - -d "$(jq -Rs '{"body": .}' JSON.parse(data)); } -function fetchGH({ path, token }) { +function postComment({ prNumber, repo, token, comment }) { + return fetchGH({ + path: `/repos/${repo}/issues/${prNumber}/comments`, + token, + data: { body: comment }, + }).then(data => JSON.parse(data)); +} + +function fetchGH({ path, token, data }) { return new Promise((resolve, reject) => { const options = { hostname: "api.github.com", path, - method: "GET", + method: data ? "POST" : "GET", headers: { "User-Agent": "node.js", "Authorization": `Bearer ${token}`, "Accept": "application/vnd.github+json" - } + }, }; + if(data) + options.body = data; + https.get(options, res => { let data = ""; res.on("data", chunk => data += chunk); From 5587ec468feebdb5965a766b0ae2ec4405abc04c Mon Sep 17 00:00:00 2001 From: Rob Pilling Date: Sun, 14 Sep 2025 07:13:05 +0100 Subject: [PATCH 23/23] pr-tag.js: add dry-run option --- bin/pr-tag.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/bin/pr-tag.js b/bin/pr-tag.js index 50b7797b92..8a55863c7f 100644 --- a/bin/pr-tag.js +++ b/bin/pr-tag.js @@ -3,17 +3,21 @@ const { readFileSync } = require("fs"); const https = require("https"); function usage(){ - console.log(`Usage: pr-tag.js [--local] [revision-range]`); + console.log(`Usage: pr-tag.js [--local] [--dry] [revision-range]`); console.log(`--local: don't fetch the PR description, etc, just show the changes apps/authors`); + console.log(`--dry: don't perform the final comment`); process.exit(2); } async function main() { let local = false; + let dry = false; let rev; for(const arg of process.argv.slice(2)){ if(arg === "--local") local = true; + else if(arg === "--dry") + dry = true; else if(/^-/.test(arg)) usage(); else if(!rev) @@ -73,7 +77,7 @@ async function main() { } if(output.length){ - if(local){ + if(local || dry){ for(const out of output) console.log(out) }else{