From 5bb934ebb52a601f96acf00b67814c2a5cd40c4e Mon Sep 17 00:00:00 2001 From: Zoltan Kochan Date: Sat, 14 Feb 2026 13:52:10 +0100 Subject: [PATCH] feat: add package count summary to pnpm list tree output Co-Authored-By: Claude Opus 4.6 --- reviewing/list/src/index.ts | 5 +++ reviewing/list/src/renderTree.ts | 32 ++++++++++++++++++- reviewing/plugin-commands-listing/src/list.ts | 1 + 3 files changed, 37 insertions(+), 1 deletion(-) diff --git a/reviewing/list/src/index.ts b/reviewing/list/src/index.ts index 62ff907ac6..f250629def 100644 --- a/reviewing/list/src/index.ts +++ b/reviewing/list/src/index.ts @@ -117,6 +117,7 @@ export async function listForPackages ( modulesDir?: string virtualStoreDirMaxLength: number finders?: Finder[] + showSummary?: boolean } ): Promise { const opts = { ...DEFAULTS, ...maybeOpts } @@ -130,6 +131,7 @@ export async function listForPackages ( long: opts.long, search: Boolean(packages.length), showExtraneous: opts.showExtraneous, + showSummary: opts.showSummary, }) } @@ -150,6 +152,7 @@ export async function list ( modulesDir?: string virtualStoreDirMaxLength: number finders?: Finder[] + showSummary?: boolean } ): Promise { const opts = { ...DEFAULTS, ...maybeOpts } @@ -193,6 +196,7 @@ export async function list ( long: opts.long, search: false, showExtraneous: opts.showExtraneous, + showSummary: opts.showSummary, }) } @@ -202,6 +206,7 @@ type Printer = (packages: PackageDependencyHierarchy[], opts: { long: boolean search: boolean showExtraneous: boolean + showSummary?: boolean }) => Promise function getPrinter (reportAs: 'parseable' | 'tree' | 'json'): Printer { diff --git a/reviewing/list/src/renderTree.ts b/reviewing/list/src/renderTree.ts index 007ba625a0..193db2824f 100644 --- a/reviewing/list/src/renderTree.ts +++ b/reviewing/list/src/renderTree.ts @@ -21,6 +21,7 @@ export interface RenderTreeOptions { long: boolean search: boolean showExtraneous: boolean + showSummary?: boolean } export async function renderTree ( @@ -33,7 +34,9 @@ export async function renderTree ( ) .filter(Boolean) .join('\n\n') - return `${(opts.depth > -1 && output ? LEGEND : '')}${output}` + const legend = opts.depth > -1 && output ? LEGEND : '' + const summary = opts.showSummary && opts.depth > -1 && output ? `\n\n${listSummary(packages)}` : '' + return `${legend}${output}${summary}` } async function renderTreeForPackage ( @@ -206,3 +209,30 @@ function findMultiPeerPackages (packages: PackageDependencyHierarchy[]): Map 1) { + parts.push(`${packages.length} projects`) + } + return chalk.dim(parts.join(' in ')) +} diff --git a/reviewing/plugin-commands-listing/src/list.ts b/reviewing/plugin-commands-listing/src/list.ts index f780318194..fb42530b8b 100644 --- a/reviewing/plugin-commands-listing/src/list.ts +++ b/reviewing/plugin-commands-listing/src/list.ts @@ -214,6 +214,7 @@ export async function render ( onlyProjects: opts.onlyProjects, reportAs: (opts.parseable ? 'parseable' : (opts.json ? 'json' : 'tree')) as ('parseable' | 'json' | 'tree'), showExtraneous: false, + showSummary: true, modulesDir: opts.modulesDir, virtualStoreDirMaxLength: opts.virtualStoreDirMaxLength, finders,