Repository navigation
Graphicle 0.1.7
Every crate is at 0.1.7, and graphicle --version prints
graphicle 0.1.7 (core). The Python and TypeScript SDKs, at 0.1.0 until
now, are at 0.1.7 too.
Code graph
- The engine follows Graphify 0.9.95 (0.1.6 followed 0.9.91): the four
releases 0.9.92 to 0.9.95 are ported. Against 0.9.95 every comparison check
passes on Linux, and the file ledger marks all 96 application modules
verified
(docs/benchmarks.md).
What changes in the graph:- YAML:
.yamland.ymlfiles are code, read structurally: a node per
key under its file, withcontainsedges, keys nested at most seven
levels deep and 500 keys a file. YAML that holds data rather than
configuration is declined by design and listed as skipped, and unsafe
tags are refused. - C#: each overload of a method is a node of its own (the first keeps its
id, the others get ids salted by their signature), and calls bind by
argument count. Adelegateis a type. - Type aliases and declarations: Python
TypeAlias,type X =and
NewType; Gotype A = B; Rusttypealiases andunionitems; C++
namespace-scopeusing A = B;andtypedef; Kotlintypealias; Dart
typedef; Swiftmacrodeclarations and#macro(...)calls. - Names that differ only by
_,$,#or case keep separate nodes:
JavaScript and TypeScript members, Python module-level classes beside a
function or class of the same id, Go and Rust declarations. - Calls: TypeScript
this.fieldis typed from an assignment in any method;
a JavaScript call on an untyped receiver waits for receiver-typed
resolution; a CommonJSrequirebinding no longer shadows the export it
requires; a pytest fixture parameter is typed from the fixture's return;
Pythonmodule.func()binds the child named exactlyfunc; a bare call
resolved only through a module import staysINFERRED; Solidity
inherited calls,supercalls and modifiers resolve through C3
linearization; a Rustuserooted at a siblingmodreaches its
declaration; an Objective-C member call resolves across a header and an
implementation in different folders; a cross-repository call edge points
at the call site. - SQL: T-SQL names are unbracketed (
dbo.Alpha, not[dbo].[Alpha]),
procedures recordreads_fromandwrites_to,GOends a statement, a
table referenced before itsCREATE TABLEfolds onto it, and a
CREATE TABLEthe grammar cannot parse is recovered. - Each
package.jsondependency entry declares the node its importers
resolve to, labelledname@range. Markdown vault-relative wikilinks
resolve, and a bare method link needs its class cited. Objective-C
NS_CLOSED_ENUMis an enum, and category ids are relative to the
repository. Metal and CUDA qualifiers no longer create nodes without a
source, and a.hwithextern "C"goes to the C++ extractor. - Graph building: string confidences that drifted from the enum are
folded onto it, on nodes as on edges; a node with a source file wins
over a namesake without one; a build without clustering resolves imports
through the old-stem alias index. An incremental build no longer queues
again a file declined by design.
- YAML:
- The AST cache format changed, so the first sync after upgrading re-extracts
every file once. - graph.json keeps parallel edges between two nodes (
multigraph: true).
Every reader of a saved graph.json, not only the MCP server (exportand
merge-driveramong them), reads a file written before (parallel links
undermultigraph: false) the same way, so a result does not depend on
which release wrote the file. - A dependency entry of a JSON manifest such as
package.json, which the
engine now labelsname@rangeand joins to the package it declares, keeps
the stable id of its name (its label up to the first@after the first
character), so a reviewed memory linked to it survives the new label and
later version bumps. Other keys that hold@, such as pnpm overrides or a
jestmoduleNameMapperpattern, keep their whole label. - A code graph episode is named by the engine's graph format as well as the
project's files, so the first sync after upgrading builds the graph again
even when no file changed: C# overloads become nodes of their own and the
nodes the new engine no longer makes are closed. Before, an unchanged
project kept the older engine's graph until one of its files changed. graphicle graph updateworks on a project whose graph is over 512 MiB,
such as kubernetes: before, even its first update failed, reading back its
own temporary graph under the size cap. The engine reads a graph.json over
the cap that it wrote itself (update,watch,serve,query,
explain,path,merge-graphs,cluster-only,label); a larger
graph.json from elsewhere is still refused, andGRAPHICLE_MAX_GRAPH_BYTES,
when set, applies to every file. A graph.json over the cap that an earlier
release wrote has no record of being the engine's own, so updates and hook
rebuilds refuse it until it is rebuilt once, as the error says: run
GRAPHICLE_MAX_GRAPH_BYTES=<N>GB graphicle graph extract --force <project>,
with N above the file's size (add--code-onlywhen no LLM backend is set
up).- The engine extracts YAML structurally (above), so graph.json and the
graphicle graphcommands have its keys, but Graphicle Core does not yet
use those keys for its answers: its code graph leaves out the YAML files
the engine reads as keys (theapm.ymlpackage manifests stay in, as
before), and a YAML path quoted in a memory is taken for data, as a JSON
path is, not for a code file.
Commands, hooks and the language model
GRAPHICLE_BACKENDchooses the LLM provider (noneturns LLM work off);
an auto-detected provider is named before anything is sent.- The semantic extraction prompt now pins each node to the file it came
from; cached semantic results are extracted again once, which costs one
round of LLM calls. - Git hooks: a rebase,
pull --rebase, cherry-pick or revert rebuilds the
graph once; a merge commit rebuilds; a new branch at the same commit does
not; hooks run from the repository's top level. Run
graphicle-graph hook installto add the post-rewrite hook and update the
others. --versionand--helpno longer refresh installed skills, and--help
lists every--platformvalue.queryrefuses a name shared by several nodes (exit 3) and an unknown
--seedexits 4;explain,get_nodeandget_neighborsreport a
substring near miss instead of answering with it.- Merged graphs:
explainandpathkeep same-path files of two repos
apart and name the repo; the tree export draws one root per repo. prsreads CI state from legacy status contexts and keeps a default
branch such asrelease/2.xwhole; a Maven pom contributes only its own
dependencies;serveover streamable-http on an IPv6 address accepts its
[::1]:portHost header.- Detection: only a valid
.gitmarks a repository root; versioned shebangs
such aspython3.12are recognised; an unreadable PDF warns once; images,
audio and video count no words; a.graphiclercsaved with a byte order
mark keeps its first setting.
Connections
- The
graphicleprogram allows plainhttp://to every loopback address
for the services it calls (models, connectors, OAuth, vector and graph
endpoints): the rest of 127.0.0.0/8, such as127.0.0.2, and IPv4-mapped
loopback, such as[::ffff:127.0.0.1], as well aslocalhost,
127.0.0.1and[::1]. Before, a local model or connector on another
loopback address was refused (#11, by @rudycelekli).
SDKs
- The Python SDK keeps the service's
Retry-Afteron an error:
GraphicleError.retry_afteris the delay in seconds (from a number of
seconds or an HTTP date), and the error's text names it, so a caller whose
monthly request budget is spent knows when to try again, as the
TypeScript SDK'sretryAfterSecondsalready says (#10, by @rudycelekli).
ARetry-Afterthat is neither leavesretry_afterasNone, and the
error is still aGraphicleError.
Security
- URLs with credentials, a bad or zero port, or no host are refused;
multicast addresses are blocked; Obsidian tags and Google Workspace
sidecars escape hostile values. - Installing or refreshing a skill (
graphicle graph install) no longer
writes through a symbolic link. A link at the skill'sSKILL.md, or at
the version stamp beside it, is replaced by the new file, and the file it
pointed to is left alone; before, that file was overwritten.
references/is staged in a new private folder with a random name
instead ofreferences.tmp, so a link put there in advance cannot
redirect the copy, and the backups (SKILL.md.bakand the
.graphicle-bakcopies of agent settings) never follow a link. - A symbolic link that a repository commits at
.graphicle/.rebuild.lock,
at the rebuild's temporary graph or at.gitattributesis no longer
followed: before,graphicle graph update, a hook rebuild or
graphicle graph hook installcould truncate, overwrite or add a line to
the file it names.update --no-clusterand the GraphML export replace a
link at their output instead of writing through it. - Credential-shaped text in docstrings and comments is redacted before it
becomes a rationale label.
Dependencies and packaging
- yoke-derive 0.8.4 replaces 0.8.3, which its authors yanked and
cargo denywarned about. Only the lock files and the third-party
licence pages change. server.jsonat the repository's root is again the MCP Registry entry of
the latest listed release (0.1.6; it still named 0.1.2). An entry lists
the SHA-256 of each bundle themcp-registryworkflow builds from the
release, so a release's entry is committed after its listing, as
packaging/mcpb/README.md
describes.
Install
brew install graphicle-ai/tap/graphicle
# or
curl -fsSL https://github.com/Graphicle-AI/graphicle/releases/download/v0.1.7/install.sh | sh -s -- --version 0.1.7On Windows (x86-64, preview), in PowerShell:
$env:GRAPHICLE_VERSION = '0.1.7'; irm https://github.com/Graphicle-AI/graphicle/releases/download/v0.1.7/install.ps1 | iexEach archive's SHA-256 sum is in SHA256SUMS and beside it in a .sha256 file.
graphicle.exe and graphicle-graph.exe in the Windows archive carry a signature from a SignPath test certificate. Windows does not trust that certificate, so it treats them as unsigned programs and may warn before it runs them. Code signing policy