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.

Install

pip install codeanalyzer-typescript

The wheel bundles a prebuilt, self-contained cants binary for your platform (no Bun or Node required to run it) and installs a cants command on your PATH. CLDK's Python SDK depends on this package to locate the analyzer backend.

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>       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
  -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. Selecting an analysis level:

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

    Every run produces a symbol table and a call graph. Edges come from the TypeScript compiler's resolver plus Rapid Type Analysis (RTA), with phantom nodes for calls into imported libraries.

  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.1-py3-none-win_amd64.whl (40.5 MB view details)

Uploaded Python 3Windows x86-64

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

Uploaded Python 3macOS 11.0+ ARM64

codeanalyzer_typescript-0.2.1-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.1-py3-none-win_amd64.whl.

File metadata

File hashes

Hashes for codeanalyzer_typescript-0.2.1-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 1134466f97187eda5eb79e021c464db94cbb39714b65a770de49c7b8f6f69eda
MD5 b45dd652941b9fd815e1629eba4cbbbf
BLAKE2b-256 71367fea5aa49de70bfc9385d1c5ef66adee323c363dc0c2d1ff3cc1a46cba7e

See more details on using hashes here.

Provenance

The following attestation bundles were made for codeanalyzer_typescript-0.2.1-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.1-py3-none-manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for codeanalyzer_typescript-0.2.1-py3-none-manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 27c695b3ff3368e05249250b322af9d62c17321404a70319b79d85a2e879db0f
MD5 0058260de0932468127b56e44aecb2bb
BLAKE2b-256 5966a00accc927abf63c5c4a4d9578aa31d404316b76ef9f2d2743e782650155

See more details on using hashes here.

Provenance

The following attestation bundles were made for codeanalyzer_typescript-0.2.1-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.1-py3-none-manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for codeanalyzer_typescript-0.2.1-py3-none-manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 c78909c0450cfe72dc14cabc6b3ac371120b96e4b98592f8a9c99053b8882776
MD5 caedc95316f7e77c324bd7637ddf4859
BLAKE2b-256 22d74484dea85e9c5ad60d9cd7fdc33cac9baa7d2a5c95ceb699172c76bbde4e

See more details on using hashes here.

Provenance

The following attestation bundles were made for codeanalyzer_typescript-0.2.1-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.1-py3-none-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for codeanalyzer_typescript-0.2.1-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 f4852256e6b0c55831b76f2cea1e093a816633dee9ab3478abdc0c90d9a23351
MD5 b755ab8d85f6930c962de63591df94cc
BLAKE2b-256 f6ec22b98dc554be964c3bc8cac208904955fcccea2d7012fd12a03012ff4a98

See more details on using hashes here.

Provenance

The following attestation bundles were made for codeanalyzer_typescript-0.2.1-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.1-py3-none-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for codeanalyzer_typescript-0.2.1-py3-none-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 25df46942045492058ee3c7f018e5c850b7ced42abf577677449965405dcacbf
MD5 ee0ab3083cd096cff15d8b02e530b287
BLAKE2b-256 d03b6c084a0fb838a8664ef59bcf1d734d862e1055361c84ead6b52732ac7f6d

See more details on using hashes here.

Provenance

The following attestation bundles were made for codeanalyzer_typescript-0.2.1-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