gnome-shell-extension-mosaic
Triggered rules
llm_review
The static rules flagged this HIGH, but an AI model (anthropic/claude-4.6-sonnet-20260217) reviewed the full PKGBUILD and judged it LOW (confidence 85%): This PKGBUILD is a legitimate GNOME Shell extension that uses nvm to install a specific Node.js version and npm to fetch typescript@5.7.3 as a build-time dependency for compiling TypeScript source. The pattern is common for GNOME extensions using TypeScript. The source tarball is fetched from the official GitHub repository with a pinned version tag and a sha256 checksum. The npm cache is sandboxed to srcdir. The only real concern is that typescript@5.7.3 is fetched without a lockfile or checksum verification, which is sloppy packaging but not malicious - typescript is a well-known Microsoft package from the official npm registry. No obfuscation, no exfiltration, no payload execution, no source substitution. The cheaper model's HIGH rating is a false positive; the actual risk is low (non-standard but not dangerous packaging practice).
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:49
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
pkgver=1.6.3
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'
)
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=('cf9045bfc7fadd52b9f750fabd525786af082f44d4001330facf24b29c126607'
'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
}
build() {
cd "gnome-mosaic-$pkgver"
export npm_config_cache="$srcdir/npm_cache"
export PATH="node_modules/.bin:${PATH}"
_ensure_local_nvm
make compile
}
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}/"
install -Dvm644 schemas/*.xml -t "$pkgdir/usr/share/glib-2.0/schemas/"
rm -rfv "$pkgdir/usr/share/gnome-shell/extensions/${_uuid}/schemas"
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/"
}
Scan history
| Scanned at (UTC) | Severity | Rules |
|---|---|---|
| 2026-08-03 00:08:14 | LOW | 2 |
| 2026-08-02 00:16:08 | LOW | 2 |
| 2026-08-01 00:11:18 | LOW | 2 |
| 2026-07-31 00:14:10 | LOW | 2 |
| 2026-07-30 00:17:23 | LOW | 2 |
| 2026-07-29 00:25:53 | LOW | 2 |
| 2026-07-28 00:07:28 | LOW | 2 |
| 2026-07-27 00:24:32 | LOW | 2 |
| 2026-07-26 00:07:32 | LOW | 2 |
| 2026-07-25 00:13:44 | LOW | 2 |
| 2026-07-24 00:02:28 | LOW | 2 |
| 2026-07-23 00:14:47 | LOW | 2 |
| 2026-07-22 00:29:32 | LOW | 2 |
| 2026-07-21 00:24:15 | LOW | 2 |
| 2026-07-20 00:19:49 | LOW | 2 |
| 2026-07-19 00:17:08 | LOW | 2 |
| 2026-07-18 00:14:48 | LOW | 2 |
| 2026-07-17 00:06:16 | LOW | 2 |
| 2026-07-16 00:05:41 | LOW | 2 |
| 2026-07-15 00:09:25 | LOW | 2 |