Skip to content

feat(pacquet/config): --recursive, --workspace-concurrency#11959

Merged
zkochan merged 6 commits into
mainfrom
claude/friendly-lovelace-kqPVW
May 26, 2026
Merged

feat(pacquet/config): --recursive, --workspace-concurrency#11959
zkochan merged 6 commits into
mainfrom
claude/friendly-lovelace-kqPVW

Conversation

@KSXGitHub

@KSXGitHub KSXGitHub commented May 26, 2026

Copy link
Copy Markdown
Contributor

Summary

Ports two pnpm settings into pacquet's Rust config layer.

  • workspace-concurrency — read from pnpm-workspace.yaml, global config.yaml, and PNPM_CONFIG_WORKSPACE_CONCURRENCY, overridable per-invocation by the --workspace-concurrency install flag. Stored as Config::workspace_concurrency; default min(4, cores); resolved through resolve_child_concurrency (the port of getWorkspaceConcurrency), so a non-positive value means parallelism - |value|, floored at 1. Not read from .npmrc — pacquet applies only the auth/network subset of .npmrc, same as the sibling childConcurrency.
  • recursive — the global CLI-only -r / --recursive boolean, stored as Config::recursive. Not a yaml / env / .npmrc key, matching pnpm.

Both are parsed and stored for config-surface parity. pacquet's frozen install materializes the whole workspace in one shared pass, so neither value has a per-project consumption point yet (same "read now, consume as the architecture lands" posture as preferOffline).

Tests

Default parity; yaml (positive / negative / independent-from-childConcurrency); PNPM_CONFIG_* env parsing; CLI parsing (including the global -r before and after the subcommand); and the --workspace-concurrency override resolution.


Written by an agent (Claude Code, claude-opus-4-7).

Summary by CodeRabbit

  • New Features

    • Added global --recursive / -r flag and --workspace-concurrency option to the CLI
    • Workspace concurrency exposed in config, env vars, and workspace YAML
  • Tests

    • Added parsing and resolution tests for the new CLI flags, env var, and workspace YAML behavior
  • Documentation

    • Added default value and docs for workspace concurrency settings

Review Change Stack

…ttings

Mirror pnpm's `workspaceConcurrency` (a `.npmrc` / `pnpm-workspace.yaml`
/ `PNPM_CONFIG_WORKSPACE_CONCURRENCY` config-file key, default
`getDefaultWorkspaceConcurrency()`, resolved through
`getWorkspaceConcurrency`) and CLI-only `recursive` (`-r`) boolean.

- Add `Config::workspace_concurrency` (resolved via the existing
  `resolve_child_concurrency` port of `getWorkspaceConcurrency`) and
  `Config::recursive`, plus `default_workspace_concurrency`.
- Read `workspaceConcurrency` from workspace yaml, global config.yaml,
  and the `PNPM_CONFIG_*` env overlay; resolve negative offsets the
  same way `childConcurrency` does.
