wubi-dict-editor
Triggered rules
llm_review
The static rules flagged this MEDIUM, but an AI model (anthropic/claude-4.6-sonnet-20260217) reviewed the full PKGBUILD and judged it LOW (confidence 80%): The `yarn add -D @electron-forge/plugin-local-electron` installs a well-known, official package from the @electron-forge scope on the standard npm registry. This is a legitimate, widely-used Electron tooling package maintained by the Electron Forge project. The pattern of dynamically adding it during prepare() rather than declaring it in package.json is sloppy packaging practice, but @electron-forge/plugin-local-electron is not an unofficial or personal package — it is the standard mechanism for using a system-installed Electron binary with electron-forge. The source itself is pulled from the official GitHub repo via a tagged release. There is no binary from an unofficial host, no obfuscation, and no exfiltration. The main concern is that npm packages are fetched at build time without pinned checksums, which is a general AUR concern but not specific to this package. This is low severity: sloppy but not a meaningful supply-chain risk beyond what any yarn/npm-based AUR package carries.
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. Severity downgraded: the package declares/looks like a Node.js consumer, where build-time installs are expected.
-
PKGBUILD:94
NODE_ENV=development yarn add -D @electron-forge/plugin-local-electron
PKGBUILD
1 offending line(s) highlighted# Maintainer: zxp19821005 <zxp19821005 at 163 dot com>
pkgname=wubi-dict-editor
_zhname='五笔码表助手'
pkgver=1.32
_electronversion=28
_nodeversion=20
pkgrel=1
pkgdesc="Five-stroke code assistant for Rime based on electron development.(Use syetem-wide electron)五笔码表助手 for Rime,基于 electron 开发."
arch=('x86_64')
url="https://github.com/KyleBing/wubi-dict-editor"
license=('GPL-3.0-only')
conflicts=("${pkgname}")
depends=(
#'ibus-rime'
"electron${_electronversion}"
'nodejs'
)
makedepends=(
'npm'
'yarn'
'nvm'
'gendesk'
'libicns'
'curl'
'git'
'jq'
)
options=(
'!emptydirs'
)
source=(
"${pkgname}-${pkgver}::git+${url}#tag=v${pkgver}"
"${pkgname}.sh"
)
sha256sums=('be322533ecca90d5c087919f0ce0e9e94baaed9a4bcf41b78eaeb95d3184e83b'
'a774c2f54fbbeeaac3cefc0f7250796d30c86d27f0fd40b7eaf9c0fdb021623d')
_ensure_local_nvm() {
local NVM_DIR="${srcdir}/.nvm"
source /usr/share/nvm/init-nvm.sh || [[ $? != 1 ]]
nvm install "${_nodeversion}"
nvm use "${_nodeversion}"
}
_get_electron_version() {
_elec_ver=$(find "${srcdir}" -maxdepth 5 -name "package.json" ! -path "*/node_modules/*" \
-exec grep -l '"electron"' {} + | xargs -I{} jq -r '(.devDependencies.electron // .dependencies.electron) // empty' {} 2>/dev/null | head -1)
[[ -z "${_elec_ver}" ]] && return 1
echo -e "The electron version is: \033[1;31m${_elec_ver%%.*}\033[0m"
}
prepare() {
cd "${srcdir}/${pkgname}-${pkgver}"
_get_electron_version
sed -i -e "
s/@electronversion@/${_electronversion}/g
s/@appname@/${pkgname}/g
s/@runname@/app/g
s/@cfgdirname@/${pkgname}/g
" "${srcdir}/${pkgname}.sh"
gendesk -q -f -n \
--pkgname="${pkgname}" \
--pkgdesc="${pkgdesc}" \
--categories="Utility" \
--name="${pkgname}" \
--genericname="${_zhname} for Rime" \
--exec="${pkgname} %U" \
--custom="Name[zh_CN]=${_zhname}"
export ELECTRON_SKIP_BINARY_DOWNLOAD=1
export SYSTEM_ELECTRON_VERSION="$(electron${_electronversion} -v | sed 's/v//g')"
local HOME="${srcdir}/.electron-gyp"
mkdir -p "${srcdir}/.electron-gyp"
if [[ "$(curl -s ipinfo.io/country)" == *"CN"* ]]; then
{
export YARN_REGISTRY="https://registry.npmmirror.com"
export ELECTRON_MIRROR="https://registry.npmmirror.com/-/binary/electron/"
export ELECTRON_BUILDER_BINARIES_MIRROR="https://registry.npmmirror.com/-/binary/electron-builder-binaries/"
export NODEJS_ORG_MIRROR="https://npmmirror.com/mirrors/node"
export YARN_CACHE_FOLDER="${srcdir}/.yarn/cache"
export YARN_PLUGINS_FOLDER="${srcdir}/.yarn/plugins"
export YARN_GLOBAL_FOLDER="${srcdir}/.yarn/global"
export YARN_USE_HARDLINKS=true
# export YARN_BUILD_FROM_SOURCE=true
export YARN_LINK_WORKSPACE_PACKAGES=true
export YARN_FETCH_RETRIES=3
export YARN_FETCH_RETRY_TIMEOUT=10000
export YARN_NETWORK_CONCURRENCY=32
}
find ./ -type f -name "yarn.lock" -exec sed -i "s/registry.yarnpkg.com/registry.npmmirror.com/g;s/registry.npmjs.org/registry.npmmirror.com/g" {} +
find ./ -type f -name "package-lock.json" -exec sed -i "s/registry.npmjs.org/registry.npmmirror.com/g" {} +
fi
_ensure_local_nvm
icns2png -d 32 -x assets/img/appIcon/appIcon.icns -o assets/img/appIcon/
cp assets/img/appIcon/appIcon_16x16x32.png assets/img/appIcon/appicon.png
sed -i "s/appIcon\/appicon\ico/img\/appIcon\/appicon\.png/g" main.js
NODE_ENV=development yarn install --cache-folder "${srcdir}/.yarn_cache"
NODE_ENV=development yarn add -D @electron-forge/plugin-local-electron
}
build() {
cd "${srcdir}/${pkgname}-${pkgver}"
_ensure_local_nvm
export ELECTRON_SKIP_BINARY_DOWNLOAD=1
local electronDist="/usr/lib/electron${_electronversion}"
sed -i '/makers: \[/i\
plugins: [\
{\
name: "@electron-forge/plugin-local-electron",\
config: {\
electronPath: "'"${electronDist}"'",\
},\
},\
],' forge.config.*
NODE_ENV=production yarn run package
}
package() {
install -Dm755 "${srcdir}/${pkgname}.sh" "${pkgdir}/usr/bin/${pkgname}"
install -Dm755 -d "${pkgdir}/usr/lib/${pkgname}"
local _app_dir=$(find "${srcdir}" -type f -name "resources.pak" ! -path "*/node_modules/*" -exec dirname {} + | head -n 1)
cp -a "${_app_dir}/resources/". "${pkgdir}/usr/lib/${pkgname}/"
_icon_sizes=(16x16 32x32 256x256 512x512 1024x1024)
for _icons in "${_icon_sizes[@]}";do
install -Dm644 "${srcdir}/${pkgname}-${pkgver}/assets/img/appIcon/appIcon_${_icons}x32.png" \
"${pkgdir}/usr/share/icons/hicolor/${_icons}/app/${pkgname}.png"
done
install -Dm644 "${srcdir}/${pkgname}-${pkgver}/${pkgname}.desktop" -t "${pkgdir}/usr/share/applications"
install -Dm644 "${srcdir}/${pkgname}-${pkgver}/LICENSE" -t "${pkgdir}/usr/share/licenses/${pkgname}"
}
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 |