Pewarta Proxy

📋 Server Request & Proxy Logs

Loading active proxy settings...
Developed by Khairul Adha (adhexa.id)
Mengambil log server...

⚙️ Pengaturan Proxy Target

Skip to content

Fix pnpm brace and class workspace globs (#1846) - #1863

Open
Mikola Lysenko (mikolalysenko) wants to merge 11 commits into
mainfrom
agent/fix-pnpm-brace-class-globs
Open

Mikola Lysenko (mikolalysenko) wants to merge 11 commits into
mainfrom
agent/fix-pnpm-brace-class-globs

Conversation

@mikolalysenko

@mikolalysenko Mikola Lysenko (mikolalysenko) commented Oct 29, 2026 •

Copy link
Copy Markdown
Collaborator

LLM Description written by Claude Code:claude-opus-5-5

Fixes #1846

Summary

A pnpm-workspace.yaml listing members as packages/{a,b} or packages/[ab]* was refused by every non-hosted membership check (member_dirs, root_accounts_for_member_lock). When working out which workspace file governs a project, it was instead treated as listing every directory. pnpm installs exactly those members, and the shared glob matcher already reads that syntax. Hosted mode had its own second reader to work around the refusal, so hosted and non-hosted answered differently.

User-visible: brace sets and plain character classes in packages: are no longer refused outside hosted mode. They now resolve to the members pnpm itself lists.

Root cause

utils::pnpm_workspace::modeled refused any glob containing { } [ ] ( ) as "syntax the shared matcher does not model". But workspace_globs::pattern_matches already expands braces and matches classes. In addition, member_dirs walked candidates with cargo's expand_glob_bounded, which reads neither braces nor classes.

Changes

  • modeled now refuses only syntax that pnpm reads differently from the shared matcher. I probed this on pnpm 10.28.0 with pnpm list -r, over packages/{a,b,c,ab,x,.h}:

    glob pnpm lists here
    packages/{a,b} a b read
    packages/[ab]* a ab b read
    packages/{a..c} a b c read
    packages/[a-b] a b read
    packages/*, !packages/[ab] ab c x read
    packages/[!a]* a ab (pnpm reads [!a] as [a]) refused
    packages/[^a]* .h b c x (matches a leading dot) refused
    packages/[.]h .h refused
    packages/[[:alpha:]] a b c x refused
    `packages/@(a b), packages/(a b)`

    A class is read only when it is closed, not negated, and holds just letters, digits, _ and - ranges. Such a class can never match . or /. A glob with more brace alternatives than the matcher expands is also refused, so the answer is never partial.

  • member_dirs walks each brace alternative, with its classes widened to ? (a superset), and then lists_member narrows the result exactly.

  • hosted::governing_root::pnpm_lists_unmodeled and its unwrap_or_else fallback are deleted. Hosted now reads through lists_member. Syntax that is still unmodeled lists nothing there, which matches that function's documented "errs toward not a member" rule.

  • There is now one detector for "the lock lists member importers": formats::pnpm::workspace, with a new lock_text_has_member_importers(&str) entry point. It replaces pnpm_workspace::root_lock_lists_members. It now skips # comment lines: an indented commented importer was counted as a member, and a column-0 comment ended the section early. It also treats tab-led lines as continuation, as the deleted copy did.

  • Brace shapes that pnpm reads as picomatch does, not as brace expansion, are refused (a7ee393, from the final review). These are stepped or multi-character sequences (p{1..10} lists p0 p1 under pnpm), * or ? inside braces (these match a leading .), and an empty alternative (packages/{a,} must not list packages).

  • member_dirs walks at most 64 brace alternatives across all globs and returns Err beyond that (2161606, from the final review). Globs without braces are not counted against that cap (d52f3b6, from Bugbot). Each alternative is one walk of the tree, and an alternative that matches nothing never reaches MAX_MANIFESTS. In the reviewer's measurement, **/{a..z}{a..z}{a..e} took 519 s on about 4,200 directories.

  • A {x..y} sequence must have both ends digits, both lowercase or both uppercase (5ca5e0e, from the final review's open question): {-..0} stepped through . and /, and {0..Z} through ?.

  • A .. beside a comma in a brace set ({a,b..c}) and braces inside a class ([a{b,c}]) are refused (032b960, from the final review): pnpm reads the first as a sequence and the second as class members.

  • Behaviour notes: the merged lock-importer reader skips # comments, no longer ends importers: at a column-0 comment, and treats tab-indented lines as indented. The member walk's MAX_MANIFESTS bound now counts the union of every glob's candidates.

  • I did not add WorkspacesDialect::PNPM, which the issue suggested. With the second reader gone, lists_member (via glob_matches_no_dot) is the only pnpm reader, so the constant would have no caller.

Test evidence

Red before the fix (cargo test -p socket-patch-core --lib, new tests on 78ccde1 plus the test commit): 4 failed: member_dirs_read_braces_and_classes_as_pnpm_does, a_project_outside_the_packages_globs_is_not_governed, member_importers_mark_a_pre_10_5_workspace (commented importer), lock_text_member_importers_read_every_lock_shape.

Green after:

  • cargo fmt --all -- --check: ok
  • cargo clippy --workspace --all-features -- -D warnings: ok
  • cargo test -p socket-patch-core --all-features: 6992 passed. 4 failed only because this container runs as root, so chmod-based "write fails" tests cannot fail: copy_tree::relax_loop_must_not_traverse_symlinked_root, vlt_heal::an_unremovable_hidden_lock_keeps_every_store_entry, pypi_poetry::wire_write_failure_…, pypi_requirements::wire_failure_rolls_back_…. This PR doesn't touch those files.
  • CLI: hosted_memory_parity (42), in_process_redirect_pnpm (41), in_process_vendor_pnpm_parent_child (8), in_process_vendor_pnpm_takeover (15), scan_pnpm_relocated_store_cwd_e2e (23): all pass.
  • e2e_redirect_pnpm_build -- --ignored --skip pnpm_pinned_matrix (CI's leg, local pnpm 10.28): 11 passed.
  • The full cargo test --workspace run ran out of container disk while linking CLI test binaries, so CI is the full run.

Per-issue checklist (#1846 acceptance criteria):

  • Brace and class workspaces resolve the same members in hosted and member_dirs: governing_root::tests::pnpm_brace_and_class_globs_list_what_member_dirs_lists, pnpm_workspace::tests::member_dirs_read_braces_and_classes_as_pnpm_does (disk and in-memory trees).
  • A #-commented importer line is not a member: member_importers_mark_a_pre_10_5_workspace, lock_text_member_importers_read_every_lock_shape.
  • Existing pnpm workspace and governing_root tests pass. hosted_memory_parity::an_unconfirmed_pnpm_member_keeps_its_lock now uses an extglob as its unmodeled glob, because braces are read now.

/code-review high

Fixed in acf9d23:

Bugbot (acf9d23): a class range starting at - ([--9]) spans . and /. Fixed in f9b15ba: a class body containing -- is refused.

Not fixed, by choice:

  • Teach cargo_workspace::expand_glob_bounded braces and classes for every caller. That is Cargo workspace member globs ignore [...] character classes, so members = ["crates/[ab]*"] expands to no members #1833 (Cargo classes, p2), a separate root cause. Here the widen-then-narrow walk stays local to pnpm and stays exact, because lists_member decides every candidate.
  • Build modeled's class check on workspace_globs::char_class. The check here deliberately accepts only a strict subset: closed, non-negated classes of [A-Za-z0-9_-] with no range starting at -. Anything else, []a] included, is refused. So when it disagrees with the matcher's grammar, the result is a refusal, never a wrong answer.

https://claude.ai/code/session_011f9aeQPdgsuof1CE3TcTC5


Generated by Claude Code


Note

Medium Risk
Changes core pnpm workspace membership, lock shared/per-member classification, and hosted governing-root behavior; wrong glob modeling could mis-pin or drop member locks, though unmodeled syntax still fails closed with errors or conservative defaults.

Overview
pnpm packages: globs with brace sets and plain character classes (e.g. packages/{a,b}, packages/[ab]*) are now resolved the same way in hosted and non-hosted paths, matching what pnpm lists instead of refusing them or using a separate hosted-only reader.

Membership logic narrows modeled() so only patterns pnpm interprets differently from the shared matcher stay refused (extglobs, negated/POSIX classes, quantifiers/escapes beside braces, odd brace sequences). Supported patterns are discovered by walking each brace alternative with classes widened to ?, then filtering with lists_member; brace-driven walks are capped at 64 alternatives across all globs. Hosted listing_workspace drops the old pnpm_lists_unmodeled fallback and uses lists_member only (unmodeled syntax lists nothing).

Shared lock detection consolidates on lock_text_has_member_importers / member_importers: # comments no longer count as importers or end the importers: section early, and tab-indented lines are handled like the previous ad-hoc parser.

Reviewed by Cursor Bugbot for commit 032b960. Configure here.

Assisted-by: Claude Code:claude-opus-5-5
The check for "does this pnpm lock list workspace members" counted a
`#`-commented importer line as a member, and a column-0 comment ended
the importers section early. It now skips comments, accepts tab-led
lines, and gains a whole-text entry point so the second, hand-split
copy in pnpm_workspace can go (#1846).

Assisted-by: Claude Code:claude-opus-5-5
A pnpm-workspace.yaml listing members as `packages/{a,b}` or
`packages/[ab]*` was refused by every non-hosted membership check,
or (when deciding which workspace file governs a project) treated as
listing every directory, even though pnpm installs exactly those
members and the shared glob matcher already reads that syntax. Hosted
mode kept its own second reader to work around the refusal.

Now one reader answers for all callers: brace sets and plain classes
of letters, digits, `_` and `-` match as pnpm 10.28 reads them, and
the member walk expands braces and widens classes before narrowing.
Syntax pnpm reads its own way stays refused: `[!a]` (pnpm reads it
as `[a]`), `[^a]` and `[.]` (they match a leading dot), POSIX classes
and extglob groups. The hosted fallback reader and the duplicate
lock-importer detector are gone (#1846).

Assisted-by: Claude Code:claude-opus-5-5
The hosted/in-memory parity test used `packages/{a,b}` as its example
of a pnpm glob socket-patch cannot read. Brace sets are now read
(#1846), so the case uses an extglob group, which is still refused.

Assisted-by: Claude Code:claude-opus-5-5
Review on #1846: beside a class or brace set, pnpm reads `+` as a
quantifier (`packages/[ab]+` lists `packages/ab`) and `\` as an
escape (`packages/\[a]` lists only a directory named `[a]`), while
the shared matcher reads `+` literally and `\` as a separator. Those
globs are refused again, in each brace alternative too, instead of
answering "not a member". Globs without classes or braces read as
before.

The member walk now applies one directory bound across every brace
alternative, so a brace glob can no longer collect many times more
candidates than the limit. Each candidate also skips the repeated
syntax check.

Assisted-by: Claude Code:claude-opus-5-5
@mikolalysenko
Mikola Lysenko (mikolalysenko) marked this pull request as ready for review October 29, 2026 23:04
@mikolalysenko

Copy link
Copy Markdown
Collaborator Author

BugBot review


Generated by Claude Code

1 similar comment
@mikolalysenko

Copy link
Copy Markdown
Collaborator Author

BugBot review


Generated by Claude Code

@cursor cursor Bot left a comment •

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Stale Bugbot comment from a previous run.

A class range from `-` (as in `packages/[--9]h`) spans `.` and `/`,
so pnpm can match a hidden directory that the shared matcher never
does. Such classes are refused now. A literal `-` (`[-a]`) and ranges
between letters, digits and `_` stay readable.

Assisted-by: Claude Code:claude-opus-5-5
@mikolalysenko

Copy link
Copy Markdown
Collaborator Author

BugBot review


Generated by Claude Code

@cursor cursor Bot left a comment •

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Stale Bugbot comment from a previous run.

@mikolalysenko Mikola Lysenko (mikolalysenko) added the Ready for review Agent-verified: mergeable, CI green, Bugbot clean — awaiting human review label Oct 30, 2026
@mikolalysenko

Copy link
Copy Markdown
Collaborator Author

Burn-down agent: labeled Ready for review at f9b15ba. CI 50/50 green on this head; mergeable, no conflicts. Bugbot reviewed f9b15ba: no findings; no open review threads. Slack announcement not sent this run (Slack posting unavailable).


Generated by Claude Code

@mikolalysenko

Copy link
Copy Markdown
Collaborator Author

Burn-down agent: labeled Ready for review at f9b15ba3eeec7c3afd07b9169294f1916b5fc240.

  • CI: 31/31 run checks green (19 skipped by path filters); no main-wide failures.
  • Bugbot: reviewed f9b15ba3ee, no new issues; no unresolved review threads.
  • Mergeable: yes, no conflicts; waiting only on human approval.
  • Slack: not announced (Slack send unavailable in this run); the next run retries.

Generated by Claude Code

pnpm 10.28.0 reads braces as picomatch does, not as brace-expansion
does. So modeled() accepted three shapes whose members differ from
what pnpm lists:

- a stepped or multi-character sequence: `p{1..10}` lists p0 and p1
  under pnpm, not p10;
- a `*` or `?` inside braces: `{a,*}` lists dot directories under pnpm;
- an empty alternative: `packages/{a,}` listed `packages` itself.

Refuse these shapes, as the rest of modeled() already does for syntax
pnpm reads its own way, instead of guessing a member set that would
reach member_dirs and the hosted governing root.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@mikolalysenko Mikola Lysenko (mikolalysenko) removed the Ready for review Agent-verified: mergeable, CI green, Bugbot clean — awaiting human review label Oct 30, 2026
@mikolalysenko

Copy link
Copy Markdown
Collaborator Author

Final review of f9b15ba: I found three brace shapes that modeled() accepted but pnpm lists differently. I pushed a7ee393, which refuses them.

I compared against a real pnpm 10.28.0 (pnpm ls -r --depth -1 --json on a fixture tree), which reads braces as picomatch does:

  • Stepped or multi-character sequences. For packages/p{1..10}, pnpm lists p0 p1; the PR listed p1 p2 p10. {a..e..2} and p{01..2} also differed. Unstepped single-character sequences ({a..c}, {c..a}, {0..2}) agree and stay accepted.
  • * or ? inside braces. pnpm's {a,*} and {?h,x} match a leading . (packages/.h); the PR's matcher doesn't.
  • An empty alternative. For packages/{a,} and {,a}, the PR listed packages itself; pnpm lists only packages/a.

The fix adds plain_braces in pnpm_workspace.rs and new refusal cases to member_dirs_read_braces_and_classes_as_pnpm_does. The test fails without the fix.

Ran: cargo test -p socket-patch-core --lib filtered to pnpm, workspace_globs and governing_root (511 pass), and hosted_memory_parity (42 pass). cargo clippy -p socket-patch-core --all-targets -D warnings still fails, but none of the errors are in the file I changed.

Non-blocking, for the PR description:

  • The lock-importer reader merge (formats/pnpm/workspace.rs, member_importers) also changes behavior. Comments are now skipped, a column-0 # no longer ends importers:, and tab indents count as indented.
  • The walk bound now counts the union of all globs against MAX_MANIFESTS.

I removed Ready for review until CI and Bugbot pass on the new head.

bugbot run


Generated by Claude Code

@mikolalysenko

Copy link
Copy Markdown
Collaborator Author

BugBot review


Generated by Claude Code

@cursor cursor Bot left a comment •

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Stale Bugbot comment from a previous run.

@mikolalysenko Mikola Lysenko (mikolalysenko) added the Ready for review Agent-verified: mergeable, CI green, Bugbot clean — awaiting human review label Oct 30, 2026
@mikolalysenko

Copy link
Copy Markdown
Collaborator Author

Burn-down agent: labeled Ready for review at a7ee3934.

  • CI: 31/31 run checks green (19 skipped by path filters); mergeable, no conflicts.
  • Bugbot: reviewed a7ee393 with no new issues; the one earlier thread is resolved.
  • Reviewer note: a7ee393 (from the final review) makes modeled() refuse three brace shapes pnpm lists differently; worth a look.
  • Slack announcement could not be sent from this run; the next run will retry.

Generated by Claude Code

member_dirs walks the tree once for each brace alternative, and the
directory bound only counts matches, so an alternative that matches
nothing walks the whole tree without ever reaching it. A scanned repo's
pnpm-workspace.yaml could list up to 4095 alternatives (for example
**/{a..z}{a..z}{a..e}) and stall the scan for minutes on a modest tree.
Allow at most 64 alternatives over all globs and answer Err beyond
that, which callers already treat as no answer.

Refs #1846

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011f9aeRR24V93EPLyuXR8tp
@mikolalysenko Mikola Lysenko (mikolalysenko) removed the Ready for review Agent-verified: mergeable, CI green, Bugbot clean — awaiting human review label Oct 30, 2026
@mikolalysenko

Copy link
Copy Markdown
Collaborator Author

Final review of a7ee393. I found one blocking problem and pushed a fix, 2161606.

The problem: an untrusted pnpm-workspace.yaml could stall the scan for minutes. member_dirs walks the tree once for each brace alternative. The MAX_MANIFESTS bound only counts directories that match, so an alternative that matches nothing walks the whole tree and never reaches the bound. modeled() accepts up to 4095 alternatives. For example, **/{a..z}{a..z}{a..e} expands to 3380 of them, and on a DiskTree of about 4,200 directories it took 519 s, against 262 ms for **/zz. A scan reaches this path whenever the scanned repo sets sharedWorkspaceLockfile: false and has no shared root lock. Before this PR, every brace glob was refused, so this exposure is new.

The fix: member_dirs now walks at most 64 brace alternatives across all globs and answers Err beyond that. Callers already treat Err as no answer. The member_dirs_refuse_a_glob_the_bounded_walk_cannot_finish test now also covers this case.

Verified:

  • cargo test -p socket-patch-core --lib -- pnpm member_importers governing_root: 501/501 pass.
  • cargo clippy -p socket-patch-core -- -D warnings: clean.
  • rustfmt: clean.
  • With the old modeled() refusal put back, 5 of the new tests fail, so the tests catch the change.

Non-blocking, for the description: two changes go beyond the brace/class fix, and the description doesn't mention them. Both are tested and look right.

  • The lock importers: reader now skips # comments.
  • root_lock_lists_members is merged into member_importers. As a side effect, a tab-indented top-level key no longer ends the section.

I removed Ready for review. The burn-down agent will re-label it once CI is green, and the final-review brief will follow.

bugbot run


Generated by Claude Code

@mikolalysenko

Copy link
Copy Markdown
Collaborator Author

BugBot review


Generated by Claude Code

@cursor cursor Bot left a comment •

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Stale Bugbot comment from a previous run.

The cap on how many tree walks a pnpm-workspace.yaml can ask for also
counted globs without braces. A workspace listing more than 64 plain
`packages:` entries, which large monorepos do, failed member-lock
discovery, though main walks those without a cap. Only the extra walks
brace sets add now count; a plain glob is one walk, as before.

Assisted-by: Claude Code:claude-opus-5-5
@mikolalysenko

Copy link
Copy Markdown
Collaborator Author

BugBot review


Generated by Claude Code

@cursor cursor Bot left a comment •

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Stale Bugbot comment from a previous run.

@mikolalysenko Mikola Lysenko (mikolalysenko) added the Ready for review Agent-verified: mergeable, CI green, Bugbot clean — awaiting human review label Oct 30, 2026
@mikolalysenko

Copy link
Copy Markdown
Collaborator Author

Burn-down agent: labeled Ready for review at d52f3b62.

  • CI: 50/50 check runs green on this head; mergeable with no conflicts; no CHANGELOG.md change.
  • Bugbot: reviewed d52f3b6, no issues found; no unresolved review threads.
  • Reviewer focus: pnpm brace/class workspace glob handling in utils/workspace_globs.rs and utils/pnpm_workspace.rs; earlier final-review blocker was fixed in 2161606 and both review threads are resolved.
  • Slack announcement not sent this run (Slack send tool unavailable); next run should retry.

Generated by Claude Code

@mikolalysenko

Copy link
Copy Markdown
Collaborator Author

Final review brief (head d52f3b6)

What it does. pnpm packages: globs may now use brace sets ({a,b}, {1..3}) and plain character classes ([ab]). Before this, they were refused outside hosted mode. Syntax that pnpm reads differently from the shared matcher (extglob, [!a], empty or nested-path alternatives) is still refused. member_dirs walks each brace alternative and is capped at 64 walks. Hosted's second pnpm workspace reader is gone, and the two lock-importer detectors are now one.

Risk: low–medium. The refusals keep it conservative and the walk is bounded. But it changes which directories count as workspace members, in both the hosted and the non-hosted paths.

Look here

Verified

  • cargo test -p socket-patch-core --lib -- pnpm workspace_globs governing_root: 511 passed.
  • Revert checks: with plain_braces disabled, member_dirs_read_braces_and_classes_as_pnpm_does fails. With the 64-walk budget disabled, member_dirs_refuse_a_glob_the_bounded_walk_cannot_finish fails. So the tests exercise the change.
  • CI is green on the head (ci-ok, clippy). Bugbot threads are all resolved. CHANGELOG.md is untouched.

Changes I made: none.

Open questions (non-blocking, contrived inputs)

  • The {x..y} sequence check at pnpm_workspace.rs:394 only requires each end to be one character. A range across punctuation is accepted. For example, packages/{0..Z} expands through ?, and packages/{-..0} expands through . and /, which lists packages itself. Requiring both ends to be the same class (both digits, both lowercase or both uppercase) would close this. It's fine as a follow-up.

Auto-merge (squash) is armed, so approving sends this straight to the merge queue.


Generated by Claude Code

A brace sequence with single-character ends that are not the same
kind stepped through punctuation: `packages/{-..0}` expanded through
`.` and `/`, listing `packages` itself as a member, and `{0..Z}`
through `?`, which the walk then read as a wildcard. A sequence now
needs both ends to be digits, both lowercase or both uppercase.

Found in the final review of #1863.

Assisted-by: Claude Code:claude-opus-5-5
@mikolalysenko

Copy link
Copy Markdown
Collaborator Author

[agent] Fixed the final review's open question in 5ca5e0e instead of leaving it as a follow-up. This PR introduced it, and {-..0} lists packages itself, which is a wrong member set. A {x..y} sequence now needs both ends to be digits, both lowercase or both uppercase (same_kind_range). packages/{-..0} and packages/{0..Z} are in the refused-syntax test and fail on d52f3b6. Locally, 90 targeted core tests pass and clippy is clean.


Generated by Claude Code

@mikolalysenko

Copy link
Copy Markdown
Collaborator Author

BugBot review


Generated by Claude Code

@cursor cursor Bot left a comment •

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Stale Bugbot comment from a previous run.

pnpm 10.28 expands a `..` inside a comma brace set as a sequence
(`packages/{a,b..c}` lists `,` `0` `A` `[` ...), and reads braces inside a
class as class members (`packages/[a{b,c}]` lists `,` `{` `}`). modeled()
accepted both and listed a different member set, where the rule is to
refuse syntax we don't read the way pnpm does. Refuse any alternative
holding `..` beside a comma, and check classes on the raw glob too.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011f9aeRocMg7S8GHB43bJsX
@mikolalysenko Mikola Lysenko (mikolalysenko) removed the Ready for review Agent-verified: mergeable, CI green, Bugbot clean — awaiting human review label Oct 30, 2026
@mikolalysenko

Copy link
Copy Markdown
Collaborator Author

Final review found two globs where member_dirs listed a different member set than pnpm 10.28.0 does, where the PR's rule is to refuse rather than guess. I fixed both in 032b960:

  • A .. beside a comma (packages/{a,b..c}, {a,..}, {a,b..c,x}). pnpm expands it as a sequence and also lists , 0 A [ _ and others. We listed packages/a plus a literal packages/b..c. Such sets are now refused. Only a lone same-kind sequence like {a..c} is read.
  • Braces inside a class (packages/[a{b,c}]). pnpm reads the braces as class members and also lists dirs named , { }. We listed only a, b, c. Classes are now checked on the raw glob as well as on each brace alternative, so {[ab],x} is still read.

All four globs are added to the refusal table. Local results: cargo test -p socket-patch-core --lib -- pnpm_workspace workspace_globs governing_root formats::pnpm::workspace passes 90/90, and cargo clippy --locked -p socket-patch-core --all-features -D warnings is clean.

I removed Ready for review; the burn-down re-labels the PR once CI is green. A brief follows on the next pass.

bugbot run


Generated by Claude Code

@mikolalysenko

Copy link
Copy Markdown
Collaborator Author

BugBot review


Generated by Claude Code

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

✅ Bugbot reviewed your changes and found no new issues!

Comment @cursor review or bugbot run to trigger another review on this PR

Reviewed by Cursor Bugbot for commit 032b960. Configure here.

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.

pnpm workspace membership refuses brace and class globs the shared matcher already reads, and hosted keeps a second reader for them

2 participants