Skip to content

v0.12.0

Latest

Choose a tag to compare

@AsiaOstrich AsiaOstrich released this 18 Sep 07:30

Moves latest from 0.11.0. Highlights:

  • Two egr processes touching one graph no longer destroy it — query commands and the MCP server hold the graph read-only (XSPEC-374).
  • The algorithm extension installs with the package on Windows x64, Linux x64 and macOS — god-nodes, communities, related work offline. (extension.ryugraph.io currently refuses connections, so on 0.11.0 these commands fail even with internet access.)
  • C, Swift and Bash support; unsupported files are now reported instead of silently skipped.
  • An existing graph no longer stops opening after the extension file moves.

Verified on Windows (hosted runner, no C++ toolchain, extension download host blocked) by .github/workflows/windows-release-verify.yml.


Release candidates rc.1–rc.5 shipped on npm next between 2026-08-11 and 2026-09-18; entries below marked (rc.N) arrived in that candidate. Verified on Windows by .github/workflows/windows-release-verify.yml — hosted Windows, no C++ toolchain, the ALGO download host blocked.

Two egr processes touching one graph did not refuse each other — they destroyed it.

Every command opened the graph for writing, even a pure query, because opening runs initSchema. The engine is single-writer, and writer-versus-writer is not a clean refusal: measured on a real graph, one process wins, the rest are refused, and the database is left answering Trying to create a vector with ANY type to everything afterwards. It is unrecoverable except by rebuilding, and the message says nothing about what happened.

This was reachable in ordinary use. An editor's MCP server holds the graph for as long as the editor is open; a post-commit hook or a shell-startup freshness check indexes in the background; you run egr in a terminal. Any two of those overlapping was enough.

Added

  • C, Swift and Bash (rc.5) (XSPEC-414 R2–R4). Functions, structs/unions/enums, and #include-derived module relationships for C; functions, classes/structs/enums/protocols and extensions (attributed to the type they extend, including across files) for Swift; function definitions, calls and source/.-derived module relationships for Bash, with external commands (grep, echo, ...) never entering the graph. egr doctor now lists all three. .h routes to C++ when the same indexing run has a C++ source file alongside it, and to C otherwise (previously always C++).

  • egr index follows an extension-less shebang script (rc.5) (#!/bin/bash, #!/usr/bin/env sh, XSPEC-414 R4) and indexes it as Bash, instead of counting it as an unsupported file.

  • A new IMPORTS (Module → Module) relationship (rc.5), resolved from C's #include and Bash's source/. against the files in the same indexing run; egr index's summary and --json output report the count.

  • The algorithm extension installs with the package (rc.4). god-nodes, communities and related need ryugraph's ALGO extension, which until now was downloaded from extension.ryugraph.io on first use — so on a network that cannot reach it they did not work at all. It now ships prebuilt as @asiaostrich/engramgraph-algo-<platform>, an optional dependency npm installs only on the matching platform, and loads from there with no network and nothing written to your home directory. Platforms: Windows x64, Linux x64, macOS arm64 and x64. Linux arm64 is not included: ryugraph's own linux-arm64 engine file is currently an x86-64 binary (predictable-labs/ryugraph#48), so there is nothing correct to build against. Everywhere else, the download still works as before.

  • egr index names what it skipped (rc.4). Files with an extension no grammar handles are counted and reported by extension in the summary and in --json (unindexedCode), instead of silently lowering the file count.

  • egr index says what to do next (rc.4) when most calls did not resolve (points at --scip) and when documents were found but none were recognised as specs or none are implemented in code (states the naming rule and the // implements comment).

Fixed

  • An existing graph could stop opening at all after the extension file moved (rc.4). Loading the extension writes its absolute path into the graph's write-ahead log, which is replayed on every open; egr exits without a checkpoint, so the record stayed. After a Node version switch, a reinstall, or a cleared ~/.ryu, every command on that graph — including ones that never use the extension — failed with Failed to load library. 0.11.0's download path had the same defect. egr now checkpoints right after loading. A graph already in that state opens again once the file is back at the path in the error.
  • MCP index_code parsed files with no grammar as JavaScript (rc.4), producing plausible and wrong nodes. They are now skipped and reported.
  • Git-branch isolation followed the caller's GIT_DIR (rc.4) instead of the directory it was given, whenever one was set in the environment — as it is inside every git hook.
  • --help and the CLI docs state that the skip list is fixed and .gitignore is not read (rc.4); the help text is generated from the list itself.

Changed

  • Query commands open read-only — callers, callees, implementers, implemented-by, impact, top, blindspots, signatures. (god-nodes, communities and related were on this list in rc.2 and are not: they load the algorithm extension and build a projected graph first, and both are writes. Corrected in rc.3; this entry was not.) A read-only open can be refused; refusal is all it can do. Measured: five concurrent read-only opens all succeed and the graph is intact; a writer and a reader refuse each other cleanly with the graph intact; only writer-versus-writer corrupts.
  • The MCP stdio server holds the graph read-only. Held for writing, it made every terminal egr command fail for as long as the editor was open. Verified end-to-end: with the server running, top, implementers, blindspots and a full egr index all work.
  • index_code, index_docs and ingest_feedback over MCP now refuse by name and point at the CLI equivalent, rather than failing at a lower layer with a lock error an assistant cannot act on.
  • Read-only openGraph neither creates nor migrates. Both are writes. A missing graph now says so and names egr index, instead of silently producing an empty one.