* fix(projects-graph): resolve workspace deps declared with a relative path
A dependency declared as `workspace:../some/path` was silently dropped
from the project graph. `workspacePrefToNpm` turns it into the bare
string `../some/path`, and because the registry argument is empty every
string satisfies the `startsWith(registry)` check, so `parseBareSpecifier`
tries to parse it as a tarball URL and throws. The surrounding
`catch { return '' }` swallowed the error and `filter(Boolean)` removed
the edge, so the dependency disappeared without any warning, affecting
`--filter` selection and recursive install ordering.
Fall back to resolving the un-prefixed spec as a directory dependency
via the existing `npa.resolve` path, the same way plain relative-path
deps are already handled. This matches the behaviour the Rust engine
already implements, which classifies a path-like workspace version as a
directory before attempting bare-specifier parsing.
* refactor(projects-graph): classify path-like workspace specs before parsing
Route a workspace spec with a relative path (workspace:./foo,
workspace:../foo) straight to directory resolution instead of relying on
parseBareSpecifier throwing and being caught. The try/catch remains only
as a backstop for other malformed specs. Behaviour is unchanged; this
addresses review feedback about using a thrown exception as control flow
for the common path-like case.
* chore: add changeset
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
---------
Co-authored-by: Zoltan Kochan <z@kochan.io>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>