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`