v3.38.9

ruvnet/ruflov3.38.9Aug 13, 2026by ruvnet

AI Summary

Fixes a critical bug in the `PathValidator` that rejected paths on macOS due to symlink handling differences, specifically breaking the `ruflo proxy install` command.

Key Highlights

  • Fixed symlinked prefix rejection on macOS
  • Resolved `proxy install` failures on macOS
  • Implemented ENOENT-tolerant fallback for path resolution

Full Release Notes

## Fixes

**#3010 — `PathValidator` rejected everything under a symlinked prefix, breaking `ruflo proxy install` on macOS.** `validate()` canonicalized the candidate path through `fs.realpath` but the constructor only ever `path.resolve()`d the allowed prefixes — so on macOS, where `os.tmpdir()` is reached through a symlink (`/var` → `/private/var`), the realpath'd candidate could never match the non-realpath'd prefix, and every path under it — including the prefix's own contents — was rejected as "outside allowed directories." Download and Ed25519 signature verification both succeeded during proxy install; it then failed on this defense-in-depth path check. Fixed by realpath-ing prefixes at construction time too, with the same ENOENT-tolerant fallback `validate()` already uses for candidates.

## Links

- PR: [#3013](https://github.com/ruvnet/ruflo/pull/3013) (#3010)
- Previous release: [v3.38.8](https://github.com/ruvnet/ruflo/releases/tag/v3.38.8) (#2962 — provider/model config propagation)