feat: release v0.7.0 with code-aware project memory#91
Merged
Conversation
Lay down the frozen interfaces, schema, types, and config for the .mex/ code-graph layer (spec §10 Phase 0). Contracts only — no engine logic, extraction, fingerprinting, reconciliation, or checker bodies. Everything typechecks/builds; existing eleven checkers + CLI untouched (graph is additive). - 0.1 src/graph/schema.sql: ported CG base (nodes+body_hash, edges, files, unresolved_refs, nodes_fts FTS5, indexes, schema_versions, project_metadata) + net-new node_fingerprints, lsh_buckets, _mex_grounded_source (keyed by scaffold_file, the one demo->OSS adaptation). - 0.2 Frozen TS contracts under src/graph/: LanguageExtractor (§8.1) + ExtractedNode/Edge + TSTree surface; FrameworkResolver + ResolutionContext; GraphEngine (build/sync/searchNodes/getNode/getCallers/getCallees) with throwing stub; Reconciler + Resolution (MOVED|GONE|AMBIGUOUS) + Fingerprint; GroundingChecker signature (matches checkEdges) + createGroundingChecker. Reader methods are sync so the grounding checker matches the existing synchronous drift-checker shape; build/sync async for lazy grammar loading. - 0.3 src/types.ts: add Grounding + ScaffoldFrontmatter.grounds_to (§5, backward-compatible) + grounding IssueCodes (GROUNDING_GONE/DRIFT/AMBIGUOUS) so Track B never has to reopen this shared union. - 0.4 src/graph/config.ts: reconciler params as named consts (HI/LO/W_BODY/ W_NBR/MIN_TOKENS/K/BANDS/ROWS) — placeholders, eval-tuned later (§12). - 0.5 package.json engines.node >=22.5 for node:sqlite (used by the DB adapter Track A ports in Phase 1). No heavy deps added yet. Also scope vitest to exclude the gitignored .demo/ reference clone (its own suite needs mex-engine-cg, which we don't install).
Implements the port-heavy graph engine against the frozen Phase-0
contracts (spec §10 Track A). Ports from .demo/ (never committed) and
ships the 0.7.0 base: a deterministic tree-sitter → SQLite code graph for
TypeScript/JavaScript/TSX/JSX, no LLM.
- A1 Clean, exemplary TS/JS reference extractor implementing the frozen
LanguageExtractor seam (the copy-template every 0.7.x contributor
language clones), plus a self-verifying test harness + fixture (§8.2).
- A2 Line-independent node id ported verbatim (Tier-1 identity).
- A3 node:sqlite adapter, schema loader (writes a schema_versions row),
store with FTS5 search + reader queries.
- A4 Cross-file reference resolution (import-aware name binding) and
callers/callees traversal.
- A5 Lazy web-tree-sitter grammar loading; TS/JS/TSX .wasm vendored and
shipped in the published package, resolved from the install location.
- A6 `mex graph` command wired additively into src/cli.ts.
- GraphEngine implementation: async build/sync (lazy grammars),
synchronous reads; engine assigns body_hash + updatedAt.
Frozen contracts (schema.sql, types, engine/extractor/resolver interfaces,
config, reconcile, grounding, drift) are unchanged; src/graph/index.ts
gains only an additive createGraphEngine export. Verified: typecheck,
build, 259 tests, and an npm pack + install-from-tarball that builds a
real graph from the installed package (WASM + schema resolve at runtime).
Merge Gate 1, part 1 of 2. Additive graph engine: extraction, db, traversal, resolver, mex graph command. No frozen-contract signature changes.
…rounding) Merge Gate 1, part 2 of 2. Additive fingerprint/reconcile/grounding layer + grounding checker body. grounding.ts stub filled behind the unchanged createGroundingChecker signature. Resolved src/graph/index.ts export conflict by keeping both tracks' additive exports.
# Conflicts: # README.md
# Conflicts: # CONTRIBUTING.md
Co-authored-by: Daksh Jaitly <thedakshjaitly@gmail.com>
Co-authored-by: Yashasvi Pandey <yashasvipandey2912@gmail.com>
* feat(graph): add Python code graph extractor * fix(graph): complete Python extractor integration * test(graph): cover Python extraction edge cases --------- Co-authored-by: theDakshJaitly <thedakshjaitly@gmail.com>
Adds Rust language detection, grammar registration, extraction for common Rust constructs, and focused regression coverage. The engine-wide same-named symbol identity limitation is tracked separately in #104.
* feat(graph): deterministic reads + committed eval harness M0 — make graph reads insertion-order independent so a rebuilt graph.db yields byte-identical query output (precondition for a CI eval harness): - add stable ORDER BY tiebreaks in db/store.ts: FTS `+ nodes.id`, LIKE fallback `+ name, id`, and edge reads `ORDER BY source, target, kind` (getIncoming/getOutgoingEdges previously had no ordering at all). - add store-determinism.test.ts covering caller/callee order stability. M1 — commit the black-box eval harness under evaluate/ (npm run eval): - Category 1 (retrieval efficiency) reproduces the prior ad-hoc benchmark bit-for-bit: corpus enumeration, grep top-3 baseline, expected-symbol recall, ceil(chars/4) tokens. Category 2 (search quality) gates where-defined found rate. - thresholds.json holds the hard CI gates; results land in evaluate/results/. Verified: full suite green (345 tests); 3 rebuilds produce identical scope output; harness reproduces the baseline (median grep-top3 1.34 vs 1.35, recall 1.0, runDriftCheck 32 facts). * feat(graph): compact source-off retrieval with budgets + graph get (M2) Rework the agent-facing graph surface so retrieval is a compact, budgeted, accountable manifest instead of a source-dump. All commands share one JSONL protocol (agent-protocol.ts): a `meta` record first, `fact`/`edge`/ `source` data records, a `summary` last with counts + `truncated` + `suggestedNextCommands`. A hard token budget is enforced while emitting. - scope.ts: split the source-heavy NodeFacts into a CompactFact (structure + relationship counts + short bodyHash, no source) and an on-demand, line-capped SourceRange. Source is opt-in via --detail source, grouped once per file. - cli-agent: source-off by default across scope/query/impact; impact gains a --depth cap; new `graph get <id...>` for targeted source expansion. - cli.ts: register `graph get`; add --detail/--max-nodes/--max-output-tokens/ --max-source-lines/--depth/--fingerprint flags; refresh help. - The full minhash fingerprint is no longer inlined on every fact (it blew the budget). It is opt-in via --fingerprint; the grounding migration prompt now requests it, keeping grounds_to authoring intact. Verified: 357 tests green. Eval harness shows scope-vs-grep median jump 1.34x -> 8.27x and recall held at 1.0; runDriftCheck over-expansion fixed (0.26x/32 facts -> 6.06x/10 facts). * feat(graph): scored, quota-limited scope selection (M3) Replace the flat "top-10 seeds + all one-hop neighbors" selection with a scored, explainable one (selectScope): - whole-task semantic search seeds the direct set; every task token that exactly matches a node name/qualified-name is boosted so explicitly named symbols survive trimming. - one-hop expansion is capped per seed (was unbounded — the runDriftCheck cause). - per-category quotas under maxNodes (direct 5, neighbor 4, test 2) keep one dense neighborhood from dominating; test-file nodes route to their own bucket. - every scope fact now carries `score` and `selectionReasons`; the summary reports the full match count so truncation is explicit. Deterministic (ties break by id). Verified: 360 tests green. Eval median scope-vs-grep 8.27x -> 10.06x with recall held at 1.0 (smarter ranking returns fewer, more relevant facts). * docs(graph): agent usage guidance for compact retrieval (M4) Teach agents to use the new two-stage, source-on-demand graph surface and avoid context pile-up. Shipped in the persistent per-session instruction files (templates/.tool-configs/* + AGENTS.md, and the .mex dogfood copies, kept byte-identical): - scope first; treat any source the graph returns as ALREADY READ (no re-Read); - expand 1-3 specific ids with `mex graph get <id> --detail source`; - known symbol -> query/get, not scope; - on `truncated`, narrow the task or use suggestedNextCommands — never re-scope. Also fix the now-stale setup grounding prompt (src/setup/prompts.ts): scope is source-off by default, so it authors grounding via `scope --fingerprint` for the fingerprint and `graph get --detail source` for node bodies. Verified: 360 tests green (tool-config templates stay in sync). * feat(eval): end-to-end agent harness, minimal vs source (M5) Add the Category 3 rig (npm run eval:e2e) that settles the default --detail: run each variant against natural-language tasks and measure accumulated tokens across ALL tool calls, follow-up `graph get` calls, Read/Grep fallbacks, and rubric correctness. Winner = best correctness at lowest total tokens, not smallest first response. Model-agnostic: pluggable driver (`--driver <module>` default-exports (variant) => driver); ships a deterministic scripted reference driver (a perfectly disciplined agent) as an idealized token baseline. Reduced from the plan's A-D — variant A (old all-source scope) was removed in M2 and C/D (flow-spine, skeletonization) were deferred, leaving the decision that matters: minimal (two-stage, source-off) vs source (one-shot, source-bearing). First signal (scripted driver, this repo): one-shot `source` is actually cheaper per task (~1430 vs ~1870 tok) because the compact manifest is nearly as large as the source a task needs and `get` then pays again; and NL-query recall is ~0.6, well below the ~1.0 symbol recall — FTS-keyword selection misses symbols absent from the question. Both are flagged for a real-model rerun before the default is frozen. * feat(eval): real-model end-to-end runner + minimal-vs-source findings Add agent-e2e-model.mjs: drives a real headless agent (`claude -p`) per variant x task against the actual graph CLI, parsing the stream-json transcript for graph-scope/get calls, Read/Grep fallbacks, cost, turns, and rubric correctness. This is the run that settles the default --detail. Result (opus-4-8, 5 NL tasks, this repo): both variants 5/5 correct. minimal ~$0.20/4.4 turns/2.2 gets/0 fallback; source ~$0.17/3 turns/0 gets/1.0 fallback. The real model navigates the compact manifest fine (the scripted driver's ~0.6 NL recall was a grading artifact). source is answer-ready and marginally cheaper but grep-falls-back ~1x/task; minimal is self-sufficient at the cost of extra round-trips. Cost is cache-noisy at N=5 — correctness/fallback are the robust signals; larger fixture set needed before freezing the default. * chore(gitignore): ignore .mex/graph.db build artifact The ~10MB graph.db (rebuilt by `mex graph`) was ignored only in local working copies; the committed branch did not ignore it, so a fresh checkout that builds the graph could accidentally commit the binary. Also groups the eval-results ignore alongside it. * fix(graph): honest budget accounting + address PR review Resolve the review findings on PR #105 — the budget/accounting layer could silently exceed the ceiling and mislabel completeness. - Replace BudgetedEmitter with a plan-then-emit BudgetLedger: decide what fits (framing counted, not bypassed), then write. `estimatedOutputTokens` now includes the summary, and `truncated` is true whenever any record was dropped or mandatory framing alone exceeds the budget. Repro fixed: `graph get missing:a missing:b missing:c --max-output-tokens 20` now reports truncated:true with an honest token count instead of a silent overshoot. - `sourceIncluded` is set from a source-planning pass, so a fact only claims source when its source record actually fit; grouped-per-file source degrades to per-range records when the whole file won't fit (partial source still lands). - Budget-dropped edges now flip `truncated` (previously reported complete). - `graph get` accepts `--detail` (fixed to source) — the shipped templates, suggestedNextCommands, and eval prompts all use `graph get <id> --detail source`, which previously errored on the unknown option. - `impact --max-nodes` caps total returned nodes (defines + callers), only counts successfully-emitted ones; file targets no longer emit every root uncapped (`impact <file> --max-nodes 1` reported returnedNodes 26 → now 1). - `graph query` restores `target` on each result and dedupes by (target, result) so overloaded/shared symbols stay distinguishable. Verified: 365 tests green (+5 regression tests from the repros); eval gates pass (median scope-vs-grep 10.57x, recall 1.0). * fix(graph): make the token ceiling truly hard + stop mutating accounted records Round 2 of PR #105 review. [P1] The ceiling is now genuinely hard, not merely honest. beginResponse sizes the summary reserve from the ACTUAL summary shape (its suggested commands carry long node ids/names) instead of a fixed 140, and clamps the budget up to a framing floor (one meta + one summary) so mandatory framing can never exceed the reported ceiling. `graph get ... --max-output-tokens 20` now reports maxOutputTokens 92 (clamped), estimatedOutputTokens 69 <= 92, truncated true — output never exceeds the reported budget. [P2] Source planning no longer mutates already-accounted records. compactFact now defaults sourceIncluded=false; the emitter flips it true only for facts whose source fit (a strictly shorter record, so the accounted shape >= the emitted one). runImpact passes only fact records (defines/caller) into planSource, so the `target` record no longer gets a spurious sourceIncluded and the reported estimate is no longer an under-count (was reported 224 vs emitted 230; now reported >= actual). Verified: 367 tests green (+2 regressions); eval gates pass (median 10.74x, recall 1.0); output deterministic; estimatedOutputTokens <= maxOutputTokens and >= actual emitted across budgets.
theDakshJaitly
marked this pull request as ready for review
July 25, 2026 05:53
There was a problem hiding this comment.
Pull request overview
This PR prepares the v0.7.0 release by adding a local SQLite + Tree-sitter code graph and integrating it into MEX workflows (setup/sync/drift), alongside packaging, docs, tests, and an evaluation harness to validate retrieval quality and determinism.
Changes:
- Introduces the new
mex graph/mex impactcommand surface and the underlying graph engine (schema, extraction, resolution, traversal, assets). - Adds code-node grounding (
grounds_to+ inlinemex://anchors) and integrates grounding drift checks + repair guidance into sync/setup. - Adds a deterministic eval harness (efficiency/search-quality/e2e) plus CI smoke tests to validate the packed graph CLI.
Reviewed changes
Copilot reviewed 147 out of 159 changed files in this pull request and generated 4 comments.
Show a summary per file
| File | Description |
|---|---|
| vitest.config.ts | Exclude .demo/ from tests |
| update.sh | Update upstream repo URL |
| tsconfig.json | Exclude graph fixtures from TS |
| test/tool-config-templates.test.ts | Validate shipped tool configs |
| test/sync.test.ts | Assert interactive timeout wiring |
| test/markdown.test.ts | Test mex anchors + grounds_to |
| test/config.test.ts | Remove legacy context/ scaffold case |
| test/checkers.test.ts | Broken-link checker allows mex:// |
| templates/patterns/README.md | Add grounding fields + examples |
| templates/context/stack.md | Add grounds_to guidance |
| templates/context/setup.md | Add grounds_to guidance |
| templates/context/decisions.md | Add grounds_to guidance |
| templates/context/conventions.md | Add grounds_to guidance |
| templates/context/architecture.md | Add grounds_to guidance |
| templates/AGENTS.md | Add code-graph workflow section |
| templates/.tool-configs/copilot-instructions.md | Add code-graph workflow section |
| templates/.tool-configs/CLAUDE.md | Add code-graph workflow section |
| templates/.tool-configs/.windsurfrules | Add code-graph workflow section |
| templates/.tool-configs/.cursorrules | Add code-graph workflow section |
| src/types.ts | Add grounding issue codes + types |
| src/telemetry/index.ts | Attempt to prevent JSONL corruption |
| src/sync/index.ts | Grounding-aware sync + repair hooks |
| src/sync/brief-builder.ts | Add grounding repair instructions |
| src/setup/prompts.ts | Setup prompts use graph workflow |
| src/setup/index.ts | Build graph + capture baselines in setup |
| src/markdown.ts | Add grounds_to + mex:// anchor utilities |
| src/graph/wasm/README.md | Document vendored WASM provenance |
| src/graph/types.ts | Define graph node/edge/language vocabulary |
| src/graph/traversal/traversal.ts | Implement callers/callees traversal |
| src/graph/resolution/types.ts | Define FrameworkResolver interface |
| src/graph/resolution/frameworks/index.ts | Register Express resolver |
| src/graph/resolution/frameworks/express.ts | Express route extraction/resolution |
| src/graph/resolution/context.ts | ResolutionContext backed by store |
| src/graph/reconcile.ts | Define reconciler contract + stub |
| src/graph/reconcile-engine.ts | Implement MinHash reconciler |
| src/graph/index.ts | Public graph module surface |
| src/graph/grounding.ts | Grounding checker contract + factory |
| src/graph/fingerprint.ts | Fingerprint creation + (de)serialization |
| src/graph/fingerprint-store.ts | Persist fingerprints + grounded source |
| src/graph/extraction/node-id.ts | Stable Tier-1 node id + docstrings |
| src/graph/extraction/languages/javascript.ts | JS/JSX extractor registry |
| src/graph/extraction/languages/index.ts | Extractor registry |
| src/graph/extraction/index.ts | Parse+extract per-file entrypoint |
| src/graph/extraction/grammars.ts | WASM grammar loading + language detection |
| src/graph/errors.ts | Shared NotImplementedError |
| src/graph/engine.ts | GraphEngine interface + stub |
| src/graph/db/sqlite.ts | node:sqlite adapter + warning suppression |
| src/graph/db/database.ts | Open/init DB + schema version |
| src/graph/config.ts | Reconciler tuning constants |
| src/graph/cli-ground.ts | mex graph ground migration flow |
| src/graph/cli-graph.ts | mex graph command runner |
| src/graph/assets.ts | Runtime asset resolution for dist |
| src/graph/agent-protocol.ts | JSONL protocol + budget ledger |
| src/graph/tests/store-fts.test.ts | FTS rowid stability test |
| src/graph/tests/store-determinism.test.ts | Deterministic edge ordering tests |
| src/graph/tests/resolver-express.test.ts | Express resolver tests |
| src/graph/tests/fixtures/typescript-edge-cases.ts | TS extractor edge-case fixture |
| src/graph/tests/fixtures/tsx-component.tsx | TSX extractor fixture |
| src/graph/tests/fixtures/sample.ts | TS extractor fixture |
| src/graph/tests/fixtures/sample.rs | Rust extractor fixture |
| src/graph/tests/fixtures/sample.py | Python extractor fixture |
| src/graph/tests/fixtures/python-package/service.py | Python package fixture |
| src/graph/tests/fixtures/python-package/models.py | Python package fixture |
| src/graph/tests/fixtures/python-package/init.py | Python package fixture |
| src/graph/tests/fixtures/jsx-component.jsx | JSX fixture |
| src/graph/tests/fixtures/javascript-edge-cases.js | JS extractor edge-case fixture |
| src/graph/tests/fixtures/express-app.ts | Express fixture |
| src/graph/tests/extractor.test.ts | Extractor harness test |
| src/graph/tests/extraction-regression.test.ts | Multi-language regression suite |
| src/graph/tests/engine-rust.test.ts | Rust engine build/sync tests |
| src/graph/tests/engine-python.test.ts | Python engine resolution tests |
| src/drift/index.ts | Add grounding runtime + nudges |
| src/drift/checkers/grounding.ts | Grounding drift checker |
| src/drift/checkers/broken-link.ts | Treat mex:// as external |
| src/config.ts | Require .mex/ scaffold only |
| src/cli.ts | Add graph + impact commands |
| scripts/copy-graph-assets.mjs | Copy schema + WASM into dist |
| patterns/INDEX.md | Remove legacy patterns index |
| package.json | Bump to 0.7.0 + graph deps |
| flake.nix | Bump version + metadata |
| evaluate/thresholds.json | Eval gate thresholds |
| evaluate/search-quality.mjs | Query quality measurement |
| evaluate/RESULTS.md | Recorded benchmark results |
| evaluate/README.md | Eval harness documentation |
| evaluate/lib/variants.mjs | Eval variants definition |
| evaluate/lib/tools.mjs | Instrumented tool surface |
| evaluate/lib/run-cli.mjs | Black-box CLI runner |
| evaluate/lib/recall.mjs | Expected symbol recall logic |
| evaluate/lib/grep-baseline.mjs | Grep top-3 baseline |
| evaluate/lib/grade.mjs | Rubric grading |
| evaluate/lib/driver.mjs | Driver contract + scripted driver |
| evaluate/lib/corpus.mjs | Corpus enumeration + token estimate |
| evaluate/index.mjs | Eval entry point + gating |
| evaluate/fixtures/symbol-tasks.json | Symbol tasks |
| evaluate/fixtures/nl-tasks.json | Natural language tasks |
| evaluate/efficiency.mjs | Efficiency measurement |
| evaluate/agent-e2e.mjs | E2E variant comparison |
| docs/extractors.md | Contribution guide for extractors/resolvers |
| CONTRIBUTING.md | Update for 0.7.0 graph contributions |
| COMPATIBILITY.md | Node 22.5 requirement + grounding contract |
| CLAUDE.md | Set last_updated date |
| .tool-configs/README.md | Remove legacy tool-configs README |
| .mex/SYNC.md | Add scaffold sync guidance |
| .mex/ROUTER.md | Add router scaffold |
| .mex/patterns/README.md | Add grounding fields + examples |
| .mex/patterns/INDEX.md | Add empty pattern index |
| .mex/context/stack.md | Scaffold context w/ grounds_to |
| .mex/context/setup.md | Scaffold context w/ grounds_to |
| .mex/context/decisions.md | Scaffold context w/ grounds_to |
| .mex/context/conventions.md | Scaffold context w/ grounds_to |
| .mex/context/architecture.md | Scaffold context w/ grounds_to |
| .mex/config.json | Seed scaffold config |
| .mex/AGENTS.md | Project anchor scaffold content |
| .mex/.tool-configs/opencode.json | Tool config for OpenCode |
| .mex/.tool-configs/copilot-instructions.md | Tool config content (copied) |
| .mex/.tool-configs/CLAUDE.md | Tool config content (copied) |
| .mex/.tool-configs/.windsurfrules | Tool config content (copied) |
| .mex/.tool-configs/.cursorrules | Tool config content (copied) |
| .gitignore | Ignore graph db + eval outputs |
| .github/workflows/ci.yml | CI on Node 22/24 + packed smoke test |
| .github/pull_request_template.md | Update template for graph work |
| .github/ISSUE_TEMPLATE/new_language_extractor.md | Update to main-branch flow |
| .github/ISSUE_TEMPLATE/new_framework_resolver.md | Update to main-branch flow |
Comments suppressed due to low confidence (1)
src/drift/index.ts:81
- When
groundingRuntimeis available, high-confidence MOVED repairs should be persisted before checks run. Otherwisemex checkcan report clean whilegrounds_to/inlinemex://ids still point at missing nodes (the checker mutates the in-memory frontmatter but does not write it back).
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Comment on lines
166
to
+170
| const ph = getClient(); | ||
| ph.capture({ | ||
| // captureImmediate returns the delivery promise to us, so we can swallow | ||
| // failures ourselves. The SDK's queued/background flush path logs rejected | ||
| // requests to console.error before callers can catch them, corrupting JSONL. | ||
| const pending = ph.captureImmediate({ |
Comment on lines
+111
to
+115
| const repairRuntime = await loadGroundingRuntime(config); | ||
| if (repairRuntime) { | ||
| persistMovedGroundings(config, scaffoldFiles, repairRuntime); | ||
| repairRuntime.close(); | ||
| } |
Comment on lines
+20
to
+21
| import { loadGroundingRuntime, type GroundingRuntime } from "../graph/runtime.js"; | ||
| import { findMexAnchors } from "../markdown.js"; |
Comment on lines
+7
to
+20
| export function createResolutionContext(store: GraphStore, projectRoot: string): ResolutionContext { | ||
| const nodes = (): GraphNode[] => store.getAllNodes(); | ||
| return { | ||
| getNodesInFile: (path) => nodes().filter((node) => node.filePath === path), | ||
| getNodesByName: (name) => nodes().filter((node) => node.name === name), | ||
| getNodesByQualifiedName: (name) => nodes().filter((node) => node.qualifiedName === name), | ||
| getNodesByKind: (kind) => nodes().filter((node) => node.kind === kind), | ||
| getNodeById: (id) => store.getNodeById(id), | ||
| fileExists: (path) => existsSync(resolve(projectRoot, path)), | ||
| readFile: (path) => { try { return readFileSync(resolve(projectRoot, path), "utf-8"); } catch { return null; } }, | ||
| getProjectRoot: () => projectRoot, | ||
| getAllFiles: () => [...new Set(nodes().map((node) => node.filePath))].sort(), | ||
| }; | ||
| } |
Address Copilot review on #91: - resolution context now snapshots getAllNodes() once and indexes by name/file/kind/qualified-name, avoiding an O(N*R) full-table scan per unresolved ref during resolution. - sync repair path closes the grounding runtime in a finally so the SQLite handle is released even when persistMovedGroundings() throws.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Status
Ready for review. Merging this PR completes the code changes and release preparation for MEX v0.7.0. The GitHub release and npm publish remain separate post-merge release actions.
Overview
This release adds a local code graph to MEX so agents can retrieve compact, symbol-level project context instead of repeatedly reading broad source ranges. It also completes the setup, migration, documentation, compatibility, benchmark, and release work needed to ship the feature without changing existing memory workflows.
What ships
mex graph build,status,query,sync, andgetcommandsPerformance and quality results
Final scripted benchmark on the release tree:
Real-agent evaluation from July 22:
These results are directional: they cover one repository and a small task set, and the real-agent run does not include a separate no-graph treatment arm. Full methodology and raw details are in
evaluate/RESULTS.mdandclaude-talks/graph/GRAPH_RETRIEVAL_BENCHMARKS_RESULT.md.Release and compatibility
Validation completed
Deferred/non-blocking follow-ups
flake.nixnow reports 0.7.0, but its fixednpmDepsHashstill needs regeneration in a Nix-capable environment because Nix is not available in the current validation environment. This does not affect the npm package, CLI, tests, or GitHub merge.Post-merge release flow
main