Skip to main content

Multi-language code complexity analyzer with AI cost metrics (AIRD, AICP), SARIF/JSON/CSV output, and CI threshold enforcement

Project description

Knots

A fast multi-language code complexity analyzer built on tree-sitter. Knots measures traditional complexity metrics alongside two AI-specific cost scores — AIRD (AI Reasoning Difficulty) and AICP (AI Context Pressure) — to identify which functions are genuinely expensive to modify with AI assistance.

Features

  • Multiple Complexity Metrics: McCabe, Cognitive, Nesting Depth, SLOC, ABC, Test Scoring
  • AI Cost Metrics: AIRD (reasoning difficulty) and AICP (context pressure) — corpus-validated against 32,205 functions across 6 open-source C codebases
  • Multi-Language: C, C++, Rust, Python, and JavaScript — same metrics and thresholds across all supported languages
  • Testability Matrix: Categorize functions by complexity and testability
  • Multiple Output Formats: text, SARIF, JSON, NDJSON (find/xargs-composable), CSV
  • CI Threshold Enforcement: exit 1 on any threshold violation; recommended --aird-threshold 85
  • Pre-commit Hook: native integration, no shim scripts required
  • Validated: McCabe matches pmccabe exactly; Cognitive matches Mozilla rust-code-analysis at 1.004× mean ratio (11,365 Rust functions)

Installation

Prebuilt binary from PyPI (no Rust toolchain, installs in seconds):

pipx install knots          # or: uv tool install knots

From crates.io:

cargo install knots

Or from source:

git clone https://github.com/brandon-arrendondo/knots.git
cd knots
cargo build --release

No C compiler or build system required.

Quick Start

# Single file
knots src/main.c

# Recursive directory
knots -r src/

# CI gate — fail if any function has AIRD > 85
knots -r src/ --aird-threshold 85

# Adopt the gate on a legacy codebase: snapshot today, then fail only on regressions
knots -r src/ --aird-threshold 85 --baseline .knots-baseline.json --write-baseline
knots -r src/ --aird-threshold 85 --baseline .knots-baseline.json

# Gate only the functions you actually touched (no new debt in this change)
knots -r src/ --aird-threshold 85 --changed

# SARIF for GitHub Code Scanning
knots -r --format sarif src/ > knots.sarif

# Corpus analysis — one JSON record per function
find . -name "*.c" -o -name "*.rs" | xargs knots --format ndjson > metrics.ndjson

# Testability matrix
knots -m src/main.c

Complexity Indicators

Based on max(McCabe, cognitive):

Range Indicator Meaning
1–10 😊 Good Low complexity, easy to maintain
11–20 😐 Okay Moderate complexity, monitor
21–49 😠 Bad High complexity, consider refactoring
50+ 😢 Critical Urgent refactoring needed

Command-Line Options

knots [OPTIONS] [FILE]...
knots [OPTIONS] --compile-commands <FILE>

Options:
  -r, --recursive                   Recursively process all C/C++/Rust/Python/JavaScript source files
  -v, --verbose                     Show detailed per-function analysis
  -m, --matrix                      Show testability matrix categorization
  --compile-commands <FILE>         Use compile_commands.json to get file list
  --include <FILE>                  Include filter rules from JSON file (whitelist)
  --exclude <FILE>                  Exclude filter rules from JSON file (blacklist)
  --exclude-path <PATTERN>          Exclude files whose path matches this regex (repeatable)
  --format <FORMAT>                 text (default) | sarif | json | ndjson | csv
  --mccabe-threshold <N>            Exit 1 if any function exceeds this McCabe complexity
  --cognitive-threshold <N>         Exit 1 if any function exceeds this cognitive complexity
  --nesting-threshold <N>           Exit 1 if any function exceeds this nesting depth
  --sloc-threshold <N>              Exit 1 if any function exceeds this SLOC count
  --abc-threshold <F>               Exit 1 if any function exceeds this ABC magnitude
  --return-threshold <N>            Exit 1 if any function exceeds this return count
  --aird-threshold <N>              Exit 1 if any function exceeds this AIRD (AI Reasoning Difficulty) score (recommended: 85)
  --aicp-threshold <N>              Exit 1 if any function exceeds this AICP (AI Context Pressure) score
  --external-calls-threshold <N>    Exit 1 if any function exceeds this external call count
  --report <FILE>                   Write a detailed per-function report to this file (opt-in)
  --baseline <FILE>                 Ratchet mode: gate only on regressions vs. this snapshot (see docs/baseline.rst)
  --write-baseline                  Snapshot current scores to --baseline and exit without gating
  --since <REF>                     Gate only functions overlapping lines changed since this git ref
  --changed                         Gate only functions changed in the working tree (sugar for --since HEAD)
  --explain <METRIC>                Explain a metric (e.g. aird, aicp) and how to lower it, then exit
  -h, --help                        Print help
  -V, --version                     Print version

Documentation

Full documentation is in the docs/ directory (Sphinx/RST):

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

knots-1.11.0.tar.gz (104.6 kB view details)

Uploaded Source

Built Distributions

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

knots-1.11.0-py3-none-win_amd64.whl (2.5 MB view details)

Uploaded Python 3Windows x86-64

knots-1.11.0-py3-none-musllinux_1_2_x86_64.whl (2.3 MB view details)

Uploaded Python 3musllinux: musl 1.2+ x86-64

