Skip to main content

Prebuilt codeanalyzer-typescript backend binary for CLDK (codellm-devkit).

Project description

logo

A TypeScript Static Analysis Toolkit (and Library)

A comprehensive static analysis tool for TypeScript and JavaScript source code that produces the canonical CodeLLM-DevKit (CLDK) analysis.json — a symbol table plus a resolver-based call graph — using the TypeScript compiler via ts-morph. It is the TypeScript backend behind CLDK, mirroring its Python and Java siblings.

Usage

The analyzer provides a command-line interface for performing static analysis on TypeScript/JavaScript projects.

Basic Usage

cants --input /path/to/typescript/project

Command Line Options

To view the available options, run cants --help:

Usage: cants [options]

CLDK TypeScript analyzer — emits the canonical analysis.json
(symbol table + resolver call graph).

Options:
  -i, --input <path>             project root to analyze
  -o, --output <dir>             output directory for analysis.json
                                 (omit ⇒ compact JSON to stdout)
  -f, --format <fmt>             output format: json | msgpack (default: "json")
  -a, --analysis-level <n>       1 = tsc resolver call graph + RTA (default);
                                 2 = + CodeQL enrichment (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
  -c, --cache-dir <dir>          cache/intermediate directory
  -v, --verbose                  increase verbosity (repeatable)
  -h, --help                     display help for command

Examples

  1. Basic analysis (symbol table + call graph):

    cants --input ./my-ts-project
    

    This prints the analysis to stdout as compact JSON. To save it instead, use --output:

    cants --input ./my-ts-project --output /path/to/analysis-results
    

    The results are written to analysis.json in the specified directory.

  2. Change output format to msgpack:

    cants --input ./my-ts-project --output /path/to/analysis-results --format msgpack
    

    This saves the results to analysis.msgpack, a binary format that is more compact for storage and transmission.

  3. Deeper analysis with CodeQL enrichment (experimental):

    cants --input ./my-ts-project --analysis-level 2
    

    Every run produces a symbol table and a call graph. At level 1, edges come from the TypeScript compiler's resolver plus Rapid Type Analysis (RTA), with phantom nodes for calls into imported libraries. Level 2 additionally merges in CodeQL-derived edges.

  4. Incremental analysis of specific files:

    cants --input ./my-ts-project --target-files src/a.ts src/b.ts
    

    Restricts the analysis to the named files, reusing the cached analysis for the rest of the project.

  5. Force a clean rebuild with a custom cache directory:

    cants --input ./my-ts-project --eager --cache-dir /path/to/custom-cache
    

    --eager rebuilds the analysis cache from scratch. If --cache-dir is omitted, the cache defaults to .codeanalyzer inside the project root.

Output

By default, analysis results are printed to stdout as compact JSON. When --output is given, results are saved to analysis.json (or analysis.msgpack with --format msgpack) in the specified directory.

The output document is a TSApplication with the following top-level shape:

{
  "symbol_table":     { /* file path → module (classes, interfaces, enums,
                           type aliases, functions, namespaces, variables, …) */ },
  "call_graph":       [ /* CALL_DEP edges: { source, target, weight,
                           provenance, tags } keyed by callable signature */ ],
  "external_symbols": { /* phantom stubs for call targets outside the project
                           (imported libraries / Node builtins) */ },
  "entrypoints":      { /* framework-detected entrypoints (empty at level 1) */ }
}

Caller- and callee-side identifiers are produced by a single signature canonicalizer, so call graph source/target values byte-match the corresponding symbol_table (or external_symbols) keys.

License

Apache 2.0 — see LICENSE.


About this package

This distributes the compiled cants binary as a set of platform-specific Python wheels, published to PyPI as codeanalyzer-typescript. The CLDK Python SDK depends on this package and calls codeanalyzer_typescript.bin_path() to locate the analyzer binary. The binary is built from this repo's src/ with bun build --compile, so it is fully self-contained (no Node/Bun needed at runtime).

Why platform wheels?

A bun --compile binary is platform-specific and large (~70 MB) — there is no single cross-platform artifact (the way a JVM backend could ship one .jar). So we ship one wheel per OS/arch, tagged py3-none-<platform> (the binary is Python-agnostic — no per-Python-version matrix), and let pip resolve the correct one at install time. There is intentionally no usable sdist: the binary cannot be built without Bun.

Building & publishing

python -m pip install build wheel hatchling twine
./build_wheels.sh            # cross-compiles every target via Bun, emits ./dist/*.whl
twine upload dist/*.whl

build_wheels.sh loops over the Bun targets, compiles each binary into src/codeanalyzer_typescript/_bin/, builds a pure wheel, and retags it to the platform. Bun cross-compiles all targets from a single host, so this does not need a CI runner matrix.

Versioning

The released version comes from the git tag. A push of vX.Y.Z triggers the release workflow, which derives X.Y.Z from the tag, verifies it matches this repo's package.json version (failing fast on mismatch), and stamps it into __init__.py via $PKG_VERSION — hatch reads __version__ as the wheel version (pyproject.toml declares dynamic = ["version"]). So the GitHub Release tag, the PyPI wheel version, and the npm package.json version are always in lockstep.

To cut a release: bump package.json version, then push the matching tag, e.g.

npm version 0.2.0 --no-git-tag-version   # or edit package.json
git commit -am "Release v0.2.0" && git tag v0.2.0 && git push --tags

For a local wheel build, override the fallback version explicitly: PKG_VERSION=0.2.0 ./build_wheels.sh.

One thing still tracked by hand: the python-sdk pin — [tool.backend-versions] codeanalyzer-typescript and the dependencies entry codeanalyzer-typescript==<version> — must be bumped to consume a new release.

SDK integration

In the python-sdk, TSCodeanalyzer._get_codeanalyzer_exec() resolves the binary in this order: analysis_backend_path$CODEANALYZER_TS_BINthis package → in-tree bundled bin/. Adding codeanalyzer-typescript to the SDK's dependencies makes the binary available automatically on install.

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

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

codeanalyzer_typescript-0.2.0-py3-none-win_amd64.whl (40.5 MB view details)

Uploaded Python 3Windows x86-64

codeanalyzer_typescript-0.2.0-py3-none-macosx_11_0_arm64.whl (26.2 MB view details)

Uploaded Python 3macOS 11.0+ ARM64

codeanalyzer_typescript-0.2.0-py3-none-macosx_10_12_x86_64.whl (28.7 MB view details)

Uploaded Python 3macOS 10.12+ x86-64

File details

Details for the file codeanalyzer_typescript-0.2.0-py3-none-win_amd64.whl.

File metadata

File hashes

Hashes for codeanalyzer_typescript-0.2.0-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 07d2ece88141c969b6abad0a97fc00564c3c1da55be573d4db028c3513961cb4
MD5 83de1d8aedb3e9bb832920bb1ea91c95
BLAKE2b-256 8be44a8dc3ed41f975ef42168fe2dffbe4159b3a4a27745b77e1406e4bb6a513

See more details on using hashes here.

Provenance

The following attestation bundles were made for codeanalyzer_typescript-0.2.0-py3-none-win_amd64.whl:

Publisher: release.yml on codellm-devkit/codeanalyzer-ts

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file codeanalyzer_typescript-0.2.0-py3-none-manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for codeanalyzer_typescript-0.2.0-py3-none-manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 5ac8d974da6df25b63f2b21b6eff9ed46b879d0ee0e29d3e227de809d158e2d4
MD5 1d8607cc72c5c5b6708fb117ed893a70
BLAKE2b-256 ba59550cedfd77a774e826a7d3df64ae314109b1718c9d236579cae37a99b3fb

See more details on using hashes here.

Provenance

The following attestation bundles were made for codeanalyzer_typescript-0.2.0-py3-none-manylinux2014_x86_64.whl:

Publisher: release.yml on codellm-devkit/codeanalyzer-ts

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file codeanalyzer_typescript-0.2.0-py3-none-manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for codeanalyzer_typescript-0.2.0-py3-none-manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 747b2f508f376a2ade60e1fb76980b990a3fc5bb771b13354ddcfa174f5226bc
MD5 e7cf3c2445205d1ee159bb6109c2a243
BLAKE2b-256 26213db70d11e3079e4ad4bd48bda031dd9f48c49f2017d6f96bb39cf8c6b14f

See more details on using hashes here.

Provenance

The following attestation bundles were made for codeanalyzer_typescript-0.2.0-py3-none-manylinux2014_aarch64.whl:

Publisher: release.yml on codellm-devkit/codeanalyzer-ts

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file codeanalyzer_typescript-0.2.0-py3-none-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for codeanalyzer_typescript-0.2.0-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 b1f206e5290a4366122c4a91a6a43ec4552ba9dc0e88667295076ace900e7767
MD5 07b1b3431301a8cf7e592a4959e5ba55
BLAKE2b-256 8b2c33fd72cced074c01971ee6a9c642393199b0c756011f2e2fb16c5ccfbbee

See more details on using hashes here.

Provenance

The following attestation bundles were made for codeanalyzer_typescript-0.2.0-py3-none-macosx_11_0_arm64.whl:

Publisher: release.yml on codellm-devkit/codeanalyzer-ts

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file codeanalyzer_typescript-0.2.0-py3-none-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for codeanalyzer_typescript-0.2.0-py3-none-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 fc27c07cc88866343493b7ea9802df2cc154e48952019ff31284cb4801206d3d
MD5 f8b302355f292ea29c71cd9d8f1511d7
BLAKE2b-256 9b108d78c94a4d0896e28d1b93e947bfd4d92a1065d116e77bf570a777a8616c

See more details on using hashes here.

Provenance

The following attestation bundles were made for codeanalyzer_typescript-0.2.0-py3-none-macosx_10_12_x86_64.whl:

Publisher: release.yml on codellm-devkit/codeanalyzer-ts

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page