Nineteen community pull requests. A security pass on ingestion: a fetched URL with no hostname, with a malformed or zero port, or with embedded user:pass@ credentials is now rejected before the request leaves, on the first fetch and on every redirect, and a text capture no longer follows a dangling symlink out of the corpus. Extraction and resolution: a Maven POM contributes only its own dependencies, a JS/TS member call on an untyped receiver stops guessing a same-named method in the same file, a CommonJS require binding no longer shadows the class the required file exports, and Objective-C category node ids stay repo-relative instead of embedding the absolute checkout path. SQL gets its own pass: T-SQL bracketed names are unbracketed, a GO batch separator ends the statement, cross-file table stubs fold onto their real definition, and a procedure emits reads_from/writes_to edges. Plus a markdown bare method only links when its class is cited, the MCP node lookup refuses a substring near-miss instead of answering with an unrelated node, a cross-repo edge points at the call site, Objective-C calls resolve across a split header/impl, an incremental build stops re-queuing files an extractor declined by design, a quoted Codex hook command for install paths with spaces, an IPv6 bracketed-Host serve fix, and a complete, drift-guarded --platform list in --help. The AST cache schema is bumped, so the first build after upgrading re-extracts.
- Fix: security
validate_urlrejects a fetched URL that has no hostname (http:///path), a non-numeric, out-of-range, or zero port, or embeddeduser:pass@credentials, before the request is made and again on every redirect, so a malformed or credential-bearing URL is no longer fetched or persisted into the graph; a normal@in a path or query and a valid high port still pass (#4643, #4644, #4645, thanks @cellrishi-code). - Fix: manifest a Maven
pom.xmlcontributes only its own<dependencies>(including those under<profiles>), not the version pins under<dependencyManagement>or a build plugin's own<dependencies>, so a parent or BOM POM no longer emits dependency edges it only manages (#4596, thanks @jayhemnani9910). - Fix: js a member call on an untyped receiver (
x.foo()wherexhas no known type) is deferred to receiver-typed resolution instead of binding to a same-named method elsewhere in the file, so a spurious self-loop or cross-call edge is no longer emitted;this.foo(), a typed receiver, and a locally instantiated receiver still resolve (#4598, #4605, thanks @ayushcodes10; reported by @SaschaAndresGrimm). - Fix: js a CommonJS
const X = require('./m')binding no longer mints a module-scope node that shadows the class the required file exports, sonew X()resolves to the required declaration; a realconst x = factory()binding still keeps its node (#4621, #4634, thanks @lab1207; reported by @sub4biz). - Fix: extract an Objective-C category's class and method node ids stay repo-relative instead of embedding the absolute checkout path, so a category file like
Foo+Cat.hyields portable ids that match across machines and merge cleanly; two same-named categories in different directories stay distinct (#4666, #4642, thanks @madhusudanpatnaik; reported by @xiongjianxu). - Fix: codex the generated Codex PreToolUse hook command quotes the graphify executable path, so an install under a path containing a space no longer builds a broken hook command, matching the existing Claude and Gemini hooks (#4662, thanks @supercell02).
- Fix: serve an IPv6 HTTP bind accepts its own bracketed
Hostheader ([::1]:port), so a server bound to an IPv6 loopback no longer refuses every request with a 421 (#4656, thanks @zydo). - Fix: ingest a text capture never writes through an existing entry: the free-path search uses
lstat, so a name that is a dangling symlink is treated as occupied and the capture is diverted instead of following the link and writing outside the corpus (#4657, thanks @zydo). - Fix: cli
graphify --helplists every accepted--platformvalue (it had omitted amp, copilot, kilo, kimi, and antigravity-windows); the list is derived from the same source as the install usage so the two cannot drift, with a guard test (#4655, thanks @zydo). - Fix: sql T-SQL bracketed identifiers (
[dbo].[Orders]) are unbracketed so a name matches across styles, and a stored procedure's body emitsreads_from/writes_toedges for the tables it reads and writes; aliases, variables, temp tables, strings, and comments never become targets (#4635, #4649, thanks @Deepjyoti-Sarmah; reported by @RuVl). - Fix: sql a
GObatch separator (a client command, not a terminator) ends the statement, so a statement after aGOwith no trailing;parses on its own instead of merging into one malformed node; aGOinside a string, comment, or column name is left alone (#4651, #4652, thanks @Deepjyoti-Sarmah). - Fix: sql a table referenced before its
CREATE TABLEis seen folds onto the real definition instead of staying a separate stub, and a schema-qualified name binds correctly, while two genuinely different tables in different schemas (dbo.Ordersvssales.Orders) stay distinct and a SQL stub no longer binds to a same-named class in another language (#4653, #4654, thanks @Deepjyoti-Sarmah). - Fix: markdown a bare method name in prose (for example
rediswhere onlyCache.redisexists) only links to the method when the owning class is cited in the same document, so a plain word is no longer turned into a falsereferencesedge; a qualifiedClass.methodorClass::methodmention still resolves (#4609, #4617, thanks @nothariharan; reported by @saad-siddique). - Fix: mcp the
get_nodeandget_neighborstools, and theexplaincommand, refuse a substring-only near-miss with candidate suggestions instead of returning an unrelated node as the answer; an exact or prefix match still resolves (#3917, #4618, thanks @nothariharan; reported by @Alexandre-Aktisea). - Fix: cross-repo a cross-repo call edge points at the real call site rather than the caller's header declaration, so the edge's
source_fileandsource_locationname the line that makes the call (#4668, #4669, thanks @xiongjianxu). - Fix: extract an incremental build no longer re-queues, on every run, a code file an extractor declined by design (for example a virtual-workspace manifest); the file is marked
ast_emptyand left alone, while a genuinely failed or transiently empty extraction is still retried (#2543, #4672, thanks @xiongjianxu). - Fix: objc a member call resolves when a class is split across a header and an implementation in different directories, binding the selector to its single definition; two unrelated same-named classes that both define the selector stay ambiguous and get no edge (#4673, #4674, thanks @xiongjianxu).