yank-note
The flagged 'yarn add -D' in prepare() installs a dev dependency directly, but it's part of building the project from source using its own tooling and declared workflow, not an undeclared external execution or supply-chain attack.
Triggered rules
llm_review
The static rules flagged this MEDIUM, but an AI model (qwen/qwen3-235b-a22b-2507) reviewed the full PKGBUILD and judged it LOW (confidence 95%): The flagged 'yarn add -D' in prepare() installs a dev dependency directly, but it's part of building the project from source using its own tooling and declared workflow, not an undeclared external execution or supply-chain attack.
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:123
yarn add -D "@types/tar-stream"
PKGBUILD
1 offending line(s) highlighted# Maintainer: zxp19821005 <zxp19821005 at 163 dot com>
pkgname=yank-note
_pkgname='Yank Note'
pkgver=3.93.0
_electronversion=41
_nodeversion=22
pkgrel=1
pkgdesc='A Hackable Markdown Note Application for Programmers.'
arch=('x86_64')
url="https://yank-note.com/"
_ghurl="https://github.com/purocean/yn"
license=('AGPL-3.0-only')
conflicts=("${pkgname}")
depends=(
"electron${_electronversion}"
'python'
'ripgrep'
'java-runtime'
)
makedepends=(
'gendesk'
'npm'
'yarn'
'nvm'
'curl'
'git'
'python'
'jq'
)
source=(
"${pkgname}.git::git+${_ghurl}#tag=v${pkgver}"
"${pkgname}.sh"
)
sha256sums=('796894840e537436d10ebbc29ff3b9ab4eada7a59959f39aef6c6037fcc4bdf2'
'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"
}
_get_app_dir() {
find "${srcdir}" -type d -name "node_modules" -prune -o -type f -name "resources.pak" -print0 | xargs -0 dirname | head -n 1
}
_set_build_env() {
export ELECTRON_DIST="/usr/lib/electron${_electronversion}"
export ELECTRON_OVERRIDE_DIST_PATH="${ELECTRON_DIST}"
export ELECTRON_SKIP_BINARY_DOWNLOAD=1
export SYSTEM_ELECTRON_VERSION="$(electron${_electronversion} -v | sed 's/^v//')"
export HOME="${srcdir}/.electron-gyp"
export XDG_CACHE_HOME="${srcdir}/.cache"
export XDG_CONFIG_HOME="${srcdir}/.config"
export XDG_DATA_HOME="${srcdir}/.local/share"
export YARN_CACHE_FOLDER="${srcdir}/.yarn/cache"
export YARN_NETWORK_CONCURRENCY=32
export COREPACK_NPM_REGISTRY="${COREPACK_NPM_REGISTRY:-${NPM_CONFIG_REGISTRY:-https://registry.npmjs.org}}"
export COREPACK_HOME="${srcdir}/.corepack"
export npm_config_registry="${NPM_CONFIG_REGISTRY:-https://registry.npmjs.org}"
local _yarnver _yarnmajor=0
_yarnver="$(node -p "require('./package.json').packageManager?.split('@')[1]?.split('-')[0] || ''" 2>/dev/null)"
_yarnmajor="${_yarnver%%.*}"
_yarnmajor="${_yarnmajor:-0}"
if [[ "${_yarnmajor}" -ge 2 ]] 2>/dev/null || [[ -f .yarnrc.yml ]]; then
export XDG_STATE_HOME="${srcdir}/.local/state"
export YARN_ENABLE_GLOBAL_CACHE=false
export YARN_ENABLE_MIRROR=false
export YARN_GLOBAL_FOLDER="${srcdir}/.yarn/berry"
export YARN_NODE_LINKER=node-modules
export YARN_NM_MODE=hardlinks-local
export YARN_ENABLE_TELEMETRY=false
export YARN_ENABLE_SCRIPTS=true
export YARN_HTTP_TIMEOUT=600000
export YARN_HTTP_RETRY=5
export YARN_NPM_REGISTRY_SERVER="${YARN_NPM_REGISTRY_SERVER:-${NPM_CONFIG_REGISTRY:-https://registry.yarnpkg.com}}"
mkdir -p "${HOME}" "${YARN_CACHE_FOLDER}" "${YARN_GLOBAL_FOLDER}" "${COREPACK_HOME}"
else
export YARN_GLOBAL_FOLDER="${srcdir}/.yarn/global"
export YARN_LINK_FOLDER="${srcdir}/.yarn/link"
export YARN_TEMP_FOLDER="${srcdir}/.yarn/tmp"
export YARN_NETWORK_TIMEOUT=600000
export YARN_CHILD_CONCURRENCY="$(nproc)"
export YARN_FROZEN_LOCKFILE=true
export YARN_IGNORE_ENGINES=true
export YARN_PRODUCTION=false
mkdir -p "${HOME}" "${YARN_CACHE_FOLDER}" "${YARN_GLOBAL_FOLDER}" "${YARN_LINK_FOLDER}" "${YARN_TEMP_FOLDER}" "${COREPACK_HOME}"
fi
local _reg="${NPM_CONFIG_REGISTRY:-https://registry.yarnpkg.com}"
_reg="${_reg%/}"
if [[ -f .yarnrc ]]; then
sed -i "s|^registry .*|registry \"${_reg}\"|" .yarnrc
fi
if [[ -f yarn.lock ]] && grep -q 'resolved "https://registry.yarnpkg.com' yarn.lock; then
sed -i "s|https://registry.yarnpkg.com/|${_reg}/|g" yarn.lock
fi
}
prepare() {
cd "${srcdir}/${pkgname}.git"
_get_electron_version
sed -i -e "
s/@electronversion@/${_electronversion}/
s/@appname@/${pkgname}/
s/@runname@/app.asar/
s/@cfgdirname@/${pkgname//-/.}/
" "${srcdir}/${pkgname}.sh"
gendesk -q -f -n \
--pkgname="${pkgname}" \
--pkgdesc="${pkgdesc}" \
--categories="Utility" \
--name="${_pkgname}" \
--exec="${pkgname} %U"
_ensure_local_nvm
_set_build_env
sed -i "s/\"electron\": \"[^\"]*\"/\"electron\": \"${SYSTEM_ELECTRON_VERSION}\"/" package.json
sed -i "s/icon\.icns/icon\.png/" electron-builder.json
export NODE_ENV=development
yarn install
yarn add -D "@types/tar-stream"
}
build() {
cd "${srcdir}/${pkgname}.git"
_ensure_local_nvm
_set_build_env
export NODE_ENV=production
yarn run electron-rebuild
yarn node scripts/download-pandoc.js
yarn node scripts/download-plantuml.js
yarn run build
yarn electron-builder --linux dir -c.electronDist="${ELECTRON_DIST}" --config electron-builder.json
local _app_dir=$(_get_app_dir)
ln -sf "/usr/bin/rg" "${_app_dir}/resources/app.asar.unpacked/node_modules/@vscode/ripgrep/bin/rg"
}
package() {
install -Dm755 "${srcdir}/${pkgname}.sh" "${pkgdir}/usr/bin/${pkgname}"
install -Dm755 -d "${pkgdir}/usr/lib/${pkgname}"
local _app_dir=$(_get_app_dir)
cp -a "${_app_dir}/resources/." "${pkgdir}/usr/lib/${pkgname}/"
install -Dm644 "${srcdir}/${pkgname}.git/${pkgname}.desktop" -t "${pkgdir}/usr/share/applications"
install -Dm644 "${srcdir}/${pkgname%-git}.git/build/icon.png" "${pkgdir}/usr/share/pixmaps/${pkgname%-git}.png"
install -Dm644 "${srcdir}/${pkgname}.git/src/main/assets/icon.png" "${pkgdir}/usr/share/pixmaps/${pkgname}.png"
install -Dm644 "${srcdir}/${pkgname}.git/LICENSE" -t "${pkgdir}/usr/share/licenses/${pkgname}"
}
Scan history
| Scanned at (UTC) | Severity | Rules |
|---|---|---|
| 2026-11-01 00:21:48 | Low | 2 |
| 2026-10-31 00:07:41 | Low | 2 |
| 2026-10-30 00:29:30 | Low | 2 |
| 2026-10-29 00:13:55 | Low | 2 |
| 2026-10-28 00:06:54 | Low | 2 |
| 2026-10-27 00:23:28 | Low | 2 |
| 2026-10-26 00:12:40 | Low | 2 |
| 2026-10-25 00:20:48 | Low | 2 |
| 2026-10-24 00:14:55 | Low | 2 |
| 2026-10-23 00:02:19 | Low | 2 |
| 2026-10-22 00:13:10 | Low | 2 |
| 2026-10-21 00:12:50 | Low | 2 |
| 2026-10-20 00:10:31 | Low | 2 |
| 2026-10-19 00:03:55 | Low | 2 |
| 2026-10-18 00:06:55 | Low | 2 |
| 2026-10-17 00:21:55 | Low | 2 |
| 2026-10-16 00:12:47 | Low | 2 |
| 2026-10-15 00:28:05 | Low | 2 |
| 2026-10-14 00:06:47 | Low | 2 |
| 2026-10-13 00:23:45 | Low | 2 |