Skip to content

Instantly share code, notes, and snippets.

@alexkli
Last active November 11, 2025 16:34
Show Gist options
  • Select an option

  • Save alexkli/47435174f5bdfa92fe66803cb8d463e7 to your computer and use it in GitHub Desktop.

Select an option

Save alexkli/47435174f5bdfa92fe66803cb8d463e7 to your computer and use it in GitHub Desktop.
Node.js script to scan for compromised npm dependencies (Shai Hulud and others)

Update #2 September 23, 2025: Updated the csv files based on snyk.io sources as of today:

  • The shai hulud csv is updated with new dependencies and no longer includes the qix attack dependencies.
  • The qix csv is updated with new dependencies found.

Update September 23, 2025: Updated the script to fix a critical bug where it did not detect scoped packages (such as @art-ws/di-node) in project lockfiles.


Scan for compromised npm dependencies

This minimal Node.js script scan-npm-deps.js scans your local computer for compromised packages.

It scans all project files (npm and yarn) in all subdirectories, global npm caches and global paths in all nvm versions. It also inspects Dockerfiles, CI configs, and vendored folders for embedded vulnerabilities.

Usage

Download the files, then run this in your $HOME folder or root folder underneath you have all your javascript projects:

node scan-npm-deps.js unsafe-npm-packages-shai-hulud-snyk-2025-09-23.csv

Attached are dependency lists to use it with:

CSV Description
unsafe-npm-packages-shai-hulud-snyk-2025-09-23.csv Shai Hulud Supply Chain Attack originating September 15, 2025

Critical exploit that attempts to steal secrets (developer environment secrets and tokens, CI/CD and cloud secrets and possibly more)
unsafe-npm-packages-qix-debug-chalk-2025-09-10.csv qix debug chalk Supply Chain Attack originating September 8, 2025

This exploit targets crypto wallet transactions happening on the local machine.

Example Output:

🔍 Scanning for compromised NPM packages

📋 Reading package list...
   512 packages

🔒 Scanning project lockfiles and package.json...
   2 lockfiles

🐳 Scanning Dockerfiles...
   1 Dockerfiles

⚙️  Scanning CI/CD config files...
   1 CI config files

📁 Scanning vendored folders...

📦 Scanning global npm caches...
   1855 files to check in /Users/alex/.npm/_cacache
   ...checked 497/1855 files in /Users/alex/.npm/_cacache
   ...checked 688/1855 files in /Users/alex/.npm/_cacache
   ...checked 811/1855 files in /Users/alex/.npm/_cacache

📦 Scanning Yarn global cache...

📦 Scanning pnpm global store...

🧠 Scanning NVM-managed Node versions...
   2 node versions
   4673 files to check in /Users/alex/.nvm/versions/node/v22.19.0
   ...checked 4/4673 files in /Users/alex/.nvm/versions/node/v22.19.0
   5034 files to check in /Users/alex/.nvm/versions/node/v24.8.0
   ...checked 4/5034 files in /Users/alex/.nvm/versions/node/v24.8.0
   ...checked 4270/5034 files in /Users/alex/.nvm/versions/node/v24.8.0

✅ No compromised packages found.

If compromised packages are found (made up example):

...

❌ Compromised packages found:

📁 project1
     Resolved @art-ws/http-server@2.0.21 in project1/package-lock.json

📁 project2
     Resolved wrap-ansi@9.0.1 in project2/package-lock.json

Notes

These dependency lists might change over time, I will not necessarily be updating them. You can easily update them yourself when new information is revealed.

This is a rewrite of https://gist.github.com/joeskeen/202fe9f6d7a2f624097962507c5ab681 in Node.js, with significantly improved performance and a customizable dependency list passed as file argument.

