Skip to content

Commit 02a7bc5

Browse files
tirth8205claude
andauthored
chore: release v2.3.1 (#233)
Hotfix for the Windows long-running-MCP-tool hang that v2.2.4 only partially fixed. - #46 / #136 — converted 5 heavy MCP tools to async + asyncio.to_thread so the stdio event loop stays responsive during full builds, postprocessing, embeddings, change detection, and wiki generation. @dev-limucc's v2.2.4 test on #136 showed read-only tools worked but long-running ones still hung. Root cause: FastMCP 2.x dispatches sync handlers inline on the only event-loop thread; a 10-second handler freezes stdin/stdout for 10 seconds. Fix: wrap the work in asyncio.to_thread so the loop keeps pumping. Verified locally on Python 3.11 / macOS: ruff clean, mypy clean, bandit clean, 737 tests (+2 new lock-in tests), coverage 74.63%. Windows verification post-release — will ping @dev-limucc on #136 once 2.3.1 is live on PyPI. Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 7093e56 commit 02a7bc5

File tree

3 files changed

+9
-2
lines changed

3 files changed

+9
-2
lines changed

CHANGELOG.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,13 @@
22

33
## [Unreleased]
44

5+
## [2.3.1] - 2026-04-11
6+
7+
Hotfix for the Windows long-running-MCP-tool hang that v2.2.4 only partially fixed.
8+
9+
### Fixed
10+
- **Windows MCP hang on long-running tools** (PR #231, fixes #46, #136): follow-up to v2.2.4. [@dev-limucc reported on #136](https://github.com/tirth8205/code-review-graph/issues/136) that the `WindowsSelectorEventLoopPolicy` fix from v2.2.4 was necessary but not sufficient — read-only tools worked, but `build_or_update_graph_tool(full_rebuild=True)` and `embed_graph_tool` still hung indefinitely on Windows 11 / Python 3.14. Root cause: FastMCP 2.x dispatches sync handlers inline on the only event-loop thread, so handlers that run for more than a few seconds (especially those that spawn subprocesses or do CPU-bound inference) stop the loop from pumping stdin/stdout. **Fix**: converted the five heavy tools (`build_or_update_graph_tool`, `run_postprocess_tool`, `embed_graph_tool`, `detect_changes_tool`, `generate_wiki_tool`) to `async def` and offloaded the blocking work via `asyncio.to_thread`. The other 19 tools are fast SQLite-read paths and stay sync. Zero config, works on every platform. New regression tests assert the five tools are registered as coroutines AND that each one's source literally contains `asyncio.to_thread` as a defense-in-depth lock-in.
11+
512
## [2.3.0] - 2026-04-11
613

714
Additive feature release — new language parsers, new platform install target, MCP tool UX improvements, and out-of-tree graph storage. No breaking changes from v2.2.4.

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
44

55
[project]
66
name = "code-review-graph"
7-
version = "2.3.0"
7+
version = "2.3.1"
88
description = "Persistent incremental knowledge graph for token-efficient, context-aware code reviews with Claude Code"
99
readme = {file = "README.md", content-type = "text/markdown"}
1010
license = "MIT"

uv.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)