rtk-ai/rtk

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

Open

#512 建立於 2026年3月11日

在 GitHub 查看
 (2 留言) (1 反應) (0 負責人)Rust (2,914 fork)batch import
area:clieffort-largeenhancementhelp wantedpriority:medium

倉庫指標

Star
 (48,085 star)
PR 合併指標
 (平均合併 11天 1小時) (30 天內合併 45 個 PR)

描述

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)

貢獻者指南