19 Commits

Author SHA1 Message Date
b923766cd1 add spectacle 2025-08-07 01:03:20 -05:00
deb2c65b9c remove print-manager from kde apps 2025-07-09 02:26:22 -05:00
ae5a80db37 are these plasma packages missing? 2025-07-08 21:48:02 -05:00
a573eab126 finalize kf6 job 2025-07-08 13:45:33 -05:00
5954740610 add plasma jobs 2025-07-08 13:42:28 -05:00
9370098921 bump version for dep issue 2025-07-08 13:06:41 -05:00
a69b0c2071 Merge pull request #1 from CorySanin/dependabot/npm_and_yarn/brace-expansion-2.0.2
Bump brace-expansion from 2.0.1 to 2.0.2
2025-07-08 13:04:33 -05:00
de1e338cd3 Add jobs to version control 2025-07-08 13:03:32 -05:00
dependabot[bot]
744d1a6fe5 Bump brace-expansion from 2.0.1 to 2.0.2
Bumps [brace-expansion](https://github.com/juliangruber/brace-expansion) from 2.0.1 to 2.0.2.
- [Release notes](https://github.com/juliangruber/brace-expansion/releases)
- [Commits](https://github.com/juliangruber/brace-expansion/compare/v2.0.1...v2.0.2)

---
updated-dependencies:
- dependency-name: brace-expansion
  dependency-version: 2.0.2
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-06-12 12:38:11 +00:00
c0561a542f 3.1.4: update dependencies, fix bash completion 2025-05-07 02:00:09 -05:00
1d7e66459a Simplify up ssh key signing logic 2025-03-25 00:15:13 -05:00
c1b59b8e20 Merge pull request 'Add ssh key sign' (#2) from ndowens/artix-metro:master into master
Reviewed-on: #2
2025-03-25 05:57:23 +01:00
fe95766606 Add ssh key sign 2025-03-25 04:55:56 +00:00
362593798c use loose moves for verifing movable packages 2025-03-15 13:13:52 -05:00
362656d13e retry failed webhooks 2025-02-08 23:21:42 -05:00
d7723efb18 3.1.0: globbing support for packages 2025-01-28 01:25:42 -05:00
9a79e6a830 3.0.2: zsh completion completes baspkgs 2025-01-27 02:02:55 -05:00
a1338aa9bc 3.0.1: detect gpg password cache 2025-01-27 01:16:50 -05:00
5e105efd9d add completion scripts 2025-01-26 19:11:46 -05:00
18 changed files with 2089 additions and 106 deletions

4
.gitignore vendored
View File

@@ -100,4 +100,6 @@ public
distribution/*.mts distribution/*.mts
distribution/*.mjs distribution/*.mjs
jobs/* jobs/*
!jobs/example.json5 !jobs/example.json5
!jobs/*-add.json*
!jobs/*-move.json*

22
.vscode/launch.json vendored
View File

@@ -5,16 +5,30 @@
"version": "0.2.0", "version": "0.2.0",
"configurations": [ "configurations": [
{ {
"type": "pwa-node", "type": "node",
"request": "launch", "request": "launch",
"name": "Launch Program", "name": "Launch Program",
"skipFiles": [ "skipFiles": [
"<node_internals>/**" "<node_internals>/**"
], ],
"env": { "env": {
"JOB": "jobs/example.json5" "GPGPASS": "${input:gpgpass}"
}, },
"program": "${workspaceFolder}/index.js" "program": "${workspaceFolder}/bin/artix-metro.mjs",
"args": [
"--job",
"jobs/kde-01.json5"
],
"outFiles": [
"${workspaceFolder}/distribution/*"
]
} }
] ],
"inputs": [
{
"id": "gpgpass",
"type": "promptString",
"description": "Enter your GPG password"
}
]
} }

99
completion/bash Normal file
View File

@@ -0,0 +1,99 @@
#/usr/bin/env bash
LIBDIR=${LIBDIR:-'/usr/share/artools/lib'}
_artixpkg_pkgbase() {
source "${LIBDIR}"/pkg/util.sh
ls -1 "${TREE_DIR_ARTIX}" | tr '\n' ' '
}
_artix_metro_completion() {
local cur prev comps repos autorepos comp_cword_exflag
source "${LIBDIR}"/pkg/db/db.sh 2>/dev/null
cur="${COMP_WORDS[COMP_CWORD]}"
prev="${COMP_WORDS[COMP_CWORD-1]}"
for ((i = COMP_CWORD - 1; i >= 0; i--)); do
if [[ ${COMP_WORDS[i]} != -* ]]; then
last_non_flag_word="${COMP_WORDS[i]}"
break
fi
done
comps=""
comp_cword_exflag=0
comp_cword_all=0
for ((i = 0; i < ${#COMP_WORDS[@]} - 1; i++)); do
word="${COMP_WORDS[i]}"
comps_all+=" $word"
((comp_cword_all++))
if [[ $word != -* ]]; then
comps+=" $word"
((comp_cword_exflag++))
fi
done
comps="${comps:1}"
repos=""
for word in "${ARTIX_DB[@]}"; do
if [[ $word != -* ]]; then
repos+=" $word"
fi
done
repos="${repos:1}"
autorepos=""
for word in "${ARTIX_DB_MAP[@]}"; do
if [[ $word != -* ]]; then
autorepos+=" $word"
fi
done
autorepos="${autorepos:1}"
case "${prev}" in
"--token")
# this flag expects a parameter
COMPREPLY=()
;;
"-j"|"--job")
compopt -o filenames
COMPREPLY=( $(compgen -f -- "$cur") )
;;
"--workspace")
COMPREPLY=( $(compgen -d -- "$cur") )
;;
"--start")
COMPREPLY=($(compgen -W "$(_artixpkg_pkgbase)" -- ${cur}))
;;
*)
local metroCommon="-h --help --start --token --workspace --increment "
case "${comps}" in
"artix-metro add"*)
case "${comp_cword_exflag}" in
2)
COMPREPLY=($(compgen -W "$metroCommon $autorepos $repos" -- ${cur}))
;;
*)
COMPREPLY=($(compgen -W "$metroCommon $(_artixpkg_pkgbase)" -- ${cur}))
;;
esac
;;
"artix-metro move"*)
case "${comp_cword_exflag}" in
2|3)
COMPREPLY=($(compgen -W "$metroCommon $autorepos $repos" -- ${cur}))
;;
*)
COMPREPLY=($(compgen -W "$metroCommon $(_artixpkg_pkgbase)" -- ${cur}))
;;
esac
;;
*)
COMPREPLY=($(compgen -W "$metroCommon -j --job add move" -- ${cur}))
;;
esac
;;
esac
}
complete -F _artix_metro_completion artix-metro

61
completion/zsh Normal file
View File

@@ -0,0 +1,61 @@
# Load necessary library files
LIBDIR=${LIBDIR:-'/usr/share/artools/lib'}
_artix_metro_completion() {
local -a metroCommon repos autorepos pkgbase
local curcontext="$curcontext" state
# Load external configurations
source "${LIBDIR}/pkg/db/db.sh" 2>/dev/null
# Common options
metroCommon=("-h" "--help" "--start" "--token" "--workspace" "--increment" "-j" "--job")
# Populate variables
repos=("${(s: :)ARTIX_DB}")
autorepos=("${(s: :)ARTIX_DB_MAP}")
pkgbase=("${(s: :)$(artix-metro --completion pkgbase)}")
# Handle command and argument contexts
_arguments -C \
'--token[Provide a token]: ' \
'-j[Specify a job]: :_files' \
'--job[Specify a job]: :_files' \
'--workspace[Specify a workspace]: :_files -/' \
'--start[Start a process]:pkgbase:(${pkgbase})' \
'1:command:(${metroCommon} add move)' \
'2:repo:(${metroCommon} ${autorepos} ${repos})' \
'*:pkgbase:->pkgbase'
# Contextual argument handling
case $state in
pkgbase)
case $words[2] in
add)
if (( CURRENT == 3 )); then
# First argument after "add" is a repo
_values "repo" "${metroCommon[@]}" "${autorepos[@]}" "${repos[@]}"
else
# Remaining arguments are pkgbase
_values "pkgbase" "${pkgbase[@]}"
fi
;;
move)
if (( CURRENT == 3 )); then
# First repo for "move"
_values "repo" "${metroCommon[@]}" "${autorepos[@]}" "${repos[@]}"
elif (( CURRENT == 4 )); then
# Second repo for "move"
_values "repo" "${metroCommon[@]}" "${autorepos[@]}" "${repos[@]}"
else
# Remaining arguments are pkgbase
_values "pkgbase" "${pkgbase[@]}"
fi
;;
esac
;;
esac
}
# Register the completion function for artix-metro
compdef _artix_metro_completion artix-metro

302
jobs/kde-add.json5 Normal file
View File

@@ -0,0 +1,302 @@
{
"repo": "gremlins",
"increment": false,
"packages": [
"grantleetheme5",
"grantleetheme",
"ktextaddons",
"kpimtextedit5",
"kpimtextedit",
"kidentitymanagement5",
"kidentitymanagement",
"libkleo",
"kmime5",
"kmime",
"kimap",
"kpkpass",
"kitinerary",
"kmbox",
"mimetreeparser",
"kleopatra",
"signon-kwallet-extension",
"kaccounts-integration",
"libakonadi5",
"akonadi",
"akonadi-mime",
"akonadi-search",
"akonadi-notes5",
"akonadi-notes",
"akonadi-contacts5",
"akonadi-contacts",
"ksmtp",
"libkgapi",
"kmailtransport",
"kldap",
"libkdepim",
"kcalutils",
"libktorrent",
"kpmcore",
"kopeninghours",
"kpublictransport",
"ktnef",
"kontactinterface5",
"kontactinterface",
"pimcommon",
"kosmindoormap",
"mailimporter",
"libgravatar",
"messagelib",
"akonadi-calendar",
"calendarsupport",
"kdiagram5",
"kdiagram",
"eventviews",
"kdepim-runtime",
"libksieve",
"mailcommon",
"incidenceeditor",
"mbox-importer",
"pim-data-exporter",
"akonadi-import-wizard",
"pim-sieve-editor",
"merkuro",
"akonadi-calendar-tools",
"korganizer",
"kaddressbook",
"kdepim-addons",
"kalarm",
"kmail-account-wizard",
"kmail",
"khealthcertificate",
"libquotient",
"itinerary",
"akonadiconsole",
"grantlee-editor",
"kontact",
"knotes",
"akregator",
"libkexiv2",
"kdegraphics-mobipocket",
"kamera",
"kcolorchooser",
"libkdcraw",
"kimagemapeditor",
"ksanecore",
"libksane",
"kdegraphics-thumbnailers",
"kolourpaint",
"kruler",
"svgpart",
"okularpart5",
"okular",
"kmag",
"kmousetool",
"kontrast",
"kmouth",
"ark",
"filelight",
"kate",
"kbackup",
"kcalc",
"kcharselect",
"kdebugsettings",
"kdf",
"kdialog",
"keditbookmarks",
"kfind",
"markdownpart",
"sweeper",
"kwalletmanager",
"ktimer",
"kgpg",
"kteatime",
"konsolepart5",
"konsole",
"skanpage",
"yakuake",
"baloo-widgets",
"kcron",
"khelpcenter",
"partitionmanager",
"kio5-extras",
"kio-extras",
"ksystemlog",
"kio-admin",
"arianna",
"dolphin",
"kio-zeroconf",
"krfb",
"krdc",
"kopete",
"pulseaudio-qt",
"kdeconnect",
"kdenetwork-filesharing",
"kget",
"ktorrent",
"konqueror",
"kaccounts-providers",
"telepathy-kde-common-internals",
"telepathy-kde-accounts-kcm",
"konversation",
"kio-gdrive",
"telepathy-kde-text-ui",
"telepathy-kde-send-file",
"telepathy-kde-integration-module",
"telepathy-kde-filetransfer-handler",
"telepathy-kde-approver",
"telepathy-kde-auth-handler",
"telepathy-kde-call-ui",
"telepathy-kde-desktop-applets",
"telepathy-kde-contact-runner",
"telepathy-kde-contact-list",
"artikulate",
"analitza",
"kalgebra",
"cantor",
"kdeedu-data",
"libkeduvocdocument",
"kanagram",
"kbruch",
"blinken",
"kgeography",
"khangman",
"kig",
"kiten",
"kalzium",
"marble",
"step",
"rocs",
"parley",
"minuet",
"klettres",
"kmplot",
"kqtquickcharts",
"kwordquiz",
"kturtle",
"ktouch",
"kwave",
"kmix",
"libkcompactdisc",
"libkcddb",
"audiocd-kio",
"k3b",
"kdenlive",
"kamoso",
"juk",
"dragon",
"elisa",
"ffmpegthumbs",
"libkomparediff2",
"umbrello",
"poxml",
"lokalize",
"kompare",
"kirigami-gallery",
"kdesdk-thumbnailers",
"cervisia",
"dolphin-plugins",
"kapptemplate",
"kcachegrind",
"kde-dev-utils",
"kde-dev-scripts",
"libkdegames",
"libkmahjongg",
"bomber",
"bovo",
"granatier",
"kajongg",
"kapman",
"katomic",
"kblackbox",
"kblocks",
"kbounce",
"kbreakout",
"kdiamond",
"kfourinline",
"kgoldrunner",
"kigo",
"killbots",
"kiriki",
"kjumpingcube",
"klickety",
"klines",
"picmi",
"palapeli",
"lskat",
"kubrick",
"ktuberling",
"ksudoku",
"ksquares",
"kspaceduel",
"ksnakeduel",
"ksirk",
"kshisen",
"kmahjongg",
"kmines",
"knavalbattle",
"knetwalk",
"knights",
"kreversi",
"kpat",
"konquest",
"kolf",
"kollision",
"skladnik",
"kdevelop",
"kimageannotator",
"gwenview",
"kdevelop-php",
"kdevelop-python",
"skanlite",
"zanshin",
"falkon",
"colord-kde",
"alligator",
"angelfish",
"audiotube",
"kalk",
"kasts",
"kclock",
"kde-inotify-survey",
"kdesdk-kio",
"keysmith",
"kongress",
"krecorder",
"ktrip",
"kweathercore",
"kweather",
"kunifiedpush",
"neochat",
"isoimagewriter",
"plasmatube",
"telly-skout",
"tokodon",
"koko",
"libalkimia",
"kmymoney",
"accessibility-inspector",
"smb4k",
"digikam",
"audex",
"francis",
"kalm",
"kgraphviewer",
"massif-visualizer",
"calligra",
"qrca"
]
}

302
jobs/kde-move.json5 Normal file
View File

@@ -0,0 +1,302 @@
{
"source": "gremlins",
"repo": "stable",
"packages": [
"grantleetheme5",
"grantleetheme",
"ktextaddons",
"kpimtextedit5",
"kpimtextedit",
"kidentitymanagement5",
"kidentitymanagement",
"libkleo",
"kmime5",
"kmime",
"kimap",
"kpkpass",
"kitinerary",
"kmbox",
"mimetreeparser",
"kleopatra",
"signon-kwallet-extension",
"kaccounts-integration",
"libakonadi5",
"akonadi",
"akonadi-mime",
"akonadi-search",
"akonadi-notes5",
"akonadi-notes",
"akonadi-contacts5",
"akonadi-contacts",
"ksmtp",
"libkgapi",
"kmailtransport",
"kldap",
"libkdepim",
"kcalutils",
"libktorrent",
"kpmcore",
"kopeninghours",
"kpublictransport",
"ktnef",
"kontactinterface5",
"kontactinterface",
"pimcommon",
"kosmindoormap",
"mailimporter",
"libgravatar",
"messagelib",
"akonadi-calendar",
"calendarsupport",
"kdiagram5",
"kdiagram",
"eventviews",
"kdepim-runtime",
"libksieve",
"mailcommon",
"incidenceeditor",
"mbox-importer",
"pim-data-exporter",
"akonadi-import-wizard",
"pim-sieve-editor",
"merkuro",
"akonadi-calendar-tools",
"korganizer",
"kaddressbook",
"kdepim-addons",
"kalarm",
"kmail-account-wizard",
"kmail",
"khealthcertificate",
"libquotient",
"itinerary",
"akonadiconsole",
"grantlee-editor",
"kontact",
"knotes",
"akregator",
"libkexiv2",
"kdegraphics-mobipocket",
"kamera",
"kcolorchooser",
"libkdcraw",
"kimagemapeditor",
"ksanecore",
"libksane",
"kdegraphics-thumbnailers",
"kolourpaint",
"kruler",
"svgpart",
"okularpart5",
"okular",
"kmag",
"kmousetool",
"kontrast",
"kmouth",
"ark",
"filelight",
"kate",
"kbackup",
"kcalc",
"kcharselect",
"kdebugsettings",
"kdf",
"kdialog",
"keditbookmarks",
"kfind",
"markdownpart",
"sweeper",
"kwalletmanager",
"ktimer",
"kgpg",
"kteatime",
"konsolepart5",
"konsole",
"skanpage",
"yakuake",
"baloo-widgets",
"kcron",
"khelpcenter",
"partitionmanager",
"kio5-extras",
"kio-extras",
"ksystemlog",
"kio-admin",
"arianna",
"dolphin",
"kio-zeroconf",
"krfb",
"krdc",
"kopete",
"pulseaudio-qt",
"kdeconnect",
"kdenetwork-filesharing",
"kget",
"ktorrent",
"konqueror",
"kaccounts-providers",
"telepathy-kde-common-internals",
"telepathy-kde-accounts-kcm",
"konversation",
"kio-gdrive",
"telepathy-kde-text-ui",
"telepathy-kde-send-file",
"telepathy-kde-integration-module",
"telepathy-kde-filetransfer-handler",
"telepathy-kde-approver",
"telepathy-kde-auth-handler",
"telepathy-kde-call-ui",
"telepathy-kde-desktop-applets",
"telepathy-kde-contact-runner",
"telepathy-kde-contact-list",
"artikulate",
"analitza",
"kalgebra",
"cantor",
"kdeedu-data",
"libkeduvocdocument",
"kanagram",
"kbruch",
"blinken",
"kgeography",
"khangman",
"kig",
"kiten",
"kalzium",
"marble",
"step",
"rocs",
"parley",
"minuet",
"klettres",
"kmplot",
"kqtquickcharts",
"kwordquiz",
"kturtle",
"ktouch",
"kwave",
"kmix",
"libkcompactdisc",
"libkcddb",
"audiocd-kio",
"k3b",
"kdenlive",
"kamoso",
"juk",
"dragon",
"elisa",
"ffmpegthumbs",
"libkomparediff2",
"umbrello",
"poxml",
"lokalize",
"kompare",
"kirigami-gallery",
"kdesdk-thumbnailers",
"cervisia",
"dolphin-plugins",
"kapptemplate",
"kcachegrind",
"kde-dev-utils",
"kde-dev-scripts",
"libkdegames",
"libkmahjongg",
"bomber",
"bovo",
"granatier",
"kajongg",
"kapman",
"katomic",
"kblackbox",
"kblocks",
"kbounce",
"kbreakout",
"kdiamond",
"kfourinline",
"kgoldrunner",
"kigo",
"killbots",
"kiriki",
"kjumpingcube",
"klickety",
"klines",
"picmi",
"palapeli",
"lskat",
"kubrick",
"ktuberling",
"ksudoku",
"ksquares",
"kspaceduel",
"ksnakeduel",
"ksirk",
"kshisen",
"kmahjongg",
"kmines",
"knavalbattle",
"knetwalk",
"knights",
"kreversi",
"kpat",
"konquest",
"kolf",
"kollision",
"skladnik",
"kdevelop",
"kimageannotator",
"gwenview",
"kdevelop-php",
"kdevelop-python",
"skanlite",
"zanshin",
"falkon",
"colord-kde",
"alligator",
"angelfish",
"audiotube",
"kalk",
"kasts",
"kclock",
"kde-inotify-survey",
"kdesdk-kio",
"keysmith",
"kongress",
"krecorder",
"ktrip",
"kweathercore",
"kweather",
"kunifiedpush",
"neochat",
"isoimagewriter",
"plasmatube",
"telly-skout",
"tokodon",
"koko",
"libalkimia",
"kmymoney",
"accessibility-inspector",
"smb4k",
"digikam",
"audex",
"francis",
"kalm",
"kgraphviewer",
"massif-visualizer",
"calligra",
"qrca"
]
}

77
jobs/kf6-add.json5 Normal file
View File

@@ -0,0 +1,77 @@
{
"repo": "gremlins",
"packages": [
"extra-cmake-modules",
"breeze-icons",
"bluez-qt",
"attica",
"kapidox",
"karchive",
"kcalendarcore",
"kcodecs",
"kconfig",
"kcoreaddons",
"kcrash",
"kdbusaddons",
"kdnssd",
"kglobalaccel",
"kguiaddons",
"kholidays",
"ki18n",
"kfilemetadata",
"kdoctools",
"kcontacts",
"kcolorscheme",
"kidletime",
"kimageformats",
"kirigami",
"kitemmodels",
"kitemviews",
"knotifications",
"kpackage",
"kplotting",
"kpty",
"kdesu",
"kquickcharts",
"krunner",
"kservice",
"kded",
"ksvg",
"ktexttemplate",
"kunitconversion",
"kuserfeedback",
"kwidgetsaddons",
"kpeople",
"kjobwidgets",
"kdeclarative",
"kconfigwidgets",
"kiconthemes",
"kcompletion",
"kbookmarks",
"kwindowsystem",
"kwallet",
"kstatusnotifieritem",
"kauth",
"kxmlgui",
"modemmanager-qt",
"networkmanager-qt",
"prison",
"solid",
"kio",
"kparts",
"knotifyconfig",
"kdav",
"kcmutils",
"purpose",
"baloo",
"sonnet",
"qqc2-desktop-style",
"ktextwidgets",
"syndication",
"knewstuff",
"frameworkintegration",
"syntax-highlighting",
"ktexteditor",
"threadweaver",
]
}

78
jobs/kf6-move.json5 Normal file
View File

@@ -0,0 +1,78 @@
{
"source": "gremlins",
"repo": "stable",
"packages": [
"extra-cmake-modules",
"breeze-icons",
"bluez-qt",
"attica",
"kapidox",
"karchive",
"kcalendarcore",
"kcodecs",
"kconfig",
"kcoreaddons",
"kcrash",
"kdbusaddons",
"kdnssd",
"kglobalaccel",
"kguiaddons",
"kholidays",
"ki18n",
"kfilemetadata",
"kdoctools",
"kcontacts",
"kcolorscheme",
"kidletime",
"kimageformats",
"kirigami",
"kitemmodels",
"kitemviews",
"knotifications",
"kpackage",
"kplotting",
"kpty",
"kdesu",
"kquickcharts",
"krunner",
"kservice",
"kded",
"ksvg",
"ktexttemplate",
"kunitconversion",
"kuserfeedback",
"kwidgetsaddons",
"kpeople",
"kjobwidgets",
"kdeclarative",
"kconfigwidgets",
"kiconthemes",
"kcompletion",
"kbookmarks",
"kwindowsystem",
"kwallet",
"kstatusnotifieritem",
"kauth",
"kxmlgui",
"modemmanager-qt",
"networkmanager-qt",
"prison",
"solid",
"kio",
"kparts",
"knotifyconfig",
"kdav",
"kcmutils",
"purpose",
"baloo",
"sonnet",
"qqc2-desktop-style",
"ktextwidgets",
"syndication",
"knewstuff",
"frameworkintegration",
"syntax-highlighting",
"ktexteditor",
"threadweaver",
]
}

70
jobs/plasma-add.json5 Normal file
View File

@@ -0,0 +1,70 @@
{
"repo": "gremlins",
"increment": false,
"packages": [
"breeze-grub",
"breeze-plymouth",
"layer-shell-qt",
"discover",
"flatpak-kcm",
"kactivitymanagerd",
"kde-cli-tools",
"kdecoration",
"kde-gtk-config",
"breeze",
"breeze-gtk",
"aurorae",
"kgamma",
"kglobalacceld",
"kmenuedit",
"kpipewire",
"krdp",
"ksshaskpass",
"kwallet-pam",
"kwayland",
"kwayland-integration",
"kwrited",
"libkscreen",
"libksysguard",
"ksystemstats",
"ocean-sound-theme",
"oxygen-sounds",
"plasma-activities",
"libplasma",
"oxygen",
"milou",
"kscreenlocker",
"bluedevil",
"plasma-activities-stats",
"plasma-firewall",
"plasma-systemmonitor",
"plasma-thunderbolt",
"plasma-workspace-wallpapers",
"plasma5support",
"plasma-sdk",
"kscreen",
"plymouth-kcm",
"polkit-kde-agent",
"print-manager",
"qqc2-breeze-style",
"sddm-kcm",
"systemsettings",
"kinfocenter",
"plasma-disks",
"wacomtablet",
"xdg-desktop-portal-kde",
"plasma-integration",
"kwin",
"kwin-x11",
"plasma-workspace",
"powerdevil",
"plasma-vault",
"plasma-pa",
"plasma-nm",
"plasma-welcome",
"plasma-desktop",
"plasma-browser-integration",
"kdeplasma-addons",
"spectacle",
]
}

70
jobs/plasma-move.json5 Normal file
View File

@@ -0,0 +1,70 @@
{
"source": "gremlins",
"repo": "stable",
"packages": [
"breeze-grub",
"breeze-plymouth",
"layer-shell-qt",
"discover",
"flatpak-kcm",
"kactivitymanagerd",
"kde-cli-tools",
"kdecoration",
"kde-gtk-config",
"breeze",
"breeze-gtk",
"aurorae",
"kgamma",
"kglobalacceld",
"kmenuedit",
"kpipewire",
"krdp",
"ksshaskpass",
"kwallet-pam",
"kwayland",
"kwayland-integration",
"kwrited",
"libkscreen",
"libksysguard",
"ksystemstats",
"ocean-sound-theme",
"oxygen-sounds",
"plasma-activities",
"libplasma",
"oxygen",
"milou",
"kscreenlocker",
"bluedevil",
"plasma-activities-stats",
"plasma-firewall",
"plasma-systemmonitor",
"plasma-thunderbolt",
"plasma-workspace-wallpapers",
"plasma5support",
"plasma-sdk",
"kscreen",
"plymouth-kcm",
"polkit-kde-agent",
"print-manager",
"qqc2-breeze-style",
"sddm-kcm",
"systemsettings",
"kinfocenter",
"plasma-disks",
"wacomtablet",
"xdg-desktop-portal-kde",
"plasma-integration",
"kwin",
"kwin-x11",
"plasma-workspace",
"powerdevil",
"plasma-vault",
"plasma-pa",
"plasma-nm",
"plasma-welcome",
"plasma-desktop",
"plasma-browser-integration",
"kdeplasma-addons",
"spectacle",
]
}

838
package-lock.json generated
View File

@@ -1,18 +1,19 @@
{ {
"name": "artix-metro", "name": "artix-metro",
"version": "3.0.0", "version": "3.1.5",
"lockfileVersion": 2, "lockfileVersion": 2,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "artix-metro", "name": "artix-metro",
"version": "3.0.0", "version": "3.1.5",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"artix-checkupdates": "1.0.1", "artix-checkupdates": "1.0.2",
"cli-color": "2.0.4", "cli-color": "2.0.4",
"glob": "11.0.2",
"json5": "2.2.3", "json5": "2.2.3",
"ky": "1.7.4" "ky": "1.8.1"
}, },
"bin": { "bin": {
"artix-metro": "bin/artix-metro.mjs" "artix-metro": "bin/artix-metro.mjs"
@@ -20,8 +21,25 @@
"devDependencies": { "devDependencies": {
"@sindresorhus/tsconfig": "7.0.0", "@sindresorhus/tsconfig": "7.0.0",
"@types/cli-color": "2.0.6", "@types/cli-color": "2.0.6",
"@types/node": "22.10.7", "@types/node": "22.15.14",
"typescript": "5.7.3" "typescript": "5.8.3"
}
},
"node_modules/@isaacs/cliui": {
"version": "8.0.2",
"resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
"integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
"license": "ISC",
"dependencies": {
"string-width": "^5.1.2",
"string-width-cjs": "npm:string-width@^4.2.0",
"strip-ansi": "^7.0.1",
"strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
"wrap-ansi": "^8.1.0",
"wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
},
"engines": {
"node": ">=12"
} }
}, },
"node_modules/@sindresorhus/tsconfig": { "node_modules/@sindresorhus/tsconfig": {
@@ -45,21 +63,60 @@
"license": "MIT" "license": "MIT"
}, },
"node_modules/@types/node": { "node_modules/@types/node": {
"version": "22.10.7", "version": "22.15.14",
"resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.7.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.14.tgz",
"integrity": "sha512-V09KvXxFiutGp6B7XkpaDXlNadZxrzajcY50EuoLIpQ6WWYCSvf19lVIazzfIzQvhUN2HjX12spLojTnhuKlGg==", "integrity": "sha512-BL1eyu/XWsFGTtDWOYULQEs4KR0qdtYfCxYAUYRoB7JP7h9ETYLgQTww6kH8Sj2C0pFGgrpM0XKv6/kbIzYJ1g==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"undici-types": "~6.20.0" "undici-types": "~6.21.0"
}
},
"node_modules/ansi-regex": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
"integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
"license": "MIT",
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://github.com/chalk/ansi-regex?sponsor=1"
}
},
"node_modules/ansi-styles": {
"version": "6.2.1",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
"integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
"license": "MIT",
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
} }
}, },
"node_modules/artix-checkupdates": { "node_modules/artix-checkupdates": {
"version": "1.0.1", "version": "1.0.2",
"resolved": "https://registry.npmjs.org/artix-checkupdates/-/artix-checkupdates-1.0.1.tgz", "resolved": "https://registry.npmjs.org/artix-checkupdates/-/artix-checkupdates-1.0.2.tgz",
"integrity": "sha512-C0AxI3SfoUUekYg3ft/y4+tRjIe8uuDLvBQRSmkfNsRuBLNlEHaxhY/93JB6G4AGXp5RFLZYDnbgjakgbTLhkw==", "integrity": "sha512-VTLeMVysGeZ3QiLtEyWoVM8D57YyeYhYQoL3vcW9b0dZE+zhE4di80PYEFGeQzIBcCStcBFnI1uSBoAEHMVHAQ==",
"license": "MIT" "license": "MIT"
}, },
"node_modules/balanced-match": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
"license": "MIT"
},
"node_modules/brace-expansion": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
"integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
"license": "MIT",
"dependencies": {
"balanced-match": "^1.0.0"
}
},
"node_modules/cli-color": { "node_modules/cli-color": {
"version": "2.0.4", "version": "2.0.4",
"resolved": "https://registry.npmjs.org/cli-color/-/cli-color-2.0.4.tgz", "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-2.0.4.tgz",
@@ -75,6 +132,38 @@
"node": ">=0.10" "node": ">=0.10"
} }
}, },
"node_modules/color-convert": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"license": "MIT",
"dependencies": {
"color-name": "~1.1.4"
},
"engines": {
"node": ">=7.0.0"
}
},
"node_modules/color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"license": "MIT"
},
"node_modules/cross-spawn": {
"version": "7.0.6",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
"integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
"license": "MIT",
"dependencies": {
"path-key": "^3.1.0",
"shebang-command": "^2.0.0",
"which": "^2.0.1"
},
"engines": {
"node": ">= 8"
}
},
"node_modules/d": { "node_modules/d": {
"version": "1.0.1", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz",
@@ -84,6 +173,18 @@
"type": "^1.0.1" "type": "^1.0.1"
} }
}, },
"node_modules/eastasianwidth": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
"integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
"license": "MIT"
},
"node_modules/emoji-regex": {
"version": "9.2.2",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
"integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
"license": "MIT"
},
"node_modules/es5-ext": { "node_modules/es5-ext": {
"version": "0.10.64", "version": "0.10.64",
"resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz", "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz",
@@ -170,11 +271,80 @@
"resolved": "https://registry.npmjs.org/type/-/type-2.6.0.tgz", "resolved": "https://registry.npmjs.org/type/-/type-2.6.0.tgz",
"integrity": "sha512-eiDBDOmkih5pMbo9OqsqPRGMljLodLcwd5XD5JbtNB0o89xZAwynY9EdCDsJU7LtcVCClu9DvM7/0Ep1hYX3EQ==" "integrity": "sha512-eiDBDOmkih5pMbo9OqsqPRGMljLodLcwd5XD5JbtNB0o89xZAwynY9EdCDsJU7LtcVCClu9DvM7/0Ep1hYX3EQ=="
}, },
"node_modules/foreground-child": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz",
"integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==",
"license": "ISC",
"dependencies": {
"cross-spawn": "^7.0.0",
"signal-exit": "^4.0.1"
},
"engines": {
"node": ">=14"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/glob": {
"version": "11.0.2",
"resolved": "https://registry.npmjs.org/glob/-/glob-11.0.2.tgz",
"integrity": "sha512-YT7U7Vye+t5fZ/QMkBFrTJ7ZQxInIUjwyAjVj84CYXqgBdv30MFUPGnBR6sQaVq6Is15wYJUsnzTuWaGRBhBAQ==",
"license": "ISC",
"dependencies": {
"foreground-child": "^3.1.0",
"jackspeak": "^4.0.1",
"minimatch": "^10.0.0",
"minipass": "^7.1.2",
"package-json-from-dist": "^1.0.0",
"path-scurry": "^2.0.0"
},
"bin": {
"glob": "dist/esm/bin.mjs"
},
"engines": {
"node": "20 || >=22"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/is-fullwidth-code-point": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/is-promise": { "node_modules/is-promise": {
"version": "2.2.2", "version": "2.2.2",
"resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz",
"integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==" "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ=="
}, },
"node_modules/isexe": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
"integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
"license": "ISC"
},
"node_modules/jackspeak": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.0.2.tgz",
"integrity": "sha512-bZsjR/iRjl1Nk1UkjGpAzLNfQtzuijhn2g+pbZb98HQ1Gk8vM9hfbxeMBP+M2/UUdwj0RqGG3mlvk2MsAqwvEw==",
"license": "BlueOak-1.0.0",
"dependencies": {
"@isaacs/cliui": "^8.0.2"
},
"engines": {
"node": "20 || >=22"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/json5": { "node_modules/json5": {
"version": "2.2.3", "version": "2.2.3",
"resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
@@ -187,9 +357,9 @@
} }
}, },
"node_modules/ky": { "node_modules/ky": {
"version": "1.7.4", "version": "1.8.1",
"resolved": "https://registry.npmjs.org/ky/-/ky-1.7.4.tgz", "resolved": "https://registry.npmjs.org/ky/-/ky-1.8.1.tgz",
"integrity": "sha512-zYEr/gh7uLW2l4su11bmQ2M9xLgQLjyvx58UyNM/6nuqyWFHPX5ktMjvpev3F8QWdjSsHUpnWew4PBCswBNuMQ==", "integrity": "sha512-7Bp3TpsE+L+TARSnnDpk3xg8Idi8RwSLdj6CMbNWoOARIrGrbuLGusV0dYwbZOm4bB3jHNxSw8Wk/ByDqJEnDw==",
"license": "MIT", "license": "MIT",
"engines": { "engines": {
"node": ">=18" "node": ">=18"
@@ -198,6 +368,15 @@
"url": "https://github.com/sindresorhus/ky?sponsor=1" "url": "https://github.com/sindresorhus/ky?sponsor=1"
} }
}, },
"node_modules/lru-cache": {
"version": "11.0.2",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.0.2.tgz",
"integrity": "sha512-123qHRfJBmo2jXDbo/a5YOQrJoHF/GNQTLzQ5+IdK5pWpceK17yRc6ozlWd25FxvGKQbIUs91fDFkXmDHTKcyA==",
"license": "ISC",
"engines": {
"node": "20 || >=22"
}
},
"node_modules/lru-queue": { "node_modules/lru-queue": {
"version": "0.1.0", "version": "0.1.0",
"resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz",
@@ -221,11 +400,195 @@
"timers-ext": "^0.1.7" "timers-ext": "^0.1.7"
} }
}, },
"node_modules/minimatch": {
"version": "10.0.1",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz",
"integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==",
"license": "ISC",
"dependencies": {
"brace-expansion": "^2.0.1"
},
"engines": {
"node": "20 || >=22"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/minipass": {
"version": "7.1.2",
"resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
"integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
"license": "ISC",
"engines": {
"node": ">=16 || 14 >=14.17"
}
},
"node_modules/next-tick": { "node_modules/next-tick": {
"version": "1.1.0", "version": "1.1.0",
"resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz",
"integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ=="
}, },
"node_modules/package-json-from-dist": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz",
"integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==",
"license": "BlueOak-1.0.0"
},
"node_modules/path-key": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
"integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/path-scurry": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz",
"integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==",
"license": "BlueOak-1.0.0",
"dependencies": {
"lru-cache": "^11.0.0",
"minipass": "^7.1.2"
},
"engines": {
"node": "20 || >=22"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/shebang-command": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
"integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
"license": "MIT",
"dependencies": {
"shebang-regex": "^3.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/shebang-regex": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
"integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/signal-exit": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
"integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
"license": "ISC",
"engines": {
"node": ">=14"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/string-width": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
"integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
"license": "MIT",
"dependencies": {
"eastasianwidth": "^0.2.0",
"emoji-regex": "^9.2.2",
"strip-ansi": "^7.0.1"
},
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/string-width-cjs": {
"name": "string-width",
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
"license": "MIT",
"dependencies": {
"emoji-regex": "^8.0.0",
"is-fullwidth-code-point": "^3.0.0",
"strip-ansi": "^6.0.1"
},
"engines": {
"node": ">=8"
}
},
"node_modules/string-width-cjs/node_modules/ansi-regex": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/string-width-cjs/node_modules/emoji-regex": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
"license": "MIT"
},
"node_modules/string-width-cjs/node_modules/strip-ansi": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
"license": "MIT",
"dependencies": {
"ansi-regex": "^5.0.1"
},
"engines": {
"node": ">=8"
}
},
"node_modules/strip-ansi": {
"version": "7.1.0",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
"integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
"license": "MIT",
"dependencies": {
"ansi-regex": "^6.0.1"
},
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://github.com/chalk/strip-ansi?sponsor=1"
}
},
"node_modules/strip-ansi-cjs": {
"name": "strip-ansi",
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
"license": "MIT",
"dependencies": {
"ansi-regex": "^5.0.1"
},
"engines": {
"node": ">=8"
}
},
"node_modules/strip-ansi-cjs/node_modules/ansi-regex": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/timers-ext": { "node_modules/timers-ext": {
"version": "0.1.7", "version": "0.1.7",
"resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz", "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz",
@@ -241,9 +604,9 @@
"integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg=="
}, },
"node_modules/typescript": { "node_modules/typescript": {
"version": "5.7.3", "version": "5.8.3",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz",
"integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==",
"dev": true, "dev": true,
"license": "Apache-2.0", "license": "Apache-2.0",
"bin": { "bin": {
@@ -255,14 +618,133 @@
} }
}, },
"node_modules/undici-types": { "node_modules/undici-types": {
"version": "6.20.0", "version": "6.21.0",
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz",
"integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==",
"dev": true, "dev": true,
"license": "MIT" "license": "MIT"
},
"node_modules/which": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
"integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
"license": "ISC",
"dependencies": {
"isexe": "^2.0.0"
},
"bin": {
"node-which": "bin/node-which"
},
"engines": {
"node": ">= 8"
}
},
"node_modules/wrap-ansi": {
"version": "8.1.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
"integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
"license": "MIT",
"dependencies": {
"ansi-styles": "^6.1.0",
"string-width": "^5.0.1",
"strip-ansi": "^7.0.1"
},
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://github.com/chalk/wrap-ansi?sponsor=1"
}
},
"node_modules/wrap-ansi-cjs": {
"name": "wrap-ansi",
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
"integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
"license": "MIT",
"dependencies": {
"ansi-styles": "^4.0.0",
"string-width": "^4.1.0",
"strip-ansi": "^6.0.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/chalk/wrap-ansi?sponsor=1"
}
},
"node_modules/wrap-ansi-cjs/node_modules/ansi-regex": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/wrap-ansi-cjs/node_modules/ansi-styles": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"license": "MIT",
"dependencies": {
"color-convert": "^2.0.1"
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
"node_modules/wrap-ansi-cjs/node_modules/emoji-regex": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
"license": "MIT"
},
"node_modules/wrap-ansi-cjs/node_modules/string-width": {
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
"license": "MIT",
"dependencies": {
"emoji-regex": "^8.0.0",
"is-fullwidth-code-point": "^3.0.0",
"strip-ansi": "^6.0.1"
},
"engines": {
"node": ">=8"
}
},
"node_modules/wrap-ansi-cjs/node_modules/strip-ansi": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
"license": "MIT",
"dependencies": {
"ansi-regex": "^5.0.1"
},
"engines": {
"node": ">=8"
}
} }
}, },
"dependencies": { "dependencies": {
"@isaacs/cliui": {
"version": "8.0.2",
"resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
"integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
"requires": {
"string-width": "^5.1.2",
"string-width-cjs": "npm:string-width@^4.2.0",
"strip-ansi": "^7.0.1",
"strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
"wrap-ansi": "^8.1.0",
"wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
}
},
"@sindresorhus/tsconfig": { "@sindresorhus/tsconfig": {
"version": "7.0.0", "version": "7.0.0",
"resolved": "https://registry.npmjs.org/@sindresorhus/tsconfig/-/tsconfig-7.0.0.tgz", "resolved": "https://registry.npmjs.org/@sindresorhus/tsconfig/-/tsconfig-7.0.0.tgz",
@@ -276,18 +758,41 @@
"dev": true "dev": true
}, },
"@types/node": { "@types/node": {
"version": "22.10.7", "version": "22.15.14",
"resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.7.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.14.tgz",
"integrity": "sha512-V09KvXxFiutGp6B7XkpaDXlNadZxrzajcY50EuoLIpQ6WWYCSvf19lVIazzfIzQvhUN2HjX12spLojTnhuKlGg==", "integrity": "sha512-BL1eyu/XWsFGTtDWOYULQEs4KR0qdtYfCxYAUYRoB7JP7h9ETYLgQTww6kH8Sj2C0pFGgrpM0XKv6/kbIzYJ1g==",
"dev": true, "dev": true,
"requires": { "requires": {
"undici-types": "~6.20.0" "undici-types": "~6.21.0"
} }
}, },
"ansi-regex": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
"integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA=="
},
"ansi-styles": {
"version": "6.2.1",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
"integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug=="
},
"artix-checkupdates": { "artix-checkupdates": {
"version": "1.0.1", "version": "1.0.2",
"resolved": "https://registry.npmjs.org/artix-checkupdates/-/artix-checkupdates-1.0.1.tgz", "resolved": "https://registry.npmjs.org/artix-checkupdates/-/artix-checkupdates-1.0.2.tgz",
"integrity": "sha512-C0AxI3SfoUUekYg3ft/y4+tRjIe8uuDLvBQRSmkfNsRuBLNlEHaxhY/93JB6G4AGXp5RFLZYDnbgjakgbTLhkw==" "integrity": "sha512-VTLeMVysGeZ3QiLtEyWoVM8D57YyeYhYQoL3vcW9b0dZE+zhE4di80PYEFGeQzIBcCStcBFnI1uSBoAEHMVHAQ=="
},
"balanced-match": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
},
"brace-expansion": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
"integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
"requires": {
"balanced-match": "^1.0.0"
}
}, },
"cli-color": { "cli-color": {
"version": "2.0.4", "version": "2.0.4",
@@ -301,6 +806,29 @@
"timers-ext": "^0.1.7" "timers-ext": "^0.1.7"
} }
}, },
"color-convert": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"requires": {
"color-name": "~1.1.4"
}
},
"color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
},
"cross-spawn": {
"version": "7.0.6",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
"integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
"requires": {
"path-key": "^3.1.0",
"shebang-command": "^2.0.0",
"which": "^2.0.1"
}
},
"d": { "d": {
"version": "1.0.1", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz",
@@ -310,6 +838,16 @@
"type": "^1.0.1" "type": "^1.0.1"
} }
}, },
"eastasianwidth": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
"integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA=="
},
"emoji-regex": {
"version": "9.2.2",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
"integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="
},
"es5-ext": { "es5-ext": {
"version": "0.10.64", "version": "0.10.64",
"resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz", "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz",
@@ -393,20 +931,65 @@
} }
} }
}, },
"foreground-child": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz",
"integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==",
"requires": {
"cross-spawn": "^7.0.0",
"signal-exit": "^4.0.1"
}
},
"glob": {
"version": "11.0.2",
"resolved": "https://registry.npmjs.org/glob/-/glob-11.0.2.tgz",
"integrity": "sha512-YT7U7Vye+t5fZ/QMkBFrTJ7ZQxInIUjwyAjVj84CYXqgBdv30MFUPGnBR6sQaVq6Is15wYJUsnzTuWaGRBhBAQ==",
"requires": {
"foreground-child": "^3.1.0",
"jackspeak": "^4.0.1",
"minimatch": "^10.0.0",
"minipass": "^7.1.2",
"package-json-from-dist": "^1.0.0",
"path-scurry": "^2.0.0"
}
},
"is-fullwidth-code-point": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="
},
"is-promise": { "is-promise": {
"version": "2.2.2", "version": "2.2.2",
"resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz",
"integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==" "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ=="
}, },
"isexe": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
"integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="
},
"jackspeak": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.0.2.tgz",
"integrity": "sha512-bZsjR/iRjl1Nk1UkjGpAzLNfQtzuijhn2g+pbZb98HQ1Gk8vM9hfbxeMBP+M2/UUdwj0RqGG3mlvk2MsAqwvEw==",
"requires": {
"@isaacs/cliui": "^8.0.2"
}
},
"json5": { "json5": {
"version": "2.2.3", "version": "2.2.3",
"resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
"integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==" "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="
}, },
"ky": { "ky": {
"version": "1.7.4", "version": "1.8.1",
"resolved": "https://registry.npmjs.org/ky/-/ky-1.7.4.tgz", "resolved": "https://registry.npmjs.org/ky/-/ky-1.8.1.tgz",
"integrity": "sha512-zYEr/gh7uLW2l4su11bmQ2M9xLgQLjyvx58UyNM/6nuqyWFHPX5ktMjvpev3F8QWdjSsHUpnWew4PBCswBNuMQ==" "integrity": "sha512-7Bp3TpsE+L+TARSnnDpk3xg8Idi8RwSLdj6CMbNWoOARIrGrbuLGusV0dYwbZOm4bB3jHNxSw8Wk/ByDqJEnDw=="
},
"lru-cache": {
"version": "11.0.2",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.0.2.tgz",
"integrity": "sha512-123qHRfJBmo2jXDbo/a5YOQrJoHF/GNQTLzQ5+IdK5pWpceK17yRc6ozlWd25FxvGKQbIUs91fDFkXmDHTKcyA=="
}, },
"lru-queue": { "lru-queue": {
"version": "0.1.0", "version": "0.1.0",
@@ -431,11 +1014,124 @@
"timers-ext": "^0.1.7" "timers-ext": "^0.1.7"
} }
}, },
"minimatch": {
"version": "10.0.1",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz",
"integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==",
"requires": {
"brace-expansion": "^2.0.1"
}
},
"minipass": {
"version": "7.1.2",
"resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
"integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="
},
"next-tick": { "next-tick": {
"version": "1.1.0", "version": "1.1.0",
"resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz",
"integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ=="
}, },
"package-json-from-dist": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz",
"integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw=="
},
"path-key": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
"integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="
},
"path-scurry": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz",
"integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==",
"requires": {
"lru-cache": "^11.0.0",
"minipass": "^7.1.2"
}
},
"shebang-command": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
"integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
"requires": {
"shebang-regex": "^3.0.0"
}
},
"shebang-regex": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
"integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="
},
"signal-exit": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
"integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="
},
"string-width": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
"integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
"requires": {
"eastasianwidth": "^0.2.0",
"emoji-regex": "^9.2.2",
"strip-ansi": "^7.0.1"
}
},
"string-width-cjs": {
"version": "npm:string-width@4.2.3",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
"requires": {
"emoji-regex": "^8.0.0",
"is-fullwidth-code-point": "^3.0.0",
"strip-ansi": "^6.0.1"
},
"dependencies": {
"ansi-regex": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="
},
"emoji-regex": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
},
"strip-ansi": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
"requires": {
"ansi-regex": "^5.0.1"
}
}
}
},
"strip-ansi": {
"version": "7.1.0",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
"integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
"requires": {
"ansi-regex": "^6.0.1"
}
},
"strip-ansi-cjs": {
"version": "npm:strip-ansi@6.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
"requires": {
"ansi-regex": "^5.0.1"
},
"dependencies": {
"ansi-regex": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="
}
}
},
"timers-ext": { "timers-ext": {
"version": "0.1.7", "version": "0.1.7",
"resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz", "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz",
@@ -451,16 +1147,82 @@
"integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg=="
}, },
"typescript": { "typescript": {
"version": "5.7.3", "version": "5.8.3",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz",
"integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==",
"dev": true "dev": true
}, },
"undici-types": { "undici-types": {
"version": "6.20.0", "version": "6.21.0",
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz",
"integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==",
"dev": true "dev": true
},
"which": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
"integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
"requires": {
"isexe": "^2.0.0"
}
},
"wrap-ansi": {
"version": "8.1.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
"integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
"requires": {
"ansi-styles": "^6.1.0",
"string-width": "^5.0.1",
"strip-ansi": "^7.0.1"
}
},
"wrap-ansi-cjs": {
"version": "npm:wrap-ansi@7.0.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
"integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
"requires": {
"ansi-styles": "^4.0.0",
"string-width": "^4.1.0",
"strip-ansi": "^6.0.0"
},
"dependencies": {
"ansi-regex": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="
},
"ansi-styles": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"requires": {
"color-convert": "^2.0.1"
}
},
"emoji-regex": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
},
"string-width": {
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
"requires": {
"emoji-regex": "^8.0.0",
"is-fullwidth-code-point": "^3.0.0",
"strip-ansi": "^6.0.1"
}
},
"strip-ansi": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
"requires": {
"ansi-regex": "^5.0.1"
}
}
}
} }
} }
} }

View File

@@ -1,6 +1,6 @@
{ {
"name": "artix-metro", "name": "artix-metro",
"version": "3.0.0", "version": "3.1.5",
"description": "Automate pushing packages to Artix", "description": "Automate pushing packages to Artix",
"keywords": [ "keywords": [
"artix", "artix",
@@ -13,7 +13,8 @@
}, },
"files": [ "files": [
"distribution", "distribution",
"bin" "bin",
"completion"
], ],
"author": { "author": {
"name": "Cory Sanin", "name": "Cory Sanin",
@@ -30,15 +31,16 @@
}, },
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"artix-checkupdates": "1.0.1", "artix-checkupdates": "1.0.2",
"cli-color": "2.0.4", "cli-color": "2.0.4",
"ky": "1.7.4", "ky": "1.8.1",
"json5": "2.2.3" "json5": "2.2.3",
"glob": "11.0.2"
}, },
"devDependencies": { "devDependencies": {
"typescript": "5.7.3", "typescript": "5.8.3",
"@sindresorhus/tsconfig": "7.0.0", "@sindresorhus/tsconfig": "7.0.0",
"@types/cli-color": "2.0.6", "@types/cli-color": "2.0.6",
"@types/node": "22.10.7" "@types/node": "22.15.14"
} }
} }

View File

@@ -30,14 +30,16 @@ function removeQuotes(str: string) {
class ArtoolsConfReader { class ArtoolsConfReader {
async readConf(): Promise<ArtoolsConf> { async readConf(silent: boolean = false): Promise<ArtoolsConf> {
const primaryLocation = path.join(os.homedir(), '.config', 'artools', 'artools-pkg.conf'); const primaryLocation = path.join(os.homedir(), '.config', 'artools', 'artools-pkg.conf');
const systemConf = path.join('/', 'etc', 'artools', 'artools-pkg.conf'); const systemConf = path.join('/', 'etc', 'artools', 'artools-pkg.conf');
try { try {
return await this.readConfFile(primaryLocation); return await this.readConfFile(primaryLocation);
} }
catch (ex) { catch (ex) {
console.error(`artools config at "${primaryLocation}" could not be read. ${ex}\nUsing system config "${systemConf}" instead.`); if (!silent) {
console.error(`artools config at "${primaryLocation}" could not be read. ${ex}\nUsing system config "${systemConf}" instead.`);
}
return await this.readConfFile(systemConf); return await this.readConfFile(systemConf);
} }
} }

View File

@@ -1,7 +1,7 @@
import ky from 'ky'; import ky from 'ky';
import { snooze } from './snooze.mjs'; import { snooze } from './snooze.mjs';
type CiStatus = "pending" | "success" | "error" | "failure"; type CiStatus = "pending" | "success" | "error" | "failure" | "";
interface GiteaConfig { interface GiteaConfig {
protocol?: string; protocol?: string;
@@ -16,7 +16,12 @@ interface Commit {
interface Status { interface Status {
sha: string; sha: string;
state: CiStatus state: CiStatus;
}
interface Hook {
active: boolean;
id: number;
} }
class Gitea { class Gitea {
@@ -95,7 +100,43 @@ class Gitea {
} }
} }
async getHooks(...args: string[]): Promise<Hook[]> {
try {
let headers: HeadersInit = {};
if (this._token) {
headers['Authorization'] = `token ${this._token}`
}
const resp = await ky.get(`${this.getUrlPrefix()}/repos/${args.join('/')}/hooks`, {
headers
});
return await resp.json();
}
catch (err) {
throw err;
}
}
async sendTestWebhook(...args: string[]): Promise<void> {
try {
let headers: HeadersInit = {};
if (this._token) {
headers['Authorization'] = `token ${this._token}`
}
const hook = (await this.getHooks(...args)).find(hook => hook.active === true);
if (!hook) {
throw new Error('No active webhook found');
}
await ky.post(`${this.getUrlPrefix()}/repos/${args.join('/')}/hooks/${hook.id}/tests`, {
headers
});
}
catch (err) {
throw err;
}
}
async waitForBuild(lastHash: string, ...args: string[]): Promise<void> { async waitForBuild(lastHash: string, ...args: string[]): Promise<void> {
let missingStatusCount = 0;
while (true) { while (true) {
let status: Status | null; let status: Status | null;
try { try {
@@ -108,7 +149,15 @@ class Gitea {
await snooze(30000); await snooze(30000);
continue; continue;
} }
if (status.sha !== lastHash) { if (!status.sha && !status.state) {
if (++missingStatusCount > 3) {
console.log('No build info detected. Sending test webhook...');
missingStatusCount = 0;
await this.sendTestWebhook(...args);
}
await snooze(30000);
}
else if (status.sha !== lastHash) {
if (status.state === 'success') { if (status.state === 'success') {
break; break;
} }

View File

@@ -1,16 +1,24 @@
import * as fsp from 'node:fs/promises'; import * as fsp from 'node:fs/promises';
import * as readline from 'node:readline/promises'; import * as readline from 'node:readline/promises';
import path from 'node:path';
import clc from 'cli-color'; import clc from 'cli-color';
import JSON5 from 'json5'; import JSON5 from 'json5';
import { Writable } from 'stream'; import { Writable } from 'stream';
import { glob } from 'glob'
import { Pusher } from './pusher.mjs'; import { Pusher } from './pusher.mjs';
import { isPasswordRequired } from './runCommand.mjs';
import { ArtoolsConfReader, DefaultConf } from './artoolsconf.mjs';
import type { Job, ArtixpkgRepo } from './pusher.mts'; import type { Job, ArtixpkgRepo } from './pusher.mts';
import type { ArtoolsConf } from './artoolsconf.mts';
/** /**
* Prompts the user to input their GPG password via stdin * Prompts the user to input their GPG password via stdin
* @returns a promise that resolves the password * @returns a promise that resolves the password
*/ */
async function getGpgPass() { async function getGpgPass() {
if ((process.env['SKIPGPGPASSPROMPT'] || '').toLowerCase() === 'true') {
return 'SKIP';
}
let muted = false; let muted = false;
let mutableStdout = new Writable({ let mutableStdout = new Writable({
write: function (chunk, encoding, callback) { write: function (chunk, encoding, callback) {
@@ -20,6 +28,11 @@ async function getGpgPass() {
callback(); callback();
} }
}); });
if (! await isPasswordRequired()) {
console.log(clc.green('Looks like GPG agent is currently running and password is cached. '
+ 'If there is no timeout on your cached password, you can simply press enter.\n'
+ 'To skip this GPG password prompt next time, set $SKIPGPGPASSPROMPT to true'));
}
let rl = readline.createInterface({ let rl = readline.createInterface({
input: process.stdin, input: process.stdin,
output: mutableStdout, output: mutableStdout,
@@ -34,7 +47,16 @@ async function getGpgPass() {
return password; return password;
} }
async function expandGlob(workspace: string, globby: string): Promise<string[]> {
return (await glob(path.join(globby, 'README.md'), {
cwd: path.join(workspace, 'artixlinux'),
maxDepth: 2
})).map(p => path.dirname(p));
}
async function artixMetro() { async function artixMetro() {
let artoolsConf: ArtoolsConf = DefaultConf;
let completion: boolean = false;
let job: Partial<Job> = { let job: Partial<Job> = {
increment: false, increment: false,
packages: [] packages: []
@@ -55,6 +77,29 @@ async function artixMetro() {
const iPlus = i + 1; const iPlus = i + 1;
const args = process.argv; const args = process.argv;
switch (true) { switch (true) {
case (arg === '--completion') && iPlus < args.length:
const comm = args[iPlus] as string;
completion = skipOne = true;
switch (comm) {
case ('pkgbase'):
(new ArtoolsConfReader()).readConf(true).then(async (conf) => {
try {
console.log(
(await fsp.readdir(path.join(conf.workspace, 'artixlinux'), { withFileTypes: true }))
.filter(dirent => dirent.isDirectory())
.map(dirent => dirent.name).join(' '));
process.exit(0);
}
catch {
process.exit(1);
}
})
break;
default:
console.error(`command "${comm}" not recognized`)
break;
}
break;
case (arg === '--job' || arg === '-j') && iPlus < args.length: case (arg === '--job' || arg === '-j') && iPlus < args.length:
if (jobfile) { if (jobfile) {
console.error(`multiple jobfiles provided. aborting.`); console.error(`multiple jobfiles provided. aborting.`);
@@ -102,6 +147,10 @@ async function artixMetro() {
} }
}); });
if (completion) {
return;
}
if (helpFlag || (!jobfile && !job.repo)) { if (helpFlag || (!jobfile && !job.repo)) {
console.log([ console.log([
`\nUsage: artix-metro [OPTIONS] [commands]...`, `\nUsage: artix-metro [OPTIONS] [commands]...`,
@@ -122,6 +171,13 @@ async function artixMetro() {
process.exit(0); process.exit(0);
} }
try {
artoolsConf = await (new ArtoolsConfReader()).readConf();
}
catch (ex) {
console.error(ex);
}
if (jobfile) { if (jobfile) {
try { try {
job = JSON5.parse((await fsp.readFile(jobfile)).toString()); job = JSON5.parse((await fsp.readFile(jobfile)).toString());
@@ -132,6 +188,13 @@ async function artixMetro() {
process.exit(4); process.exit(4);
} }
} }
else if (job.packages) {
const expanded: string[] = [];
for (let i = 0; i < (job.packages.length || 0); i++) {
(await expandGlob(artoolsConf.workspace, job.packages[i] as string)).forEach(p => expanded.push(p));
}
job.packages = expanded;
}
if (startPkg && job.packages) { if (startPkg && job.packages) {
const startPos = job.packages.indexOf(startPkg); const startPos = job.packages.indexOf(startPkg);
@@ -139,11 +202,15 @@ async function artixMetro() {
} }
})(); })();
if (completion) {
return;
}
console.log('artix-metro - Developed by Cory Sanin\n');
let pusher = new Pusher({ let pusher = new Pusher({
gpgpass: process.env['GPGPASS'] || (await getGpgPass()) || '' gpgpass: process.env['GPGPASS'] || (await getGpgPass()) || ''
}); }, artoolsConf);
console.log('artix-metro\nCory Sanin\n');
try { try {
await pusher.runJob(job as Job); await pusher.runJob(job as Job);
@@ -156,4 +223,4 @@ async function artixMetro() {
} }
export default artixMetro; export default artixMetro;
export { artixMetro }; export { artixMetro, expandGlob };

View File

@@ -4,11 +4,11 @@ import * as readline from 'node:readline/promises';
import clc from 'cli-color'; import clc from 'cli-color';
import path from 'node:path'; import path from 'node:path';
import os from 'node:os'; import os from 'node:os';
import { spawn } from 'node:child_process';
import { Checkupdates } from 'artix-checkupdates'; import { Checkupdates } from 'artix-checkupdates';
import { Gitea } from './gitea.mjs' import { Gitea } from './gitea.mjs'
import { ArtoolsConfReader, DefaultConf } from './artoolsconf.mjs'; import { DefaultConf } from './artoolsconf.mjs';
import { snooze } from './snooze.mjs'; import { snooze } from './snooze.mjs';
import { runCommand, isPasswordRequired } from './runCommand.mjs';
import type { ArtixRepo } from 'artix-checkupdates'; import type { ArtixRepo } from 'artix-checkupdates';
import type { ArtoolsConf } from './artoolsconf.mts'; import type { ArtoolsConf } from './artoolsconf.mts';
@@ -26,22 +26,8 @@ interface Job extends Partial<ArtoolsConf> {
} }
const PACKAGE_ORG = 'packages'; const PACKAGE_ORG = 'packages';
const SIGNATUREEXPIRY = 30000;//in ms
const SIGNFILE = path.join(os.tmpdir(), 'signfile'); const SIGNFILE = path.join(os.tmpdir(), 'signfile');
/**
* Run a command (as a promise).
* @param command command to run
* @param args args to pass
* @returns true if success
*/
function runCommand(command: string, args: string[] = []): Promise<boolean> {
return new Promise((res, _) => {
let proc = spawn(command, args, { stdio: ['ignore', process.stdout, process.stderr] });
proc.on('exit', code => res(code === 0));
});
}
/** /**
* Formats text to be sent as a parameter to some command * Formats text to be sent as a parameter to some command
* @param param * @param param
@@ -54,40 +40,36 @@ function escapeCommandParam(param: string) {
class Pusher { class Pusher {
private _gitea: Gitea | null; private _gitea: Gitea | null;
private _lastSign: number = 0;
private _config: PusherConfig; private _config: PusherConfig;
private _artools: ArtoolsConf; private _artools: ArtoolsConf;
private _constructed: Promise<void>; private _createdSignfile: boolean;
constructor(config: PusherConfig = {}) { constructor(config: PusherConfig = {}, artoolsConf: ArtoolsConf = DefaultConf) {
this._gitea = null; this._gitea = null;
this._artools = DefaultConf this._artools = artoolsConf;
this._config = config; this._config = config;
this._constructed = (async () => { this._createdSignfile = false;
try { this._gitea = new Gitea({
this._artools = await (new ArtoolsConfReader()).readConf(); token: this._artools.giteaToken || ''
this._gitea = new Gitea({ });
token: this._artools.giteaToken || ''
});
}
catch (ex) {
this._artools = DefaultConf
console.error(ex);
}
})();
} }
async refreshGpg() { async refreshGpg() {
let currentTime = (new Date()).getTime(); const sshSignMode = 'SSHKEYSIGN' in process.env;
if (this._config.gpgpass && currentTime - this._lastSign > SIGNATUREEXPIRY) { if (sshSignMode || await isPasswordRequired()) {
console.log(clc.cyan('Refreshing signature...')); console.log(clc.cyan('Refreshing signature...'));
await runCommand('touch', [SIGNFILE]); this._createdSignfile ||= await runCommand('touch', [SIGNFILE]);
await runCommand('gpg', ['-a', '--passphrase', escapeCommandParam(this._config.gpgpass), '--batch', '--pinentry-mode', 'loopback', '--detach-sign', SIGNFILE]); if (sshSignMode) {
await fsp.rm(`${SIGNFILE}.asc`); await runCommand('ssh-keygen', ['-Y', 'sign', '-f', path.resolve(process.env['SSHKEYSIGN'] as string), '-n', ' git', SIGNFILE]);
this._lastSign = currentTime; }
else {
await runCommand('gpg', ['-a', '--passphrase', escapeCommandParam(this._config.gpgpass || ''), '--batch', '--pinentry-mode', 'loopback', '--detach-sign', SIGNFILE]);
}
await fsp.rm(`${SIGNFILE}.${sshSignMode ? 'sig' : 'asc'}`)
} }
} }
increment(pkg: string): Promise<void> { increment(pkg: string): Promise<void> {
return new Promise(async (res, _) => { return new Promise(async (res, _) => {
const pkgbuild = path.join(this._artools.workspace, 'artixlinux', pkg, 'PKGBUILD'); const pkgbuild = path.join(this._artools.workspace, 'artixlinux', pkg, 'PKGBUILD');
@@ -141,7 +123,6 @@ class Pusher {
} }
async runJob(job: Job) { async runJob(job: Job) {
await this._constructed;
const checkupdates = new Checkupdates(); const checkupdates = new Checkupdates();
const gitea = this._gitea as Gitea; const gitea = this._gitea as Gitea;
@@ -159,7 +140,7 @@ class Pusher {
} }
console.log(clc.yellowBright('Running artix-checkupdates')); console.log(clc.yellowBright('Running artix-checkupdates'));
const actionable = job.increment ? job.packages : (await (!!job.source ? checkupdates.fetchMovable() : checkupdates.fetchUpgradable())).map(res => res.basename); const actionable = job.increment ? job.packages : (await (!!job.source ? checkupdates.fetchLooseMovable() : checkupdates.fetchUpgradable())).map(res => res.basename);
// order is IMPORTANT. Must be BLOCKING. // order is IMPORTANT. Must be BLOCKING.
for (let i = 0; i < (job.packages || []).length; i++) { for (let i = 0; i < (job.packages || []).length; i++) {
@@ -214,11 +195,13 @@ class Pusher {
} }
} }
console.log(clc.greenBright('SUCCESS: All packages built')); console.log(clc.greenBright('SUCCESS: All packages built'));
try { if (this._createdSignfile) {
await fsp.rm(SIGNFILE); try {
} await fsp.rm(SIGNFILE);
catch { }
console.error(clc.red('failed to remove temp signfile')); catch {
console.error(clc.red('failed to remove temp signfile'));
}
} }
} }
} }

43
src/runCommand.mts Normal file
View File

@@ -0,0 +1,43 @@
import { spawn } from 'node:child_process';
import type { SpawnOptions } from 'node:child_process';
/**
* Run a command (as a promise).
* @param command command to run
* @param args args to pass
* @returns promise that yields true if success
*/
function runCommand(command: string, args: string[] = [], stdOutToLogs: boolean = true): Promise<boolean> {
return new Promise((res, _) => {
const opts: SpawnOptions = {stdio: stdOutToLogs ? ['pipe', 'inherit', 'inherit'] : 'pipe'};
const proc = spawn(command, args, opts);
proc.on('exit', code => res(code === 0));
});
}
/**
* Check if password input is necessary for signing
* @returns promise that yieds true if password is required
*/
function isPasswordRequired(): Promise<boolean> {
return new Promise(async (res, _) => {
if (! await runCommand('gpg-agent', [], false)) {
return res(true);
}
const proc = spawn('gpg-connect-agent', ['KEYINFO --list', '/bye'], { stdio: 'pipe' });
let outputstr = '';
proc.stdout.on('data', data => {
outputstr += data.toString();
});
proc.on('exit', async () => {
const keyinfo = outputstr.split('\n').filter(l => l.includes('KEYINFO'));
res(!keyinfo.find(l => {
const tokens = l.split(' ');
return tokens[0] === 'S' && tokens[1] === 'KEYINFO' && tokens[3] === 'D' && tokens[6] === '1';
}));
});
});
}
export default runCommand;
export { runCommand, isPasswordRequired };

View File

@@ -1,8 +1,8 @@
#!/bin/bash #!/bin/bash
read -s -p "Enter your GPG password: " GPGPASS read -s -p "Enter your GPG password: " GPGPASS
export GPGPASS export GPGPASS
node index.js --job jobs/kde-01.json5 \ artix-metro --job jobs/kde-add.json5 \
&& node index.js --job jobs/kde-02-push.json && artix-metro --job jobs/kde-move.json5
./notify.sh ./notify.sh
GPGPASS="" GPGPASS=""