gnome-shell-extension-mosaic
The flagged pattern is `npm install typescript@5.7.3` in the prepare() step. This installs a specific pinned version of TypeScript from the npm registry as a build-time dependency (used for compilation via `make compile`). This is a common and legitimate pattern in AUR packages that build TypeScript-based GNOME extensions. The package source is fetched from the official GitHub repository via a tagged release tarball with a declared sha256sum. The npm_config_cache is redirected to srcdir to avoid polluting the system. TypeScript is a well-known, widely-used Microsoft-maintained package. The nvm usage is also a recognized AUR pattern for managing Node.js versions in a sandboxed way. No obfuscation, no remote code execution, no exfiltration, no attacker-controlled hosts. The only concern is that npm install fetches from the network without a lockfile checksum verification, which is a minor supply-chain hygiene issue but not malicious.
Triggered rules
llm_review
The static rules flagged this HIGH, but an AI model (anthropic/claude-sonnet-4.6) reviewed the full PKGBUILD and judged it LOW (confidence 85%): The flagged pattern is `npm install typescript@5.7.3` in the prepare() step. This installs a specific pinned version of TypeScript from the npm registry as a build-time dependency (used for compilation via `make compile`). This is a common and legitimate pattern in AUR packages that build TypeScript-based GNOME extensions. The package source is fetched from the official GitHub repository via a tagged release tarball with a declared sha256sum. The npm_config_cache is redirected to srcdir to avoid polluting the system. TypeScript is a well-known, widely-used Microsoft-maintained package. The nvm usage is also a recognized AUR pattern for managing Node.js versions in a sandboxed way. No obfuscation, no remote code execution, no exfiltration, no attacker-controlled hosts. The only concern is that npm install fetches from the network without a lockfile checksum verification, which is a minor supply-chain hygiene issue but not malicious.
1 higher static finding superseded - not the current verdict (shown for transparency)
npm_install_external
Runs `npm/yarn/pnpm install <package>` for a package not in source=(), pulling unpinned, unreviewed code at build time.
-
PKGBUILD:51
npm install typescript@5.7.3
PKGBUILD
1 offending line(s) highlighted# Maintainer: Mark Wagie <mark dot wagie at proton dot me>
pkgname=gnome-shell-extension-mosaic
_app_id=com.github.jardon.gnome-mosaic
pkgver=1.7.0
pkgrel=1
_nodeversion=20
pkgdesc="GNOME window tiling extension"
arch=('any')
url="https://github.com/jardon/gnome-mosaic"
license=('GPL-3.0-or-later')
depends=(
'gnome-shell'
'xorg-xprop'
)
makedepends=(
'jq'
'nvm'
)
checkdepends=('desktop-file-utils')
optdepends=('gnome-shell-extensions: for Native Window Placment extension')
source=("gnome-mosaic-$pkgver.tar.gz::$url/archive/refs/tags/$pkgver.tar.gz"
'50_org.gnome.desktop.wm.keybindings.gnome-mosiac.gschema.override'
'50_org.gnome.mutter.keybindings.gnome-mosaic.gschema.override'
'50_org.gnome.mutter.wayland.keybindings.gnome-mosaic.gschema.override'
'50_org.gnome.settings-daemon.plugins.media-keys.gnome-mosaic.gschema.override'
'50_org.gnome.shell.keybindings.gnome-mosaic.gschema.override')
sha256sums=('4479469a413e2d91eb0d9bce4d69e678dc822651074033ab6ee233fba2b55bb6'
'484bf48f12d2fa503c27ed34f6d190edb94ec844a0b49c6ff1bda872081e6b64'
'f98115fbf502394ffb2eb2a38452a743ab087eadef7e009c62e93ee15c9f3849'
'd3a4ac86303c9065fd76dace64283573079c3bdce4b9a2ca18be5f103eb6fd4c'
'a6ed6eed9fba7ab0668caa5cb93f56152cd90e1047b4bdfd76dc5b5f8862b6fd'
'7ebe94923b20c2bfc2382945ad635620f1b460c06e01694bb57074625414547e')
_ensure_local_nvm() {
# let's be sure we are starting clean
which nvm >/dev/null 2>&1 && nvm deactivate && nvm unload
export NVM_DIR="${srcdir}/.nvm"
# The init script returns 3 if version specified
# in ./.nvmrc is not (yet) installed in $NVM_DIR
# but nvm itself still gets loaded ok
source /usr/share/nvm/init-nvm.sh || [[ $? != 1 ]]
}
prepare() {
cd "gnome-mosaic-$pkgver"
_ensure_local_nvm
nvm install "${_nodeversion}"
export npm_config_cache="$srcdir/npm_cache"
npm install typescript@5.7.3
# Extension path
sed -i 's|~/.local|/usr|g' "${_app_id}-exceptions.desktop"
}
build() {
cd "gnome-mosaic-$pkgver"
export npm_config_cache="$srcdir/npm_cache"
export PATH="node_modules/.bin:${PATH}"
_ensure_local_nvm
make compile
make translations
}
check() {
cd "gnome-mosaic-$pkgver"
desktop-file-validate "${_app_id}-exceptions.desktop"
}
package() {
cd "gnome-mosaic-$pkgver"
_uuid=$(jq -r .uuid metadata.json)
install -d "$pkgdir/usr/share/gnome-shell/extensions/${_uuid}"
cp -rv _build/* "$pkgdir/usr/share/gnome-shell/extensions/${_uuid}/"
mv -v "$pkgdir/usr/share/gnome-shell/extensions/${_uuid}/locale" "$pkgdir/usr/share"
install -Dvm644 schemas/*.xml -t "$pkgdir/usr/share/glib-2.0/schemas/"
rm -rfv "$pkgdir/usr/share/gnome-shell/extensions/${_uuid}/schemas"
install -Dvm644 "${_app_id}-exceptions.desktop" -t \
"$pkgdir/usr/share/applications/"
install -Dvm644 icons/mosaic-logo.svg \
"$pkgdir/usr/share/icons/hicolor/scalable/apps/${_app_id}-exceptions.svg"
install -Dvm644 keybindings/*.xml -t "$pkgdir/usr/share/gnome-control-center/keybindings/"
install -Dvm644 SHORTCUTS.md -t "$pkgdir/usr/share/doc/$pkgname/"
install -Dvm644 "$srcdir"/*.gnome-mosaic.gschema.override -t \
"$pkgdir/usr/share/glib-2.0/schemas/"
}
Changes since previous scan
--- PKGBUILD @ 2026-09-13 00:19+++ PKGBUILD @ 2026-09-17 00:27@@ -1,6 +1,7 @@ # Maintainer: Mark Wagie <mark dot wagie at proton dot me> pkgname=gnome-shell-extension-mosaic-pkgver=1.6.5+_app_id=com.github.jardon.gnome-mosaic+pkgver=1.7.0 pkgrel=1 _nodeversion=20 pkgdesc="GNOME window tiling extension"@@ -15,6 +16,7 @@ 'jq' 'nvm' )+checkdepends=('desktop-file-utils') optdepends=('gnome-shell-extensions: for Native Window Placment extension') source=("gnome-mosaic-$pkgver.tar.gz::$url/archive/refs/tags/$pkgver.tar.gz" '50_org.gnome.desktop.wm.keybindings.gnome-mosiac.gschema.override'@@ -22,7 +24,7 @@ '50_org.gnome.mutter.wayland.keybindings.gnome-mosaic.gschema.override' '50_org.gnome.settings-daemon.plugins.media-keys.gnome-mosaic.gschema.override' '50_org.gnome.shell.keybindings.gnome-mosaic.gschema.override')-sha256sums=('fffcfebd6d18abf0dae639e337cac65975d1ec076e47d4ec774619c30407e3bd'+sha256sums=('4479469a413e2d91eb0d9bce4d69e678dc822651074033ab6ee233fba2b55bb6' '484bf48f12d2fa503c27ed34f6d190edb94ec844a0b49c6ff1bda872081e6b64' 'f98115fbf502394ffb2eb2a38452a743ab087eadef7e009c62e93ee15c9f3849' 'd3a4ac86303c9065fd76dace64283573079c3bdce4b9a2ca18be5f103eb6fd4c'@@ -47,6 +49,9 @@ export npm_config_cache="$srcdir/npm_cache" npm install typescript@5.7.3++ # Extension path+ sed -i 's|~/.local|/usr|g' "${_app_id}-exceptions.desktop" } build() {@@ -55,6 +60,12 @@ export PATH="node_modules/.bin:${PATH}" _ensure_local_nvm make compile+ make translations+}++check() {+ cd "gnome-mosaic-$pkgver"+ desktop-file-validate "${_app_id}-exceptions.desktop" } package() {@@ -64,9 +75,16 @@ install -d "$pkgdir/usr/share/gnome-shell/extensions/${_uuid}" cp -rv _build/* "$pkgdir/usr/share/gnome-shell/extensions/${_uuid}/" + mv -v "$pkgdir/usr/share/gnome-shell/extensions/${_uuid}/locale" "$pkgdir/usr/share"+ install -Dvm644 schemas/*.xml -t "$pkgdir/usr/share/glib-2.0/schemas/" rm -rfv "$pkgdir/usr/share/gnome-shell/extensions/${_uuid}/schemas" + install -Dvm644 "${_app_id}-exceptions.desktop" -t \+ "$pkgdir/usr/share/applications/"+ install -Dvm644 icons/mosaic-logo.svg \+ "$pkgdir/usr/share/icons/hicolor/scalable/apps/${_app_id}-exceptions.svg"+ install -Dvm644 keybindings/*.xml -t "$pkgdir/usr/share/gnome-control-center/keybindings/" install -Dvm644 SHORTCUTS.md -t "$pkgdir/usr/share/doc/$pkgname/" install -Dvm644 "$srcdir"/*.gnome-mosaic.gschema.override -t \Scan history
| Scanned at (UTC) | Severity | Rules |
|---|---|---|
| 2026-09-17 00:27:14 | Low | 2 |
| 2026-09-16 00:03:17 | Low | 2 |
| 2026-09-15 00:25:31 | Low | 2 |
| 2026-09-14 15:17:35 | High | 1 |
| 2026-09-14 00:27:57 | Low | 2 |
| 2026-09-13 17:17:16 | Low | 2 |
| 2026-09-13 17:14:56 | High | 1 |
| 2026-09-13 00:19:54 | Low | 2 |
| 2026-09-12 00:25:17 | Low | 2 |
| 2026-09-11 00:19:22 | Low | 2 |
| 2026-09-10 00:22:44 | Low | 2 |
| 2026-09-09 00:04:09 | Low | 2 |
| 2026-09-08 00:18:08 | Low | 2 |
| 2026-09-07 00:30:15 | Low | 2 |
| 2026-09-06 00:17:06 | Low | 2 |
| 2026-09-05 00:16:27 | Low | 2 |
| 2026-09-04 00:03:13 | Low | 2 |
| 2026-09-03 00:15:47 | Low | 2 |
| 2026-09-02 00:02:31 | Low | 2 |
| 2026-09-01 00:11:19 | Low | 2 |