Skip to main content

Structural code quality metrics for agent-written programs.

Project description

Topos

Structural code quality metrics for agent-written programs.

Topos gives you structural code quality metrics your agents can act on. Passing unit tests proves your code works, but Topos proves it's built to last. It measures program structure — not just syntax — giving agents concrete metrics to optimize toward on every pass. You set the target; agents handle the iteration.

The Quality Pillars

Topos evaluates code along three independent pillars:

  • SIMPLE — Avoids unnecessary complexity (AST entropy & CFG cyclomatic complexity).
  • COMPOSABLE — Cleanly decoupled from other modules (MDG Martin instability via GitNexus).
  • SECURE — Free of dangerous API reachability and taint paths (CPG analysis).

The Medal Podium

Topos checks all three pillars and awards a Code Quality Medal based on how many pass:

Medal Criteria
🥇 GOLD Passes all 3 (SIMPLE + COMPOSABLE + SECURE)
🥈 SILVER Passes 2 of 3
🥉 BRONZE Passes 1 of 3
SLOP Passes 0 (or fails to parse)

Set your Preferences (e.g., simple,composable,secure) to tell your coding agent which pillars to prioritize when aiming for Gold under token and time budgets.


Quick Start

Install

curl -fsSL https://docs.krv.ai/topos/install.sh | sh
topos --version
topos --help

Every command also accepts -h / --help. See docs/cli-startup-benchmarks.md for release binary size and startup benchmarks.

Evaluate code — the 60-second tour

topos evaluate path/to/file.py
topos evaluate src/ -r
topos evaluate src/ -r --json
topos inspect path/to/file.py
topos compare before.py after.py

Use evaluate for medals, inspect for per-file metrics, compare for AST edit distance, and --json for CI or automation.

Review a whole repo or module

Point evaluate at a directory with -r for a ranked, actionable digest instead of a per-file wall:

topos evaluate src/ -r
topos evaluate src/mypackage -r

The summary surfaces, in order:

  • Pillars — per-pillar PASS/FAIL with average & minimum scores across all files.
  • Directory Floor Verdict — the worst verdict any single file drags the codebase down to (the pointwise lattice meet).
  • Needs attention — the lowest-scoring files (where quality is worst).
  • Lowest-hanging fruit — the files closest to flipping a failing pillar, each with the concrete fix. Start here for the cheapest wins:
Lowest-hanging fruit
  Smallest improvement that flips a failing pillar.
  1.  src/mypackage/__init__.py
      simple 59% → 60% (+1 pts)
  2.  src/mypackage/util.py
      simple 55% → 60% (+5 pts)
      ↳ Extract helper functions to cut branching (cyclomatic 21 > 15).

Add --json for a machine-readable rollup, or -v to expand every file's raw metrics.

Score COMPOSABLE — add a dependency graph

COMPOSABLE measures how cleanly a module is decoupled, which needs a cross-file dependency graph. Topos reads one from a .gitnexus/ directory produced by GitNexus. Without it, SIMPLE and SECURE still run — but any medal containing COMPOSABLE (including 🥇 GOLD) is unreachable.

npm install -g gitnexus
topos depgraph generate
topos evaluate src/ -r --gitnexus-dir .gitnexus

Install GitNexus once per machine. Run topos depgraph generate from each repository you want to score for COMPOSABLE.

The CLI does not auto-detect .gitnexus/ — pass --gitnexus-dir explicitly. Regenerate after imports change (new modules, renames, restructures). (The topos mcp server, by contrast, auto-detects ./.gitnexus.)

Measure test coverage — structural + semantic

--tests takes your test files (repeat the flag for several); the positional arguments are the program-under-test files.

topos coverage --tests tests/test_foo.py topos/foo.py
topos coverage --tests tests/test_a.py --tests tests/test_b.py src/a.py src/b.py
topos coverage --tests tests/test_foo.py topos/foo.py --coverage-threshold 0.8 --json

Reports UAST declaration coverage: bipartite matching between PUT and test declarations at the structural level.

Steer the verdict

topos evaluate src/ -r --preferences simple,composable,secure
topos evaluate app.py --allow yaml.load
topos evaluate src/ -r --language typescript