knots-1.11.0-py3-none-musllinux_1_2_aarch64.whl (2.4 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARM64

knots-1.11.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.3 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ x86-64

knots-1.11.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (2.4 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARM64

knots-1.11.0-py3-none-macosx_11_0_arm64.whl (2.3 MB view details)

Uploaded Python 3macOS 11.0+ ARM64

knots-1.11.0-py3-none-macosx_10_12_x86_64.whl (2.1 MB view details)

Uploaded Python 3macOS 10.12+ x86-64

File details

Details for the file knots-1.11.0.tar.gz.

File metadata

  • Download URL: knots-1.11.0.tar.gz
  • Upload date:
  • Size: 104.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for knots-1.11.0.tar.gz
Algorithm Hash digest
SHA256 dabf7bbb434a409bd5319b023144257fae0a34118fae206f5077d64a6cd82cad
MD5 eb8c1594fc647a365c0fb97dbfe714ef
BLAKE2b-256 a5d6c684faea7ed7afe8193c9dd775d72d0efb425eaafce6be9f073c96d5559b

See more details on using hashes here.

Provenance

The following attestation bundles were made for knots-1.11.0.tar.gz:

Publisher: wheels.yml on brandon-arrendondo/knots

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

File details

Details for the file knots-1.11.0-py3-none-win_amd64.whl.

File metadata

  • Download URL: knots-1.11.0-py3-none-win_amd64.whl
  • Upload date:
  • Size: 2.5 MB
  • Tags: Python 3, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for knots-1.11.0-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 3d980e833ab9d09298d58df09509818f9b5661f5e386955186ac1dd9c6b6cf4f
MD5 ba9ba62f0949913c11004e96adb5a9ef
BLAKE2b-256 291c81b59277a93779573980cd98f1fe9ee6149bd42636a28c421bb5c4da261c

See more details on using hashes here.

Provenance

The following attestation bundles were made for knots-1.11.0-py3-none-win_amd64.whl:

Publisher: wheels.yml on brandon-arrendondo/knots

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

File details

Details for the file knots-1.11.0-py3-none-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for knots-1.11.0-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 338894725fabae30e0cedea0ccf8ab0d2231b0903610c02e5dc08b7b3c391445
MD5 489efe49eb674a6d83c4c5fcd54b7499
BLAKE2b-256 2c5e8ce1affbcc287ecb63552208b58a12e75c8588dab61c63fb8dd0c541fa33

See more details on using hashes here.

Provenance

The following attestation bundles were made for knots-1.11.0-py3-none-musllinux_1_2_x86_64.whl:

Publisher: wheels.yml on brandon-arrendondo/knots

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

File details

Details for the file knots-1.11.0-py3-none-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for knots-1.11.0-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 05bd1fb266489c577b91ceab4b716616ca84165be1dd97f0f7752e8d2e905291
MD5 5de7964477906065bc2f9c70ba15d124
BLAKE2b-256 77c76a570ccf647672d88f8a222098e4fba5474f5ce2531214e0620d23d89495

See more details on using hashes here.

Provenance

The following attestation bundles were made for knots-1.11.0-py3-none-musllinux_1_2_aarch64.whl:

Publisher: wheels.yml on brandon-arrendondo/knots

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

File details

Details for the file knots-1.11.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for knots-1.11.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 9b183f8d4b9af6e756a020c2a4d3426e664bd2777f7dbe1669eb99b5506e3dbb
MD5 5df03448278c5337031948601791018e
BLAKE2b-256 e4b7bb5087d706d4bb871f6331f74fdc81eeb367a138394202663b65d374f913

See more details on using hashes here.

Provenance

The following attestation bundles were made for knots-1.11.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: wheels.yml on brandon-arrendondo/knots

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

File details

Details for the file knots-1.11.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for knots-1.11.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 1ae6a1909d8b19d0898080a6521cb6239edbd58cfcb5d1ee11825b86be6a16fb
MD5 5c0a385b883e7abeceed28afa0e450e0
BLAKE2b-256 f43e622175026afdbe7dfbd2258b4f4c9cede31fb28a69cb03d6f0353de055f0

See more details on using hashes here.

Provenance

The following attestation bundles were made for knots-1.11.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: wheels.yml on brandon-arrendondo/knots

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

File details

Details for the file knots-1.11.0-py3-none-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for knots-1.11.0-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 eafa514c01e617b1322c117c08dd40ab5836d4fd97f9b8181729fe74cee9d168
MD5 748b0bd444371e9ed817f805a070458e
BLAKE2b-256 e959de1b143dc1f16e4ca9cd648c960a8934a58948dc53d7118051c92e360efd

See more details on using hashes here.

Provenance

The following attestation bundles were made for knots-1.11.0-py3-none-macosx_11_0_arm64.whl:

Publisher: wheels.yml on brandon-arrendondo/knots

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

File details

Details for the file knots-1.11.0-py3-none-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for knots-1.11.0-py3-none-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 5623ee2b8b5b1d3f02c148aa97ea587ade5ef3032d480acdf6ae750e9b260388
MD5 1765d616bcfd8478af78ec7cf63ec1c0
BLAKE2b-256 c90592982878e0494ec4eacb01c0bd97ab554cb492e819d3126281644af9a9d3

See more details on using hashes here.

Provenance

The following attestation bundles were made for knots-1.11.0-py3-none-macosx_10_12_x86_64.whl:

Publisher: wheels.yml on brandon-arrendondo/knots

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