Inspecting Packages
Read-only commands, safe to run any time — none of these change anything.
list
A table of every discovered package. Full summary by default: local version, branch, git status (clean/dirty), whether the current version is tagged, whether that tag has a release, whether the npm registry matches (or the registry version if it doesn't, or "unpublished"), and how many other local packages reference it with a now-stale dependency range (see doctor).
polyrepo list [options]The git/tag/release/npm checks run in parallel across packages, but they're still real network calls (tag, release, and registry — three per package), so a full list across many packages takes a few seconds rather than being instant. alias: ls
Example output (truncated — a real run covers every discovered package):
Package Version Branch Git Tag Release npm Deps
------------------------ ------- ------ ----- ------- ------- --- ----
color-value-tools 1.1.12 master clean v1.1.12 ✓ ✓ ✓
css-magic-gradient 1.2.14 master clean v1.2.14 ✓ ✓ ✓
os-detect 2.1.5 master clean v2.1.5 ✓ ✓ ✓
…Options
--quick
Skip the tag/release/npm/dependency checks — just version, branch, and git status. No network calls.
--path
Add a Path column (right after Package) showing each package's location on disk.
--output <path>
Also save the table to this file, in addition to printing it — for sending the data somewhere.
--format <md|json|csv|html|txt>
File format for --output. Guessed from the file extension if omitted (.json → json, .md/.markdown → markdown, .csv → csv, .html/.htm → html, anything else → plain text). In JSON, a cell that's just a ✓/✗ checkmark becomes a real true/false; anything carrying more information than a plain yes/no (an outdated registry version, a stale-dep count, clean/dirty) stays text.
Example:
polyrepo list --quick
polyrepo list --output packages.jsonoutdated
One table of outdated dependencies across every package, instead of running npm outdated in each repo by hand.
polyrepo outdated [options]Runs in parallel across packages, with a blank line between each package's rows for readability, and a summary line above the table (N dependencies outdated across M package(s), K of them major version behind). The Latest column is colored by how far behind it is — red for a major bump, yellow for minor, dim for patch.
Example output:
15 dependencies outdated across 2 package(s), 3 of them major version behind
Package Dependency Current Wanted Latest
----------------- ---------------------- ------- ------- -------
color-value-tools @types/node 26.4.1 25.9.5 26.4.1
color-value-tools typescript 7.0.2 5.9.3 7.0.2
color-value-tools vitest 2.1.9 2.1.9 5.0.0
os-detect @playwright/test 1.61.0 1.63.0 1.63.0
os-detect @types/node 25.5.0 25.9.5 26.4.1
os-detect @types/react 19.2.14 19.2.18 19.2.18
os-detect eslint 10.1.0 10.10.0 10.10.0
os-detect jest 30.3.0 30.5.1 30.5.1
os-detect jest-environment-jsdom 30.3.0 30.5.1 30.5.1
os-detect prettier 3.8.1 3.9.6 3.9.6
os-detect react 19.2.4 19.2.8 19.2.8
os-detect ts-jest 29.4.11 29.4.12 29.4.12
os-detect typescript 6.0.2 6.0.3 7.0.2
os-detect typescript-eslint 8.59.4 8.69.0 8.69.0
os-detect vue 3.5.31 3.5.42 3.5.42vitest on color-value-tools, and @types/node/typescript on os-detect, are all in red (major version behind) — the rest are yellow (minor) or dim (patch, or already matching Latest with just a lower Wanted).
Options
--packages <a,b,c>
Only check these packages.
Example:
polyrepo outdated --packages vue-toast-kit,os-detectaudit
One table of npm security vulnerabilities across every package, instead of running npm audit in each repo by hand.
polyrepo audit [options]Runs in parallel across packages, with a blank line between each package's rows for readability (same as outdated), and a summary line above the table (N vulnerabilities across M package(s), K of them critical/high severity). Rows are sorted by severity within each package. The Severity column is colored — bold red for critical, red for high, yellow for moderate, dim for low/info. Fix available says whether a fix exists, and names the package/version it would resolve to when that's a semver-major bump of a top-level dependency.
Example output:
9 vulnerabilities across 1 package(s), 6 of them critical/high severity
Package Dependency Severity Type Fix available
--------- --------------- -------- ---------- -------------
os-detect brace-expansion high transitive yes
os-detect browserslist high transitive yes
os-detect js-yaml high transitive yes
os-detect nanoid high transitive yes
os-detect postcss high transitive yes
os-detect ws high transitive yes
os-detect @humanfs/node moderate transitive yes
os-detect @babel/core low transitive yes
os-detect esbuild low transitive yesAll nine here are transitive (devDependency-tree) findings with a fix already available — polyrepo audit only reports what npm audit finds, it doesn't run npm audit fix for you. Packages with nothing found don't add any rows; if nothing's found anywhere, it says so instead of printing an empty table.
Options
--packages <a,b,c>
Only check these packages.
Example:
polyrepo audit
polyrepo audit --packages os-detectprs
One table of every open pull/merge request across every package.
polyrepo prs [options]Runs gh pr list (GitHub repos) or glab mr list (GitLab repos) for every package in parallel — useful after an interrupted bump run, to see at a glance which packages still have one open that needs merging by hand.
Example output — with something actually open (one leftover bump PR waiting on os-detect, and two on vue-toast-kit — one of them still a draft):
Package PR/MR Title Branch Status
------------- ------ ------------------------------------------ ------------------- ------
os-detect PR #21 chore: bump version to 2.1.6 2.1.6-version-bump
vue-toast-kit PR #14 chore: bump version to 1.0.8 1.0.8-version-bump
vue-toast-kit PR #15 Add dark mode support for toast container dark-mode-support draftThe chore: bump version to ... titles are the ones bump itself opens; PR #15 here is an unrelated PR someone opened by hand, still in draft — prs shows both the same way, it doesn't care who or what created it. On a GitLab repo the same row would read MR #21 instead — the label comes from whichever host that particular repo is actually on, a mixed folder shows both in the same table.
When nothing's open, it says so instead of printing an empty table:
No open pull/merge requests.Options
--packages <a,b,c>
Only check these packages.
Example:
polyrepo prs