Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
355 commits
Select commit Hold shift + click to select a range
aa01692
fix(js,ts): an import from the app's root maps through the app's own …
colbymchenry Oct 21, 2026
ae0fc63
fix(js,ts): a callee that names nothing records no reference, and a w…
colbymchenry Oct 21, 2026
51be28d
fix(extraction): a function in an initializer is referenced once, by …
colbymchenry Oct 21, 2026
e248270
fix(sync): a name imported through a barrel links when an edit gives …
colbymchenry Oct 21, 2026
6e24711
fix(go): a call through a func-typed struct field reaches the functio…
colbymchenry Oct 21, 2026
e450ae3
fix(go): an unexported interface method is satisfied only from its ow…
colbymchenry Oct 21, 2026
3cfd24a
fix(explore): every dynamic-dispatch link gets its own line, the ones…
colbymchenry Oct 21, 2026
fc293f0
fix(sync): a default import follows the module's default when an edit…
colbymchenry Oct 21, 2026
f5dfa21
fix(explore): a symbol written with its package resolves, like `refre…
colbymchenry Oct 21, 2026
bbf987e
fix(explore): the named symbols take turns in the dynamic-dispatch li…
colbymchenry Oct 21, 2026
553d5d1
fix(sync): an import a name match took follows its module once it res…
colbymchenry Oct 21, 2026
a5fe6e1
fix(go): a call on an indexed element reaches its element type's meth…
colbymchenry Oct 21, 2026
1f3a274
fix(go): a method a type declares in a file the index couldn't read i…
colbymchenry Oct 21, 2026
847f1df
fix(go): an interface or struct embedding a standard-library type cou…
colbymchenry Oct 21, 2026
8b5d1d5
chore(scripts): regenerate the Go standard-library method table from …
colbymchenry Oct 21, 2026
dbb6aa9
fix(vbnet): link reads through a namespace or a bare member name, and…
colbymchenry Oct 21, 2026
bf6f1fa
fix(dart): a typedef references the types it aliases (#2763)
colbymchenry Oct 21, 2026
efff745
fix(go): a field typed by a dot-imported package resolves in that pac…
colbymchenry Oct 21, 2026
d6e8c91
fix(installer): upgrade keeps everything around CodeGraph's section i…
colbymchenry Oct 22, 2026
0abae11
fix(installer): a symlinked instructions or config file is written th…
colbymchenry Oct 22, 2026
1ef8866
test(explore): the cross-call dedup test passes with LF and CRLF chec…
colbymchenry Oct 22, 2026
6bd217a
fix(cpp): code that calls operator++ by its name no longer stops an i…
colbymchenry Oct 22, 2026
0de9497
fix(installer): the Codex table is found however its config.toml writ…
colbymchenry Oct 22, 2026
5a6917b
fix(c): a function whose return type is a macro call is indexed (#2773)
colbymchenry Oct 22, 2026
7dfef84
fix(installer): Hermes keeps your MCP entry and gets no platform_tool…
colbymchenry Oct 22, 2026
c326b6b
fix(go): a function value keeps its link past a local of the same nam…
colbymchenry Oct 22, 2026
57ce5b9
fix(upgrade): a global npm install is upgraded with -g from any folde…
colbymchenry Oct 22, 2026
929c65c
fix(pascal): Delphi routines with a parameter attribute like `const […
colbymchenry Oct 22, 2026
88ebefa
fix(pascal): calls inside a Delphi `for var x in` loop are indexed (#…
colbymchenry Oct 22, 2026
0c3e12d
fix(go): a call further along a chain links the method of the type th…
colbymchenry Oct 22, 2026
1890b10
fix(explore): a named function too long for its share renders instead…
colbymchenry Oct 22, 2026
800e582
fix(go): conversions, external test packages and build-tag twins link…
colbymchenry Oct 22, 2026
c465230
fix(context): the busiest file is found even when 20 test or generate…
colbymchenry Oct 22, 2026
7180fd0
fix(js,ts): a dynamic import from Node or a package no longer links t…
colbymchenry Oct 22, 2026
0953084
fix(pascal): the receiver calls of a chained Delphi call are indexed …
colbymchenry Oct 22, 2026
214ef50
fix(explore): names the query spells that the index never saw are sai…
colbymchenry Oct 22, 2026
e69546e
fix(js,ts): code outside tests resolves as if Jest manual mocks were …
colbymchenry Oct 22, 2026
8651990
fix(js,ts): an import spelled with a trailing slash or a ./ segment l…
colbymchenry Oct 22, 2026
b2a8487
fix(daemon): a long sync of another project no longer gets the shared…
colbymchenry Oct 22, 2026
8073637
fix(db): reopening an interrupted index no longer gets the server kil…
colbymchenry Oct 22, 2026
1040d09
fix(mcp): a daemon that never answers no longer stalls a new session …
colbymchenry Oct 22, 2026
63ca568
fix(db): a database SQLite can't open is reported as that, not as a N…
colbymchenry Oct 22, 2026
407efb1
fix(pascal): Delphi calls written without parentheses link to the rou…
colbymchenry Oct 22, 2026
c1744e7
fix(prompt-hook): desktop reminders and other sessions' messages no l…
colbymchenry Oct 22, 2026
e8ddc4e
fix(js,ts): imports of a repo's own packages follow their package.jso…
colbymchenry Oct 22, 2026
5d81d29
fix(js,ts): a call or new never lands on an interface or a type alias…
colbymchenry Oct 22, 2026
d82a4ad
fix(js,ts): a call or new in a parameter's default value is the funct…
colbymchenry Oct 22, 2026
7b50ca8
fix(pascal): Delphi calls to compiler intrinsics and plain data no lo…
colbymchenry Oct 22, 2026
89cd08f
fix(explore): a long query, like a pasted log, answers in seconds on …
colbymchenry Oct 22, 2026
c4dbc12
fix(bundle): bundle Node 24.21.0 so Windows commands no longer abort …
colbymchenry Oct 22, 2026
9ed79c6
fix(add-lang): check-grammar fails a grammar that crashes or hangs it…
colbymchenry Oct 22, 2026
80c3680
fix(extraction): drop the extractVariables hook, which the core never…
colbymchenry Oct 22, 2026
f3fdba2
fix(pascal): calls inside nested Delphi routines are indexed, each un…
colbymchenry Oct 22, 2026
08478ee
fix(js,ts): a receiver declared outside the calling function goes by …
colbymchenry Oct 22, 2026
efb091e
fix(liquid): editor-saved Shopify JSON and {% sections %} groups link…
colbymchenry Oct 22, 2026
68fcf2f
fix(js,ts): static and instance methods override only their own kind …
colbymchenry Oct 22, 2026
53f72fe
fix(liquid): variables declared with {% capture %} are indexed, as as…
colbymchenry Oct 22, 2026
ab92c90
fix(js,ts): a super.method() call links to the method of the class's …
colbymchenry Oct 22, 2026
df1cd1e
fix(pascal): Delphi units with re-published properties and similar sy…
colbymchenry Oct 22, 2026
b8c3c03
fix(bundle): bundle Node 24.22.1, the October security release, and v…
colbymchenry Oct 22, 2026
3f58e34
fix(cli): index no longer blocks on a daemon lock naming a process th…
colbymchenry Oct 22, 2026
e32021f
fix(java,kotlin,csharp,scala): an overload links only the overrides w…
colbymchenry Oct 23, 2026
d5fc1fb
fix(python): calls like reg.get() on a typed local or parameter reach…
colbymchenry Oct 23, 2026
628f69e
fix(kotlin): repository().pending() links the method of the type repo…
colbymchenry Oct 23, 2026
23a80a8
fix(python): a from-import of a module with no dot in its name links …
colbymchenry Oct 23, 2026
013b91c
fix(js,ts): a named class expression is a class with its own members …
colbymchenry Oct 23, 2026
9ee6718
fix(vue): a <script lang="tsx"> block is read with the TSX grammar (#…
colbymchenry Oct 23, 2026
58eb57a
fix(nuxt): navigateTo('/x') links to the page it opens, as router.pus…
colbymchenry Oct 23, 2026
5b47bc4
fix(js,ts): .tsx and .jsx classes link their overrides as .ts and .js…
colbymchenry Oct 23, 2026
dcb985f
fix(ruby): a call on a namespaced class links its caller to the class…
colbymchenry Oct 23, 2026
8fdc8a1
fix(rust): calls on field chains, struct literals and outside-type pa…
colbymchenry Oct 23, 2026
f7820b5
fix(dart): calls to a private name in another part of the same librar…
colbymchenry Oct 23, 2026
16a8e77
fix(ruby): a call reaches the class method or the instance method its…
colbymchenry Oct 23, 2026
51c4124
fix(cfml): a dotted extends finds its component when a test suite mir…
colbymchenry Oct 23, 2026
cf3e6bc
fix(ts): a type-only re-export like export type * from './types' now …
colbymchenry Oct 23, 2026
d90f6ab
fix(cfml): <cfinclude template> and cfinclude() link the code to the …
colbymchenry Oct 23, 2026
f406fe0
fix(cfml): createObject("component", path) links its component, and .…
colbymchenry Oct 23, 2026
ef05970
test(daemon): the OS process lookup tests pass on a loaded Windows ma…
colbymchenry Oct 23, 2026
6500a37
fix(cfml): a <cfquery> or <cfscript> block that fails to parse no lon…
colbymchenry Oct 23, 2026
d833827
perf(resolution): skip receiver typing for JS/TS calls of a method no…
colbymchenry Oct 23, 2026
23eb392
fix(ts): a re-export's import node keeps export type * as the file wr…
colbymchenry Oct 23, 2026
865ddf4
fix(library): indexFiles keeps other writers out until its files are …
colbymchenry Oct 23, 2026
9c4794d
fix(rust): a call keeps its whole receiver chain, and links through m…
colbymchenry Oct 23, 2026
679c4e0
test(windows): the windowsHide guard reads quoted and computed keys, …
Oct 23, 2026
2def0a6
test(kernel): skip the kernel-only suites when CODEGRAPH_KERNEL=0
Oct 23, 2026
33dc2ae
fix(viewer): the routes list's limit counts routes, not one route's c…
Oct 23, 2026
5c5bfd4
fix(php): a namespace alias matches whatever case it is written in
Oct 23, 2026
449eefa
fix(js,ts): a call on an element of a class field reaches the element…
inth3shadows Oct 23, 2026
16f2d35
fix(go): a project package named like a standard-library package is n…
Oct 23, 2026
0d46dba
fix(js,ts): a call on a new C() receiver resolves through C
Oct 23, 2026
428b3c4
fix(js,ts): a nested function takes calls to a name the file imports …
Oct 23, 2026
8f8f04b
fix(java,ts): a parameterized supertype links its type, like implemen…
Oct 23, 2026
90c5dc6
fix(extraction): a Go method carries the exportedness of its name
Oct 23, 2026
44adef8
fix(erlang): a comment in an argument list no longer counts as an arg…
Dshuishui Oct 23, 2026
a278c2e
fix(scope): a folder git ignores matches only itself, not every folde…
colbymchenry Oct 23, 2026
43a4f5b
fix(graph): the type hierarchy returns a type's subtypes, not only it…
Oct 23, 2026
d02a88d
fix(java,csharp): a call on a new object reaches the class the file i…
colbymchenry Oct 23, 2026
3750921
test(resolution): calls on nested receivers keep their evidence and g…
bompus Oct 23, 2026
a565f21
fix(viewer): saved trails stay inside the project when a folder or tr…
Oct 23, 2026
3a93f57
fix(java): a record is indexed as a class, with its components' field…
Oct 23, 2026
de2b80e
fix(mcp): a project opened for projectPath is released on its own idl…
bompus Oct 23, 2026
0b23845
fix(mcp): explore's maxFiles text gives the real default, not 12
bompus Oct 24, 2026
cde4cd7
fix(resolution): a lone same-file definition scores as a strong match
Oct 24, 2026
4c572e0
fix(play): a Class.method reference reaches a member of the class it …
Oct 23, 2026
69af19a
fix(build): building from source with bun finishes instead of startin…
bompus Oct 24, 2026
81559dc
fix(resolution): a call reaches the caller's own copy of a duplicated…
Oct 24, 2026
b6379e6
fix(scala): an Outer.Inner(...) call reaches the Scala case class or …
Oct 23, 2026
0b19444
fix(resolution): a call a method hands on to another object no longer…
Oct 27, 2026
4eb8c2a
perf(synthesis): line numbers from a newline index, not a split per m…
bompus Oct 27, 2026
7ff2841
fix(resolution): ties that decide a link break by code unit, not the …
bompus Oct 27, 2026
5e0c42c
fix(security): the sensitive-folder guard refuses links, case variant…
colbymchenry Oct 27, 2026
0187366
fix(cli): codegraph status opens the index read-only, and says when a…
Oct 27, 2026
f93e89a
fix(paths): a project at a Windows drive root indexes its files (#2931)
colbymchenry Oct 27, 2026
983c4df
fix(index): a deleted file git still lists is skipped, not reported a…
colbymchenry Oct 27, 2026
2afee00
fix(viewer): a file with % in its name opens as itself (#2933)
colbymchenry Oct 27, 2026
0174f80
perf(resolution): read a bare JS/TS call's local binding once per mat…
luojiyin1987 Oct 24, 2026
1cb4aab
fix(status): a project below its repository root sees its uncommitted…
colbymchenry Oct 27, 2026
c306967
fix(cfnptr): a C function-pointer table links only to C and C++ funct…
bompus Oct 27, 2026
cbd9817
fix(extraction): a damaged C #if group no longer turns into functions…
Oct 27, 2026
475e56b
fix(cli): read commands and the prompt hook open the index read-only …
colbymchenry Oct 27, 2026
45a29b4
fix(worktree): a linked worktree is recognized however Windows spells…
colbymchenry Oct 27, 2026
7cceba5
fix(resolution): library calls on untyped Python, Scala and Java valu…
Oct 27, 2026
31ec908
fix(sync): a long-running session picks up a framework added while it…
colbymchenry Oct 27, 2026
6162d87
fix(watcher): a deleted link target no longer pins a CPU core on Wind…
colbymchenry Oct 27, 2026
760e31f
fix(install): install.ps1 resolves the latest release without GitHub'…
colbymchenry Oct 28, 2026
2577601
fix(resolution): a call on the caller's own class reaches that class'…
Oct 27, 2026
69cddc0
docs(changelog): credit the earlier pull requests for three unrelease…
colbymchenry Oct 28, 2026
3f8e8b0
fix(rust): a module-path call links the function its module declares
Oct 27, 2026
5594843
fix(go): a call on a value bound from a call or a conversion reaches …
colbymchenry Oct 28, 2026
72f398a
fix(index): a video named .ts counts as skipped, so a full index isn'…
colbymchenry Oct 28, 2026
7973df0
fix(java): a call resolves on its receiver's declared type, and a lib…
Oct 24, 2026
77ee348
fix(aliases): a paths wildcard no longer matches an import that leave…
colbymchenry Oct 28, 2026
01e0ac3
fix(kotlin): a call through a property or a receiver chain resolves o…
Oct 23, 2026
13f983d
fix(kotlin): a private property, and the members of a private class, …
Oct 23, 2026
40f5851
fix(kotlin): a call on an outside type reaches the project's extensio…
Oct 1, 2026
86c85cf
fix(kotlin): a call on an imported type reaches that package's class …
arttttt Oct 23, 2026
e7c9ffd
fix(security): an MCP session no longer opens a sensitive folder as i…
colbymchenry Oct 29, 2026
4955eac
fix(rust): use bindings follow Rust's scopes, and module paths walk t…
colbymchenry Oct 29, 2026
da1f263
fix(index): a repeat full index keeps the name words of files it didn…
colbymchenry Oct 29, 2026
8bd55fa
fix(frameworks): a component's same-folder preference compares whole …
colbymchenry Oct 29, 2026
57dc7ae
fix(search): path: and name: filters find their matches at any limit …
colbymchenry Oct 29, 2026
787eafb
fix(jvm): a call through an import reaches the Java or Kotlin class i…
colbymchenry Oct 29, 2026
38dc374
fix(lookup): a qualified symbol query names its scope whole (#3024)
colbymchenry Oct 29, 2026
f1da755
fix(resolution): calls on the browser's own objects link no project m…
colbymchenry Oct 29, 2026
a38a1ec
fix(paths): a folder named like ..generated is inside the project, no…
colbymchenry Oct 29, 2026
8e854d1
fix(js,ts): a function exported as exports["name"] is a symbol named …
colbymchenry Oct 29, 2026
3d19da2
fix(spring): a route links the method it annotates, including a packa…
colbymchenry Oct 29, 2026
60b0d7a
fix(affected): a --filter glob matches whole names, from any folder b…
colbymchenry Oct 29, 2026
9f379af
fix(node): every language and folder of an overloaded name shows in c…
colbymchenry Oct 30, 2026
c12a7b6
fix(explore): Chinese, Japanese and Korean names reach explore, its F…
colbymchenry Oct 30, 2026
37052b1
fix(go): a package-level var or const named in uppercase is exported …
colbymchenry Oct 30, 2026
407ec4f
chore: keep the kernel's vendored grammars out of GitHub's language s…
colbymchenry Oct 30, 2026
b700a3e
fix(python): a parameter or local named like an imported module is no…
colbymchenry Oct 30, 2026
3a4cd3b
fix(ruby): calls to `!`/`?` methods and calls on what `.new` made lin…
colbymchenry Oct 30, 2026
4e7a221
chore(deps): take the security fixes for devalue and postcss, drop an…
colbymchenry Oct 30, 2026
1941caf
fix(add-lang): the extraction check finds codegraph's npm shim on Win…
colbymchenry Oct 30, 2026
2514467
fix(jvm): a dotted supertype names its nested type, and a Kotlin obje…
colbymchenry Oct 30, 2026
19b74d1
fix(deps): read .gitignore rules the way git does, with ignore 7.0.14…
colbymchenry Oct 30, 2026
6d3804c
fix(resolution): C, C++ and Objective-C rank as one language, and a l…
colbymchenry Oct 30, 2026
cdfa31b
fix(ruby): a call on an instance variable that initialize types links…
colbymchenry Oct 30, 2026
7021de5
fix(rust): calls through a type a path or a use names reach that type…
colbymchenry Oct 30, 2026
bc9291a
fix(java): a call on a value a type holds in a static field reaches t…
colbymchenry Oct 30, 2026
29ce014
fix(lock): only one process takes over a stale write lock (#3056)
colbymchenry Oct 30, 2026
80f6b50
fix(sync): a tsconfig, jsconfig or go.mod change re-resolves the impo…
Oct 30, 2026
d139865
fix(db): processes opening an index that needs a migration all open i…
colbymchenry Oct 30, 2026
6644925
fix(sync): a barrel whose re-export points elsewhere re-links its imp…
Oct 30, 2026
e431491
fix(mcp): a session whose host stops reading its output shuts down cl…
colbymchenry Oct 30, 2026
2d98c1b
fix(sync): a call left with one candidate links after a delete or a r…
inth3shadows Oct 30, 2026
4b0f72b
fix(sync): a skipped file that now indexes re-links its importers
inth3shadows Oct 30, 2026
6177692
fix(astro,svelte): a self-closing <script /> no longer swallows the n…
maxmilian Oct 30, 2026
ed6b88e
fix(js): an export default line inside a template literal no longer n…
colbymchenry Oct 30, 2026
cc17978
fix(rust): a module a #[path] attribute loads is the module that decl…
colbymchenry Oct 30, 2026
f67eafc
fix(search): a pasted call like leaf(entry) finds both names instead …
colbymchenry Oct 30, 2026
cb7fb61
fix(docs): agent and command lists match the code; worktree warning d…
colbymchenry Oct 30, 2026
de0a4eb
fix(vue): a self-closing <script /> no longer swallows the next scrip…
colbymchenry Oct 30, 2026
fd57eaa
fix(mcp): a tools/call whose arguments aren't an object gets invalid …
colbymchenry Oct 30, 2026
063708b
fix(pascal): Delphi chained calls and method pointers follow declared…
colbymchenry Oct 30, 2026
5526e33
fix(status): recommend a re-index when package.json alone adds or dro…
inth3shadows Oct 30, 2026
1c40e34
fix(mcp): a projectPath naming a file resolves through its directory
maxmilian Oct 30, 2026
59eb0d2
fix(resolution): an import no longer lands on a same-named method of …
inth3shadows Oct 30, 2026
fa03fa6
fix(callers): list every call site of a caller, and a function that c…
colbymchenry Oct 30, 2026
0d7480f
fix(cpp): an overload chosen by arguments that call it again no longe…
JosefAschauer Oct 30, 2026
03c10ad
ci(site): move the site deploy off the Node 20 action runtime (#3048)
colbymchenry Oct 30, 2026
910e9bd
fix(site): agent lists include GitHub Copilot, and Codex notes its ID…
colbymchenry Oct 30, 2026
a3e9e76
fix(explore): Flow reaches a named symbol a shorter route gets to fir…
colbymchenry Oct 30, 2026
a0c6c1b
fix(liquid): a variable named with a hyphen is indexed under its whol…
colbymchenry Oct 30, 2026
3f66df3
docs: add a contributing guide and a documentation index (#3081)
colbymchenry Oct 30, 2026
cd04b21
fix(python): a base's type argument is no supertype, so Repo.save() i…
JosefAschauer Oct 30, 2026
17d5426
feat(files): list a project's files by the package that owns them (#3…
colbymchenry Oct 30, 2026
22cf7d3
fix(watch): a watch callback that throws no longer ends the host's pr…
colbymchenry Oct 30, 2026
f4c4dae
feat(mcp): the server gives hosts its title and icon (#3095)
colbymchenry Oct 30, 2026
7889da6
feat(status): show files parsed beside files found, and add --strict …
colbymchenry Oct 30, 2026
47526d2
feat(serve): --no-telemetry turns telemetry off for one MCP server entry
Oct 30, 2026
9bfdd09
feat(cli): codegraph cycles lists the files that import each other in…
colbymchenry Oct 30, 2026
3fca009
fix(python): a parameterized base links its class, like class Leaf(Ba…
JosefAschauer Oct 30, 2026
08b187a
feat(cli): codegraph implementations <name> lists the types that impl…
Oct 30, 2026
27c904b
fix(python): a base list wrapped over several lines is read whole
JosefAschauer Oct 30, 2026
fb71a9f
feat(init): --local-only keeps .codegraph/ out of git entirely (#3104)
colbymchenry Oct 30, 2026
1739538
feat(sync): CODEGRAPH_SYNTH_MIN_INTERVAL_MS bounds how often live syn…
Oct 30, 2026
274b43c
fix(python): a base imported from outside the project is not a projec…
colbymchenry Oct 30, 2026
b1e6c97
test: move the test workspace to Vitest 4 and align the Vite toolchain
danusha2345 Oct 30, 2026
bea5e20
fix(python): a class with PEP 695 type parameters reads its base list
JosefAschauer Oct 30, 2026
002dd4d
feat(frameworks): CodeIgniter 3 routes, and calls through what $this-…
colbymchenry Oct 30, 2026
61e1621
feat(installer): nine more agents: Bob, Droid, Windsurf, Qwen, dsh, G…
colbymchenry Oct 30, 2026
c0b4906
fix(python): a class-name call doesn't follow a base imported from ou…
colbymchenry Oct 30, 2026
d494e43
fix(graph): a path search keeps one predecessor per node, so it stays…
Oct 30, 2026
a287056
feat(drupal): services, plugin definitions and #[Hook] methods are pa…
colbymchenry Oct 30, 2026
446d08c
feat(nextjs): a route links to the proxy that runs before it (#3119)
colbymchenry Oct 30, 2026
0603ad9
fix(cli): sync warns about an index from an older engine, and still runs
bompus Oct 30, 2026
737ee96
feat(mcp): warn once when a project's index predates the running engine
cbeaulieu-gt Oct 30, 2026
0410b31
fix(cli): after an upgrade, status and the reminder name only codegra…
colbymchenry Oct 31, 2026
b6ea617
feat(cli): files --json marks test files, with --tests and --no-tests…
maxmilian Oct 30, 2026
cc86361
fix(graph): impact stops at a safety budget and says it was truncated
Oct 30, 2026
f92bdca
fix(mcp): idle query workers are recycled, so a burst's memory is giv…
Oct 30, 2026
84c7fba
feat(csharp): MediatR reaches a handler behind any interface, with no…
colbymchenry Oct 31, 2026
9749205
feat(razor): a view's inline script links to the JavaScript it calls …
colbymchenry Oct 31, 2026
2008e2f
feat(tauri): a frontend's invoke and events link across to the Rust t…
colbymchenry Oct 31, 2026
0f93575
fix(python): a script's import of a module in a folder above it links…
colbymchenry Oct 31, 2026
9d3abb8
fix(resolution): a flow carries on through a const that hands a funct…
colbymchenry Oct 31, 2026
6ad8bec
perf(cli): read commands no longer load the indexing code, and start …
colbymchenry Oct 31, 2026
a0174ce
fix(c,cpp): a struct links the types its members are declared with (#…
colbymchenry Oct 31, 2026
d087b94
perf(resolution): read C++ names and receiver types with one pattern …
colbymchenry Oct 31, 2026
aaba929
perf(resolution): read a Rust or Java reference's line once, not once…
colbymchenry Oct 31, 2026
f76b468
perf(resolution): strip comments by slices, not an array of character…
colbymchenry Oct 31, 2026
d54fc43
perf(resolution): a cache hit moves one entry, without touching the M…
colbymchenry Oct 31, 2026
fc7dd0d
perf(resolution): look for a JS binding only where a mention of the n…
colbymchenry Oct 31, 2026
195faa9
perf(resolution): resolver workers keep their young generation to 48 …
colbymchenry Oct 31, 2026
1b0e351
perf(resolution): a full index detects frameworks once, and remembers…
colbymchenry Oct 31, 2026
fe783cb
fix(cli): a temp folder on a missing drive no longer hangs every comm…
colbymchenry Oct 31, 2026
d87ec36
build: the built JavaScript carries no comments (#3153)
colbymchenry Oct 31, 2026
0576044
fix(python): a script's import of a module beside it in a package fol…
colbymchenry Oct 31, 2026
4499d00
fix(js,ts): a declare module answers its own package, behind a real m…
colbymchenry Oct 31, 2026
3ea6d23
fix(mcp): a quiet pool keeps one trimmed worker, so the next call sta…
colbymchenry Nov 1, 2026
9c5cf97
fix(js,ts): a function inside an object literal's method is a local, …
colbymchenry Nov 1, 2026
39fc083
fix(js,ts): a member of a required or default-imported module is that…
colbymchenry Nov 1, 2026
206449b
fix(python): a dotted chain through an imported class links its last …
colbymchenry Nov 1, 2026
2393ea2
fix(ts): a receiver typed by a type alias calls the class the alias n…
colbymchenry Nov 1, 2026
6473f60
fix(flow): a Flow library's declarations are globals of the files Flo…
colbymchenry Nov 1, 2026
3bd9949
fix(js,ts): a package import follows the page, and stops at a monorep…
colbymchenry Nov 1, 2026
14c25e3
fix(php): a receiver reaches the class PHP means, through its real pa…
colbymchenry Nov 1, 2026
087de4c
fix(ruby): a call follows a class's real ancestors, in Ruby's order (…
colbymchenry Nov 1, 2026
b23c880
fix(c): a function that writes a macro before a block still uses the …
colbymchenry Nov 1, 2026
cb1e13d
fix(c,cpp): a member whose type a macro renames links what the macro …
colbymchenry Nov 1, 2026
79c25b7
fix(objc): a struct links the types its members are declared with (#3…
colbymchenry Nov 1, 2026
9191ab6
fix(python): a call on an element of a collection links to the projec…
colbymchenry Nov 1, 2026
e651b87
fix(index): a sparse checkout no longer reads the files it leaves out…
colbymchenry Nov 1, 2026
092e6cf
fix(csharp): type arguments and keyword types decide what a name mean…
colbymchenry Nov 1, 2026
5cd8a9a
fix(js): a file that gives an object a method itself takes no lone gu…
colbymchenry Nov 1, 2026
d2e0389
fix(status): a widened or narrowed sparse checkout shows in status (#…
colbymchenry Nov 1, 2026
31f6436
Merge upstream d2e0389 into the fork, and release as 1.6.2-fmagent.3
Dshuishui Nov 1, 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
  •  
  •  
  •  
11 changes: 7 additions & 4 deletions .claude/skills/add-lang/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -60,11 +60,14 @@ still be unusable:**
```bash
node scripts/add-lang/check-grammar.mjs <lang> path/to/valid-sample.<ext>
```
It prints the grammar's ABI version and parses a valid sample many times in a
multi-grammar runtime. If it **FAILs** (ERROR trees on valid code — an old ABI
It prints the grammar's ABI version and runs it the way indexing does: in a
child process with indexing's V8 flags, beside the vendored grammars, parsing a
valid sample many times and once at the 1 MiB file-size limit. If it **FAILs**
(ERROR trees, or later parses giving a different tree, on valid code — an old ABI
corrupting the shared WASM heap, which silently drops nested calls/imports on
every file after the first; e.g. the tree-sitter-wasms **Lua** grammar is ABI 13
and fails), do NOT use that wasm. **Vendor a newer (ABI 14/15) build instead:**
and fails — or the process running it crashing or hanging, even after every
parse finished), do NOT use that wasm. **Vendor a newer (ABI 14/15) build instead:**
```bash
npm pack @tree-sitter-grammars/tree-sitter-<lang> # often ships a prebuilt *.wasm
# or build one: npx tree-sitter build --wasm (needs Docker/emscripten)
Expand Down Expand Up @@ -131,7 +134,7 @@ npm run build # tsc + copy-assets (copies any vendored *.wasm into di
```
Index a small sample repo and check extraction:
```bash
( cd <sample-repo> && codegraph init -i )
( cd <sample-repo> && codegraph init )
node scripts/add-lang/verify-extraction.mjs <sample-repo> <lang>
```
`verify-extraction.mjs` fails (exit 1) if the language isn't detected or only
Expand Down
2 changes: 1 addition & 1 deletion .cursor/rules/codegraph.mdc
Original file line number Diff line number Diff line change
Expand Up @@ -20,5 +20,5 @@ Reach for `codegraph_explore` before grep/find or Read for any **structural** qu

### If `.codegraph/` doesn't exist

The MCP server returns "not initialized." Ask the user: *"I notice this project doesn't have CodeGraph initialized. Want me to run `codegraph init -i` to build the index?"*
The MCP tools say the project isn't indexed. Indexing is the user's decision: tell them they can run `codegraph init` to build the index, but don't run it yourself.
<!-- CODEGRAPH_END -->
9 changes: 9 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# Third-party tree-sitter grammars that the native kernel compiles from source
# (codegraph-kernel/build.rs). Keep all of them out of GitHub's language
# statistics, and collapse only the generated parser.c files in pull-request
# diffs. The hand-written scanner.c files are where C gets patched or added,
# so they stay expanded for review.
# The /** is needed: an attributes pattern that names a directory does not
# reach the files inside it.
codegraph-kernel/grammars/** linguist-vendored
codegraph-kernel/grammars/**/parser.c linguist-generated
6 changes: 3 additions & 3 deletions .github/workflows/deploy-site.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,9 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
uses: actions/checkout@v6
- name: Build with Astro
uses: withastro/action@v3
uses: withastro/action@v6
with:
path: site
node-version: 22
Expand All @@ -40,4 +40,4 @@ jobs:
steps:
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v4
uses: actions/deploy-pages@v5
30 changes: 16 additions & 14 deletions AGENTS.md

Large diffs are not rendered by default.

4 changes: 4 additions & 0 deletions BUNDLING.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,10 @@ scripts/build-bundle.sh linux-x64 # -> release/codegraph-linux-x64.ta
scripts/build-bundle.sh win32-x64 # -> release/codegraph-win32-x64.zip
```

The Node runtime is the official nodejs.org release named by the script's
default `NODE_VERSION` (or its second argument). The download is refused
unless it matches the SHA-256 listed in that release's `SHASUMS256.txt`.

Because dropping better-sqlite3 left **zero native addons**, building a bundle is
pure file-packaging — **any** target builds on **any** OS (the whole matrix builds
on one Linux runner). Cross-compilation isn't a concern; only *run-testing* a
Expand Down
327 changes: 326 additions & 1 deletion CHANGELOG.md

Large diffs are not rendered by default.

72 changes: 72 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
# Contributing to CodeGraph

Thanks for helping out. Small, focused changes are the easiest to review and land.

**Reporting a bug?** Open an [issue](https://github.com/colbymchenry/codegraph/issues) with your CodeGraph version (`codegraph --version`), Node.js version, operating system, the steps to reproduce it, what you expected, and what happened instead. A small public repository or snippet that shows the problem helps most.

**Asking for a feature?** Describe the use case and why what's there today doesn't cover it.

## Build from source

You need Git, npm, and Node.js 22.12 or later, below 25. `npm ci` stops on anything older, because the build and test tools need it and running from source uses Node's built-in `node:sqlite`; the published installers bundle their own Node, so this only matters here.

```bash
# Fork the repository on GitHub, then:
git clone https://github.com/<your-username>/codegraph.git
cd codegraph
git remote add upstream https://github.com/colbymchenry/codegraph.git

npm ci
npm run build
```

A globally installed `codegraph` doesn't run your changes, so run your build directly:

```bash
node dist/bin/codegraph.js --help # the build as it stands
npm run cli -- status # rebuild first, then run a command
npm run dev # recompile TypeScript on every save
```

`npm run build` covers the CLI, the SQL schema, the parser grammars and the browser viewer. Two builds are separate:

- `npm run build:kernel` builds the optional native extraction kernel, and needs a Rust toolchain. Tests that need the kernel are skipped without it.
- `npm run build:lib` builds the viewer's component library.

## Test your change

```bash
npx vitest run __tests__/extraction.test.ts # one file
npx vitest run __tests__/extraction.test.ts -t "TypeScript" # tests matching a name
npm run test:watch # rerun as you edit
npm test # everything
```

Run the focused tests while you work, then `npm test` before opening a pull request. Tests that run the compiled CLI use `dist/`, and the test setup rebuilds it first when it's stale.

- **Tests live in `__tests__/`** and use real files and real SQLite databases, with no database mocking. Create temporary folders with `fs.mkdtempSync` and remove them in `afterEach`.
- **A bug fix needs a test that fails without the fix.**
- **Behavior that differs by platform** gets a gated test, such as `it.runIf(process.platform === 'win32')(...)`, and needs checking on the platforms it affects. See [cross-platform validation](AGENTS.md#cross-platform-validation).
- **New language or framework support** needs validating on real repositories. Start with the `/add-lang` skill in [`.claude/skills/add-lang/SKILL.md`](.claude/skills/add-lang/SKILL.md), then follow the [validation methodology](docs/AGENTS.md#validation-methodology-required-for-every-new-languageframework) and the [coverage playbook](docs/design/dynamic-dispatch-coverage-playbook.md). Before extending a router or web framework, read [framework coverage](docs/design/framework-coverage.md).
- **A documentation-only change** doesn't need the test suite. Check its examples and links instead.

## Prepare a pull request

- Branch from the latest `main`, and keep to one concern. Unrelated formatting, CI or feature work belongs in its own pull request.
- Name commits `type(scope): what now works`, such as `fix(go): a constant in a const ( … ) group keeps its own doc comment`. Types in use are `feat`, `fix`, `docs`, `test`, `perf`, `chore` and `ci`.
- In the description, explain the problem, the resulting behavior, and what you ran, including any failures and any platform you couldn't test.
- Keep existing CLI commands and the default MCP tools working, unless the pull request exists to change them and says why.
- Add a line to `CHANGELOG.md` under `## [Unreleased]`, in `### New Features` or `### Fixes`, for anything a user would notice. Write one plain sentence about what changed for them, without internal file names or benchmark numbers. Changes to the `codegraph ui` viewer, which isn't released yet, go in [`docs/viewer-launch-changelog.md`](docs/viewer-launch-changelog.md) instead.
- Don't bump the version, and change `package-lock.json` only when you add or remove a dependency.
- Use public or made-up examples. Keep local paths, private code and machine-specific settings out of fixtures.

## What happens next

A maintainer reads every change closely before anything lands, and may ask for changes. Keep your branch up to date by rebasing on `main`.

A maintainer may also land your contribution as their own commit, rewritten where needed, instead of merging your branch. You're credited in the changelog either way.

## Find your way around

- [Documentation index](docs/README.md): guides, design notes and benchmarks.
- [AGENTS.md](AGENTS.md): the architecture and the development rules, which [CLAUDE.md](CLAUDE.md) imports for Claude Code.
30 changes: 20 additions & 10 deletions FORK.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,18 @@
FM-Agent's maintenance fork of
[colbymchenry/codegraph](https://github.com/colbymchenry/codegraph).

**Pinned base:** upstream `10e316d` (`main`, 2026-10-19) — an untagged commit past
`v1.6.2`, the exception the policy below allows. `v1.6.2` itself slows indexing of
JavaScript and Python projects, fixed only on `main` (#2362, #2344), and the fixes
this sync is for — C++ receiver types and overloads, Go interfaces and embedding,
functions in named object literals (#2300) — are on `main` only.
**Pinned base:** upstream `d2e0389` (`main`, 2026-11-01) — an untagged commit past
`v1.6.2`, the exception the policy below allows: upstream has tagged nothing since
`v1.6.2` (2026-10-03). This sync is for call resolution `main` gained after the
previous base: Rust receiver types (`Box`/`Rc`/`Pin` self, `as_mut`, loop and tuple
bindings, field chains, trait-bounded generics), which link about 900 more of
ripgrep's calls, and calls on library and built-in values no longer landing on a
same-named project method, in every language FM-Agent reads.

It carries this project's
[PR #1865](https://github.com/colbymchenry/codegraph/pull/1865) for Dart 3
extension types ([#1784](https://github.com/colbymchenry/codegraph/issues/1784)),
which was patch 5 here byte for byte, and fixes for three issues reported upstream
which this fork once carried as a patch, byte for byte, and fixes for three issues reported upstream
from this project: functions bound through a string-named wrapper
([#1747](https://github.com/colbymchenry/codegraph/issues/1747), upstream PR #2002),
C/C++ functions defined through a single-argument macro
Expand All @@ -27,18 +29,24 @@ wrappers nothing binds, and calls into a service's members. Measured on
`sst/opencode` (`df23b7f`) by source position, upstream alone reaches 1,017 of the
1,055 `Effect.fn*("…")(function…)` sites; with patch 2, all 1,055.

The previous base was `e63fe2e` (`main`, 2026-09-27), 363 commits behind this point,
none of them merges. None of the four patches below was taken upstream in that span:
all four merged back without a conflict and are byte for byte what they were.
The previous base was `10e316d` (`main`, 2026-10-19), 354 commits behind this point,
none of them merges. None of the patches below was taken upstream in that span.
Patches 1–4 merged back without a conflict and are byte for byte what they were.
Upstream's generator fix ([#1741](https://github.com/colbymchenry/codegraph/issues/1741))
still stops short in one place — the two helpers that read a class field's value do
not list `generator_function`, on either extraction path — so patch 4 stays.
Patch 5 conflicted only by position: upstream added
`blankCUnbalancedConditionalBranches` (`cbd9817`) beside it in `c-cpp.ts`. That
pass now keeps an `else if` written across a directive inside its function, which
patch 5 also does, but it leaves a function whose `#if`/`#else` branches each
carry a header unindexed: 10 of the patch's 14 behaviour cases fail on upstream
alone. Both passes run, patch 5's first, before the directive snapshot.

Upstream shipped the C macro-attribute extraction fix (issue #1211, PR #1311) in
v1.5.0, so the base carries it natively; the fork no longer needs its own patch
for it.

**Patches:** four, listed below, each one file of behaviour plus the regression
**Patches:** five, listed below, each one file of behaviour plus the regression
test that catches its loss. Apart from them the tree matches the pinned base, so
the fork stays cheap to re-sync. Every patch lives as a merged pull request here
and must be **re-applied on each upstream sync** — if a merge drops one, this list
Expand All @@ -58,6 +66,8 @@ members that naming leaves unresolved. Each goes when upstream covers its half.
| `__tests__/fm-agent-effect-ts-resolution.test.ts` | Regression cover for the patch above: a member call on a `yield* Ns.Service` local and a direct call on an imported, self-re-exporting namespace, each picking the right one of two same-named members; the missing-import and shadow declines; the `Ns.Service.create` factory hop; and a bare call never reaching a wrapped function through its string's tail. |
| `src/extraction/languages/typescript.ts`, `src/extraction/languages/javascript.ts`, `codegraph-kernel/src/tsjs/mod.rs` | **Generator class fields.** A class field holding a generator — `class Repo { loadAll = function* () {…} }`, directly or through a wrapper call — is a method written as a field. Two helpers decide that, one classifying the field and one finding the body to walk, and each lists the node types a field's value may have. Without `generator_function` on those lists the field is a property: no callable node, and the calls in its body attribute to the file. The lists exist once per extraction path — the walker's in the language files, the kernel's in `classify_ts_class_member` and `resolve_field_body` — and have to move together: with one side updated the same source is a method on one extraction path and a property on the other. |
| `__tests__/fm-agent-generator-class-field.test.ts` | Regression cover for the patch above, in TypeScript and JavaScript: the field is a method under its class's qualified name, the wrapped form is too, its body's call is attributed to it rather than to the file, and both extraction paths return identical nodes, edges and refs for the same source. |
| `src/extraction/languages/c-cpp.ts`, `codegraph-kernel/src/ccpp/mod.rs` | **C functions with a conditional signature.** Code like QP's `QActive_post_` gives each `#if`/`#else` branch its own header and shares one body after `#endif`; tree-sitter reads neither header as a definition, so the function was missing. `blankCAlternativeFunctionHeaders` keeps the first header and blanks the directives and the other headers — same length, line breaks kept, so offsets do not move — but only when every branch is a complete header for the same name, there is an `#else`, nothing else is nested inside, and `{` follows `#endif`; anything else is left as it was. The kept header is a representative, not a build configuration. Separately, error recovery could read `else if (…) {…}` across a directive as a function named `if`: C now treats a function named after a control keyword as a misparse, as C++ already did, and keeps its body's calls in the enclosing function, on both extraction paths. (#20) |
| `__tests__/fm-agent-c-conditional-function-headers.test.ts` | Regression cover for the patch above, on both extraction paths with LF and CRLF line endings: a shared body is extracted once at its original lines with its calls; conditional `else if` calls stay with the real caller while a real function named `Q_REQUIRE_ID` is kept; `#elif` and function-pointer parameters; calls resolve to a recovered function in an indexed project; and eight unrelated or ambiguous shapes come out unchanged. |

A sync brings new upstream test files in on its own — they are separate files, so
git takes them without asking. The case to watch for is upstream *moving* the test
Expand Down
Loading