Releases: zzet/gortex
v0.11.0
Changelog
- 3a7ff57 Adjust view for the process list to make it more compact
- e4c5d31 Bump version to v0.11.0
- 2dd0ebc Graph views now consume real data
- 6122e5d Split product processed from tests processes
- 7388c14 agents: install Gortex instructions file into every detected agent
- 285f91c caveats: cross-repo reach, actionable advice, working inspector
- 2da79c4 caveats: scope filter (yours/tests/deps/all) + drop vendored dirs
- c63f8ba contracts: extract request/response shapes and diff provider↔consumer drift
- bea1253 contracts: graph-aware type tracing, side-by-side UI, broader language coverage
- f9f8dd6 contracts: own/external + type filters, expandable detail, highlighted source
- 9f2758b contracts: persist per-repo registries across daemon restarts; add project/ref filters
- 40f94fc fix flaky test
- aa1b9e6 fix web links
- e1899e4 init: split install + init, fold skills, drop per-repo tool-usage
- 1dd5588 mcp: add row-based GCX encoders for contracts, editing_context, smart_context
- d0dc98f mcp: add winnow_symbols multi-axis structured retrieval
- f663865 note for agents for future
- 276d1a6 parser+resolver: attribute external calls to their import path
- 054cd66 processes: call-tree steps, collapsible tree UI, graph race fix
- 53839f8 return source code for the symbol in web
- d086558 server: add bearer-token auth + localhost-only default bind
- 94ee2ba server: add server_id, extend /v1/stats, accept format on /v1/tools
- 7208e77 server: drop --web, salvage /v1/graph + /v1/events, delete internal/web
- e2e684e server: move all HTTP routes under /v1 prefix
- b636a0a server: rename
gortex bridge→serverandgortex serve→mcp - 3ec5884 web + server: wire UI to real /v1 data, delete remaining mocks
- 16acdb1 web: redesign UI from Claude Design handoff; add /v1 dashboard endpoints
- 02ae8d7 web: replace seed mocks with /v1/* hooks; add UI-shaped server endpoints
v0.10.2
v0.10.1
v0.10.0
Important
Fixed a sad bug with a graph duplication. Required to recreate the index.
$ gortex daemon stop
$ rm ~/.cache/gortex/daemon.gob.gz
$ gortex daemon start --detachChangelog
- 9311153 Bump version to v0.10.0
- f9461ee Update readme - make less verbose
- 4ca6483 daemon: self-heal graph on restart, offline edits, and branch switches
- bd4dd7c docs(gcx): teach agents and users about the GCX1 wire-format opt-in
- 01d42c3 feat(parser): add 15 languages — F#, Julia, Tcl, Shaders, Perl, Raku, Crystal, Nim, Pascal, COBOL, Ada, PowerShell, VimScript, Emacs Lisp, Racket
- f54b214 feat(parser): add 36 languages — template engines, build/shell, blockchain, scientific, emerging, legacy
- 50b3314 feat(parser): add 8 languages — Verse, AL, AutoHotkey, Assembly, GDScript, Nix, Fortran, Solidity
- 26040cc fix linter issues
v0.9.1
v0.9.0
v0.8.0
v0.7.0
v0.6.1
v0.6.0
Gortex v0.6.0 — End-to-End Cross-Service Request Tracing
TL;DR
This release delivers end-to-end cross-service request tracing across all contract types. get_call_chain and get_callers now traverse service boundaries for HTTP, gRPC, topics, GraphQL, WebSocket, and OpenAPI-defined APIs. In
multi-repo workspaces, call-graph resolution works properly for the first time.
If you've been using Gortex in multi-repo mode, restart the daemon and clear the cache (steps below) — prior snapshots carry stale state that the old bugs accumulated, and a clean restart gives you the full benefit immediately.
What's New
Cross-service bridging works for every contract type
EdgeMatches edges now form between consumer and provider symbols across repositories. get_call_chain(consumerFn) reaches the actual handler on the provider side without manually hopping through contracts check.
| Contract type | Example scenario |
|---|---|
| HTTP | Go http.Get or TS fetch(`${API_URL}/path`) → Gin/Echo/Express handler |
| gRPC | pb.NewUsersClient(conn).GetUser(...) → UsersServer.GetUser via .proto binding |
| Topics | Kafka p.Publish("user.created", ...) → c.Subscribe("user.created", ...) |
| GraphQL | TS query { user } → schema-declared Query.user resolver |
| WebSocket | socket.emit("event") → socket.on("event") |
| OpenAPI | YAML/JSON spec declaring get /users → Go Gin r.GET("/users", listUsers) |
Method inference (GET / POST / PATCH / DELETE) is preserved through HTTP wrapper chains. Template literals (`${API_URL}/v1/tucks`) normalize to canonical paths. Dart dio.post('/path/$id') is supported.
Big fix: multi-repo call-graph resolution
applyRepoPrefix was polluting the resolver's unresolved:: sentinel, so in multi-repo workspaces every function-call edge ended up dangling, across every language. get_callers returned empty even for heavily-used functions. Fixed.
HTTP wrapper inlining
Frontends that funnel 30 endpoints through request(path, ...) now produce 30 specific consumer contracts (one per caller) instead of a single unresolvable parametric one. BFS-propagates through chains like fetchX → request → doFetch → fetch.
Other notable fixes
contracts list/checkreflects runtime-tracked repos (was showing empty even when nodes existed).- Duplicate Go nodes from prior-version indexing bugs are dropped on snapshot load.
track_repository↔active_projectstate drift auto-reconciles on next operation.- First-repo-tracked-at-daemon-warmup correctly gets a repo prefix.
Breaking Changes
Most users will not be affected. Flagging for completeness.
gRPC consumer contract ID format
| Format | |
|---|---|
| Before | grpc::Users — service-level only, from the pb.NewUsersClient construction site |
| After | grpc::Users::GetUser — per-method, from the client.GetUser(...) call site |
A service-level fallback is still emitted when no method calls resolve. If you were filtering contracts or building tools on top of the old grpc::Service ID shape, the new shape matches provider IDs (which were already
grpc::Service::Method) and you now get real matcher pairs.
OpenAPI provider contract ID format
| Format | |
|---|---|
| Before | openapi::GET::/users |
| After | http::GET::/users |
Type: ContractOpenAPI is retained, so contracts list --type openapi still filters correctly. Only users matching raw ID strings need to update.
Upgrade Steps
# 1. Pull latest and build.
cd <gortex repo>
git pull
go build -o gortex ./cmd/gortex/
# 2. Stop the running daemon so it loads the new binary.
./gortex daemon stop
# or: kill "$(cat ~/.cache/gortex/daemon.pid)"
# 3. Recommended: clear the cached snapshot. Prior runs may have
# stored stale Go duplicate nodes, orphan unresolved call edges,
# or abs-path IDs from buggy prior versions. A fresh graph is
# guaranteed correct.
rm -f ~/.cache/gortex/daemon.gob.gz
# 4. Restart. Your MCP client (Claude Code, etc.) will spawn the new
# daemon on its next call, or you can pre-warm:
./gortex daemon startAfter restart, the first query takes a few seconds longer while Gortex re-indexes your tracked repos fresh. Subsequent queries are back to normal latency.
▎ Note: If you'd rather keep the old snapshot, the load path now auto-drops nodes with absolute-filesystem-path IDs and reconciles tracked-repo drift against active_project, so a restart alone still works. Clearing is the cleanest option, not
▎ a requirement.
Verify the Upgrade
Once restarted, try these against your actual multi-repo workspace:
# Show every cross-service bridge in the project.
contracts action:"check"
# Expect nonzero matched_pairs, distinguishing cross-repo hits.
# Pick a well-known handler; you should see frontend / worker /
# mobile callers across repo boundaries.
get_callers id:"<provider-repo>/path/handler.go::HandleCreate"
# Pick a consumer function; chain should cross into the provider repo.
get_call_chain id:"<consumer-repo>/lib/api.ts::createThing"
# List gRPC contracts — should include grpc::Service::Method
# (not just grpc::Service).
contracts action:"list" type:"grpc"
Known Limitations
Not fixed in this release — flagging so you don't hunt for them:
- Function-as-value references (TS).
useQuery({ queryFn: fetchUser })passes fetchUser as a value, not a call. No call edge is emitted; the consumer side of the chain starts at fetchUser rather than at the component that imports it. Future
work needs function-reference tracking (EdgeReferences on identifiers in non-call positions). - Dynamic-URL HTTP consumers. Worker code using
http.NewRequestWithContext(ctx, method, urlVar, nil)with a variable URL cannot yield a path. These get no consumer contract. Typically these are calls to external services (media downloads,
oEmbed, etc.), not internal APIs — the absence is usually correct. - gRPC binding ambiguity. If your server types don't follow the {Service}Server naming convention and you have multiple methods of the same name in a repo, the binder skips rather than guesses. A .gortex.yaml option for custom server-type
suffixes is a future addition. - Wrapper inlining is HTTP-only. A publishEvent(topic, payload) helper in Go won't have its callers inlined. HTTP is where this pattern is endemic; gRPC / topic wrappers are rarer.
- Env-var bridges don't form. Providers (.env, docker-compose.yaml) aren't function symbols. get_dependencies(handler) still traces env-var reads correctly via the contract node — no EdgeMatches is emitted because it would be a category error.
- OpenAPI binding heuristic. Falls back to operationId or the last path segment matched to a function name in the same repo. Unusual handler-naming conventions may not bind; the consumer still reaches the OpenAPI contract node, just not the
handler method.
Troubleshooting
Did you restart the daemon? Old binary, old behavior. Check ps aux | grep gortex and verify the modified time matches your build.
If you never cleared the snapshot, stale nodes may have been dropped silently on load. ~/.cache/gortex/daemon.log will note stale_nodes_dropped=N. Re-index the affected repo(s) or clear the cache.
Confirm the server type matches the {Service}Server convention. Run search_symbols query:"{Service}Server" to verify. If your convention differs, file an issue — the binder's tier list can be extended.
The drift-reconcile path handles this automatically on the next index_repository call. If it persists, check ~/.cache/gortex/daemon.log for warnings about auto-track failures.
Changelog
- 856aa67 Bump version to v0.6.0
- 4ef6312 Merge pull request #1 from zzet/dependabot/go_modules/go-minor-patch-e88dfb2ff4
- b5cb68a Merge pull request #2 from zzet/dependabot/github_actions/actions-minor-patch-2337bbc86d
- 9d4839b Merge pull request #3 from zzet/dependabot/github_actions/crazy-max/ghaction-virustotal-5
- 166ea4d Merge pull request #4 from zzet/dependabot/github_actions/softprops/action-gh-release-3
- feb814b Merge pull request #5 from zzet/dependabot/github_actions/actions/upload-artifact-7
- 2d2c565 Merge pull request #6 from zzet/dependabot/github_actions/github/codeql-action-4
- eea0add ci(deps): bump actions/upload-artifact from 4 to 7
- 3c153f1 ci(deps): bump crazy-max/ghaction-virustotal from 4 to 5
- 61547de ci(deps): bump github/codeql-action from 3 to 4
- b5a9297 ci(deps): bump softprops/action-gh-release from 2 to 3
- 68c2a1a ci(deps): bump the actions-minor-patch group with 2 updates
- 048cc50 ci, docs: add supply-chain badges, OpenSSF Scorecard, Dependabot
- 08ebd50 deps(deps): bump github.com/mark3labs/mcp-go in the go-minor-patch group
- 3855c45 feat(contracts): bridge services in call-chain via matcher edges
- 5f0ad98 feat(contracts): detect Dart HTTP consumers and bridge to Go providers
- ee07821 feat(contracts): full cross-service bridging for gRPC, topics, GraphQL, WebSocket, env, OpenAPI
- 700c6d1 feat(contract...