Releases: AEndrix03/Graft
Releases · AEndrix03/Graft
Release list
v0.1.0
Changelog
All notable changes to graft are documented in this file.
The format follows Keep a Changelog and the project follows Semantic Versioning.
0.1.0 — Initial release
First public release of graft — local-first agentic memory for AI coding agents.
A single binary + single SQLite file that gives any agent persistent memory across sessions, context resets, and machines, with no cloud and no API key.
Core engine
- C11 daemon (
graftd) withAF_UNIXsocket transport and a thingraftCLI client; MessagePack wire protocol for low-overhead local IPC. - Storage on SQLite with
sqlite-vec(dense vector index) andFTS5(BM25 lexical index) in a single DB file. - Embeddings via embedded
llama.cpprunning BGE-M3 on CPU out of the box; opt-in GPU acceleration withGRAFT_GPU=cuda(NVIDIA) orGRAFT_GPU=hip(AMD ROCm 6 / 7). - WAL-safe sync layer: single-writer push half, no double-open, no WAL contention under concurrent reads.
Retrieval
graft query— verified semantic cache returningSTRONG/WEAK/MISSin milliseconds. Multi-signal verifier refuses to claim a hit when dense and lexical signals disagree, so agents never quote confidently-wrong answers.graft retrieve— hybrid search fusing dense (BGE-M3 cosine) and lexical (BM25 over title + body) via Reciprocal Rank Fusion.graft explore— beam-search graph walk over keyword and semantic edges with MMR diversity andgamma^stepdecay.
Knowledge model
- Memory nodes:
title(retrieval anchor) +body(full context) + keywords. - Graph edges: keyword and semantic links between nodes, walked by
explore. - Supersession: replace outdated nodes atomically while keeping the old version visible as
SUPERSEDED— history stays, mistakes don't propagate. - Confidence levels surfaced to clients (STRONG / WEAK / MISS) so agents can gate behavior on retrieval quality.
Multi-tenant profiles
- Isolated DBs and sockets per profile (
work,personal, project-scoped); switch withGRAFT_PROFILE=<name>. - Import / export / merge profiles as plain SQLite files — portable, diffable, scriptable.
Optional REST API + 3D viewer
- Nine JSON endpoints (
/v1/match,/v1/search,/v1/insert, …) gated by a flag inconfig.yaml. - Browser-based 3D graph viewer with click-to-edit and atomic supersession.
Agent integrations
Each adapter ships skills (when to search, when to save) and, where the harness supports them, hooks (deterministic execution on UserPromptSubmit / PostToolUse / Stop so the model can't forget):
- Claude Code — skills + hooks, installed via
graft setup claudecode. - Codex —
AGENTS.md+ hooks, installed viagraft setup codex. - Claude Desktop — MCP server (stdio).
- ChatGPT — MCP server (stdio or HTTP) with optional OAuth gateway.
- Gemini CLI —
GEMINI.mdmemory file. - Open Code —
AGENTS.md+ skills, installed viagraft setup opencode.
Microservices pattern
- Reference architecture for L1 Redis + L2 graft semantic cache + L3 graft + LLM with writeback, documented in
docs/microservices/. - Designed to absorb most "GPT in a microservice" traffic before it hits the LLM, with the system getting cheaper and faster over time as L3 answers write back into L2.
Packaging & distribution
- Homebrew formula (
Formula/graft.rb) with prebuilt Linux bottle. - Scoop bucket (
bucket/graft.json) for Windows users. - Cross-platform installer scripts:
scripts/install.sh(Linux / macOS / MSYS2) andscripts/install.ps1(Windows, auto-installs MSYS2). - Build under 3 minutes on a laptop.
CI / release pipeline
- Single unified release workflow triggered by pushes to the
releasebranch. - Strict semver gate (only
x.y.z, no pre-release suffixes). ctest→ parallel build of Linux tarball, Homebrew bottle, Scoop zip → single signed publish job with cosign signatures, SBOM, and build provenance attestations.- Smart caching of
llama.cppbuild (keyed on submodule SHA) andccacheacross runs.
Documentation
- Per-feature docs tree under
docs/(install, retrieval, insert, profiles, embeddings, integrations, microservices, HTTP API, viewer, maintenance, storage, architecture, release). - Glossary in
docs/concepts.md, use cases indocs/use-cases.md. - Contributor guide in
CONTRIBUTING.mdwith commit-msg policy (Conventional Commits, English ASCII subject ≤ 70 chars).
v0.1.0-alpha.1
v0.1.0-alpha.1
- ci: drop macos targets from brew bottle and release workflows (cf6fbac)
- fix(build): add pkg-config include dirs for sqlite and yaml (89f344c)
- fix(ci): cap llama.cpp build parallelism to avoid linux oom (5cf8cb1)
- fix(build): disable neon and tests for ci bottle and scoop builds (3141127)
- fix(scoop): install zip in msys2 for packaging step (9dc47e9)
- fix(build): strip semver pre-release suffix for cmake project() (f9bd71d)
- feat(scoop): add windows bucket manifest and release pipeline (3ef7355)
- fix(ci): drop windows runner to remove parse-error in release workflow (4590d6a)
- fix(ci): resolve matrix.shell expression error in release workflow (2a08f83)
- ci(brew): tag-driven release pipeline, gh release only for stable (8f996c4)
- feat(profile): add daemon-routed remote sync with --auto/--stop worker (2125b6e)
- chore: update profile (a2a1030)
- chore: update 5 files (3be127e)
- ci(brew): add homebrew bottle workflow for release branches and tags (2cadbfa)
- refactor(brew): apply homebrew best practices, mark head-only (34965ea)
- fix(brew): pin sqlite-vec to upstream-reachable sha 5778fec (9f1dc33)
- feat(view): filter nodes and edges by keyword scope for rbac-lite (3af1586)
- feat(storage): apply graft_db_key pragma when sqlcipher is linked (664cdbb)
- feat(http): refuse remote bind without auth or attested tls upstream (9f40e4c)
- docs: document release process (d15a305)
- docs: update 11 files (d76b2ea)
- feat(install): optional cosign verification of model blob (3f12796)
- feat(view): add view_anonymize toggle to strip titles and keywords (35dd7ad)
- feat(http): add readonly token capability and origin-based csrf (a247639)
- feat(http): add bearer token auth for v1 endpoints (bd7108e)
- feat(http): print attack surface banner at server startup (6640bb3)
- feat(install): verify model sha256 when pinned via env or .sha256 file (a46b433)
- fix(storage): chmod sqlite db to 0600 after open (posix) (4c41583)
- docs: document opencode setup target (e18fb07)
- test(verify): use clearly-in-band fused score to avoid 0.7 boundary (6a6c5ac)
- feat(verify): add opt-in fused-score gate mode (49b1955)
- feat(rerank): add s_nli signal and w_nli weight in fusion (ece3106)
- feat(verify): compute s_nli via ce with entailment template (ff3eed0)
- feat(verify): add s_nli signal placeholder to verify signals (f2fc34f)
- test(rerank): cover fusion math and disabled init (1f9a8ff)
- feat(retrieve): apply rerank after rrf when enabled (3e83f8b)
- feat(rerank): implement batch ce scoring with weighted fusion (80dccc1)
- feat(rerank): scaffold rerank module with config and fusion formula (be769c7)
- refactor(verify): move hardcoded strong-hit thresholds to config (0ac4a6a)
- fix(verify): clamp s_vec to [0,1] before scoring (d288739)
- perf(verify): avoid recomputing jaccard since s_lex is the same value (e5cf78c)
- refactor(verify): use nan instead of -1 as ce score sentinel (61e63d9)
- chore: update config.example (3e155b4)
- fix(http): handle zero-byte files in static reader (6ddb96f)
- fix(daemon): validate mpack args is a map before dispatch (d0d7379)
- fix(http): validate host header to block dns rebinding (5041a2f)
- fix(http): refuse non-loopback bind without explicit opt-in (c3253ac)
- fix(daemon): restrict unix socket permissions to 0600 (2235bda)
- fix(view): drop shell interpolation in run_in_dir to prevent rce (d666e5a)
- fix(setup): prevent heap overflow in codex hooks toml writer (68f630f)
- fix(profile): handle path truncation in recursive directory removal (538555f)
- fix(hooks): atomically consume injected proposal via rename (76af916)
- fix(cli): validate numeric args with strtoll instead of atoll (df1c2d9)
- fix(hooks): validate session id before using in cache paths (352b37a)
- fix(autostart): create daemon log with 0600 permissions (62a6044)
- fix(hooks): restrict state dir and file permissions to user only (2ff60f3)
- fix(profile): write remote auth file with 0600 permissions (5bf8f8b)
- fix(classify): skip neighbors without keyword id instead of guessing (9553c0b)
- fix(hooks): use per-pid candidates files to avoid append races (456e54d)
- fix(storage): escape fts5 metacharacters in title scoped search (7ffad9d)
- fix(autostart): guard daemon spawn with exclusive pidfile lock (880eb6e)
- fix(hooks): cap query prompt length to avoid windows argv limits (1dd59d0)
- docs: update 31 files (fe2bdac)
- chore: ignore local config files (1dd92a4)
- chore: ignore local agent and cache files (0cd2104)
- fix(hooks): surface save proposals before final response (58cc961)
- fix(hooks): harden graft setup and cache hints (6c2c9dc)
- chore: update settings.local (4bff59e)
- chore: verify.c multi-lang (41fb850)
- docs: add per-feature documentation tree under docs/ (6e2f2eb)
- test: update 14 files (493dd2c)
- fix(storage): filter and prune expired memories (02ca535)
- fix(retrieve): split title and body FTS results (b4fabf4)
- fix(query): rerank verified candidates (86e9173)
- fix(cli): graft view path truncation + absolute viewer_path on install (fec2092)
- feat(cli): graft view auto-builds the viewer SPA on first run (542a30b)
- feat(scripts): add reload helper (ps1 + sh) for graftd (e2f7439)
- feat(config): enable http layer with all endpoints (8334328)
- feat(install): add homebrew formula (b299511)
- refactor(project): rename to graft (739ce85)
- chore(deps): update sqlite-vec submodule (03dca46)
- fix(core): validate inputs and clone config ownership (1fde6e1)
- docs: update viewer auth guidance (3dd884b)
- feat: add remote profile sync and Codex setup fixes (6e50e38)
- feat(cli): add setup command for assistant integrations (2e87eb4)
- fix(codex): install hooks with current feature flag (8fc0845)
- docs: update 4 files (d81addf)
- feat(explore): expose cosine to query for meaningful score percent (6bf1bef)
- fix(viewer): score percentage on absolute scale per mode (e04b604)
- fix(viewer): result nav inline below search bar, no overlap with kw (bdfe98d)
- feat(viewer): explore defaults depth=5 beam=1 (7a36203)
- feat(viewer): score percentage to 2 decimals (78167a3)
- feat(viewer): match dim mode, hide labels on dimmed, kw empty hint (241eec3)
- feat(viewer): explore path edges, depth/beam labels, kw autocomplete (f51484c)
- feat(viewer): vivid rank ramp, score box, brighter overlays (18a5e51)
- feat(viewer): retrieve click semantics, tier-stepped red-orange ramp (7d79f9e)
- feat(viewer): retrieve dim mode, orange rank ramp, prev/next nav (ca7a373)
- feat(viewer): match feedback banner, halve edge thickness (bb3293c)
- chore: update Graph3D (dcda774)
- feat(viewer): edge thickness proportional to weight (4 buckets) (c1cad83)
- feat(viewer): 1.5x scale, top-2 also for keyword edges (c4f43a0)
- feat(viewer): top-2 semantic edges per node, label dist 8 (0002fbc)
- chore: update Graph3D (2749dcf)
- chore: update Graph3D (289b616)
- feat(viewer): 5x wider spatial scale (2d3413a)
- feat(viewer): anim, resizable panel, smart dirty, prettier nodes (3f05521)
- feat(viewer): spread, content-size, color, edges click+thicker (1048a27)
- fix(config): treat YAML null markers as unset for http.api_key (5fe8ca1)
- feat(viewer): 3D graph viewer with supersession editor (d8a2651)
- chore: update 9 files (74d35c3)
- feat(view): add /v1/view full-graph dump with 3D coords (cc8ce2d)
- feat(insert): atomic supersession via supersedes id (bb457f6)
- feat(http): add optional REST layer with 5 primitive endpoints (2512a36)
- docs: README field rename and --markdown render note (f1504f0)
- docs(integrations): align skills, hooks, MCP server with title/body (43401ec)
- feat(core): rename summary->title detail->body, add author/expires (32fec2d)
- docs: rewrite README, add CONTRIBUTING and Apache 2.0 LICENSE (2c35ef7)
- feat(integrations): add memgraph hooks for Claude Code and Codex (168bf07)
- chore(hooks): mark commit-msg hook executable (5084a38)
- feat(hooks): add commit-msg policy hook (381d1d3)
- docs: document hardware_accel and query_fallback_top_k (cdbadb8)
- feat(embed): add hardware_accel toggle for CUDA/ROCm GPU offload (6d5f76a)
- feat(query): cap MISS fallback_retrieve at 5 nodes by default (648785d)
- docs: update 2 files (29ea46d)
- feat: Claude & ChatGPT integrations. Node removing & MCP updates (646551e)
- feat: Claude Code integrations & install utils (8514186)
- feat: import code (d20bfd3)
- Initial commit (1576c50)