home / skills / ratacat / claude-skills / ts-morph-analyzer

ts-morph-analyzer skill

/skills/ts-morph-analyzer

This skill helps you debug TypeScript code quickly by tracing call chains, extracting signatures and JSDoc without full file reads.

npx playbooks add skill ratacat/claude-skills --skill ts-morph-analyzer

Review the files below or copy the command above to add this skill to your agents.

Files (9)
SKILL.md
6.2 KB
---
name: ts-morph-analyzer
description: Use when debugging TypeScript/JavaScript bugs by tracing call chains, understanding unfamiliar codebases quickly, making architectural decisions, or reviewing code quality. Extract function signatures and JSDoc without full file reads, trace call hierarchies up/down, detect code smells, and follow data flow. Triggers on debugging, understanding codebase, architectural analysis, signature extraction, call tracing.
---

# TypeScript Codebase Analyzer

## Overview

Lightweight codebase analysis using ts-morph. Extract signatures, JSDoc, and call chains without flooding context with full file reads.

**Core principle:** Get maximum architectural insight with minimum token usage.

## When to Use

| Situation | Script to Use |
|-----------|---------------|
| Understand a codebase's public API quickly | `extract-signatures.ts` |
| Trace a bug through function calls | `trace-calls.ts` |
| Map what a module exports | `analyze-exports.ts` |
| Detect architectural issues before diving in | `code-smells.ts` |
| Understand import/dependency structure | `analyze-exports.ts --deps` |

## Setup

```bash
# In the skill directory
cd ~/.claude/skills/ts-morph-analyzer
npm install
```

Or run the setup script:
```bash
~/.claude/skills/ts-morph-analyzer/setup.sh
```

## Quick Reference

### Extract Signatures (Most Common)

Get function/method signatures + JSDoc without reading full files:

```bash
# All signatures in a file
npx ts-node scripts/extract-signatures.ts src/api/users.ts

# All signatures in a directory (recursive)
npx ts-node scripts/extract-signatures.ts src/

# Filter to exported only
npx ts-node scripts/extract-signatures.ts src/ --exported

# Include types and interfaces
npx ts-node scripts/extract-signatures.ts src/ --types

# Output as JSON for further processing
npx ts-node scripts/extract-signatures.ts src/ --json
```

**Output example:**
```
// src/api/users.ts

/**
 * Fetches user by ID from the database
 * @param id - User's unique identifier
 * @returns User object or null if not found
 */
export async function getUser(id: string): Promise<User | null>

/**
 * Creates a new user account
 * @throws ValidationError if email is invalid
 */
export async function createUser(data: CreateUserInput): Promise<User>
```

### Trace Call Hierarchy

Follow function calls up (who calls this?) or down (what does this call?):

```bash
# Who calls this function?
npx ts-node scripts/trace-calls.ts src/api/users.ts:getUser --up

# What does this function call?
npx ts-node scripts/trace-calls.ts src/api/users.ts:getUser --down

# Full call chain (both directions, limited depth)
npx ts-node scripts/trace-calls.ts src/api/users.ts:getUser --depth 3

# Output as tree
npx ts-node scripts/trace-calls.ts src/api/users.ts:getUser --tree
```

**Output example (--up):**
```
getUser (src/api/users.ts:15)
├── called by: handleGetUser (src/routes/users.ts:23)
│   └── called by: router.get('/users/:id') (src/routes/users.ts:8)
├── called by: validateSession (src/middleware/auth.ts:45)
└── called by: getUserProfile (src/services/profile.ts:12)
```

### Analyze Exports

Map a module's public API surface:

```bash
# What does this module export?
npx ts-node scripts/analyze-exports.ts src/api/

# Include re-exports
npx ts-node scripts/analyze-exports.ts src/ --follow-reexports

# Show dependency graph
npx ts-node scripts/analyze-exports.ts src/ --deps
```

### Detect Code Smells

Quick architectural assessment:

```bash
# Full analysis
npx ts-node scripts/code-smells.ts src/

# Specific checks
npx ts-node scripts/code-smells.ts src/ --check circular-deps
npx ts-node scripts/code-smells.ts src/ --check large-functions
npx ts-node scripts/code-smells.ts src/ --check missing-jsdoc
npx ts-node scripts/code-smells.ts src/ --check many-params
```

## Architectural Assessment Patterns

When analyzing a new codebase for potential issues:

### 1. Public API Surface First
```bash
# Get the big picture: what's exported?
npx ts-node scripts/extract-signatures.ts src/ --exported --json > api-surface.json
```
Look for: Overly complex interfaces, inconsistent naming, missing JSDoc on public APIs

### 2. Dependency Structure
```bash
# Map imports - circular deps are red flags
npx ts-node scripts/code-smells.ts src/ --check circular-deps
```
Look for: Circular dependencies, deep import chains, unclear module boundaries

### 3. Function Complexity
```bash
# Find complex functions that may need refactoring
npx ts-node scripts/code-smells.ts src/ --check large-functions --check many-params
```
Look for: Functions >50 lines, >5 parameters, deep nesting

### 4. Documentation Coverage
```bash
# Public APIs should be documented
npx ts-node scripts/code-smells.ts src/ --check missing-jsdoc --exported
```

## Following the Data Trail

When debugging, trace data flow without reading full files:

### Pattern: "Where does this value come from?"

```bash
# 1. Find who calls the function with the bad value
npx ts-node scripts/trace-calls.ts src/service.ts:processData --up --depth 5

# 2. Get signatures of callers to understand parameter flow
npx ts-node scripts/extract-signatures.ts src/caller.ts
```

### Pattern: "Where does this return value go?"

```bash
# 1. Find what uses this function's return
npx ts-node scripts/trace-calls.ts src/api.ts:fetchUser --down

# 2. Check how return values are consumed
npx ts-node scripts/trace-calls.ts src/api.ts:fetchUser --down --show-usage
```

### Pattern: "Full call chain for a bug"

```bash
# Get complete path from entry point to problem area
npx ts-node scripts/trace-calls.ts src/broken.ts:problematicFn --up --tree
```

## Script Locations

All scripts in: `~/.claude/skills/ts-morph-analyzer/scripts/`

| Script | Purpose |
|--------|---------|
| `extract-signatures.ts` | Extract function/method/class signatures with JSDoc |
| `trace-calls.ts` | Trace call hierarchies up/down |
| `analyze-exports.ts` | Map module exports and dependencies |
| `code-smells.ts` | Detect architectural issues |

## Common Issues

| Problem | Solution |
|---------|----------|
| "Cannot find module 'ts-morph'" | Run `npm install` in skill directory |
| Slow on large codebases | Add `--include "src/**/*.ts"` to limit scope |
| Missing type info | Ensure tsconfig.json is in project root |
| Memory issues | Use `--exclude "node_modules"` (default) |

Overview

This skill provides lightweight TypeScript/JavaScript codebase analysis built on ts-morph to speed debugging, architecture review, and onboarding. It extracts function and method signatures with JSDoc, traces call hierarchies up and down, detects common code smells, and maps module exports without reading entire files. The goal is maximum architectural insight with minimal context and token use.

How this skill works

The analyzer queries the AST via ts-morph to extract signatures, JSDoc comments, and export lists while avoiding full-file expansions. It traces call chains by following references and call expressions to produce caller/callee trees and limited-depth paths. Additional scripts run focused checks for circular dependencies, large functions, many parameters, and missing documentation.

When to use it

  • Debugging a bug by tracing where a value originates or where a return value is consumed
  • Quickly understanding an unfamiliar codebase’s public API surface and documentation coverage
  • Mapping module exports and dependency relationships before making architectural changes
  • Reviewing code quality to find large functions, many-parameter APIs, or circular imports
  • Extracting signatures and JSDoc to generate docs or to feed other analysis tools

Best practices

  • Limit scope for large repositories with include globs (e.g., --include "src/**/*.ts") to improve speed
  • Run extract-signatures on exported APIs first to get a high-level view before diving into internals
  • Use depth limits when tracing call chains to avoid overwhelming output on dense graphs
  • Ensure the project tsconfig.json is present so type information and references are accurate
  • Exclude node_modules and generated folders to reduce noise and memory usage

Example use cases

  • Trace callers of a failing function to find the validation gap causing incorrect input
  • Produce a JSON API surface for a module to evaluate public interface complexity
  • Detect circular dependencies and deep import chains before refactoring or splitting modules
  • Locate large functions or many-parameter methods as candidates for refactoring
  • Follow a data flow from entry point to sink to reproduce a bug without reading every file

FAQ

Do I need to install dependencies before running the scripts?

Yes. Run npm install in the skill directory or use the provided setup script to install ts-morph and runtime dependencies.

How do I limit analysis to a subset of files?

Use include/exclude globs or the --include flag to restrict the scanner to specific directories or file patterns.