--preferences ranks pillars for agents, --allow acknowledges a known risky call and caps the grade below Gold, and --language supports python, typescript, javascript, rust, and cpp.


MCP Server

Give any MCP-compatible agent — Claude Code, Cursor, Gemini CLI, Windsurf — a live feed of Topos verdicts so it can evaluate and iterate on its own output.

Set up topos mcp in your agent

 

Step 1 — Build the dependency graph (optional but recommended)

⚠️ Recommended: Without a dependency graph, Topos cannot score COMPOSABLE — any verdict containing it (including IDEAL) is unreachable. SIMPLE and SECURE always run.

npm install -g gitnexus
cd /path/to/your/repo
topos depgraph generate

Re-run when imports change (new modules, renames, restructures). The cache keys on .gitnexus/ mtime and invalidates itself.

💡 Tip: Verify the binary before wiring it into editors:

topos mcp

topos mcp prints the FastMCP banner and waits on standard input. Press Ctrl-C after the smoke check.

Step 2 — Register with your agent

Run from your project root — Topos auto-detects its file-access root by walking up for .git or pyproject.toml.

Claude Code
claude mcp add topos topos mcp
Gemini CLI
gemini mcp add topos topos mcp
Cursor

➕ Install topos in Cursor

Or edit .cursor/mcp.json:

{ "mcpServers": { "topos": { "command": "topos mcp" } } }
Windsurf and everything else
{ "mcpServers": { "topos": { "command": "topos mcp" } } }

Step 3 — Launch from the project root

:warning: IMPORTANT Topos refuses to read files outside a trusted root. If you must launch from elsewhere, set it explicitly:

{
  "command": "topos mcp",
  "env": { "TOPOS_MCP_FILE_ROOT": "/absolute/path/to/repo" }
}

:bulb: TIP On the agent's first turn, point it at the workflow doc:

"Fetch topos://docs/workflows and follow the Topos refactor loop."

Or invoke the prompt directly: topos_refactor_until_ideal(filepath="path/to/file.py").

Smoke test

"Use topos to find the worst-scoring file in src/, propose a refactor, and verify with topos_assess_improvement."

A healthy response shows {simple: 72%, composable: 65%, secure: 95%} when GitNexus is configured. If the response is missing composable, go back to Step 1.


How it works

Topos measures code along the three independent quality generators and maps them to an 8-element evaluation lattice:

  • SIMPLE — Built from the abstract syntax tree (AST) and control-flow graph (CFG). We calculate cyclomatic complexity of the CFG and entropy of the AST to assess complexity.
  • COMPOSABLE — Built from the module dependency graph (MDG) using GitNexus, to capture inter-module dependencies. This is slightly different than the usual program dependence graph (PDG) which is used to capture intra-function dependencies. We calculate Martin Instability and Fanning metrics for the MDG to assess coupling.
  • SECURE — Built from the code property graph (CPG). We calculate dangerous-API reachability and taint paths from the CPG to assess security.
graph BT
    SLOP["❌ SLOP<br/>No Medal"]
    SIMPLE["🥉 BRONZE<br/>Simple"]
    COMPOSABLE["🥉 BRONZE<br/>Composable"]
    SECURE["🥉 BRONZE<br/>Secure"]
    SC["🥈 SILVER<br/>S ∧ C"]
    SSc["🥈 SILVER<br/>S ∧ Sc"]
    CSc["🥈 SILVER<br/>C ∧ Sc"]
    IDEAL["🥇 GOLD<br/>Quality Code"]

    SLOP --> SIMPLE
    SLOP --> COMPOSABLE
    SLOP --> SECURE
    SIMPLE --> SC
    SIMPLE --> SSc
    COMPOSABLE --> SC
    COMPOSABLE --> CSc
    SECURE --> SSc
    SECURE --> CSc
    SC --> IDEAL
    SSc --> IDEAL
    CSc --> IDEAL

    style SLOP       fill:#f8d7da,stroke:#842029,color:#000
    style SIMPLE     fill:#cd7f32,stroke:#5c3a1e,color:#fff
    style COMPOSABLE fill:#cd7f32,stroke:#5c3a1e,color:#fff
    style SECURE     fill:#cd7f32,stroke:#5c3a1e,color:#fff
    style SC         fill:#c0c0c0,stroke:#4a4a4a,color:#000
    style SSc        fill:#c0c0c0,stroke:#4a4a4a,color:#000
    style CSc        fill:#c0c0c0,stroke:#4a4a4a,color:#000
    style IDEAL      fill:#ffd700,stroke:#856404,color:#000

