Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
234 commits
Select commit Hold shift + click to select a range
8221a40
feat(graph): extract Store interface from *Graph public surface
zzet May 23, 2026
100d328
feat(graph/storetest): add Store conformance suite + MemoryStore base…
zzet May 23, 2026
2f0a38e
feat(graph/store_bolt): bbolt-backed on-disk implementation of graph.…
zzet May 23, 2026
1e0bdaa
feat(graph/store_sqlite): pure-Go SQLite-backed implementation of gra…
zzet May 23, 2026
6002334
perf(graph/store_bolt): hand-rolled binary codec + chunked AddBatch
zzet May 23, 2026
edb0f37
feat(bench/store-bench): cross-backend Store benchmark harness
zzet May 23, 2026
b091850
refactor(indexer): drive the full pipeline through graph.Store
zzet May 24, 2026
708be69
feat(graph): batched edge-mutation methods on Store (ReindexEdges + S…
zzet May 24, 2026
5ca800c
refactor(resolver): batch per-pass edge mutations through Store
zzet May 24, 2026
8e545d4
refactor(bench/store-bench): drive the full indexer per backend
zzet May 24, 2026
2a6b74a
feat(graph): predicate-shaped Store methods (EdgesByKind / NodesByKin…
zzet May 24, 2026
acb97ea
refactor(resolver): migrate hot-path scans to predicate-shaped Store …
zzet May 24, 2026
e88eb6d
feat(graph): batched lookup methods (GetNodesByIDs + FindNodesByNames…
zzet May 24, 2026
13b2c15
refactor(resolver): per-pass batched-lookup cache for ResolveAll
zzet May 24, 2026
258abad
perf(graph/store_sqlite): pool NumCPU connections so resolver workers…
zzet May 24, 2026
7aac251
perf(resolver): batch post-pass lookups (existingDepends index + file…
zzet May 24, 2026
12b4b4f
feat(graph/store_cayley): pure-Go Cayley-backed implementation of gra…
zzet May 24, 2026
1d3022d
feat(graph/store_kuzu): KuzuDB-backed (Cypher) implementation of grap…
zzet May 24, 2026
3237ee3
feat(graph/store_duckdb): DuckDB-backed (columnar SQL) implementation…
zzet May 24, 2026
9916b86
feat(bench/store-bench): wire kuzu / cayley / duckdb backends + -only…
zzet May 24, 2026
88eb84f
fix(bench/store-bench): apply -only filter to all six backends
zzet May 24, 2026
68b85b6
fix(graph/store_duckdb): dedupe within-batch in AddBatch's pre-delete…
zzet May 24, 2026
27e3908
perf(graph/store_kuzu): UNWIND-batch AddBatch / ReindexEdges / SetEdg…
zzet May 24, 2026
142c930
feat(graph): BulkLoader optional interface + indexer-side probe
zzet May 24, 2026
fcd506f
perf(graph/store_kuzu): BulkLoader fast path via COPY FROM TSV
zzet May 24, 2026
6466fbc
perf(graph/store_duckdb): BulkLoader fast path via single-pass Appender
zzet May 24, 2026
d0b1bd9
perf(graph/store_cayley): BulkLoader fast path via deferred mirror re…
zzet May 24, 2026
d406fc3
perf(indexer): in-memory shadow for whole IndexCtx, bulk-load to disk…
zzet May 24, 2026
1b0a538
perf(graph/store_bolt,store_sqlite): BulkLoader marker enables shadow…
zzet May 24, 2026
cf27f8f
perf(indexer): file-count threshold guard on the in-memory shadow swap
zzet May 24, 2026
a3f193a
feat(graph,resolver): backend-delegated unique-name resolution
zzet May 24, 2026
33b85d9
perf(indexer): streaming-flush parse path for above-threshold repos
zzet May 24, 2026
68d0780
feat(graph/store_ladybug): LadybugDB-backed (Kuzu fork, Cypher) graph…
zzet May 24, 2026
cac1005
feat(graph/store_cozo): CozoDB-backed (Datalog) graph.Store
zzet May 24, 2026
0d12ef6
feat(graph/store_lora): LoraDB-backed (Rust Cypher) graph.Store + bui…
zzet May 24, 2026
63e580b
chore(graph): drop store_bolt, store_cayley, store_lora backends
zzet May 24, 2026
bcdf0e3
fix(graph/store_kuzu,store_duckdb,store_ladybug): BulkLoader handles …
zzet May 24, 2026
c1a1761
perf(indexer,graph): drain shadow shard-by-shard during persist
zzet May 25, 2026
d96fab3
feat(graph,resolver): BackendResolver interface expansion to 8 methods
zzet May 25, 2026
48dbe5b
feat(graph,storetest): Phase 2a ResolveSameFile (Kuzu + DuckDB) + con…
zzet May 25, 2026
a80e602
feat(graph): Phase 2b ResolveSamePackage (Kuzu + DuckDB)
zzet May 25, 2026
27e4299
feat(graph): Phase 2c ResolveImportAware (Kuzu + DuckDB)
zzet May 25, 2026
c4acf26
feat(graph): Phase 3a ResolveRelativeImports (Kuzu + DuckDB)
zzet May 25, 2026
4224817
feat(graph): Phase 3b ResolveExternalCallStubs (Kuzu + DuckDB)
zzet May 25, 2026
c7f86ef
feat(graph): Phase 3c ResolveCrossRepo (Kuzu + DuckDB)
zzet May 25, 2026
c08e6c8
feat(graph/store_ladybug): Phase 4b BackendResolver port
zzet May 25, 2026
1e6d148
feat(graph/store_cozo): Phase 4a BackendResolver Datalog port
zzet May 25, 2026
14e7505
chore(graph): drop store_cozo backend
zzet May 25, 2026
15dbbb3
fix(indexer): redirect resolver graph through shadow swap
zzet May 25, 2026
3139290
perf(bench): per-MCP-tool latency breakdown in store-bench
zzet May 25, 2026
52d17c9
test(bench): node-diff + edge-diff harnesses for cross-backend confor…
zzet May 25, 2026
409761d
fix(resolver): rebind cross-file Go method receivers onto canonical type
zzet May 25, 2026
6f6f777
test(bench): kuzu-stubs diagnostic for cross-backend node-count audit
zzet May 25, 2026
d4a4c44
perf(go-extractor): encode local/closure IDs as function-relative off…
zzet May 25, 2026
3db5834
feat(go-extractor): materialise intra-function locals as KindLocal nodes
zzet May 25, 2026
3d3da48
feat(resolver): scope-aware bare-name binding (locals + params)
zzet May 25, 2026
6eb8fb7
feat(resolver): bind generic-type-param refs to KindGenericParam
zzet May 25, 2026
e64a841
feat(resolver): attribute Go language intrinsics to builtin::go::*
zzet May 25, 2026
f136387
feat(go-extractor): preserve package qualifier on dataflow selectors
zzet May 25, 2026
a2f4101
feat(resolver): materialize Go stdlib/dep/external call targets
zzet May 25, 2026
b84a611
feat(ts-extractor): materialize let/const/var bindings as KindLocal
zzet May 25, 2026
624a3b4
chore(graph): drop store_kuzu backend (upstream public-archived)
zzet May 25, 2026
c652383
feat(ladybug): native FTS via SymbolSearcher capability interface
zzet May 25, 2026
8365023
feat(indexer): drive backend SymbolSearcher through the shadow drain
zzet May 25, 2026
10e5241
feat(search): route Engine.SearchSymbols through Ladybug FTS
zzet May 25, 2026
b414767
perf(indexer): skip Bleve auto-upgrade when SymbolSearcher is active
zzet May 25, 2026
486d21e
perf(bench): add fts_search column to store-bench
zzet May 25, 2026
1fe080d
feat(ladybug): VectorSearcher capability via native HNSW
zzet May 25, 2026
66da687
feat(indexer): mirror embeddings into backend VectorSearcher
zzet May 25, 2026
163ea9f
perf(search): skip in-process HNSW build when backend has VectorSearcher
zzet May 25, 2026
e0b1c1e
bench(store): add vector_search column + in-process HNSW baseline
zzet May 25, 2026
36a728a
test(ladybug): probe ALGO extension surface (PROJECT_GRAPH + 6 algos)
zzet May 25, 2026
f266fe6
feat(algo): graph.PageRanker capability + ladybug impl + analyze kind…
zzet May 25, 2026
f80bfff
feat(algo): graph.CommunityDetector capability + ladybug Louvain + an…
zzet May 25, 2026
90e6561
feat(algo): graph.ComponentFinder + ladybug WCC/SCC + analyze kind=wc…
zzet May 25, 2026
9fc3fd6
feat(algo): graph.KCorer capability + ladybug k-core + analyze kind=k…
zzet May 25, 2026
b02e47d
bench(store): per-algo columns (pagerank, louvain, wcc, scc, kcore)
zzet May 25, 2026
68346f2
bench(multi-repo): harness that drives MultiIndexer across backends
zzet May 25, 2026
a3f5101
refactor: mcp.Server.graph + analysis/etc. take graph.Store, not *gra…
zzet May 25, 2026
b905507
feat(daemon): --backend memory|ladybug flag swaps the storage engine
zzet May 25, 2026
8d4f497
fix(ladybug): SymbolFTS bulk upsert .tsv → .csv
zzet May 25, 2026
f591b82
feat(daemon): smoke-test fixes — multi-repo gate, snapshot cache, wri…
zzet May 25, 2026
27a9c15
feat(multi-repo): per-repo prefix on stubs + per-Indexer shadow-swap …
zzet May 25, 2026
b2201e3
perf(ladybug): connection pool + per-repo unresolved-stub prefix
zzet May 25, 2026
8eb9ef3
feat(daemon): wire --backend / --backend-path into gortex daemon start
zzet May 25, 2026
d66dad6
fix(mcp): preserve full arguments through streamable->router->local-e…
zzet May 25, 2026
8eebcad
docs(graph): BulkLoader may be re-entered on a non-empty store
zzet May 25, 2026
4cf9a3b
perf(indexer): bulk-batch contracts commit through BulkLoader
zzet May 25, 2026
e30c711
fix(indexer): skip dep contracts in bulk commit to avoid PK collision
zzet May 25, 2026
49275c8
feat(graph): GetRepoEdges on Store + backend impls + conformance test
zzet May 25, 2026
0b84b9c
perf(indexer): replace per-node OutEdges walks with GetRepoEdges
zzet May 25, 2026
fef9ffc
fix(contracts): drop COPY bracket from bulkCommit; UNWIND-batch nodes…
zzet May 25, 2026
cdbc4a9
feat(graph): GetNodesByIDs on Reader + OverlaidView impl
zzet May 25, 2026
8ce8614
perf(query): batch-materialise search candidates via GetNodesByIDs
zzet May 25, 2026
8f2b4d8
perf(mcp): batch GetNode in analyze(pagerank) and check_references
zzet May 25, 2026
99e2c67
chore(graph): drop store_sqlite backend
zzet May 25, 2026
c1a19ff
chore(graph): drop store_duckdb backend
zzet May 25, 2026
af0c3db
chore(bench,cli): drop sqlite/duckdb branches from bench tools and co…
zzet May 25, 2026
42744ed
chore: tidy go.mod after backend removal
zzet May 25, 2026
2f6476b
perf(query,mcp): batch GetNode in find_usages and analyze(kcore)
zzet May 25, 2026
bdf05d3
perf(query): batch GetNode in FindUsages via GetNodesByIDs
zzet May 25, 2026
0b13b08
perf(mcp): batch GetNode in notes auto-link, replay_episode, tests_as…
zzet May 25, 2026
1958112
perf(ladybug): cache PROJECT_GRAPH across algo calls; rebuild on writ…
zzet May 25, 2026
356f6c6
feat(graph): batch edge fetch — GetInEdgesByNodeIDs + GetOutEdgesByNo…
zzet May 26, 2026
4f9ed9d
perf(rerank): batch edge fetches in prepare + signals + retriever
zzet May 26, 2026
d080585
test(bench): end-to-end daemon bench harness for memory vs ladybug
zzet May 26, 2026
ebf2988
chore: fix make lint — errcheck, staticcheck QF/ST, unused funcs
zzet May 26, 2026
8dbd7cc
perf(mcp): per-phase timing instrumentation in search_symbols
zzet May 26, 2026
94a1ea3
perf(search): combine expansion terms into one BM25 query
zzet May 26, 2026
dd5724b
perf(graph): FindNodesByNameContaining — push substring filter into b…
zzet May 26, 2026
b2b46cb
fix(ladybug): serialise concurrent BeginBulkLoad on shared Store
zzet May 26, 2026
15cbf54
feat(graph): SymbolBundle + SymbolBundleSearcher capability + ladybug…
zzet May 26, 2026
4d01cb4
perf(query): gather search candidates as backend bundles to skip rera…
zzet May 26, 2026
74a31fd
perf(rerank): skip Context.prepare's batched edge fetch when bundle-s…
zzet May 26, 2026
a6c6c6d
perf(query): inner per-call rerank inherits the bundle edge cache fro…
zzet May 26, 2026
d305ce0
perf(search): skip inner engine rerank + vector-only channel pull
zzet May 26, 2026
214a42b
perf(ladybug): parallelise SearchSymbolBundles' 3 post-FTS sub-cyphers
zzet May 26, 2026
ab1b52b
perf(search): identifier-shape fast path — skip expansion + vector fo…
zzet May 26, 2026
cee3e64
perf(search): dedupe FindNodesByName across fan-outs + tighten fetchL…
zzet May 26, 2026
cec4d3c
test(bench): all-tools-bench harness covering ~78 MCP tools end-to-end
zzet May 26, 2026
b711a54
fix(analyze): batch dead_code's per-node GetInEdges + drop AllEdges scan
zzet May 26, 2026
74ec6ca
feat(graph): DeadCodeCandidator + IfaceImplementsScanner capabilities…
zzet May 26, 2026
f63010d
perf(analyze): push dead_code candidate filter into the storage layer
zzet May 26, 2026
2652d0d
feat(graph): NodeDegreeAggregator + NodeFanAggregator capabilities + …
zzet May 26, 2026
2cda689
perf(analyze): push connectivity_health's per-node degree probe into …
zzet May 26, 2026
415ad28
perf(analyze): push find_clones' SimilarTo edge walk into the storage…
zzet May 26, 2026
90b3dff
perf(analyze): push find_co_changing_symbols' CoChange edge walk into…
zzet May 26, 2026
73e2839
perf(analyze): push cycles' AllEdges scan into per-kind streaming
zzet May 26, 2026
12ffb0f
fix(test): align test helpers with graph.Store interface drift
zzet May 26, 2026
1a96c69
perf(analyze): push hotspots' AllEdges scan into the storage layer
zzet May 26, 2026
84de0fe
perf(analyze): push health_score's AllEdges scan into the storage layer
zzet May 26, 2026
5b37b44
perf(analyze): push impact's AllEdges scan into the storage layer
zzet May 26, 2026
363f0e4
feat(graph): FileImporters + InEdgeCounter + NodesInFilesByKindFinder…
zzet May 26, 2026
3b3caca
perf(mcp): push check_references' importing-files scan into the stora…
zzet May 26, 2026
0153ae0
perf(mcp): push get_untested_symbols' fan-in scan into the storage layer
zzet May 26, 2026
f8b979c
perf(mcp): push find_declaration's file-symbol index into the storage…
zzet May 26, 2026
50fcb5d
perf(mcp): graph_completion_search seeder reuses FindNodesByNameConta…
zzet May 26, 2026
41a42ac
perf(mcp): push graph_query's seed scan into the storage layer
zzet May 26, 2026
e790979
perf(dataflow): push taint_paths candidate seed into the storage layer
zzet May 26, 2026
e8541cb
perf(mcp): push search_ast's file-target enumeration into the storage…
zzet May 26, 2026
396a13d
fix(dataflow): drop dead taintEligible helper left by taint_paths pus…
zzet May 26, 2026
b5f8efb
feat(graph): EdgesByKindsScanner capability + ladybug impl + conformance
zzet May 26, 2026
de168f9
perf(analyze): push edge-driven analyzers' kind filter into the stora…
zzet May 26, 2026
b71dcc6
perf(analyze): push string_emitters / log_events / sql_call_sites kin…
zzet May 26, 2026
b4b8b70
perf(analyze): push race_writes / unclosed_channels kind filter into …
zzet May 26, 2026
b791980
perf(analyze): push k8s_resources / images / kustomize kind filter in…
zzet May 26, 2026
90bdeba
perf(analyze): push routes / models / components / dbt_models kind fi…
zzet May 26, 2026
7bde699
perf(analyze): push tests_as_edges kind filter into the storage layer
zzet May 26, 2026
5e036ef
feat(graph): NodesByKindsScanner capability + ladybug impl + conformance
zzet May 26, 2026
f751a1b
perf(analyze): push metadata analyzers' candidate filter into the sto…
zzet May 26, 2026
8a36b2d
feat(graph): EdgeKindCounter + CrossRepoEdgeAggregator + FileImportAg…
zzet May 26, 2026
e9e1ced
perf(mcp): push overview-aggregate scans into the storage layer
zzet May 26, 2026
daf056b
perf(mcp): push per-node degree counts into the storage layer
zzet May 26, 2026
026d2b5
perf(mcp): push get_coupling_metrics's edge filter through EdgesByKind
zzet May 26, 2026
dbce3a8
perf(mcp): short-circuit unscoped edge counts via EdgeCount()
zzet May 26, 2026
f5028e8
feat(graph): InDegreeForNodes + ReachableForwardByKinds + ThrowerErro…
zzet May 26, 2026
7631dac
perf(analysis): push betweenness adjacency build through EdgesByKinds
zzet May 26, 2026
0710479
perf(mcp): push analyze(health_score)'s candidate scan into NodesByKi…
zzet May 26, 2026
ff4e4c9
perf(mcp): push get_knowledge_gaps's candidate scan into NodesByKinds…
zzet May 26, 2026
a72a320
perf(mcp): push get_untested_symbols' candidate scan + test-reachabil…
zzet May 26, 2026
10cebbb
perf(mcp): push get_surprising_connections's in-degree pass into the …
zzet May 26, 2026
ebdba4c
perf(mcp): push analyze(error_surface)'s thrower joins into the stora…
zzet May 26, 2026
8a8b584
perf(analysis): push FindHotspots + ComputeBetweenness node scans int…
zzet May 26, 2026
b85e0fb
perf(mcp): push get_repo_outline's full-graph scans into Stats() + Fi…
zzet May 26, 2026
5f33819
perf(mcp): push get_architecture's full-graph scans into Stats() + No…
zzet May 26, 2026
6b9f13e
perf(mcp): push gortex_wakeup's full-graph scans into Stats() + Nodes…
zzet May 26, 2026
1e06f4a
perf(mcp): revert get_surprising_connections to AllEdges-driven in-de…
zzet May 26, 2026
3cee99b
perf(mcp): cache default-threshold hotspots in RunAnalysis
zzet May 26, 2026
f64eda8
style: clean up lint findings from pushdown wave
zzet May 26, 2026
d4e0556
feat(graph): EdgeAdjacencyForKinds capability + ladybug impl + confor…
zzet May 27, 2026
4ca5a55
perf(analysis): use EdgeAdjacencyForKinds in ComputeBetweenness
zzet May 27, 2026
66a441f
feat(graph): CommunityCrossingsByKind capability + ladybug impl + con…
zzet May 27, 2026
ec4ab8a
perf(analysis): use CommunityCrossingsByKind in FindHotspots
zzet May 27, 2026
3b47ef3
feat(graph): NodeIDsByKinds capability + ladybug impl + conformance
zzet May 27, 2026
a7aecfc
perf(analysis): use NodeIDsByKinds in betweenness + hotspots node ite…
zzet May 27, 2026
af11c8a
perf(ladybug): malloc pressure relief after large query / drain batches
zzet May 27, 2026
a21f37d
chore: vendor go-ladybug v0.13.1 into internal/thirdparty/
zzet May 27, 2026
e78e738
fix(ladybug-go): destroy lbug_value in FlatTuple.GetValue + audit Get…
zzet May 27, 2026
820b9bd
fix(ladybug-go): free CString after lbug_value_create_string + struct…
zzet May 27, 2026
c091159
chore(ladybug-go): drop test-only deps + unused helper + unused ctx p…
zzet May 27, 2026
e58a941
feat(ladybug): cap buffer pool at 4 GiB by default + --backend-buffer…
zzet May 27, 2026
9c35444
feat(graph): MemberMethodsByType + StructuralParentEdges + CrossRepoC…
zzet May 27, 2026
896d985
perf(resolver): push InferImplements + InferOverrides global walks in…
zzet May 27, 2026
20700fb
perf(resolver): push DetectCrossRepoEdges scan into CrossRepoCandidates
zzet May 27, 2026
36539d8
feat(graph): carry RepoPrefix on MemberMethodInfo
zzet May 27, 2026
05ae8e3
perf(resolver): push ResolveGRPCStubCalls + buildGRPCHandlerIndex N+1…
zzet May 27, 2026
3d866b9
perf(resolver): drop AllNodes scans + per-edge GetNode loops in Resol…
zzet May 27, 2026
ebf47a2
perf(resolver): narrow SynthesizeExternalCalls to call-like kinds + b…
zzet May 27, 2026
b0eb4e7
perf(indexer): drop per-edge GetNode in markTestSymbolsAndEmitEdges
zzet May 27, 2026
3871f17
chore: drop now-dead helpers left behind by the pushdown wave
zzet May 27, 2026
c41ebec
perf(mcp): short-circuit analyze[clusters] when the graph token is un…
zzet May 27, 2026
95132a6
feat(graph): ExtractCandidates + FileSymbolNamesByPaths + ClassHierar…
zzet May 27, 2026
76a6eb5
perf(mcp): push get_extraction_candidates's AllNodes+per-node loop in…
zzet May 27, 2026
50ddc8b
perf(mcp): push get_class_hierarchy BFS into ClassHierarchyTraverser
zzet May 27, 2026
dfe49b9
perf(mcp): push get_editing_context and GetFileSymbols into batched l…
zzet May 27, 2026
71c9b4e
perf(mcp): batch symbol-name lookups in find_co_changing_symbols via …
zzet May 27, 2026
0d5a946
perf(mcp): push get_knowledge_gaps degree aggregate through NodeDegre…
zzet May 27, 2026
99533c2
perf(mcp): widen analyze[clusters] cache hit to graph-token parity alone
zzet May 27, 2026
36aa7a2
perf(mcp): unblock find_co_changing_symbols by mining co-change async…
zzet May 27, 2026
e829b45
perf(mcp): cap per-cluster member fetch in analyze[clusters]
zzet May 27, 2026
89ae709
feat(mcp): pre-compute churn data so get_churn_rate stops blaming on …
zzet May 27, 2026
48c02e2
feat(mcp): pre-compute releases timeline so analyze[releases] stops w…
zzet May 27, 2026
5cf322f
perf(mcp): stream computeETag + structural etagSubGraph for file_summary
zzet May 27, 2026
93c82b8
feat(graph): EdgeContains kind for file → side-band children
zzet May 27, 2026
ab5dc43
feat(graph,mcp): GetFileSubGraph(Counts) capabilities + tighter file_…
zzet May 27, 2026
83d00f7
perf(ladybug): file→nodeIDs accelerator + native FileSubGraph(Counts)
zzet May 27, 2026
10955a3
feat(daemon): persist file mtimes for warm-restart reconcile
zzet May 28, 2026
594a1b0
fix(ladybug): multi-repo correctness + perf, get_file_summary
zzet May 28, 2026
40c8c22
fix(ladybug): survive a poisoned pooled connection
zzet May 28, 2026
d217216
fix(mcp): get_file_summary returns definitions, not body-internal nodes
zzet May 28, 2026
f516947
fix(daemon,ladybug): make warm restart fast and crash-free
zzet May 28, 2026
aa42e2e
fix(resolver): go module stub id uses single-colon ecosystem separator
zzet May 29, 2026
fee3fe9
fix(resolver): resolve receiver-method-call stubs to concrete methods
zzet May 29, 2026
445a33a
fix(resolver): method-call rule matches bare method name (indexed =)
zzet May 29, 2026
ddc50a1
fix(resolver): ResolveAllBulk continues past a rule error (was aborting)
zzet May 29, 2026
a29e703
fix(reach): batch the impact live-walk and persist the lazy cache on …
zzet May 29, 2026
758f780
fix(coverage,blame): persist enriched node Meta on disk backends
zzet May 29, 2026
e821f91
fix(semantic,resolver): persist enriched node Meta on disk backends
zzet May 29, 2026
d1a89de
chore: fix make lint — staticcheck QF/SA + remove unused funcs
zzet May 29, 2026
c0fd7e1
build(release): fetch liblbug at build time; static unix, dynamic win…
zzet May 29, 2026
39e9e43
fix(install): windows one-line installer ships the runtime DLLs
zzet May 29, 2026
09af007
chore: drop ad-hoc bench/probe tooling from the repo
zzet May 29, 2026
6d9c3b8
fix(ladybug): -rdynamic so the dlopen'd FTS extension resolves on sta…
zzet May 29, 2026
df6fea8
refactor(store_ladybug): split store.go into purpose-named files
zzet May 29, 2026
1eb468b
feat(store_ladybug): schema_version + forward-only migration ladder
zzet May 29, 2026
6d783a6
perf(query,store_ladybug): bound bfs fan-out via single-query Frontie…
zzet May 29, 2026
87b9103
fix(store_ladybug): sanitize node id in vector bulk TSV so a tab/newl…
zzet May 29, 2026
10d7281
fix(store_ladybug): drop+recreate SymbolVec on bulk upsert so re-COPY…
zzet May 29, 2026
28e65a9
update the release flow
zzet May 29, 2026
2af5f41
feat(daemon): force full re-index when the backend NeedsRebuild
zzet May 29, 2026
6339a02
fix(store_ladybug): load SymbolFTS re-bulk via LOAD FROM ... MERGE so…
zzet May 29, 2026
fc1aa09
fix(codeowners): precompile rule matcher in Parse so concurrent Match…
zzet May 30, 2026
52c1835
fix(ladybug): --whole-archive forces liblbug's weak C++ RTTI into sta…
zzet May 30, 2026
d27850a
ci(security): allow -Wl,--whole-archive so govulncheck can load the c…
zzet May 30, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
17 changes: 17 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,13 @@ on:
pull_request:
branches: [main]

# liblbug static-links on linux; its #cgo LDFLAGS use -Wl,--whole-archive to
# force liblbug's weak C++ RTTI into the binary for the dlopen'd FTS extension
# (see internal/thirdparty/go-ladybug/cgo_shared.go). --whole-archive isn't on
# cgo's built-in #cgo LDFLAGS allowlist, so permit it for every job's build/test.
env:
CGO_LDFLAGS_ALLOW: '-Wl,--(no-)?whole-archive'

jobs:
test:
runs-on: ${{ matrix.os }}
Expand All @@ -20,6 +27,9 @@ jobs:
with:
go-version: ${{ matrix.go-version }}

- name: Fetch liblbug
run: bash scripts/fetch-lbug.sh

- name: Build
run: go build -o gortex ./cmd/gortex/

Expand Down Expand Up @@ -47,6 +57,10 @@ jobs:
with:
go-version: '1.26'

- name: Fetch liblbug (windows dynamic — lbug_shared.dll)
shell: bash
run: bash scripts/fetch-lbug.sh

- name: Build CLI
run: go build -o gortex.exe ./cmd/gortex/

Expand Down Expand Up @@ -77,6 +91,9 @@ jobs:
with:
go-version: '1.26'

- name: Fetch liblbug
run: bash scripts/fetch-lbug.sh

- name: Install ONNX Runtime
run: |
wget -q https://github.com/microsoft/onnxruntime/releases/download/v1.24.4/onnxruntime-linux-x64-1.24.4.tgz
Expand Down
9 changes: 9 additions & 0 deletions .github/workflows/init-smoke.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,12 @@ on:
- "cmd/gortex/init*.go"
- "internal/agents/**"

# liblbug static-links on linux with -Wl,--whole-archive (forces its weak C++
# RTTI into the binary for the dlopen'd FTS extension; see cgo_shared.go).
# Not on cgo's #cgo LDFLAGS allowlist, so permit it for the build step below.
env:
CGO_LDFLAGS_ALLOW: '-Wl,--(no-)?whole-archive'

jobs:
dry-run:
runs-on: ubuntu-latest
Expand All @@ -29,6 +35,9 @@ jobs:
go-version-file: go.mod
cache: true

- name: Fetch liblbug
run: bash scripts/fetch-lbug.sh

- name: Build gortex
run: go build -o /tmp/gortex ./cmd/gortex

Expand Down
125 changes: 125 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,18 @@ jobs:

chmod 600 "$SIGNING_DIR"/cert.* "$SIGNING_DIR"/notary.*

# Fetch the static liblbug for every unix target into
# lib/static/<os>-<arch>/ on the host. $PWD is bind-mounted into the
# goreleaser-cross container, so the cross-compiles below link them
# in (self-contained binaries, nothing to ship alongside). Pinned by
# LBUG_VERSION inside the script.
- name: Fetch liblbug (linux + darwin, static)
run: |
bash scripts/fetch-lbug.sh linux amd64
bash scripts/fetch-lbug.sh linux arm64
bash scripts/fetch-lbug.sh darwin amd64
bash scripts/fetch-lbug.sh darwin arm64

- name: Run GoReleaser (cross-compile via Docker)
# goreleaser-cross ships osxcross + aarch64/x86_64 gcc toolchains
# so all 4 targets (linux/amd64, linux/arm64, darwin/amd64,
Expand Down Expand Up @@ -208,6 +220,119 @@ jobs:
rm -rf /tmp/macos-signing
fi

# Windows is built on a NATIVE windows runner because lbug's windows lib
# is MSVC-built and must be linked dynamically — the mingw .exe loads
# lbug_shared.dll via `-l:lbug_shared.dll` (no import lib / gendef
# needed), so it can't be produced by the goreleaser-cross job above.
# This job builds, bundles the .exe with lbug_shared.dll + the mingw and
# VC++ runtime DLLs it needs, zips, cosign-signs, and appends the zip to
# the release the `release` job already created.
release-windows:
needs: release
runs-on: windows-latest
permissions:
contents: write
id-token: write
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6

- uses: actions/setup-go@4a3601121dd01d1626a1e23e37211e3254c1c06c # v6
with:
go-version: '1.26'

- uses: sigstore/cosign-installer@6f9f17788090df1f26f669e9d70d6ae9567deba6 # v4.1.2
with:
cosign-release: v2.4.1

# Fetches lbug_shared.dll (the MSVC-built DLL) into
# lib/dynamic/windows/. The mingw-w64 toolchain the runner ships on
# PATH links the .exe directly against it.
- name: Fetch liblbug (windows, dynamic)
shell: bash
run: bash scripts/fetch-lbug.sh windows amd64

- name: Build gortex.exe
shell: bash
env:
CGO_ENABLED: "1"
run: |
set -euo pipefail
VER="${GITHUB_REF#refs/tags/}"
go build -ldflags "-s -w -X main.version=${VER} -X main.commit=$(git rev-parse --short HEAD) -X main.date=$(date -u +%Y-%m-%dT%H:%M:%SZ)" -o gortex.exe ./cmd/gortex/

- name: Stage exe + runtime DLLs
shell: bash
run: |
set -euo pipefail
mkdir -p stage
cp gortex.exe stage/
cp internal/thirdparty/go-ladybug/lib/dynamic/windows/lbug_shared.dll stage/

# A missing runtime DLL must FAIL the release, never ship a
# zip whose .exe can't start. `gcc -print-file-name` echoes the
# bare name (exit 0) when it can't find the file, and the mingw
# runtime DLLs live in the toolchain's bin/ dir (not the lib/
# dir -print-file-name searches), so resolve via bin/ and assert
# an absolute, existing path.
find_dll() {
local name="$1" hit
for base in \
"$(dirname "$(command -v gcc 2>/dev/null || true)")" \
"$(dirname "$(command -v x86_64-w64-mingw32-gcc 2>/dev/null || true)")" \
/c/mingw64/bin /c/msys64/mingw64/bin /c/ProgramData/mingw64/mingw64/bin; do
[ -n "$base" ] && [ -f "$base/$name" ] && { echo "$base/$name"; return 0; }
done
hit="$(find /c/mingw64 /c/msys64 -name "$name" 2>/dev/null | head -1 || true)"
[ -n "$hit" ] && { echo "$hit"; return 0; }
return 1
}
# mingw C/C++ runtime the .exe links dynamically.
for lib in libstdc++-6.dll libgcc_s_seh-1.dll libwinpthread-1.dll; do
p="$(find_dll "$lib")" || { echo "FATAL: mingw runtime $lib not found"; exit 1; }
cp "$p" stage/; echo "bundled $lib <- $p"
done
# VC++ runtime the MSVC-built lbug_shared.dll imports
# (MSVCP140/VCRUNTIME140*). Present on windows-latest (VS).
for d in VCRUNTIME140.dll VCRUNTIME140_1.dll MSVCP140.dll; do
if [ -f "/c/Windows/System32/$d" ]; then cp "/c/Windows/System32/$d" stage/; echo "bundled $d";
else echo "FATAL: VC++ runtime $d not found on runner"; exit 1; fi
done
ls -la stage/

- name: Zip (gortex_windows_amd64.zip)
shell: pwsh
run: Compress-Archive -Path stage/* -DestinationPath gortex_windows_amd64.zip -Force

- name: Sign + upload to release
shell: bash
env:
COSIGN_YES: "true"
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
set -euo pipefail
cosign sign-blob \
--output-signature gortex_windows_amd64.zip.sig \
--output-certificate gortex_windows_amd64.zip.pem \
gortex_windows_amd64.zip
TAG="${GITHUB_REF#refs/tags/}"
gh release upload "$TAG" \
gortex_windows_amd64.zip \
gortex_windows_amd64.zip.sig \
gortex_windows_amd64.zip.pem \
--clobber

# Append the windows zip's sha256 to the release checksums.txt so
# the one-line installer (scripts/install.ps1, which verifies
# against checksums.txt) covers windows too — the unix goreleaser
# run only hashed its own artifacts. needs:release guarantees
# checksums.txt already exists.
sha="$(sha256sum gortex_windows_amd64.zip | awk '{print $1}')"
gh release download "$TAG" --pattern checksums.txt --clobber 2>/dev/null || : > checksums.txt
if ! grep -q "gortex_windows_amd64.zip" checksums.txt; then
printf '%s gortex_windows_amd64.zip\n' "$sha" >> checksums.txt
gh release upload "$TAG" checksums.txt --clobber
fi

# SLSA-3 provenance via the OpenSSF reusable workflow. This runs in a
# separate, isolated job that the `release` job can't tamper with —
# that isolation is what elevates us from SLSA-2 to SLSA-3. Output is
Expand Down
8 changes: 8 additions & 0 deletions .github/workflows/security.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,14 @@ permissions:
contents: read
security-events: write

# liblbug static-links on linux with -Wl,--whole-archive (forces its weak C++
# RTTI into the binary so the dlopen'd FTS extension resolves — see
# internal/thirdparty/go-ladybug/cgo_shared.go). --whole-archive isn't on cgo's
# #cgo LDFLAGS allowlist, so govulncheck — which loads the cgo packages through
# the Go toolchain — must allow it, the same way ci.yml does.
env:
CGO_LDFLAGS_ALLOW: '-Wl,--(no-)?whole-archive'

jobs:
govulncheck:
runs-on: ubuntu-latest
Expand Down
17 changes: 17 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -51,3 +51,20 @@ eval/scripts/
eval/logs/

internal_docs/

# liblbug native libraries are fetched at build time by
# scripts/fetch-lbug.sh (run by make / CI / release), never committed.
internal/thirdparty/go-ladybug/lib/

# Ad-hoc bench/probe tooling — kept locally, not part of the repo.
bench/all-tools-bench/
bench/daemon-bench/
bench/edge-diff/
bench/ladybug-bundle-probe/
bench/multi-repo-bench/
bench/node-diff/
bench/store-bench/
bench/unresolved-audit/
bench/run-linux.sh
bench/run-linux-rest.sh
cmd/lbug-probe/
62 changes: 22 additions & 40 deletions .goreleaser.yml
Original file line number Diff line number Diff line change
@@ -1,8 +1,17 @@
version: 2

# Run inside ghcr.io/goreleaser/goreleaser-cross — the Docker image ships
# cross-compile toolchains for all four targets below so CGO (tree-sitter)
# links cleanly on a single Linux runner. See .github/workflows/release.yml.
# cross-compile toolchains so CGO (tree-sitter + the statically-linked
# liblbug) links cleanly on a single Linux runner. This config builds the
# UNIX targets only (linux + darwin, both with liblbug static-linked into
# a self-contained binary). Windows is built separately on a native
# windows runner (see the `release-windows` job in release.yml) because
# lbug's windows lib is MSVC-built and must be linked dynamically + shipped
# as a DLL — it can't be static-linked from mingw.
#
# liblbug static archives are fetched into lib/static/<os>-<arch>/ by the
# "Fetch liblbug" step in release.yml before this runs (the repo is
# bind-mounted into the container).
before:
hooks:
- go mod tidy
Expand All @@ -19,30 +28,19 @@ builds:
# Version (see internal/version). Commit lands in the +build slot so
# `gortex version` output round-trips as canonical semver.
- -s -w -X main.version={{.Version}} -X main.commit={{.ShortCommit}} -X main.date={{.Date}}
# Statically link the mingw-w64 C/C++ runtime (libstdc++, libgcc,
# winpthread) into the Windows binary. CGO is on for tree-sitter and
# some grammar scanners ship C++; without -static the released
# gortex.exe dynamically links libstdc++-6.dll et al., which are not
# present on a stock Windows box — the binary fails to start with a
# missing-DLL error. No-op on linux/darwin, which keep their normal
# dynamic libc/libc++.
- '{{ if eq .Os "windows" }}-extldflags "-static"{{ end }}'
env:
- CGO_ENABLED=1
# liblbug static-links on linux with -Wl,--whole-archive (forces its
# weak C++ RTTI into the binary for the dlopen'd FTS extension; see
# internal/thirdparty/go-ladybug/cgo_shared.go). --whole-archive isn't
# on cgo's #cgo LDFLAGS allowlist, so permit it. No-op for darwin.
- 'CGO_LDFLAGS_ALLOW=-Wl,--(no-)?whole-archive'
goos:
- linux
- darwin
- windows
goarch:
- amd64
- arm64
ignore:
# windows/arm64 needs an aarch64-w64-mingw32 cross-toolchain that
# the goreleaser-cross image doesn't ship; windows/amd64 covers
# every mainstream Windows dev box. Revisit when the image gains
# the llvm-mingw arm64 target.
- goos: windows
goarch: arm64
# Per-target CC + CXX. goreleaser-cross exposes these cross-toolchains
# on PATH; CGO needs both set per target triple because some deps
# (tree-sitter yaml scanner, etc.) ship C++. Without CXX, the system
Expand All @@ -69,11 +67,6 @@ builds:
env:
- CC=aarch64-linux-gnu-gcc
- CXX=aarch64-linux-gnu-g++
- goos: windows
goarch: amd64
env:
- CC=x86_64-w64-mingw32-gcc
- CXX=x86_64-w64-mingw32-g++
# Per-target build hook. Fires after each Mach-O / ELF is linked,
# before the archive step. The script is a no-op for non-darwin
# targets, so we don't need a per-override hook list.
Expand Down Expand Up @@ -151,20 +144,9 @@ homebrew_casks:
executable: gortex
shell_parameter_format: cobra

# Scoop manifest — `scoop install gortex` on Windows. goreleaser commits
# the generated manifest (pointing at the signed windows/amd64 .zip in
# this release) to a separate bucket repo on every tagged release,
# exactly like the Homebrew cask above.
scoops:
- name: gortex
repository:
owner: gortexhq
name: scoop-bucket
# GITHUB_TOKEN can only push to the source repo, so the bucket
# needs its own PAT with `repo` scope on gortexhq/scoop-bucket,
# stored as SCOOP_BUCKET_TOKEN in repo secrets. release.yml wires
# it in.
token: "{{ .Env.SCOOP_BUCKET_TOKEN }}"
homepage: "https://github.com/zzet/gortex"
description: "Code intelligence engine that indexes repositories into an in-memory knowledge graph."
license: "Custom"
# NOTE: the Scoop manifest is intentionally NOT generated here. Windows is
# built by the separate `release-windows` job (native runner, dynamic
# liblbug) and isn't an artifact of this goreleaser-cross run, so goreleaser
# has no windows zip to point a scoop manifest at. Re-add a scoop manifest
# (pointing at the windows job's zip) as a follow-up once the windows
# release path is settled.
Loading
Loading