#!/usr/bin/env node
// Node.js rewrite of check-npm-cache.sh
// Original script source: https://gist.github.com/joeskeen/202fe9f6d7a2f624097962507c5ab681
const fs = require('fs');
const path = require('path');
const { execSync } = require('child_process');
const os = require('os');
// if no arguments, print usage
if (process.argv.length === 2) {
console.error('Usage: node scan-npm-deps.js <packages-csv>');
console.error();
console.error(' This script scans all subdirectories and global npm caches');
console.error(' for compromised NPM packages');
console.error();
console.error(' The file <packages-csv> must have the following format:');
console.error(' <package>,<version>');
console.error(' <package>,<version>');
console.error(' ...');
console.error();
console.error(' Each line contains a single package and version');
console.error();
console.error(' Example:');
console.error(' eslint-config-crowdstrike-node,4.0.3');
console.error(' @art-ws/common,2.0.22');
console.error(' @art-ws/common,2.0.28');
process.exit(1);
}
const findings = [];
function printFindings() {
// Summary
console.log('');
if (findings.length === 0) {
console.log('✅ No compromised packages found.');
} else {
console.log('❌ Compromised packages found:');
console.log('');
const grouped = {};
const remediation = {};
// Group findings by remediation directory
for (const line of findings) {
const match = line.match(/in (.+)$/);
if (!match) continue;
let filePath = match[1];
let dir = path.dirname(filePath);
// Trim path before node_modules if present
if (dir.includes('/node_modules/')) {
dir = dir.substring(0, dir.indexOf('/node_modules'));
} else if (dir.endsWith('/node_modules')) {
dir = dir.substring(0, dir.length - '/node_modules'.length);
}
// Walk up to find the remediation root
let currentDir = dir;
while (currentDir !== '/' && currentDir !== '.') {
if (fileExists(path.join(currentDir, 'package-lock.json'))) {
remediation[currentDir] = 'npm';
break;
} else if (fileExists(path.join(currentDir, 'yarn.lock'))) {
remediation[currentDir] = 'yarn';
break;
} else if (fileExists(path.join(currentDir, 'pnpm-lock.yaml'))) {
remediation[currentDir] = 'pnpm';
break;
}
currentDir = path.dirname(currentDir);
}
if (!grouped[dir]) {
grouped[dir] = [];
}
grouped[dir].push(line);
}
// Print grouped findings
for (const [dir, lines] of Object.entries(grouped)) {
console.log(`📁 ${dir}`);
for (const line of lines) {
console.log(` ${line}`);
}
console.log('');
}
// console.log('🛠️ Suggested Remediation Commands:');
// console.log();
// for (const [dir, tool] of Object.entries(remediation)) {
// console.log(`💡 cd "${dir}" && rm -rf node_modules ${tool}-lock.yaml yarn.lock package-lock.json && ${tool} install`);
// }
}
}
console.log('🔍 Scanning for compromised NPM packages');
console.log();
console.log('📋 Reading package list...');
const compromisedPackages = fs.readFileSync(process.argv[2], 'utf8');
// Parse compromised packages into array
const compromised = [];
compromisedPackages.split('\n').forEach(line => {
line = line.trim();
if (line && !line.startsWith('#')) {
compromised.push(line);
}
});
console.log(` ${compromised.length} packages`);
console.log();
// Utility functions
function fileExists(filePath) {
try {
return fs.existsSync(filePath);
} catch (error) {
return false;
}
}
function readFileSync(filePath) {
try {
return fs.readFileSync(filePath, 'utf8');
} catch (error) {
return '';
}
}
function findFiles(dir, patterns, maxDepth = Infinity, matchDirectories = false) {
const results = [];
function traverse(currentDir, depth) {
if (depth > maxDepth) return;
try {
const entries = fs.readdirSync(currentDir, { withFileTypes: true });
for (const entry of entries) {
const fullPath = path.join(currentDir, entry.name);
if (entry.isDirectory()) {
if (matchDirectories) {
results.push(fullPath);
}
traverse(fullPath, depth + 1);
} else if (entry.isFile()) {
for (const pattern of patterns) {
if (entry.name.match(pattern)) {
results.push(fullPath);
break;
}
}
}
}
} catch (error) {
// Skip directories we can't read
}
}
if (fileExists(dir)) {
traverse(dir, 0);
}
return results;
}
function scanFile(filePath) {
const content = readFileSync(filePath);
if (!content) return;
for (const item of compromised) {
const [pkg, version] = item.split(',');
if (content.includes(pkg) && content.includes(version)) {
findings.push(`Found ${pkg}@${version} in ${filePath}`);
}
}
}
function scanLockfileResolved(filePath) {
const content = readFileSync(filePath);
if (!content) return;
for (const item of compromised) {
const [pkg, version] = item.split(',');
// Match resolved tarball URLs for compromised versions
// get package local name, i.e. after the last /
const localName = pkg.split('/').pop();
const pattern = `${pkg}/-/${localName}-${version}.tgz`;
if (content.includes(pattern)) {
findings.push(`Resolved ${pkg}@${version} in ${filePath}`);
}
}
}
function scanProjectFiles() {
const lockfilePatterns = [/^package-lock\.json$/, /^yarn\.lock$/, /^pnpm-lock\.yaml$/];
const lockfiles = findFiles('.', lockfilePatterns);
console.log(` ${lockfiles.length} lockfiles`);
let count = 0;
for (const file of lockfiles) {
scanLockfileResolved(file);
count++;
if (count % 100 === 0) {
console.log(` ...scanned ${count} files`);
}
}
}
async function scanNpmCache(cacheDir) {
if (!fileExists(cacheDir)) return;
// traverse cacheDir recursively
const files = findFiles(cacheDir, [/.*/], Infinity);
console.log(` ${files.length} files to check in ${cacheDir}`);
let startTime = Date.now();
let count = 0;
for (const file of files) {
const content = readFileSync(file);
for (const item of compromised) {
const [pkg, version] = item.split(',');
const searchPattern = `${pkg}@${version}`;
if (content.includes(searchPattern)) {
findings.push(`Found ${pkg}@${version} in cached file: ${file}`);
}
}
count++;
// print update every 5 seconds
if (Date.now() - startTime > 5000) {
console.log(` ...checked ${count}/${files.length} files in ${cacheDir}`);
startTime = Date.now();
}
}
}
async function scanNvmVersions() {
const nvmDir = process.env.NVM_DIR || path.join(os.homedir(), '.nvm');
if (!fileExists(nvmDir)) return;
console.log();
console.log('🧠 Scanning NVM-managed Node versions...');
const nodeVersionsDir = path.join(nvmDir, 'versions', 'node');
if (!fileExists(nodeVersionsDir)) return;
// for each dir in nodeVersionsDir, scan the npm cache
const dirs = findFiles(nodeVersionsDir, [/.*/], 0, true);
console.log(` ${dirs.length} node versions`);
for (const dir of dirs) {
await scanNpmCache(dir);
}
}
function scanDockerfiles() {
console.log();
console.log('🐳 Scanning Dockerfiles...');
const dockerfiles = findFiles('.', [/^Dockerfile/i]);
console.log(` ${dockerfiles.length} Dockerfiles`);
let startTime = Date.now();
let count = 0;
for (const file of dockerfiles) {
scanFile(file);
count++;
// print update every 5 seconds
if (Date.now() - startTime > 5000) {
console.log(` ...scanned ${count}/${dockerfiles.length} Dockerfiles`);
startTime = Date.now();
}
}
}
function scanCiConfigs() {
console.log();
console.log('⚙️ Scanning CI/CD config files...');
const patterns = [
/^Jenkinsfile/,
/\.ya?ml$/
];
const ciFiles = findFiles('.', patterns).filter(file => {
const relativePath = path.relative('.', file);
return !relativePath.includes('/node_modules/') &&
(relativePath.includes('.github/') ||
relativePath.includes('.gitlab/') ||
relativePath.includes('.circleci/') ||
relativePath.includes('Jenkinsfile'));
});
console.log(` ${ciFiles.length} CI config files`);
let startTime = Date.now();
let count = 0;
for (const file of ciFiles) {
scanFile(file);
count++;
// print update every 5 seconds
if (Date.now() - startTime > 5000) {
console.log(` ...scanned ${count}/${ciFiles.length} CI config files`);
startTime = Date.now();
}
}
}
function scanVendoredDirs() {
console.log();
console.log('📁 Scanning vendored folders...');
const vendorDirs = ['vendor', 'third_party', 'static', 'assets'];
const patterns = [/\.js$/, /\.json$/, /\.tgz$/];
for (const dir of vendorDirs) {
if (!fileExists(dir)) continue;
const files = findFiles(dir, patterns);
for (const file of files) {
scanFile(file);
}
}
}
// Main scanning logic
async function main() {
console.log('🔒 Scanning project lockfiles and package.json...');
scanProjectFiles();
scanDockerfiles();
scanCiConfigs();
scanVendoredDirs();
// Global caches
console.log();
console.log('📦 Scanning global npm caches...');
const homeDir = os.homedir();
const npmCache = path.join(homeDir, '.npm', '_cacache');
if (fileExists(npmCache)) {
await scanNpmCache(npmCache);
}
const npmPackages = path.join(homeDir, '.npm-packages');
if (fileExists(npmPackages)) {
await scanNpmCache(npmPackages);
}
// Yarn global cache
console.log();
console.log('📦 Scanning Yarn global cache...');
try {
const yarnCache = execSync('yarn cache dir 2>/dev/null || echo ""', { encoding: 'utf8' }).trim();
if (yarnCache && fileExists(yarnCache)) {
await scanNpmCache(yarnCache);
}
} catch (error) {
// Yarn not available
}
// pnpm global store
console.log();
console.log('📦 Scanning pnpm global store...');
try {
const pnpmCache = execSync('pnpm store path 2>/dev/null || echo ""', { encoding: 'utf8' }).trim();
if (pnpmCache && fileExists(pnpmCache)) {
await scanNpmCache(pnpmCache);
}
} catch (error) {
// pnpm not available
}
await scanNvmVersions();
printFindings();
}
// Run the main function
main().catch(console.error);
// Browser script to get snyk npm dependency lists into csv format
// for example from https://security.snyk.io/shai-hulud-npm-supply-chain-attack-sep-2025
// Instructions:
// 1. open the corresponding snyk vulnerability page in Chrome (only tested in Chrome)
// 2. open browser developer console
// 3. run this code (adds a function)
// -----------------------------------------
window.parseDeps = function() {
window.deps = window.deps || [];
document.querySelectorAll(".vue--proprietary-vulns__item").forEach(e => {
const pkg = e.querySelector(".vue--proprietary-vulns__body > div > a:nth-child(2)").innerText;
let versionsStr = e.querySelector(".vue--proprietary-vulns__footer").innerText;
versionsStr.substring("Versions: ".length).split(", ").forEach(v => {
window.deps.push(`${pkg},${v}`);
});
});
console.log("total deps:", window.deps.length);
};
// -----------------------------------------
// 4. repeat this for all pages in the vulnerability list
// 4a. run this in the browser console
window.parseDeps()
// 4b. click "Next" page button
// 4c. repeat
// 5. when finished going through all pages, run this in the browser console
window.deps.join(`
`)
// 6. right click on the result and click "Copy string contents"
@coveops/abi 2.0.1
@duckdb/node-api 1.3.3
@duckdb/node-bindings 1.3.3
ansi-regex 6.2.1
ansi-styles 6.2.2
backslash 0.2.1
chalk-template 1.1.1
chalk 5.6.1
color-convert 3.1.1
color-name 2.0.1
color-string 2.1.1
color 5.0.1
debug 4.4.2
duckdb 1.3.3
error-ex 1.3.3
has-ansi 6.0.1
is-arrayish 0.3.3
prebid-universal-creative 1.17.3
prebid 10.9.1
prebid 10.9.2
prebid.js 10.9.2
proto-tinker-wc 0.1.87
simple-swizzle 0.2.3
slice-ansi 7.1.1
strip-ansi 7.1.1
supports-color 10.2.1
supports-hyperlinks 4.1.1
wrap-ansi 9.0.1
@ahmedhfarag/ngx-perfect-scrollbar 20.0.20
@ahmedhfarag/ngx-virtual-scroller 4.0.4
@art-ws/common 2.0.22
@art-ws/common 2.0.27
@art-ws/common 2.0.28
@art-ws/config-eslint 2.0.4
@art-ws/config-eslint 2.0.5
@art-ws/config-ts 2.0.7
@art-ws/config-ts 2.0.8
@art-ws/db-context 2.0.21
@art-ws/db-context 2.0.23
@art-ws/db-context 2.0.24
@art-ws/di 2.0.28
@art-ws/di 2.0.32
@art-ws/di-node 2.0.13
@art-ws/eslint 1.0.5
@art-ws/eslint 1.0.6
@art-ws/fastify-http-server 2.0.24
@art-ws/fastify-http-server 2.0.26
@art-ws/fastify-http-server 2.0.27
@art-ws/http-server 2.0.21
@art-ws/http-server 2.0.24
@art-ws/http-server 2.0.25
@art-ws/openapi 0.1.9
@art-ws/openapi 0.1.11
@art-ws/openapi 0.1.12
@art-ws/package-base 1.0.5
@art-ws/package-base 1.0.6
@art-ws/prettier 1.0.5
@art-ws/prettier 1.0.6
@art-ws/slf 2.0.15
@art-ws/slf 2.0.22
@art-ws/ssl-info 1.0.9
@art-ws/ssl-info 1.0.10
@art-ws/web-app 1.0.3
@art-ws/web-app 1.0.4
@basic-ui-components-stc/basic-ui-components 1.0.5
@crowdstrike/commitlint 8.1.1
@crowdstrike/commitlint 8.1.2
@crowdstrike/falcon-shoelace 0.4.1
@crowdstrike/falcon-shoelace 0.4.2
@crowdstrike/foundry-js 0.19.1
@crowdstrike/foundry-js 0.19.2
@crowdstrike/glide-core 0.34.2
@crowdstrike/glide-core 0.34.3
@crowdstrike/logscale-dashboard 1.205.1
@crowdstrike/logscale-dashboard 1.205.2
@crowdstrike/logscale-file-editor 1.205.1
@crowdstrike/logscale-file-editor 1.205.2
@crowdstrike/logscale-parser-edit 1.205.1
@crowdstrike/logscale-parser-edit 1.205.2
@crowdstrike/logscale-search 1.205.1
@crowdstrike/logscale-search 1.205.2
@crowdstrike/tailwind-toucan-base 5.0.1
@crowdstrike/tailwind-toucan-base 5.0.2
@ctrl/deluge 7.2.1
@ctrl/deluge 7.2.2
@ctrl/golang-template 1.4.2
@ctrl/golang-template 1.4.3
@ctrl/magnet-link 4.0.3
@ctrl/magnet-link 4.0.4
@ctrl/ngx-codemirror 7.0.1
@ctrl/ngx-codemirror 7.0.2
@ctrl/ngx-csv 6.0.1
@ctrl/ngx-csv 6.0.2
@ctrl/ngx-emoji-mart 9.2.1
@ctrl/ngx-emoji-mart 9.2.2
@ctrl/ngx-rightclick 4.0.1
@ctrl/ngx-rightclick 4.0.2
@ctrl/qbittorrent 9.7.1
@ctrl/qbittorrent 9.7.2
@ctrl/react-adsense 2.0.1
@ctrl/react-adsense 2.0.2
@ctrl/shared-torrent 6.3.1
@ctrl/shared-torrent 6.3.2
@ctrl/tinycolor 4.1.1
@ctrl/tinycolor 4.1.2
@ctrl/torrent-file 4.1.1
@ctrl/torrent-file 4.1.2
@ctrl/transmission 7.3.1
@ctrl/ts-base32 4.0.1
@ctrl/ts-base32 4.0.2
@hestjs/core 0.2.1
@hestjs/cqrs 0.1.6
@hestjs/demo 0.1.2
@hestjs/eslint-config 0.1.2
@hestjs/logger 0.1.6
@hestjs/scalar 0.1.7
@hestjs/validation 0.1.6
@nativescript-community/arraybuffers 1.1.6
@nativescript-community/arraybuffers 1.1.7
@nativescript-community/arraybuffers 1.1.8
@nativescript-community/gesturehandler 2.0.35
@nativescript-community/perms 3.0.5
@nativescript-community/perms 3.0.6
@nativescript-community/perms 3.0.7
@nativescript-community/perms 3.0.8
@nativescript-community/perms 3.0.9
@nativescript-community/sentry 4.6.43
@nativescript-community/sqlite 3.5.2
@nativescript-community/sqlite 3.5.3
@nativescript-community/sqlite 3.5.4
@nativescript-community/sqlite 3.5.5
@nativescript-community/text 1.6.9
@nativescript-community/text 1.6.10
@nativescript-community/text 1.6.11
@nativescript-community/text 1.6.12
@nativescript-community/text 1.6.13
@nativescript-community/typeorm 0.2.30
@nativescript-community/typeorm 0.2.31
@nativescript-community/typeorm 0.2.32
@nativescript-community/typeorm 0.2.33
@nativescript-community/ui-collectionview 6.0.6
@nativescript-community/ui-document-picker 1.1.27
@nativescript-community/ui-document-picker 1.1.28
@nativescript-community/ui-drawer 0.1.30
@nativescript-community/ui-image 4.5.6
@nativescript-community/ui-label 1.3.35
@nativescript-community/ui-label 1.3.36
@nativescript-community/ui-label 1.3.37
@nativescript-community/ui-material-bottom-navigation 7.2.72
@nativescript-community/ui-material-bottom-navigation 7.2.73
@nativescript-community/ui-material-bottom-navigation 7.2.74
@nativescript-community/ui-material-bottom-navigation 7.2.75
@nativescript-community/ui-material-bottomsheet 7.2.72
@nativescript-community/ui-material-core 7.2.72
@nativescript-community/ui-material-core 7.2.73
@nativescript-community/ui-material-core 7.2.74
@nativescript-community/ui-material-core 7.2.75
@nativescript-community/ui-material-core 7.2.76
@nativescript-community/ui-material-core-tabs 7.2.72
@nativescript-community/ui-material-core-tabs 7.2.73
@nativescript-community/ui-material-core-tabs 7.2.74
@nativescript-community/ui-material-core-tabs 7.2.75
@nativescript-community/ui-material-core-tabs 7.2.76
@nativescript-community/ui-material-ripple 7.2.72
@nativescript-community/ui-material-ripple 7.2.73
@nativescript-community/ui-material-ripple 7.2.74
@nativescript-community/ui-material-ripple 7.2.75
@nativescript-community/ui-material-tabs 7.2.72
@nativescript-community/ui-material-tabs 7.2.73
@nativescript-community/ui-material-tabs 7.2.74
@nativescript-community/ui-material-tabs 7.2.75
@nativescript-community/ui-pager 14.1.35
@nativescript-community/ui-pager 14.1.36
@nativescript-community/ui-pager 14.1.37
@nativescript-community/ui-pager 14.1.38
@nativescript-community/ui-pulltorefresh 2.5.4
@nativescript-community/ui-pulltorefresh 2.5.5
@nativescript-community/ui-pulltorefresh 2.5.6
@nativescript-community/ui-pulltorefresh 2.5.7
@nexe/config-manager 0.1.1
@nexe/eslint-config 0.1.1
@nexe/logger 0.1.3
@nstudio/angular 20.0.4
@nstudio/angular 20.0.5
@nstudio/angular 20.0.6
@nstudio/focus 20.0.4
@nstudio/focus 20.0.5
@nstudio/focus 20.0.6
@nstudio/nativescript-checkbox 2.0.6
@nstudio/nativescript-checkbox 2.0.7
@nstudio/nativescript-checkbox 2.0.8
@nstudio/nativescript-checkbox 2.0.9
@nstudio/nativescript-loading-indicator 5.0.1
@nstudio/nativescript-loading-indicator 5.0.2
@nstudio/nativescript-loading-indicator 5.0.3
@nstudio/nativescript-loading-indicator 5.0.4
@nstudio/ui-collectionview 5.1.11
@nstudio/ui-collectionview 5.1.12
@nstudio/ui-collectionview 5.1.13
@nstudio/ui-collectionview 5.1.14
@nstudio/web 20.0.4
@nstudio/web-angular 20.0.4
@nstudio/xplat 20.0.5
@nstudio/xplat 20.0.6
@nstudio/xplat 20.0.7
@nstudio/xplat-utils 20.0.5
@nstudio/xplat-utils 20.0.6
@nstudio/xplat-utils 20.0.7
@operato/board 9.0.36
@operato/board 9.0.37
@operato/board 9.0.38
@operato/board 9.0.39
@operato/board 9.0.40
@operato/board 9.0.41
@operato/board 9.0.42
@operato/board 9.0.43
@operato/board 9.0.44
@operato/board 9.0.45
@operato/board 9.0.46
@operato/data-grist 9.0.29
@operato/data-grist 9.0.35
@operato/data-grist 9.0.36
@operato/data-grist 9.0.37
@operato/graphql 9.0.22
@operato/graphql 9.0.35
@operato/graphql 9.0.36
@operato/graphql 9.0.37
@operato/graphql 9.0.38
@operato/graphql 9.0.39
@operato/graphql 9.0.40
@operato/graphql 9.0.41
@operato/graphql 9.0.42
@operato/graphql 9.0.43
@operato/graphql 9.0.44
@operato/graphql 9.0.45
@operato/graphql 9.0.46
@operato/headroom 9.0.2
@operato/headroom 9.0.35
@operato/headroom 9.0.36
@operato/headroom 9.0.37
@operato/help 9.0.35
@operato/help 9.0.36
@operato/help 9.0.37
@operato/help 9.0.38
@operato/help 9.0.39
@operato/help 9.0.40
@operato/help 9.0.41
@operato/help 9.0.42
@operato/help 9.0.43
@operato/help 9.0.44
@operato/help 9.0.45
@operato/help 9.0.46
@operato/i18n 9.0.35
@operato/i18n 9.0.36
@operato/i18n 9.0.37
@operato/input 9.0.27
@operato/input 9.0.35
@operato/input 9.0.36
@operato/input 9.0.37
@operato/input 9.0.38
@operato/input 9.0.39
@operato/input 9.0.40
@operato/input 9.0.41
@operato/input 9.0.42
@operato/input 9.0.43
@operato/input 9.0.44
@operato/input 9.0.45
@operato/input 9.0.46
@operato/input 9.0.47
@operato/input 9.0.48
@operato/layout 9.0.35
@operato/layout 9.0.36
@operato/layout 9.0.37
@operato/popup 9.0.22
@operato/popup 9.0.35
@operato/popup 9.0.36
@operato/popup 9.0.37
@operato/popup 9.0.38
@operato/popup 9.0.39
@operato/popup 9.0.40
@operato/popup 9.0.41
@operato/popup 9.0.42
@operato/popup 9.0.43
@operato/popup 9.0.44
@operato/popup 9.0.45
@operato/popup 9.0.46
@operato/popup 9.0.49
@operato/pull-to-refresh 9.0.36
@operato/pull-to-refresh 9.0.37
@operato/pull-to-refresh 9.0.38
@operato/pull-to-refresh 9.0.39
@operato/pull-to-refresh 9.0.40
@operato/pull-to-refresh 9.0.41
@operato/pull-to-refresh 9.0.42
@operato/shell 9.0.22
@operato/shell 9.0.35
@operato/shell 9.0.36
@operato/shell 9.0.37
@operato/shell 9.0.38
@operato/shell 9.0.39
@operato/styles 9.0.2
@operato/styles 9.0.35
@operato/styles 9.0.36
@operato/styles 9.0.37
@operato/utils 9.0.22
@operato/utils 9.0.35
@operato/utils 9.0.36
@operato/utils 9.0.37
@operato/utils 9.0.38
@operato/utils 9.0.39
@operato/utils 9.0.40
@operato/utils 9.0.41
@operato/utils 9.0.42
@operato/utils 9.0.43
@operato/utils 9.0.44
@operato/utils 9.0.45
@operato/utils 9.0.46
@operato/utils 9.0.49
@teselagen/bio-parsers 0.4.29
@teselagen/bio-parsers 0.4.30
@teselagen/bounce-loader 0.3.16
@teselagen/bounce-loader 0.3.17
@teselagen/file-utils 0.3.21
@teselagen/file-utils 0.3.22
@teselagen/liquibase-tools 0.4.1
@teselagen/ove 0.7.39
@teselagen/ove 0.7.40
@teselagen/range-utils 0.3.14
@teselagen/range-utils 0.3.15
@teselagen/react-list 0.8.19
@teselagen/react-list 0.8.20
@teselagen/react-table 6.10.21
@teselagen/react-table 6.10.19
@teselagen/react-table 6.10.22
@teselagen/react-table 6.10.20
@teselagen/sequence-utils 0.3.33
@teselagen/sequence-utils 0.3.34
@teselagen/ui 0.9.9
@teselagen/ui 0.9.10
@thangved/callback-window 1.1.4
@thangved/callback-window 1.1.4-0
@thangved/callback-window 1.1.5-0
@thangved/callback-window 1.1.5
@things-factory/attachment-base 9.0.43
@things-factory/attachment-base 9.0.44
@things-factory/attachment-base 9.0.45
@things-factory/attachment-base 9.0.46
@things-factory/attachment-base 9.0.47
@things-factory/attachment-base 9.0.48
@things-factory/attachment-base 9.0.49
@things-factory/attachment-base 9.0.50
@things-factory/auth-base 9.0.42
@things-factory/auth-base 9.0.43
@things-factory/auth-base 9.0.44
@things-factory/auth-base 9.0.45
@things-factory/email-base 9.0.42
@things-factory/email-base 9.0.43
@things-factory/email-base 9.0.44
@things-factory/email-base 9.0.45
@things-factory/email-base 9.0.46
@things-factory/email-base 9.0.47
@things-factory/email-base 9.0.48
@things-factory/email-base 9.0.49
@things-factory/email-base 9.0.50
@things-factory/email-base 9.0.51
@things-factory/email-base 9.0.52
@things-factory/email-base 9.0.53
@things-factory/email-base 9.0.54
@things-factory/env 9.0.42
@things-factory/env 9.0.43
@things-factory/env 9.0.44
@things-factory/env 9.0.45
@things-factory/integration-base 9.0.43
@things-factory/integration-base 9.0.44
@things-factory/integration-base 9.0.45
@things-factory/integration-marketplace 9.0.43
@things-factory/integration-marketplace 9.0.44
@things-factory/integration-marketplace 9.0.45
@things-factory/shell 9.0.43
@things-factory/shell 9.0.44
@things-factory/shell 9.0.45
@tnf-dev/api 1.0.8
@tnf-dev/core 1.0.8
@tnf-dev/js 1.0.8
@tnf-dev/mui 1.0.8
@tnf-dev/react 1.0.8
@ui-ux-gang/devextreme-angular-rpk 24.1.7
@ui-ux-gang/devextreme-rpk 24.1.7
@yoobic/design-system 6.5.17
@yoobic/jpeg-camera-es6 1.0.13
@yoobic/yobi 8.7.53
ace-colorpicker-rpk 0.0.14
airchief 0.3.1
airpilot 0.8.8
angulartics2 14.1.1
angulartics2 14.1.2
another-shai 1.0.1
browser-webdriver-downloader 3.0.8
capacitor-notificationhandler 0.0.2
capacitor-notificationhandler 0.0.3
capacitor-plugin-healthapp 0.0.2
capacitor-plugin-healthapp 0.0.3
capacitor-plugin-ihealth 1.1.8
capacitor-plugin-ihealth 1.1.9
capacitor-plugin-ihealth 1.0.5
capacitor-plugin-ihealth 1.0.4
capacitor-plugin-ihealth 1.0.3
capacitor-plugin-ihealth 1.0.2
capacitor-plugin-ihealth 1.0.1
capacitor-plugin-ihealth 0.0.9
capacitor-plugin-ihealth 0.0.8
capacitor-plugin-ihealth 0.0.7
capacitor-plugin-ihealth 0.0.6
capacitor-plugin-ihealth 0.0.5
capacitor-plugin-ihealth 0.0.4
capacitor-plugin-ihealth 0.0.3
capacitor-plugin-ihealth 0.0.2
capacitor-plugin-ihealth 0.0.1
capacitor-plugin-vonage 1.0.2
capacitor-plugin-vonage 1.0.3
capacitorandroidpermissions 0.0.4
capacitorandroidpermissions 0.0.5
config-cordova 0.8.5
cordova-plugin-voxeet2 1.0.24
cordova-voxeet 1.0.32
create-hest-app 0.1.9
db-evo 1.1.4
db-evo 1.1.5
devextreme-angular-rpk 21.2.8
ember-browser-services 5.0.3
ember-browser-services 5.0.2
ember-headless-form 1.1.3
ember-headless-form 1.1.2
ember-headless-form-yup 1.0.1
ember-headless-table 2.1.6
ember-headless-table 2.1.5
ember-url-hash-polyfill 1.0.13
ember-url-hash-polyfill 1.0.12
ember-velcro 2.2.2
ember-velcro 2.2.1
encounter-playground 0.0.2
encounter-playground 0.0.3
encounter-playground 0.0.4
encounter-playground 0.0.5
eslint-config-crowdstrike 11.0.3
eslint-config-crowdstrike 11.0.2
eslint-config-crowdstrike-node 4.0.4
eslint-config-crowdstrike-node 4.0.3
eslint-config-teselagen 6.1.7
eslint-config-teselagen 6.1.8
globalize-rpk 1.7.4
graphql-sequelize-teselagen 5.3.8
html-to-base64-image 1.0.2
json-rules-engine-simplified 0.2.1
json-rules-engine-simplified 0.2.2
json-rules-engine-simplified 0.2.3
json-rules-engine-simplified 0.2.4
jumpgate 0.0.2
koa2-swagger-ui 5.11.1
koa2-swagger-ui 5.11.2
mcfly-semantic-release 1.3.1
mcp-knowledge-base 0.0.2
mcp-knowledge-graph 1.2.1
mobioffice-cli 1.0.3
monorepo-next 13.0.2
monorepo-next 13.0.1
mstate-angular 0.4.4
mstate-angular 0.0.2
mstate-angular 0.0.1
mstate-angular 0.0.0-watch
mstate-cli 0.4.7
mstate-dev-react 1.1.1
mstate-react 0.0.2
mstate-react 0.0.1
mstate-react 1.6.5
ng-imports-checker 0.0.9
ng-imports-checker 0.0.10
ng2-file-upload 7.0.2
ng2-file-upload 7.0.3
ng2-file-upload 8.0.1
ng2-file-upload 8.0.2
ng2-file-upload 8.0.3
ng2-file-upload 9.0.1
ngx-bootstrap 18.1.4
ngx-bootstrap 19.0.3
ngx-bootstrap 19.0.4
ngx-bootstrap 20.0.3
ngx-bootstrap 20.0.4
ngx-bootstrap 20.0.5
ngx-bootstrap 20.0.6
ngx-color 10.0.1
ngx-color 10.0.2
ngx-toastr 19.0.1
ngx-toastr 19.0.2
ngx-trend 8.0.1
ngx-ws 1.1.5
ngx-ws 1.1.6
oradm-to-gql 35.0.14
oradm-to-gql 35.0.15
oradm-to-sqlz 1.1.4
oradm-to-sqlz 1.1.3
oradm-to-sqlz 1.1.2
ove-auto-annotate 0.0.9
ove-auto-annotate 0.0.10
pm2-gelf-json 1.0.4
pm2-gelf-json 1.0.5
printjs-rpk 1.6.1
react-complaint-image 0.0.32
react-complaint-image 0.0.33
react-complaint-image 0.0.34
react-complaint-image 0.0.35
react-jsonschema-form-conditionals 0.3.18
react-jsonschema-form-conditionals 0.3.19
react-jsonschema-form-conditionals 0.3.20
react-jsonschema-form-conditionals 0.3.21
react-jsonschema-form-extras 1.0.1
react-jsonschema-form-extras 1.0.2
react-jsonschema-form-extras 1.0.3
react-jsonschema-form-extras 1.0.4
react-jsonschema-rxnt-extras 0.4.6
react-jsonschema-rxnt-extras 0.4.7
react-jsonschema-rxnt-extras 0.4.8
react-jsonschema-rxnt-extras 0.4.9
remark-preset-lint-crowdstrike 4.0.2
remark-preset-lint-crowdstrike 4.0.1
rxnt-authentication 0.0.3
rxnt-authentication 0.0.4
rxnt-authentication 0.0.5
rxnt-authentication 0.0.6
rxnt-healthchecks-nestjs 1.0.2
rxnt-healthchecks-nestjs 1.0.3
rxnt-healthchecks-nestjs 1.0.4
rxnt-healthchecks-nestjs 1.0.5
rxnt-kue 1.0.4
rxnt-kue 1.0.5
rxnt-kue 1.0.6
rxnt-kue 1.0.7
swc-plugin-component-annotate 1.9.1
swc-plugin-component-annotate 1.9.2
tbssnch 1.0.2
teselagen-interval-tree 1.1.2
tg-client-query-builder 2.14.4
tg-client-query-builder 2.14.5
tg-redbird 1.3.1
tg-redbird 1.3.2
tg-seq-gen 1.0.9
tg-seq-gen 1.0.10
thangved-react-grid 1.0.3
ts-gaussian 3.0.5
ts-gaussian 3.0.6
ts-imports 1.0.1
ts-imports 1.0.2
tvi-cli 0.1.5
ve-bamreader 0.2.6
ve-bamreader 0.2.7
ve-editor 1.0.1
ve-editor 1.0.2
verror-extra 6.0.1
voip-callkit 1.0.2
voip-callkit 1.0.3
wdio-web-reporter 0.1.3
yargs-help-output 5.0.3
yoo-styles 6.0.326
@alexkli
Copy link
Author

alexkli commented Sep 23, 2025

Note I made two important updates today, see the readme update notes at the top.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment