Skip to content
Back to skills

Code Complexity

ASecurity

Analyze code complexity metrics (cyclomatic, cognitive, function length, coupling). Use when identifying refactoring targets, tracking codebase health, or reviewing large changes.

  • 58 stars
  • 0 votes
  • 0 copies
  • 3 views
  • Added September 3, 2026
developmentjavascripttypescriptpythonrustgojavac++bashnoderefactoring

Works with

  • cli
  • api

Security analysis

A92/100
  • mediumInstalls packages at runtime which could introduce malicious dependencies

Pro scans all 2 files and shows the line behind each finding

Scanned September 3, 2026

npx -y skills add laurigates/claude-plugins --skill code-complexity --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Code Complexity?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Code Complexity
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/laurigates-code-complexity/badge)](https://www.skillsdirectory.com/skills/laurigates-code-complexity)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: code-complexity
description: Analyze code complexity metrics (cyclomatic, cognitive, function length, coupling). Use when identifying refactoring targets, tracking codebase health, or reviewing large changes.
args: "[PATH] [--threshold <number>] [--format <summary|detailed|json>]"
argument-hint: path or directory to analyze for complexity
allowed-tools: Bash(npx *), Bash(radon *), Bash(cargo *), Bash(lizard *), Read, Grep, Glob, TodoWrite
model: opus
created: 2026-04-10
modified: 2026-07-06
reviewed: 2026-07-06
---

# /code:complexity

Measure and report code complexity metrics.

## When to Use This Skill

| Use this skill when... | Use something else when... |
|---|---|
| Identifying refactoring targets by complexity | Looking for specific anti-patterns → /code:antipatterns |
| Tracking codebase health trends | Doing full code review → /code:review |
| Reviewing large PRs for complexity hotspots | Finding duplicated code → /code:dry-consolidation |
| Setting complexity budgets for the team | Configuring linting rules → /configure:linting |

## Context

- Source files: !`find . -type f \( -name "*.ts" -o -name "*.tsx" -o -name "*.js" -o -name "*.jsx" -o -name "*.py" -o -name "*.rs" -o -name "*.go" \) -not -path "*/node_modules/*" -not -path "*/.git/*" -not -path "*/dist/*" -not -path "*/build/*"`
- Package files: !`find . -maxdepth 1 \( -name "package.json" -o -name "pyproject.toml" -o -name "Cargo.toml" -o -name "go.mod" \) -type f`

## Parameters

- `$1`: Path to analyze (defaults to current directory)
- `--threshold`: Complexity threshold for flagging (default: 10)
- `--format`: Output format — `summary` (default), `detailed`, `json`

## Metric Computation: Offload, Never Count By Hand

Complexity metrics (cyclomatic complexity, NLOC, parameter count, function
length, nesting depth) are **computed by a tool**, never by eyeballing function
boundaries or counting branches by hand. Hand-counting is token-hungry,
irreproducible run-to-run, and exactly the mechanical work that belongs in a
deterministic substrate.

- **Language-native fast paths** (use when the project already has them
  configured): `radon` for Python, `cargo clippy` for Rust, the ESLint
  `complexity` rule for JS/TS when an ESLint config exists.
- **`lizard` — the uniform fallback for every language.** One tool computes
  cyclomatic complexity (CCN), NLOC, parameter count (PARAM), function length,
  and nesting depth (ND) across JS/TS/Go/Python/Rust/C/C++/Java with
  machine-readable output. It is the deterministic answer wherever a
  language-native tool is absent — always the JS/TS and Go path when ESLint
  complexity isn't configured.

### Install lizard (tool-installation priority)

```bash
uv tool install lizard
```

Alternative: `mise use -g pipx:lizard` (mise `pipx:` backend, runs via uvx).

## Execution

Execute this complexity analysis:

### Step 1: Detect project language and available tools

Check for language-specific complexity tools, falling back to `lizard`:

- **JavaScript/TypeScript**: use the ESLint `complexity` rule when an ESLint
  config is present; otherwise use `lizard`.
- **Python**: use `radon` (cyclomatic + maintainability index); `lizard` is a
  fallback if `radon` is unavailable.
- **Rust**: use `cargo clippy` cognitive-complexity warnings; `lizard` is a
  fallback.
- **Go**: use `lizard`.
- **Any other language / no native tool**: use `lizard`.

Confirm `lizard` is installed (`uv tool install lizard`) before using the
fallback path.

### Step 2: Measure function-level complexity

**JavaScript/TypeScript (ESLint complexity rule, when configured):**

```bash
npx eslint --rule '{"complexity":["warn",1]}' --format json .
```

**JavaScript/TypeScript, Go, or any language without a native tool (lizard):**

```bash
# Warnings only — one line per function exceeding the CCN threshold
lizard -C 10 --warnings_only .

# Full machine-readable metrics for every function (CSV)
lizard --csv .
```

`lizard` emits, per function: NLOC, CCN (cyclomatic complexity), token count,
PARAM (parameter count), length, and ND (nesting depth) — the complete metric
set, so no branch counting or line counting is done by hand. Restrict to a
language when needed with `-l js`, `-l typescript`, `-l go`, etc. The
`--warnings_only` run exits non-zero when any function exceeds the threshold.

**CSV column order** (for `lizard --csv`): `NLOC, CCN, token, PARAM, length,
location, file, function, long_name, start_line, end_line`.

**Python (Radon):**
```bash
radon cc ${1:-.} -s -a --min B
radon mi ${1:-.} -s
```

**Rust:**
```bash
cargo clippy -- -W clippy::cognitive_complexity
```

### Step 3: Identify hotspots

Rank files and functions by complexity. Flag items exceeding the threshold:

| Metric | Green | Yellow | Red |
|---|---|---|---|
| Cyclomatic complexity | 1-5 | 6-10 | 11+ |
| Cognitive complexity | 1-8 | 9-15 | 16+ |
| Function length (lines) | 1-25 | 26-50 | 51+ |
| Nesting depth | 1-3 | 4 | 5+ |
| Parameters per function | 1-3 | 4-5 | 6+ |

### Step 4: Calculate file-level metrics

For each source file:
- Total functions/methods
- Average complexity per function
- Maximum complexity function
- Lines of code vs lines of logic
- Import/dependency count (coupling indicator)

The `lizard` default (non-CSV) run already prints per-file NLOC, average NLOC,
average CCN, average token count, and function count — use it for the file-level
roll-up.

### Step 5: Report results

```
Complexity Report
=================
Files analyzed: N
Functions analyzed: N
Average complexity: X.X

Hotspots (complexity > threshold):
  File                          | Function        | CC  | Lines | Depth
  src/auth/handler.ts           | validateToken   | 15  | 82    | 6
  src/api/router.ts             | handleRequest   | 12  | 64    | 5

Distribution:
  Low (1-5):    NN% of functions
  Medium (6-10): NN% of functions
  High (11+):   NN% of functions

Recommendations:
1. [file:function] Extract nested conditions into helper functions
2. [file:function] Split into smaller focused functions
3. [file:function] Replace switch with strategy pattern
```

## Post-Actions

- If many high-complexity functions → suggest `/code:refactor` for the worst offenders
- If complexity tools not installed → suggest `uv tool install lizard` (uniform, all languages) or `pip install radon` (Python)
- If setting up complexity budgets → suggest adding ESLint complexity rule via `/configure:linting`

## Agentic Optimizations

| Context | Command |
|---|---|
| Uniform CCN warnings (all languages) | `lizard -C 10 --warnings_only .` |
| Uniform full metrics (machine-readable) | `lizard --csv .` |
| JS/TS only via lizard | `lizard -l javascript -l typescript -C 10 --warnings_only .` |
| Go only via lizard | `lizard -l go -C 10 --warnings_only .` |
| Python cyclomatic | `radon cc . -s -a --min B -j` |
| Python maintainability | `radon mi . -s -j` |
| JS/TS complexity (ESLint, when configured) | `npx eslint --rule '{"complexity":["warn",1]}' --format json .` |
| Rust cognitive | `cargo clippy -- -W clippy::cognitive_complexity 2>&1` |

Files in this skill

  • SKILL.md6.9 KB
  • scripts/tests/test-code-complexity.sh5.5 KB

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…