v3.5.49
ruvnet/ruflov3.5.49Apr 2, 2026by ruvnet
AI Summary
This is a bug-fix release (P0 fixes) addressing critical issues: a daemon race condition causing immediate death after spawn, an ESM compatibility issue with require('path') that disabled all AgentDB controllers, and a ReasoningBank method name mismatch. All 1725 tests pass.
Key Highlights
- Fixed daemon race condition - removed premature PID file write and added setInterval keepalive
- Fixed Windows detached spawn issue by changing stdio from numeric FDs to 'ignore'
- Fixed ESM compatibility - replaced require('path') with await import('node:path')
- Added fallback for ReasoningBank search method (.searchPatterns() falls back to .search())
- All 1725 tests pass across 28 files with 0 failures
New Features
- PID file timing fix to prevent self-detection race condition
- setInterval-based keepalive mechanism for Node.js process
- Windows-compatible detached spawn stdio handling
- Dynamic ESM/CJS compatible path module import
- Search method fallback logic for ReasoningBank compatibility
Full Release Notes
## P0 Fixes
### #1478: Daemon Dies Immediately After Spawn
- Removed premature PID file write that caused self-detection race condition
- Added ref'd `setInterval` keepalive (unref'd timers don't keep Node.js alive)
- Changed detached spawn stdio from numeric FDs to `'ignore'` (fixes Windows child death)
### #1492: ESM require('path') Disables All 15 AgentDB Controllers
- `require('path')` throws ReferenceError in ESM context, silently killing `initAgentDB()`
- Replaced with `await import('node:path')` — works in both ESM and CJS
### #1492 (Bug 2): bridgeSearchPatterns Wrong Method
- ReasoningBank exposes `.search()` not `.searchPatterns()` in some versions
- Added fallback: tries `.searchPatterns()` first, falls back to `.search()`
## Stats
- **1725 tests pass** (28 files, 0 failures)
- Published: `@claude-flow/cli@3.5.49`, `claude-flow@3.5.49`, `ruflo@3.5.49`