[!TIP] Three Independent Pillars: SIMPLE, COMPOSABLE, and SECURE are pairwise incomparable. A file can achieve any subset of {S, C, Sc} independently. 🥇 GOLD is the intersection of all three.

Manager Priorities & Agent Iteration

In a perfect world, every file would earn a 🥇 GOLD medal. In reality, managers and developers have a finite budget of time and tokens.

Topos allows you to set Preferences — an ordering of these medals based on your immediate priorities. Coding agents use this ranking to aim for 🥇 GOLD. If achieving 🥇 GOLD isn't feasible within the budget, the preference ranking tells the agent exactly how to relax its goals, ensuring it still delivers the highest possible quality medal aligned with your priorities.


Contributing

Topos is used internally at Krv Labs to manage AI agent code output. We welcome bugs, ideas, and contributions.


Full Documentation · Measures & Metrics · Category Theory Concepts

Built with ❤️ by Krv Labs

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

topos_mcp-0.3.9.tar.gz (702.0 kB view details)

Uploaded Source

Built Distributions

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

topos_mcp-0.3.9-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (592.1 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

topos_mcp-0.3.9-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (591.1 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ ARM64

topos_mcp-0.3.9-cp312-cp312-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl (864.6 kB view details)

Uploaded CPython 3.12macOS 10.12+ universal2 (ARM64, x86-64)macOS 10.12+ x86-64macOS 11.0+ ARM64

File details

Details for the file topos_mcp-0.3.9.tar.gz.

File metadata

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

File hashes

Hashes for topos_mcp-0.3.9.tar.gz
Algorithm Hash digest
SHA256 fd1423de9b7d1a8a8014ec809ec4982c4752530e045d6f017e801da8ae2ca910
MD5 6dcc79b439f351edbee18ff4b743eadc
BLAKE2b-256 c1ded5663867d16b9051a97326c0348f2cff1fa13e5a3452df81846ee971eff4

See more details on using hashes here.

Provenance

The following attestation bundles were made for topos_mcp-0.3.9.tar.gz:

Publisher: release.yml on Krv-Labs/topos

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

File details

Details for the file topos_mcp-0.3.9-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for topos_mcp-0.3.9-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 fa16e0f9b0b5e2d7faf326e3eba6d50b39cb9e1abd097a1a4ea8ad3785b06345
MD5 fdc3b1911b06749786347b4c36f0f2c7
BLAKE2b-256 78cbf4b1f154be59541d962f18624d8b384ba41c4c3c37c9105f22a9cd787aa8

See more details on using hashes here.

Provenance

The following attestation bundles were made for topos_mcp-0.3.9-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: release.yml on Krv-Labs/topos

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

File details

Details for the file topos_mcp-0.3.9-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for topos_mcp-0.3.9-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 464e0363a41d3ceafd94e7cb4c546f6cd860c6ae970b8fc5b6b084c7a426e3a1
MD5 69962d7fcdeef92063dd3b5ef13d2224
BLAKE2b-256 7a09ed67833d6859abace5f40b96968c6a1f366b321cfe1b741a7485ca1e0f04

See more details on using hashes here.

Provenance

The following attestation bundles were made for topos_mcp-0.3.9-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: release.yml on Krv-Labs/topos

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

File details

Details for the file topos_mcp-0.3.9-cp312-cp312-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl.

File metadata

File hashes

Hashes for topos_mcp-0.3.9-cp312-cp312-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
Algorithm Hash digest
SHA256 5972697d786b2514085cdc6db366a173928f65cc13dde8cebc7b4e756a92e485
MD5 30b6f8c5626044515d30b45552c84795
BLAKE2b-256 65966daa303b044669425dcbfb4fd2a3c97f104e08e8036341f348847eb46f0c

See more details on using hashes here.

Provenance

The following attestation bundles were made for topos_mcp-0.3.9-cp312-cp312-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl:

Publisher: release.yml on Krv-Labs/topos

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