- Add the `--workspace-concurrency` install flag (overrides the
  config-resolved value) and the global `-r` / `--recursive` flag
  (sets `Config::recursive`, matching pnpm's CLI-only nature).

`workspaceConcurrency` is parsed and stored for config-surface parity;
pacquet's frozen install materializes the whole workspace in one shared
pass, so there is no per-project parallel loop for it to throttle yet
(same posture as `preferOffline`). `recursive` is likewise a surface
flag on install today, since install already spans the workspace.
@coderabbitai

coderabbitai Bot commented May 26, 2026

Copy link
Copy Markdown

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 768a0061-8cb7-4e07-b6e6-b184020a5d65

📥 Commits

Reviewing files that changed from the base of the PR and between b37ef00 and 908b5ad.

📒 Files selected for processing (3)
  • pacquet/crates/cli/src/cli_args/install.rs
  • pacquet/crates/config/src/lib.rs
  • pacquet/crates/config/src/workspace_yaml.rs
📜 Recent review details
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (4)
  • GitHub Check: Doc
  • GitHub Check: Lint and Test (windows-latest)
  • GitHub Check: Run benchmark on ubuntu-latest
  • GitHub Check: Compile & Lint
🧰 Additional context used
📓 Path-based instructions (1)
pacquet/**/*.rs

📄 CodeRabbit inference engine (pacquet/AGENTS.md)

pacquet/**/*.rs: When porting a function that fires pnpm:<channel> events through globalLogger, logger.debug(), or streamParser.write(), mirror the call site, payload, and ordering so the reporter parses pacquet's NDJSON the same way it parses pnpm's.
Declare a newtype wrapper for branded string types. Do not collapse the brand into a plain String or &str.
If upstream always validates before construction, validate in pacquet's wrapper too. The wrapper must construct only via TryFrom<String> and/or FromStr. Do not provide an infallible public constructor.
If upstream never validates, just brand for type-safety. Expose an infallible From<String> (and From<&str> when convenient).
If upstream occasionally constructs without validation, expose from_str_unchecked as an escape hatch alongside the validating constructor.
Match upstream serde behavior for branded types that cross JSON, YAML, or INI boundaries. Use #[serde(try_from = "String")] for deserialization and #[serde(into = "String")] for serialization.
Use #[derive(derive_more::From)] and #[derive(derive_more::Into)] for mechanical conversion impls. Fall back to manual impl only when conversion needs custom logic.
String-literal unions should become enums, not newtype wrappers. Model closed sets of valid string values as enums.
Template literal types should be treated as branded strings with validation discipline from rules 2-5.
Choose owned vs. borrowed parameters to minimize copies. Widen to the most encompassing type (&Path over &PathBuf, &str over &String) when it doesn't force extra copies.
Prefer Arc::clone(&x) / Rc::clone(&x) over x.clone() for reference-counted types, so the cost is visible at the call site.
Follow Rust API Guidelines for naming conventions.
Do not use star imports inside module bodies. Write use super::{Foo, bar} instead of use super::*;. Two forms stay allowed: external-crate preludes like use rayon::prelude::*; and root-of-module re-...

Files:

  • pacquet/crates/config/src/workspace_yaml.rs
  • pacquet/crates/config/src/lib.rs
  • pacquet/crates/cli/src/cli_args/install.rs
🧠 Learnings (3)
📚 Learning: 2026-05-20T19:40:55.051Z
Learnt from: zkochan
Repo: pnpm/pnpm PR: 11774
File: pacquet/crates/resolving-deps-resolver/src/resolve_peers.rs:0-0
Timestamp: 2026-05-20T19:40:55.051Z
Learning: In the pacquet Rust code, ensure the semver implementation uses the `node-semver` crate (not `nodejs-semver`). `node-semver`’s public API does not include a `satisfies_with_prerelease`-style method; prerelease-tolerant matching should be implemented inline by first calling `Range::satisfies`, and when it rejects a prerelease version, retry matching against a stripped `MAJOR.MINOR.PATCH` base of the prerelease version.

Applied to files:

  • pacquet/crates/config/src/workspace_yaml.rs
  • pacquet/crates/config/src/lib.rs
  • pacquet/crates/cli/src/cli_args/install.rs
📚 Learning: 2026-05-22T00:08:44.646Z
Learnt from: zkochan
Repo: pnpm/pnpm PR: 11837
File: pacquet/crates/resolving-npm-resolver/src/pick_package.rs:33-51
Timestamp: 2026-05-22T00:08:44.646Z
Learning: In the pnpm/pnpm repo’s pacquet Rust crates, do not flag Unicode ellipsis characters (U+2026, `…`) in Rust doc comments (`///` / `/** */`) as a lint violation. The pacquet crate’s `dylint.toml` only enables `perfectionist::derive_ordering`, and the Dylint `unicode-ellipsis` rule is not enabled for this project—so `…` in doc comments is an intentional, repo-consistent style.

Applied to files:

  • pacquet/crates/config/src/workspace_yaml.rs
  • pacquet/crates/config/src/lib.rs
  • pacquet/crates/cli/src/cli_args/install.rs
📚 Learning: 2026-05-20T23:07:58.444Z
Learnt from: zkochan
Repo: pnpm/pnpm PR: 11784
File: pacquet/crates/resolving-deps-resolver/src/hoist_peers.rs:120-133
Timestamp: 2026-05-20T23:07:58.444Z
Learning: When reviewing code in this pacquet Rust port, follow the upstream pnpm compatibility rule: only match pnpm’s behavior exactly. Do not propose review changes that intentionally deviate from pnpm’s documented/observed behavior, even if pnpm appears buggy. If you identify a real bug in pnpm behavior, the review should prioritize fixing it upstream in pnpm first, and avoid implementing a pnpm-behavior workaround here unless the same fix has already landed upstream.

Applied to files:

  • pacquet/crates/config/src/workspace_yaml.rs
  • pacquet/crates/config/src/lib.rs
  • pacquet/crates/cli/src/cli_args/install.rs
🔇 Additional comments (3)
pacquet/crates/config/src/lib.rs (1)

780-784: LGTM!

pacquet/crates/config/src/workspace_yaml.rs (1)

220-221: LGTM!

pacquet/crates/cli/src/cli_args/install.rs (1)

179-180: LGTM!

Also applies to: 287-288


📝 Walkthrough

Walkthrough

Adds Config fields workspace_concurrency: u32 and recursive: bool, exposes CLI flags --workspace-concurrency and global --recursive/-r, and wires YAML/env/CLI sources through existing resolution logic with accompanying tests.

Changes

Workspace Concurrency and Recursive Flags Configuration

Layer / File(s) Summary
Config schema and default functions
pacquet/crates/config/src/defaults.rs, pacquet/crates/config/src/defaults/tests.rs, pacquet/crates/config/src/lib.rs
Config gains workspace_concurrency: u32 and recursive: bool fields. New default_workspace_concurrency() delegates to default_child_concurrency() and is re-exported; tests assert parity.
Workspace YAML parsing for workspace_concurrency
pacquet/crates/config/src/workspace_yaml.rs, pacquet/crates/config/src/workspace_yaml/tests.rs
WorkspaceSettings adds workspace_concurrency: Option<i32> and apply_to resolves it with resolve_child_concurrency, writing to Config.workspace_concurrency. Tests cover positive, negative (offset) resolution, and independence from childConcurrency.
Environment variable parsing for workspace_concurrency
pacquet/crates/config/src/env_overlay.rs
Adds PNPM_CONFIG_WORKSPACE_CONCURRENCY mapping into WorkspaceSettings::from_pnpm_config_env with tests for parsing signed integers.
InstallArgs CLI parsing for --workspace-concurrency
pacquet/crates/cli/src/cli_args/install.rs, pacquet/crates/cli/src/cli_args/install/tests.rs
InstallArgs adds --workspace-concurrency: Option<i32> and resolve_workspace_concurrency to prefer CLI value (via resolve_child_concurrency) or return config value. Tests validate parsing and resolution semantics.
CliArgs global integration of both flags
pacquet/crates/cli/src/cli_args.rs, pacquet/crates/cli/src/cli_args/tests.rs
CliArgs adds global --recursive / -r. CliArgs::run sets cfg.recursive from the flag and applies resolved workspace_concurrency during install. Tests verify global flag parsing positions and defaults.
Test fixture updates
pacquet/crates/package-manager/src/install_package_from_registry/tests.rs
Test helper create_config now initializes workspace_concurrency: 1 and recursive: false.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

  • pnpm/pnpm#11806: Modifies CliArgs config-loading path in parallel with this PR's cfg.recursive and workspace_concurrency integration.
  • pnpm/pnpm#11752: Extends pacquet config-loading pipeline with env-var overlay behavior that overlaps with this PR's PNPM_CONFIG_WORKSPACE_CONCURRENCY handling.

Suggested reviewers

  • zkochan

Poem

🐰 I hop through flags and config trees,
Workspace concurrency, set with ease,
Recursive hops both near and far,
YAML, env, CLI — each plays a part,
A cheerful rabbit approves this release.

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately summarizes the main changes: adding two new configuration options (--recursive and --workspace-concurrency) to the pacquet config layer, matching the primary scope of the changeset.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch claude/friendly-lovelace-kqPVW

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actions

github-actions Bot commented May 26, 2026

Copy link
Copy Markdown
Contributor

Micro-Benchmark Results

Linux

group                          main                                   pr
-----                          ----                                   --
tarball/download_dependency    1.03      7.9±0.25ms   548.4 KB/sec    1.00      7.7±0.07ms   566.0 KB/sec

@codecov-commenter

codecov-commenter commented May 26, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 87.93%. Comparing base (a1f6f32) to head (908b5ad).
⚠️ Report is 7 commits behind head on main.

Additional details and impacted files
@@            Coverage Diff             @@
##             main   #11959      +/-   ##
==========================================
- Coverage   87.94%   87.93%   -0.01%     
==========================================
  Files         227      228       +1     
  Lines       27720    27810      +90     
==========================================
+ Hits        24377    24456      +79     
- Misses       3343     3354      +11     

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

`default_workspace_concurrency`'s public doc linked the crate-private
`default_child_concurrency`, which `rustdoc -D rustdoc::private-intra-doc-links`
(implied by `-D warnings`) rejects. Use plain backticks instead.
Comment thread pacquet/crates/cli/src/cli_args/install.rs Outdated
@github-actions

github-actions Bot commented May 26, 2026

Copy link
Copy Markdown
Contributor

Integrated-Benchmark Report (Linux)

Scenario: Isolated linker: fresh restore, cold cache + cold store

Command Mean [s] Min [s] Max [s] Relative
pacquet@HEAD 1.954 ± 0.060 1.869 2.073 1.02 ± 0.04
pacquet@main 1.921 ± 0.044 1.872 2.025 1.00
BENCHMARK_REPORT.json
{
  "results": [
    {
      "command": "pacquet@HEAD",
      "mean": 1.9542126651,
      "stddev": 0.059778628980986445,
      "median": 1.9653385481,
      "user": 2.7601574199999996,
      "system": 3.25694284,
      "min": 1.8685403341,
      "max": 2.0726070611000003,
      "times": [
        1.9705796921,
        1.8685403341,
        1.9134690171,
        1.8766452701,
        2.0726070611000003,
        1.9607433471,
        1.9786416511,
        1.9361649821,
        1.9948015471,
        1.9699337491
      ]
    },
    {
      "command": "pacquet@main",
      "mean": 1.9212230648000002,
      "stddev": 0.04350200692465724,
      "median": 1.9162810386,
      "user": 2.7820275199999993,
      "system": 3.2635453400000003,
      "min": 1.8723179571000002,
      "max": 2.0246779891,
      "times": [
        1.9102146081,
        1.9122495351,
        1.9308702731,
        1.9275715261000002,
        1.9203125421,
        2.0246779891,
        1.9468852201,
        1.8723179571000002,
        1.8908644281,
        1.8762665691
      ]
    }
  ]
}

Scenario: Isolated linker: fresh restore, hot cache + hot store

Command Mean [ms] Min [ms] Max [ms] Relative
pacquet@HEAD 645.3 ± 20.7 628.7 701.7 1.00
pacquet@main 699.5 ± 36.6 637.6 748.5 1.08 ± 0.07
BENCHMARK_REPORT.json
{
  "results": [
    {
      "command": "pacquet@HEAD",
      "mean": 0.6452588685199999,
      "stddev": 0.020722747157525128,
      "median": 0.6405704347200001,
      "user": 0.35815811999999997,
      "system": 1.35249326,
      "min": 0.62870929222,
      "max": 0.70170546022,
      "times": [
        0.70170546022,
        0.63619677822,
        0.6322857442200001,
        0.62870929222,
        0.64853108622,
        0.64645818022,
        0.64015620022,
        0.64142392122,
        0.6409846692200001,
        0.63613735322
      ]
    },
    {
      "command": "pacquet@main",
      "mean": 0.69947233022,
      "stddev": 0.03663505718071411,
      "median": 0.70598324822,
      "user": 0.35540392,
      "system": 1.3487084599999999,
      "min": 0.63756952422,
      "max": 0.7485173002200001,
      "times": [
        0.68790178522,
        0.72786832922,
        0.6955742622200001,
        0.64715022022,
        0.7485173002200001,
        0.73070790722,
        0.71639223422,
        0.6805633602200001,
        0.63756952422,
        0.72247837922
      ]
    }
  ]
}

Scenario: Isolated linker: fresh install, cold cache + cold store

Command Mean [s] Min [s] Max [s] Relative
pacquet@HEAD 2.230 ± 0.022 2.202 2.267 1.00
pacquet@main 2.248 ± 0.028 2.205 2.285 1.01 ± 0.02
BENCHMARK_REPORT.json
{
  "results": [
    {
      "command": "pacquet@HEAD",
      "mean": 2.2299414914800004,
      "stddev": 0.02184420477058646,
      "median": 2.2226256380800002,
      "user": 3.83613578,
      "system": 3.02728276,
      "min": 2.20158424358,
      "max": 2.26743333458,
      "times": [
        2.25189331558,
        2.21485319758,
        2.25702076458,
        2.22234082358,
        2.20158424358,
        2.26743333458,
        2.21048112058,
        2.23305296858,
        2.22291045258,
        2.21784469358
      ]
    },
    {
      "command": "pacquet@main",
      "mean": 2.24766427178,
      "stddev": 0.028170096547575216,
      "median": 2.2542308765800003,
      "user": 3.8815918799999993,
      "system": 2.9884238599999997,
      "min": 2.20472515958,
      "max": 2.28518787758,
      "times": [
        2.21767551558,
        2.25303236358,
        2.28518787758,
        2.26105458358,
        2.26782757158,
        2.25494830558,
        2.20654940858,
        2.20472515958,
        2.27212848458,
        2.25351344758
      ]
    }
  ]
}

Scenario: Isolated linker: fresh install, hot cache + hot store

Command Mean [s] Min [s] Max [s] Relative
pacquet@HEAD 1.436 ± 0.015 1.412 1.465 1.00
pacquet@main 1.464 ± 0.035 1.438 1.560 1.02 ± 0.03
BENCHMARK_REPORT.json
{
  "results": [
    {
      "command": "pacquet@HEAD",
      "mean": 1.4356077055200003,
      "stddev": 0.015211088616632154,
      "median": 1.4325464547200002,
      "user": 1.7041831199999997,
      "system": 1.83640194,
      "min": 1.41165773672,
      "max": 1.46476633472,
      "times": [
        1.43428571472,
        1.42294942072,
        1.42846706072,
        1.44913382072,
        1.43404208872,
        1.44994242972,
        1.4310508207200001,
        1.41165773672,
        1.46476633472,
        1.42978162772
      ]
    },
    {
      "command": "pacquet@main",
      "mean": 1.46397821792,
      "stddev": 0.03496363564575821,
      "median": 1.45454592272,
      "user": 1.7195764199999997,
      "system": 1.8480519400000002,
      "min": 1.4376546997200002,
      "max": 1.5600527637200001,
      "times": [
        1.4376546997200002,
        1.45070157172,
        1.45683483872,
        1.46366721272,
        1.5600527637200001,
        1.45225700672,
        1.44140974672,
        1.46313898972,
        1.4643659667200002,
        1.44969938272
      ]
    }
  ]
}

@github-actions

github-actions Bot commented May 26, 2026

Copy link
Copy Markdown
Contributor

🐰 Bencher Report

Branchpr/11959
Testbedpacquet
Click to view all benchmark results
BenchmarkLatencyBenchmark Result
milliseconds (ms)
(Result Δ%)
Upper Boundary
milliseconds (ms)
(Limit %)
isolated-linker.fresh-install.cold-cache.cold-store📈 view plot
🚷 view threshold
2,229.94 ms
(-24.70%)Baseline: 2,961.46 ms
3,553.75 ms
(62.75%)
isolated-linker.fresh-install.hot-cache.hot-store📈 view plot
🚷 view threshold
1,435.61 ms
(-30.41%)Baseline: 2,062.82 ms
2,475.39 ms
(58.00%)
isolated-linker.fresh-restore.cold-cache.cold-store📈 view plot
🚷 view threshold
1,954.21 ms
(-6.19%)Baseline: 2,083.24 ms
2,499.88 ms
(78.17%)
isolated-linker.fresh-restore.hot-cache.hot-store📈 view plot
🚷 view threshold
645.26 ms
(-1.71%)Baseline: 656.45 ms
787.74 ms
(81.91%)
🐰 View full continuous benchmarking report in Bencher

…estructure bind

The sibling `offline: _` / `prefer_offline: _` binds carry no comment;
match them for consistency.
The inline `if let Some(value) = args.workspace_concurrency` override
body was only reachable when install ran *with* the flag, so the
flag-absent integration runs left it uncovered. Extract the resolution
into `InstallArgs::resolve_workspace_concurrency` and apply it
unconditionally at the dispatch (matching upstream's final
`getWorkspaceConcurrency` pass), so the substantive logic is covered by
fast unit tests (absent / positive / negative) and the call site is an
unconditional assignment the existing install tests already exercise.

@KSXGitHub KSXGitHub left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Some lines could be better with pipe-trait.

Comment thread pacquet/crates/cli/src/cli_args/install/tests.rs Outdated
Comment thread pacquet/crates/cli/src/cli_args/install/tests.rs Outdated
Comment thread pacquet/crates/cli/src/cli_args/install/tests.rs Outdated
Comment thread pacquet/crates/cli/src/cli_args/install/tests.rs Outdated
…alls

Per review: rewrite the `InstallArgsHarness::try_parse_from([...])`
calls in the new workspace-concurrency tests as
`[...].pipe(InstallArgsHarness::try_parse_from)` so they read
left-to-right, matching the codebase's pipe-trait convention.
@KSXGitHub KSXGitHub marked this pull request as ready for review May 26, 2026 15:28
@KSXGitHub KSXGitHub requested a review from zkochan as a code owner May 26, 2026 15:28
Copilot AI review requested due to automatic review settings May 26, 2026 15:28

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Ports pnpm’s recursive and workspace-concurrency knobs into pacquet’s Rust configuration/CLI surfaces to align config parsing and storage behavior (even if not yet fully consumed by install’s execution pipeline).

Changes:

  • Added Config::workspace_concurrency with a smart default (min(4, cores)), YAML/env parsing, and CLI override via install --workspace-concurrency.
  • Added Config::recursive and wired it to the global -r/--recursive CLI flag.
  • Added/updated tests covering YAML/env/CLI parsing and default parity.

Reviewed changes

Copilot reviewed 11 out of 11 changed files in this pull request and generated 2 comments.

Show a summary per file
File Description
pacquet/crates/package-manager/src/install_package_from_registry/tests.rs Updates test config construction for new Config fields.
pacquet/crates/config/src/workspace_yaml/tests.rs Adds YAML parsing/resolution tests for workspaceConcurrency.
pacquet/crates/config/src/workspace_yaml.rs Adds workspace_concurrency to WorkspaceSettings and applies it via the shared resolver.
pacquet/crates/config/src/lib.rs Adds Config fields/docs and exports default_workspace_concurrency.
pacquet/crates/config/src/env_overlay.rs Adds PNPM_CONFIG_WORKSPACE_CONCURRENCY env overlay support + tests.
pacquet/crates/config/src/defaults/tests.rs Adds a parity test tying workspaceConcurrency default to childConcurrency default.
pacquet/crates/config/src/defaults.rs Introduces default_workspace_concurrency().
pacquet/crates/cli/src/cli_args/tests.rs Adds tests for global -r/--recursive parsing behavior.
pacquet/crates/cli/src/cli_args/install/tests.rs Adds tests for --workspace-concurrency parsing and resolution.
pacquet/crates/cli/src/cli_args/install.rs Adds the --workspace-concurrency flag and resolution helper.
pacquet/crates/cli/src/cli_args.rs Wires --recursive into Config and applies --workspace-concurrency override for install.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread pacquet/crates/config/src/lib.rs Outdated
Comment thread pacquet/crates/config/src/workspace_yaml.rs Outdated
…currency docs

workspace_concurrency is populated only from pnpm-workspace.yaml, global
config.yaml, and the PNPM_CONFIG_WORKSPACE_CONCURRENCY env overlay.
Config::current reads .npmrc but applies only the auth/network subset, so a
workspace-concurrency= entry in .npmrc never reaches the field. Align the doc
comments and PR summary with actual behavior, matching the sibling
childConcurrency docs.
@zkochan zkochan merged commit f578281 into main May 26, 2026
28 checks passed
@zkochan zkochan deleted the claude/friendly-lovelace-kqPVW branch May 26, 2026 16:47
@zkochan zkochan mentioned this pull request May 27, 2026
KSXGitHub pushed a commit that referenced this pull request Jun 1, 2026
…ral doc

- Re-pad the [dependencies] table so every `=` aligns to the widest
  key (pacquet-resolving-parse-wanted-dependency, added by this PR).
  The merge from origin/main introduced a new dep that broke the
  uniform column alignment taplo enforces.
- Update exec.rs's deferral doc: the workspace-projects-filter /
  workspace-projects-graph crates and the global --filter/--recursive
  flags landed on main (#11959, #12000), so the selection layer now
  exists; only the recursive runner is still missing.

https://claude.ai/code/session_01PPwhryEFfN4iyZkVsjy2Hf
KSXGitHub pushed a commit that referenced this pull request Jun 1, 2026
The perfectionist 0.0.0-rc.17 upgrade on main flags bare `#NNN`
references as ambiguous (could be issue / PR / colour / etc.). Replace
the two #11959 / #12000 references with explicit pull-request URLs,
matching pacquet's existing doc-comment convention.

https://claude.ai/code/session_01PPwhryEFfN4iyZkVsjy2Hf
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants