Prebuilt codeanalyzer-typescript backend binary for CLDK (codellm-devkit).
Project description
codeanalyzer-typescript (cants)
A TypeScript/JavaScript static-analysis toolkit — the CLDK backend that emits a canonical symbol table and call graph, as analysis.json or a Neo4j property graph.
cants is a static analyzer for TypeScript/JavaScript built on the TypeScript compiler (via
ts-morph). It produces the canonical CodeLLM-DevKit (CLDK)
analysis.json — a symbol table plus a resolver-based call graph — and can project that same
analysis into a Neo4j property graph. It is the TypeScript backend behind
CLDK, mirroring its
Python and
Java siblings.
The call graph defaults to the TypeScript compiler's resolver, but the cants binary also embeds
Jelly — a flow-based analyzer that resolves higher-order and
callback edges the resolver misses — as an experimental backend (--call-graph-provider jelly, or
both to diff them). No extra install is needed; Jelly ships inside the binary.
Table of Contents
Features
- Symbol table — modules, classes, interfaces, enums, type aliases, namespaces, functions, methods, variables, decorators, and JSDoc, with precise source spans.
- Call graph — the TypeScript compiler's resolver plus Rapid Type Analysis (RTA), with phantom (external) nodes for calls into imported libraries and Node builtins.
- Pluggable call-graph backend — the
tscresolver by default, the embedded Jelly flow analyzer, orbothto compare edge sets. - Neo4j output — project the analysis into a labeled property graph: a self-contained
graph.cyphersnapshot, or an incremental push to a live database over Bolt. - Versioned schema — a machine-readable, version-stamped Neo4j schema contract
(
--emit schema), bundled in every release and enforced by a conformance test. - Self-contained binary — no Bun or Node required at runtime; install via
pip, Homebrew, or a one-line shell script. - Incremental — content-hash caching so re-analyzing (and re-loading the graph) only touches what changed.
Installation
Prerequisites
Running a prebuilt cants binary requires nothing — it is fully self-contained. To analyze a
project, that project should be a normal Node/TypeScript project (so the compiler can resolve types
and imports). Building cants from source requires Bun 1.0+.
Install via shell script
Download and install the prebuilt binary for your platform from the latest release:
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/codellm-devkit/codeanalyzer-typescript/releases/latest/download/cants-installer.sh | sh
The installer drops cants into ~/.local/bin (override with CANTS_INSTALL_DIR) and can pin a
version with CANTS_VERSION=vX.Y.Z. Supports macOS (arm64/x86_64) and Linux (x86_64/aarch64).
Install via Homebrew
brew install codellm-devkit/homebrew-tap/codeanalyzer-typescript
Install via pip (PyPI)
The wheel bundles the prebuilt, self-contained binary for your platform (no Bun or Node required):
pip install codeanalyzer-typescript
cants --help
This is also the package CLDK's Python SDK depends on to locate the analyzer backend; it exposes
codeanalyzer_typescript.bin_path() and schema_path().
Build from source
# Install Bun, then:
git clone https://github.com/codellm-devkit/codeanalyzer-typescript
cd codeanalyzer-typescript
bun install
bun run build # → dist/cants (standalone native binary)
You can also run the analyzer directly from source without compiling:
bun run start -- --input /path/to/typescript/project
Usage
cants --input /path/to/typescript/project
With no --output, the analysis is printed to stdout as compact JSON; with --output <dir> it is
written to analysis.json (or graph.cypher for --emit neo4j) in that directory.
Options
Usage: cants [options]
CLDK TypeScript analyzer — emits the canonical analysis.json (symbol table +
resolver call graph), or a Neo4j graph.
Options:
-i, --input <path> project root to analyze (not required for
--emit schema)
-o, --output <dir> output directory (omit ⇒ compact output to
stdout)
--emit <target> output target: json (analysis.json, default) |
neo4j (graph.cypher or live push) | schema (the
Neo4j schema.json contract) (default: "json")
--app-name <name> logical application name for the graph
:Application anchor (default: input dir name)
--neo4j-uri <uri> push the graph to a live Neo4j over Bolt
(incremental); omit to write graph.cypher (env:
NEO4J_URI)
--neo4j-user <user> Neo4j username (default: "neo4j", env:
NEO4J_USERNAME)
--neo4j-password <password> Neo4j password (prefer the env var; a flag is
visible in shell history / process list)
(default: "neo4j", env: NEO4J_PASSWORD)
--neo4j-database <db> Neo4j database name (env: NEO4J_DATABASE)
-a, --analysis-level <n> analysis depth: 1 = symbol table + tsc resolver
call graph + RTA (default); 2 = call graph
(default: "1")
-t, --target-files <paths...> restrict analysis to specific files
(incremental)
--skip-tests skip test trees (default)
--include-tests include test trees
--eager force a clean rebuild instead of reusing the
cache
--lazy reuse the cache (default)
--no-build skip dependency materialization (use a prepared
node_modules)
--no-phantoms disable phantom (external) nodes for
imported/required library calls
--call-graph-provider <name> call-graph backend: tsc (default) | jelly |
both (default: "tsc")
-c, --cache-dir <dir> cache/intermediate directory
-v, --verbose increase verbosity (repeatable)
-h, --help display help for command
Examples
-
Basic analysis to stdout, or to a file:
cants --input ./my-ts-project # compact JSON on stdout cants --input ./my-ts-project --output ./out # → ./out/analysis.json
-
Emit a Neo4j snapshot, or push to a live database:
cants --input ./my-ts-project --emit neo4j --output ./out # → ./out/graph.cypher cants --input ./my-ts-project --emit neo4j \ --neo4j-uri bolt://localhost:7687 --neo4j-user neo4j --neo4j-password secret
-
Incremental analysis of specific files:
cants --input ./my-ts-project --target-files src/a.ts src/b.ts
-
Compare call-graph backends:
cants --input ./my-ts-project --call-graph-provider both
-
Force a clean rebuild with a custom cache directory:
cants --input ./my-ts-project --eager --cache-dir /path/to/custom-cache
Output targets
cants builds one analysis in memory and can emit it three ways (--emit):
analysis.json (default)
A TSApplication document — the canonical CLDK contract the Python SDK parses:
{
"symbol_table": { /* file path → module (classes, interfaces, enums,
type aliases, functions, namespaces, variables, …) */ },
"call_graph": [ /* CALL_DEP edges: { source, target, type, weight,
provenance, tags } keyed by callable signature */ ],
"external_symbols": { /* phantom stubs for call targets outside the project */ }
}
Caller- and callee-side identifiers come from a single signature canonicalizer, so call-graph
source/target values byte-match the corresponding symbol_table / external_symbols keys.
Neo4j graph
--emit neo4j projects the same analysis into a labeled property graph (declarations keyed by
their signature under a shared :Symbol label; calls, imports, inheritance, decorators, and call
sites as relationships):
- Without
--neo4j-uri— writes a self-containedgraph.cypher(constraints + indexes, a scoped wipe, then batchedMERGEs). Load it withcypher-shell < graph.cypher. - With
--neo4j-uri— pushes to a live Neo4j over Bolt incrementally: only modules whose content hash changed are rewritten, and on a full run modules whose source file vanished are pruned. Every graph carries aschema_versionon its:Applicationnode.
The connection options also read the standard Neo4j environment variables — NEO4J_URI,
NEO4J_USERNAME, NEO4J_PASSWORD, NEO4J_DATABASE — when the corresponding flag is omitted (an
explicit flag wins). Prefer the env var for the password so it doesn't land in shell history or the
process list:
export NEO4J_URI=bolt://localhost:7687
export NEO4J_PASSWORD=secret
cants --input ./my-ts-project --emit neo4j # credentials picked up from the environment
Schema contract
--emit schema writes the machine-readable, version-stamped Neo4j schema (schema.json: node
labels, relationships, properties, constraints, and indexes). It needs no project and is bundled in
every release (as a wheel asset and a GitHub Release asset), so a consumer can validate
producer/consumer compatibility without invoking the binary.
cants --emit schema # print to stdout
cants --emit schema --output ./out # → ./out/schema.json
Development
This project uses Bun as its toolchain.
bun install
bun run start -- --input /path/to/project # run from source
bun run typecheck # type-check
bun test # tests (the Neo4j bolt test is opt-in; see below)
bun run test:container # Neo4j bolt tests — needs Docker/Podman (opt-in)
bun run gen:schema # regenerate schema.neo4j.json
bun run gen:readme # regenerate the cants --help block above
License
Apache 2.0 — see LICENSE.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
Built Distributions
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file codeanalyzer_typescript-0.4.1-py3-none-win_amd64.whl.
File metadata
- Download URL: codeanalyzer_typescript-0.4.1-py3-none-win_amd64.whl
- Upload date:
- Size: 42.9 MB
- Tags: Python 3, Windows x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
32c6d1506baa177c5363e63a43c77d0c896b7c101858dd9d10de2c7aad76b0e3
|
|
| MD5 |
fd75058bca4bbd1814a49dc07af56c6d
|
|
| BLAKE2b-256 |
19663d986049667182119784e646817f55dca0f73c98795a0e9244d2f77bc755
|
Provenance
The following attestation bundles were made for codeanalyzer_typescript-0.4.1-py3-none-win_amd64.whl:
Publisher:
release.yml on codellm-devkit/codeanalyzer-typescript
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
codeanalyzer_typescript-0.4.1-py3-none-win_amd64.whl -
Subject digest:
32c6d1506baa177c5363e63a43c77d0c896b7c101858dd9d10de2c7aad76b0e3 - Sigstore transparency entry: 1885416258
- Sigstore integration time:
-
Permalink:
codellm-devkit/codeanalyzer-typescript@509789df8e3f22501cde579ee5780ba099e4614c -
Branch / Tag:
refs/tags/v0.4.1 - Owner: https://github.com/codellm-devkit
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@509789df8e3f22501cde579ee5780ba099e4614c -
Trigger Event:
push
-
Statement type:
File details
Details for the file codeanalyzer_typescript-0.4.1-py3-none-manylinux2014_x86_64.whl.
File metadata
- Download URL: codeanalyzer_typescript-0.4.1-py3-none-manylinux2014_x86_64.whl
- Upload date:
- Size: 40.5 MB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
32b8922db098e57d13b44bbe4b6a35617b1ed88d6fe559c1c51ade805abba702
|
|
| MD5 |
f2622aa0b8123c4ec8d312a4bb7e6972
|
|
| BLAKE2b-256 |
3530562bb785f589134cb43325172ef37bc7e0648086005e8471182bc4256919
|
Provenance
The following attestation bundles were made for codeanalyzer_typescript-0.4.1-py3-none-manylinux2014_x86_64.whl:
Publisher:
release.yml on codellm-devkit/codeanalyzer-typescript
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
codeanalyzer_typescript-0.4.1-py3-none-manylinux2014_x86_64.whl -
Subject digest:
32b8922db098e57d13b44bbe4b6a35617b1ed88d6fe559c1c51ade805abba702 - Sigstore transparency entry: 1885416176
- Sigstore integration time:
-
Permalink:
codellm-devkit/codeanalyzer-typescript@509789df8e3f22501cde579ee5780ba099e4614c -
Branch / Tag:
refs/tags/v0.4.1 - Owner: https://github.com/codellm-devkit
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@509789df8e3f22501cde579ee5780ba099e4614c -
Trigger Event:
push
-
Statement type:
File details
Details for the file codeanalyzer_typescript-0.4.1-py3-none-manylinux2014_aarch64.whl.
File metadata
- Download URL: codeanalyzer_typescript-0.4.1-py3-none-manylinux2014_aarch64.whl
- Upload date:
- Size: 40.2 MB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6fa8c11b732195788c5ee570c900c7e9251f9961467f9aab3bc5e5d57abd2c2d
|
|
| MD5 |
82306d4ee4430ae4832121d8921b01b6
|
|
| BLAKE2b-256 |
7d6c12e62870dfaf74c977ec262ebe0d335f9008d163a564338eeba4a1cbd954
|
Provenance
The following attestation bundles were made for codeanalyzer_typescript-0.4.1-py3-none-manylinux2014_aarch64.whl:
Publisher:
release.yml on codellm-devkit/codeanalyzer-typescript
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
codeanalyzer_typescript-0.4.1-py3-none-manylinux2014_aarch64.whl -
Subject digest:
6fa8c11b732195788c5ee570c900c7e9251f9961467f9aab3bc5e5d57abd2c2d - Sigstore transparency entry: 1885416126
- Sigstore integration time:
-
Permalink:
codellm-devkit/codeanalyzer-typescript@509789df8e3f22501cde579ee5780ba099e4614c -
Branch / Tag:
refs/tags/v0.4.1 - Owner: https://github.com/codellm-devkit
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@509789df8e3f22501cde579ee5780ba099e4614c -
Trigger Event:
push
-
Statement type:
File details
Details for the file codeanalyzer_typescript-0.4.1-py3-none-macosx_11_0_arm64.whl.
File metadata
- Download URL: codeanalyzer_typescript-0.4.1-py3-none-macosx_11_0_arm64.whl
- Upload date:
- Size: 28.7 MB
- Tags: Python 3, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
818ddde6d8e0e5a17e5d88a931615b102d589a4015117a207b21c491e4e43654
|
|
| MD5 |
f51145f0eb9cb19180195eb96c7dee17
|
|
| BLAKE2b-256 |
9f2ddf2dfeec0a4e4981399f5e0e61344069716e3ec3a701c9fd8f1a774b9a84
|
Provenance
The following attestation bundles were made for codeanalyzer_typescript-0.4.1-py3-none-macosx_11_0_arm64.whl:
Publisher:
release.yml on codellm-devkit/codeanalyzer-typescript
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
codeanalyzer_typescript-0.4.1-py3-none-macosx_11_0_arm64.whl -
Subject digest:
818ddde6d8e0e5a17e5d88a931615b102d589a4015117a207b21c491e4e43654 - Sigstore transparency entry: 1885416327
- Sigstore integration time:
-
Permalink:
codellm-devkit/codeanalyzer-typescript@509789df8e3f22501cde579ee5780ba099e4614c -
Branch / Tag:
refs/tags/v0.4.1 - Owner: https://github.com/codellm-devkit
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@509789df8e3f22501cde579ee5780ba099e4614c -
Trigger Event:
push
-
Statement type:
File details
Details for the file codeanalyzer_typescript-0.4.1-py3-none-macosx_10_12_x86_64.whl.
File metadata
- Download URL: codeanalyzer_typescript-0.4.1-py3-none-macosx_10_12_x86_64.whl
- Upload date:
- Size: 31.0 MB
- Tags: Python 3, macOS 10.12+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
16773b7d732e0a4f3ab24e44cc00647bf495755d845aeeeef6df68de22314f52
|
|
| MD5 |
9677053af07bf40bcb12652fe9f5ab73
|
|
| BLAKE2b-256 |
98d210fa082445a9561f14033e2a29b8a47dae72a9ffcd18c1d1ef4c567555dc
|
Provenance
The following attestation bundles were made for codeanalyzer_typescript-0.4.1-py3-none-macosx_10_12_x86_64.whl:
Publisher:
release.yml on codellm-devkit/codeanalyzer-typescript
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
codeanalyzer_typescript-0.4.1-py3-none-macosx_10_12_x86_64.whl -
Subject digest:
16773b7d732e0a4f3ab24e44cc00647bf495755d845aeeeef6df68de22314f52 - Sigstore transparency entry: 1885416409
- Sigstore integration time:
-
Permalink:
codellm-devkit/codeanalyzer-typescript@509789df8e3f22501cde579ee5780ba099e4614c -
Branch / Tag:
refs/tags/v0.4.1 - Owner: https://github.com/codellm-devkit
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@509789df8e3f22501cde579ee5780ba099e4614c -
Trigger Event:
push
-
Statement type: