|
2 | 2 |
|
3 | 3 | ## [Unreleased] |
4 | 4 |
|
| 5 | +## [2.3.3] - 2026-05-08 |
| 6 | + |
| 7 | +Large additive release accumulated since v2.3.2 — 141 non-merge commits, 8 new languages/extensions, 5 new platform install targets, 6 new framework call resolvers, comprehensive Windows hardening, VS Code accessibility pass, and a full sweep of community PRs. |
| 8 | + |
5 | 9 | ### Added |
6 | 10 |
|
| 11 | +#### Languages and extensions |
| 12 | + |
7 | 13 | - **Nix support** (flake-aware): `.nix` files are parsed via the `nix` tree-sitter grammar shipped with `tree-sitter-language-pack`. Top-level and nested attrset bindings become `Function` nodes with flattened dotted names (e.g. `packages.default`, `devShells.default`). In `flake.nix`, `inputs.<name>.url = "..."` strings emit `IMPORTS_FROM` edges to the URL; `import <path>` and `callPackage <path> <args>` applications in any `.nix` file emit `IMPORTS_FROM` edges (relative paths are resolved against the caller's directory). Adds 7 tests (`TestNixParsing`) and fixtures `tests/fixtures/sample.nix`, `tests/fixtures/sample_module.nix`. |
8 | | -- **GDScript support** (Godot): `.gd` files are parsed via the `gdscript` tree-sitter grammar shipped with `tree-sitter-language-pack`. Extracts inner classes (`class Name:`), the file-level `class_name` identity, functions (including `static func`), `extends` parent class as an IMPORTS_FROM edge, direct calls (`call`) and method calls (`attribute_call`). Adds 10 tests and `tests/fixtures/sample.gd`. |
| 14 | +- **GDScript support** (Godot, PR #316): `.gd` files are parsed via the `gdscript` tree-sitter grammar. Extracts inner classes (`class Name:`), the file-level `class_name` identity, functions (including `static func`), `extends` parent class as an IMPORTS_FROM edge, direct calls and method calls. Adds 10 tests and `tests/fixtures/sample.gd`. |
| 15 | +- **Verilog / SystemVerilog support** (PR #428): `.v`, `.sv`, `.svh` files parse modules, classes, packages, interfaces, programs, functions, and tasks via the `verilog` tree-sitter grammar. Per-construct extractors with dedicated unit tests. |
| 16 | +- **SQL support** (PR #398): `.sql` files parse `CREATE FUNCTION`, `CREATE PROCEDURE`, `CREATE TABLE`, and `CREATE VIEW` statements; emits CALLS edges for function invocations. |
| 17 | +- **ReScript support** (PR #309/323): `.res`/`.resi` parsing for modules, let-bindings, and external declarations. |
| 18 | +- **`.hh` extension support**: C++ header variants now resolve into the C++ parser path. |
| 19 | +- **`.ksh` extension and shebang-based detection** (PR #276): `.ksh` files parsed as shell; extension-less scripts detected via `#!/usr/bin/env <lang>` shebang lines. |
| 20 | +- **Julia improvements**: parametric constructors, `@enum` declarations, and `public` module exports now produce graph nodes. |
| 21 | + |
| 22 | +#### Platforms and install targets |
| 23 | + |
| 24 | +- **GitHub Copilot platform support** (PR #445): `code-review-graph install --platform copilot` writes Copilot-CLI-compatible MCP config without generating Claude-specific skill artifacts. |
| 25 | +- **Gemini CLI platform support** (PR #391): `--platform gemini-cli` skips Claude skills and writes Gemini-native MCP config. |
| 26 | +- **Qoder platform support** (PR #245): `--platform qoder` adds MCP server registration for Qoder. |
| 27 | +- **OpenCode plugin support** (PR #198 via #366): `--platform opencode` registers the MCP server with the OpenCode plugin manifest. |
| 28 | +- **Cursor hooks support** (PR #196): `install` now writes Cursor hook entries (gated behind `~/.cursor` detection so non-Cursor users are not affected). |
| 29 | +- **Codex install alignment**: native Codex integration path; no Claude skill files generated for Codex targets. |
| 30 | + |
| 31 | +#### MCP server and CLI features |
| 32 | + |
| 33 | +- **`crg-daemon`**: new multi-repo watch daemon that supervises per-repo file watchers via `subprocess.Popen` child processes. Documented in README, COMMANDS.md, and ROADMAP.md. 35 dedicated tests. |
| 34 | +- **Streamable HTTP transport** (PR #277): MCP server can now run over streamable HTTP in addition to stdio. |
| 35 | +- **`serve --tools` flag and `CRG_TOOLS` env var**: MCP tool filtering at startup so callers can expose only the subset they need. |
| 36 | +- **`--repo` precedence and validation in `get_docs_section`** (PR #378): honors `serve --repo` and validates path containment before returning section content. |
| 37 | +- **Search enrichment via PreToolUse hooks** (PR #248): hook-driven search index enrichment ahead of tool calls. |
| 38 | +- **External database directory support**: graph DB can now live on a network filesystem via the existing `CRG_DATA_DIR` mechanism, with the file locking path adjusted accordingly. |
| 39 | +- **SVN support** (PR #255): basic Subversion working-copy detection alongside git for change analysis. |
| 40 | + |
| 41 | +#### Parser and resolver improvements |
| 42 | + |
| 43 | +- **Spring DI call resolution** (PR #413): receiver method calls (`this.userService.find(...)`) resolve through `@Autowired`/constructor-injected fields to the concrete `InjectedType.method`. Emits `INJECTS` edges and stereotype metadata (`@Service`, `@Component`, `@Repository`, `@Controller`); writes fully-qualified `target_qualified` so `callers_of` queries work. |
| 44 | +- **Temporal workflow/activity call resolution**: `WorkflowStub.start(...)` and `ActivityStub.execute(...)` resolve to their concrete workflow/activity implementations. |
| 45 | +- **Kafka consumer/producer detection**: `@KafkaListener`-annotated methods and `KafkaTemplate.send(...)` calls emit `CONSUMES` and `PRODUCES` edges keyed on topic. |
| 46 | +- **Jedi-based Python call resolution** (PR #247): improved cross-file Python call resolution using the Jedi static-analysis library. |
| 47 | +- **Python callback REFERENCES edges** (PR #363): function names passed as callback arguments (`schedule(my_handler)`) now emit `REFERENCES` edges instead of being dropped. |
| 48 | +- **Mocha TDD `suite()` recognition** (PR #423): files using Mocha's TDD interface now classify as tests. |
| 49 | +- **Bun test runtime support** (PR #421): files importing `bun:test` are detected as tests. |
| 50 | +- **`__tests__/` directory detection** (PR #422): all files under `__tests__/` are classified as test files regardless of name. |
| 51 | + |
| 52 | +#### Embeddings |
| 53 | + |
| 54 | +- **OpenAI-compatible embedding provider** (PR #321): pluggable provider supporting OpenAI, Azure OpenAI, and any OpenAI-API-compatible endpoint, with configurable batch size. |
| 55 | +- **Localized embedding READMEs**: provider docs translated for non-English users. |
| 56 | + |
| 57 | +#### Visualization, accessibility, and VS Code extension |
| 58 | + |
| 59 | +- **WCAG 2.1 AA contrast pass**: 4.5:1 minimum text contrast across the standalone HTML and VS Code webview. |
| 60 | +- **Distinct `d3.symbol` shapes per node kind**: colorblind-friendly differentiation in both the standalone visualization and the VS Code webview. |
| 61 | +- **Keyboard navigation**: tab/arrow/enter/escape navigation across nodes, with focus styles and a skip-link to bypass the legend. |
| 62 | +- **ARIA roles and labels**: tooltip, detail panel, legend, search results, communities button, edge-pill keyboard activation, search input label. |
| 63 | +- **Help overlay**: interaction guide for both the standalone HTML and the keyboard-help overlay. |
| 64 | +- **Empty-state webview** in VS Code with a contextual depth slider and tooltip. |
| 65 | +- **Edge filter popover** in the VS Code toolbar — fixes density on narrow panels. |
| 66 | +- **Detail panel relocated to the left** so it no longer occludes top controls; close button restyled to match the toolbar. |
| 67 | +- **CONTAINS edge opacity** raised from 0.08 → 0.14 for visibility on dense graphs. |
| 68 | +- **GitHub Dark palette** unified across the VS Code extension. |
| 69 | +- **`IMPLEMENTS`, `TESTED_BY`, `DEPENDS_ON` edge types** rendered in the standalone HTML visualization. |
| 70 | + |
| 71 | +### Fixed |
| 72 | + |
| 73 | +#### `__version__` reporting |
| 74 | + |
| 75 | +- **`code_review_graph.__version__` now matches `pyproject.toml`** (was `2.1.0` since the v2.1.0 release). The User-Agent header that `embeddings.py` sends on cloud HTTP requests is built from this string, so cloud-embedding traffic was being mis-attributed across all releases between v2.1.0 and v2.3.2. |
| 76 | + |
| 77 | +#### C++ / Java / PHP parsing |
| 78 | + |
| 79 | +- **C++ scoped/destructor/operator method names** (PR #371, PR #403): `void Foo::bar()`, `Foo::~Foo()`, `Foo::operator==(...)` now extract the correct member name instead of the qualifier or the operator token. |
| 80 | +- **Java method name extraction** (PR #275): method names are now read from the `identifier` child of `method_declaration` rather than the return-type child (which was producing names like `int64`). |
| 81 | +- **Java superclass / super-interfaces** (PR #278): `extends Foo` and `implements Bar, Baz` now extract bare type names from the `superclass`/`super_interfaces` AST nodes. |
| 82 | +- **Java import resolution to file paths** (PR #280): `import com.example.foo.Bar` resolves through `src/main/java/...` and configured source roots to the actual file. |
| 83 | +- **PHP `CALL` extraction** (PR #298): method calls (`$obj->foo()`), static calls (`Foo::bar()`), and unqualified function calls now produce CALLS edges. |
| 84 | +- **Module-scope `CALLS` edges** (PR #285): top-level executable statements emit CALLS edges (previously only function/method bodies did). |
| 85 | + |
| 86 | +#### Windows |
| 87 | + |
| 88 | +- **Windows MCP stdio hang on long-running tools** (PR #400, PR #292): thread-pool selection now auto-selects on Windows MCP stdio so build/embed do not deadlock. |
| 89 | +- **Windows MCP stdin hang** (PR #425): all `git`/`svn` subprocesses now run with `stdin=DEVNULL`, preventing the FastMCP-stdio buffer from filling on Windows. |
| 90 | +- **Windows non-UTF-8 locale**: `subprocess.run` calls now pass `encoding="utf-8"` so cp1252 hosts no longer mis-decode git output. |
| 91 | +- **Windows test failures** (PR #274): UTF-8 encoding, CRLF normalization, and `stop_at` boundary handling fixes for Windows CI. |
| 92 | + |
| 93 | +#### Hooks and install |
| 94 | + |
| 95 | +- **Hooks JSON schema** (PR #288): `hooks.json` validation no longer fails on the wrapper layout — `matcher` is required and the wrapper is removed. |
| 96 | +- **Hooks merge instead of overwrite** (PR #114, PR #145, PR #203): `install_hooks` now merges into existing hook arrays and creates a `settings.json.bak` backup before modifying user config. |
| 97 | +- **Pre-commit hook adds `update` command** (PR #315): generated pre-commit hook runs `code-review-graph update` rather than the obsolete subcommand. |
| 98 | +- **Skip hooks gracefully outside git** (PR #293): `install` no longer fails when invoked from a non-git directory. |
| 99 | +- **Poetry / uv environment detection** (PR #287): `install` now generates the correct MCP serve command for projects using Poetry or uv. |
| 100 | +- **Hook quoting and `docs` repo_root** (PR #192): hook commands now quote repo paths with spaces, and the docs repo path is restored on install. |
| 101 | + |
| 102 | +#### MCP server |
| 103 | + |
| 104 | +- **fastmcp 3.x compatibility**: `_apply_tool_filter` restored on fastmcp ≥3, dependency floor bumped to `fastmcp>=3.2.4` to pick up the upstream Windows stdio EOF fixes. |
| 105 | +- **FastMCP banner suppressed for stdio transport** (PR #290): the startup banner no longer corrupts the stdio handshake. |
| 106 | +- **MCP config `cwd`, skills path, and JSONC parsing**: install now writes `cwd` into MCP config, points skills at the correct project path, and tolerates JSONC (comments + trailing commas) in existing config files. |
| 107 | + |
| 108 | +#### SQLite and post-processing |
| 109 | + |
| 110 | +- **SQLite transaction safety, FTS5 sync, and atomic operations** (PR #94, PR #279): nested-transaction handling, FTS5 content-table synchronization, and resource cleanup on error paths. |
| 111 | +- **CLI build/update/watch run post-processing** (PR #98): signatures, FTS, flows, and communities are now refreshed after every CLI graph mutation (was previously only refreshed by the MCP server). |
| 112 | +- **`reconcile()` auto-builds graphs and registers new repos**: cold-start path no longer requires a manual `build` before `reconcile`. |
| 113 | +- **Flow trace adjacency in-memory** (PR #296): `trace_flows` loads adjacency once instead of querying SQLite per hop. |
| 114 | + |
| 115 | +#### Other |
| 116 | + |
| 117 | +- **`UnicodeDecodeError` in `read_text`** (PR #303): all text reads now use `errors="replace"`. |
| 118 | +- **Dead-code callback references** (PR #424): functions referenced as callbacks no longer mis-classify as dead code. |
| 119 | +- **Skills.py table formatting** (PR #302). |
| 120 | +- **Search.py duplicate logger** removed. |
| 121 | +- **`status` command reports alive/dead** from the persisted state file. |
| 122 | + |
| 123 | +### Security |
| 124 | + |
| 125 | +- **Embeddings RCE hardening** (PR #397): remote code execution paths in the embedding provider are gated behind an explicit env var; cloud HTTP requests now send a versioned User-Agent (PR #390) and refuse to mix indexes built with different providers. |
| 126 | + |
| 127 | +### Documentation |
| 128 | + |
| 129 | +- **MCP tools documentation** (PR #306): catalog of all MCP tools with usage examples. |
| 130 | +- **venv usage guide** (PR #307). |
| 131 | +- **Windows setup guide** for Claude Code MCP integration. |
| 132 | +- **pipx / PyPI failure troubleshooting** with a `diagnose_pypi_connectivity.py` diagnostic script. |
| 133 | +- **MseeP.ai badge** added to README (PR #399). |
| 134 | + |
| 135 | +### Maintenance |
| 136 | + |
| 137 | +- **Beads (`bd`) issue tracking** initialized for the project (`bd prime` for workflow context). |
| 138 | +- **iCloud sync duplicate files** removed from the working tree. |
| 139 | +- **Working spec docs** moved out of git (already in `.gitignore`). |
| 140 | +- **CI lint and test failures** swept across multiple merged PRs. |
| 141 | + |
| 142 | +### Upgrade notes |
| 143 | + |
| 144 | +- `uvx --reinstall code-review-graph` or `pip install -U code-review-graph`. |
| 145 | +- Re-run `code-review-graph install` once after upgrading to pick up the JSONC-tolerant config writer and the corrected `cwd` / skills path in `.mcp.json`. |
| 146 | +- The `__version__` fix changes the User-Agent string emitted by cloud embedding providers from `code-review-graph/2.1.0` to `code-review-graph/2.3.3`. Anyone allow-listing the old User-Agent on a proxy needs to update their rule. |
| 147 | +- VS Code extension still ships separately — repackage and republish the `.vsix` if you want the v2.3.3 a11y improvements in the Marketplace build. |
9 | 148 |
|
10 | 149 | ## [2.3.2] - 2026-04-14 |
11 | 150 |
|
|
0 commit comments