rtk-ai/rtk

feat: pnpm workspace filter support (--filter/-F)

Open

#512 ouverte le 11 mars 2026

Voir sur GitHub
 (2 commentaires) (1 réaction) (0 assignés)Rust (2 914 forks)batch import
area:clieffort-largeenhancementhelp wantedpriority:medium

Métriques du dépôt

Stars
 (48 085 stars)
Métriques de merge PR
 (Merge moyen 11j 1h) (45 PRs mergées en 30 j)

Description

Problem

Monorepo Node.js users (pnpm workspaces) get zero token savings from RTK because all their commands go through pnpm --filter <workspace> <tool>:

pnpm --filter web prettier --check .
pnpm --filter web tsc --noEmit
pnpm -F @scope/pkg vitest run

The rewrite layer and Clap parsing both fail to match these patterns. Root cause: every PATTERN regex assumes pnpm <subcommand> with no flags between pnpm and the subcommand. pnpm --filter web breaks all matching.

Strategy: Rewrite-Layer Normalization

Strip pnpm (--filter|-F) <workspace> in the rewrite layer before classification, then propagate the workspace value to tool modules via a hidden --pnpm-filter Clap global arg.

Why not pattern expansion: Adding pnpm --filter \S+ <tool> variants to every PATTERN regex and rewrite_prefixes array is combinatorial (7+ tools × 2 flag forms). Doesn't scale.

Expected behavior

# Hook rewrites transparently
pnpm --filter web prettier --check .  →  rtk prettier --pnpm-filter web --check .
pnpm -F web tsc --noEmit              →  rtk tsc --pnpm-filter web --noEmit
pnpm --filter web vitest run          →  rtk vitest --pnpm-filter web run
pnpm --filter web list                →  rtk pnpm --pnpm-filter web list

# rtk discover correctly classifies these as Supported (not Unsupported)
rtk discover  →  pnpm --filter web prettier  [Supported, ~70% savings]

Files to modify (10 total)

File Change
src/discover/registry.rs Rewrite core extraction, pnpm filter strip/inject, classify_command update
src/main.rs --pnpm-filter global Clap arg + 8 dispatch updates
src/utils.rs New package_manager_filtered_exec()
src/prettier_cmd.rs Add pnpm_filter param
src/format_cmd.rs Add pnpm_filter param
src/tsc_cmd.rs Add pnpm_filter param
src/vitest_cmd.rs Add pnpm_filter param
src/lint_cmd.rs Add pnpm_filter param
src/playwright_cmd.rs Add pnpm_filter param
src/pnpm_cmd.rs Add pnpm_filter param

Edge cases

  • Scoped packages: @scope/pkg\S+ regex handles it
  • Glob patterns: ./packages/*\S+ handles it
  • No filter: all existing behavior unchanged (pnpm_filter = None throughout)
  • Env prefixes: sudo pnpm --filter web prettier — env prefix stripped first, re-added after rewrite
  • Unknown commands: pnpm --filter web unknown-cmd → no rewrite (passthrough)

Out of scope (future)

  • pnpm -w (workspace root flag)
  • pnpm -r / --recursive
  • pnpm --filter-prod

Related

Reported by Stephane (monorepo Node user via Slack).

Sub-issues: Phase 1 (#registry), Phase 2 (#main), Phase 3 (#utils), Phase 4 (#tool-modules)

Guide contributeur