Skip to content
Back to skills

Jsharpener Lawless M Earwig

ASecurity

JavaScript/TypeScript static analysis tool for call graphs, unused code detection (tree shaking), dependency analysis, and circular dependency detection

  • 666 stars
  • 0 votes
  • 0 copies
  • 2 views
  • Added February 9, 2026
developmentjavascripttypescriptgojavashellbashreactnoderefactoringgit

Works with

  • vscode
  • cli
  • api

Security analysis

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

Pro shows the line behind each finding and how to fix it

Scanned February 10, 2026

npx -y skills add majiayu000/claude-skill-registry --skill jsharpener-lawless-m-earwig --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Jsharpener Lawless M Earwig?

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

Security grade badge for Jsharpener Lawless M Earwig
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/majiayu000-jsharpener-lawless-m-earwig/badge)](https://www.skillsdirectory.com/skills/majiayu000-jsharpener-lawless-m-earwig)

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: JSharpener
description: JavaScript/TypeScript static analysis tool for call graphs, unused code detection (tree shaking), dependency analysis, and circular dependency detection
---

# JSharpener - JavaScript/TypeScript Code Analysis

JSharpener is a TypeScript Compiler API-based static analysis tool that analyzes JavaScript and TypeScript codebases to build call graphs, identify unused code, detect circular dependencies, and help with refactoring decisions.

## Executable Location

`C:\Users\matthew.heath\Git\JSharpener\dist\cli\index.js`

Run with: `node "C:\Users\matthew.heath\Git\JSharpener\dist\cli\index.js" <command>`

**Note:** If the executable is not available, rebuild from source:
```bash
cd C:\Users\matthew.heath\Git\JSharpener
npm install
npm run build
```

## Available Commands

### 1. analyze - Project Analysis
Performs comprehensive analysis including file count, function count, class count, and import/export statistics.

```bash
node "C:\Users\matthew.heath\Git\JSharpener\dist\cli\index.js" analyze [path]
```

**Options:**
- `path`: Directory or file to analyze (default: current directory)
- `-o, --output <file>`: Save results to JSON file
- `--include <pattern...>`: File patterns to include (e.g., "src/**/*.ts")
- `--exclude <pattern...>`: File patterns to exclude (e.g., "**/*.test.ts")
- `--config <file>`: Path to config file (jsharpener.json)

**Example:**
```bash
node "C:\Users\matthew.heath\Git\JSharpener\dist\cli\index.js" analyze ./src
```

**Output:**
```
JSharpener Analysis Summary
════════════════════════════════════════════════════════════

Files analyzed: 15
Functions: 42
Classes: 8
Imports: 67
Exports: 28
```

### 2. callgraph - Generate Call Graph
Generates Graphviz DOT format call graphs showing function dependencies.

```bash
node "C:\Users\matthew.heath\Git\JSharpener\dist\cli\index.js" callgraph [path] -o output.dot
```

**Options:**
- `path`: Directory or file to analyze
- `-o, --output <file>`: Output DOT file (required)
- `--function <name>`: Focus on specific function
- `--reverse`: Show reverse call graph (what calls this function)
- `--depth <n>`: Maximum depth to traverse (default: 10)
- `--module-level`: Show module dependencies only
- `--config <file>`: Config file path

**Examples:**
```bash
# Full call graph
node "C:\Users\matthew.heath\Git\JSharpener\dist\cli\index.js" callgraph ./src -o callgraph.dot

# Focus on specific function
node "C:\Users\matthew.heath\Git\JSharpener\dist\cli\index.js" callgraph ./src --function processData -o callgraph.dot

# Reverse call graph (who calls this)
node "C:\Users\matthew.heath\Git\JSharpener\dist\cli\index.js" callgraph ./src --function processData --reverse -o callers.dot

# Module-level dependencies
node "C:\Users\matthew.heath\Git\JSharpener\dist\cli\index.js" callgraph ./src --module-level -o modules.dot
```

**Visualize the graph:**
```bash
# Convert to SVG
dot -Tsvg callgraph.dot -o callgraph.svg

# Convert to PNG
dot -Tpng callgraph.dot -o callgraph.png

# Open in browser (if GraphvizOnline)
# Upload the .dot file to https://dreampuf.github.io/GraphvizOnline/
```

### 3. treeshake - Find Unused Code
Detects unused exports, functions, variables, and imports (dead code detection).

```bash
node "C:\Users\matthew.heath\Git\JSharpener\dist\cli\index.js" treeshake [path]
```

**Options:**
- `path`: Directory or file to analyze
- `-o, --output <file>`: Save report to file
- `--entry <file...>`: Entry point(s) for reachability analysis
- `--format <type>`: Output format: json or text (default: text)
- `--config <file>`: Config file path

**Examples:**
```bash
# Analyze entire project
node "C:\Users\matthew.heath\Git\JSharpener\dist\cli\index.js" treeshake ./src

# With entry points
node "C:\Users\matthew.heath\Git\JSharpener\dist\cli\index.js" treeshake ./src --entry src/index.ts --entry src/cli.ts

# JSON output
node "C:\Users\matthew.heath\Git\JSharpener\dist\cli\index.js" treeshake ./src --format json -o unused.json
```

**Output:**
```
JSharpener Tree Shaking Report
════════════════════════════════════════════════════════════

Unused Exports (3):
  • src/utils/helper.ts:14: unusedFunction
  • src/services/old.ts:22: deprecatedMethod
  • src/lib/legacy.ts:8: oldHelper

Unused Functions (5):
  • src/utils/helper.ts:18: helperFunction
  • src/index.ts:7: unusedLocalFunction
  • src/services/data.ts:45: processOldFormat
  • src/lib/utils.ts:12: debugHelper
  • src/lib/utils.ts:89: tempFunction

Unused Variables (2):
  • src/config.ts:5: LEGACY_MODE
  • src/constants.ts:18: OLD_API_URL

Unused Imports (4):
  • src/index.ts:2: import { oldUtil } from './old'
  • src/services/api.ts:5: import { deprecated } from './legacy'
  • src/utils/format.ts:3: import * as unused from './unused'
  • src/lib/helpers.ts:1: import { temp } from './temp'

Potential Savings:
  • 87 lines of code could be removed
  • Estimated size reduction: 2.14 KB
```

### 4. deps - Dependency Analysis
Analyzes dependencies, finds circular dependencies, and shows external package usage.

```bash
node "C:\Users\matthew.heath\Git\JSharpener\dist\cli\index.js" deps [path]
```

**Options:**
- `path`: Directory or file to analyze
- `-o, --output <file>`: Save results to file
- `--circular`: Only show circular dependencies
- `--external`: Analyze external package usage
- `--config <file>`: Config file path

**Examples:**
```bash
# Full dependency analysis
node "C:\Users\matthew.heath\Git\JSharpener\dist\cli\index.js" deps ./src

# Only circular dependencies
node "C:\Users\matthew.heath\Git\JSharpener\dist\cli\index.js" deps ./src --circular

# External package analysis
node "C:\Users\matthew.heath\Git\JSharpener\dist\cli\index.js" deps ./src --external
```

**Output:**
```
JSharpener Dependency Analysis
════════════════════════════════════════════════════════════

Circular Dependencies (2):
  1. src/circular-a.ts → src/circular-b.ts → src/circular-a.ts
  2. src/services/user.ts → src/services/auth.ts → src/services/session.ts → src/services/user.ts

Module Dependencies:
  • src/index.ts imports 5 modules
  • src/services/api.ts imports 8 modules
  • src/utils/helper.ts imports 3 modules

External Dependencies (5):
  • typescript: 23 imports
  • commander: 4 imports
  • fast-glob: 6 imports
  • chalk: 12 imports
  • ora: 3 imports
```

## Configuration File

Create a `jsharpener.json` file in your project root:

```json
{
  "include": ["src/**/*.ts", "src/**/*.js"],
  "exclude": ["**/*.test.ts", "**/*.spec.js", "node_modules/**", "dist/**"],
  "entryPoints": ["src/index.ts", "src/cli/index.ts"],
  "followDynamicImports": true,
  "includeExternalDeps": false,
  "detectCircular": true
}
```

**Config Options:**
- `include`: Glob patterns for files to include
- `exclude`: Glob patterns for files to exclude
- `entryPoints`: Entry points for tree shaking analysis
- `followDynamicImports`: Track dynamic imports (default: true)
- `includeExternalDeps`: Include external packages in analysis (default: false)
- `detectCircular`: Detect circular dependencies (default: true)

## Usage Examples for Claude

### Example 1: Analyze Project
**User Request:** "Analyze my TypeScript project"

**Claude Action:**
```bash
node "C:\Users\matthew.heath\Git\JSharpener\dist\cli\index.js" analyze ./src
```

**Interpretation:**
- Shows file count, function count, class count
- Provides import/export statistics
- Good for getting project overview

### Example 2: Find Unused Code
**User Request:** "Find unused code in my project"

**Claude Action:**
```bash
node "C:\Users\matthew.heath\Git\JSharpener\dist\cli\index.js" treeshake ./src --entry src/index.ts
```

**Interpretation:**
- Lists unused exports (safe to remove if not part of public API)
- Lists unused functions (can be deleted)
- Lists unused variables (can be removed)
- Lists unused imports (clean up import statements)
- Provides size savings estimate

### Example 3: Generate Call Graph
**User Request:** "Show me the call graph for the processData function"

**Claude Action:**
```bash
node "C:\Users\matthew.heath\Git\JSharpener\dist\cli\index.js" callgraph ./src --function processData -o callgraph.dot
dot -Tsvg callgraph.dot -o callgraph.svg
```

**Interpretation:**
- Creates visual diagram showing what processData calls
- Use `--reverse` to see who calls processData
- SVG can be viewed in browser or editor

### Example 4: Detect Circular Dependencies
**User Request:** "Are there any circular dependencies in my code?"

**Claude Action:**
```bash
node "C:\Users\matthew.heath\Git\JSharpener\dist\cli\index.js" deps ./src --circular
```

**Interpretation:**
- Lists all circular dependency chains
- Each chain shows the import cycle
- Circular dependencies should be refactored to break the cycle

### Example 5: Module-Level Dependency Graph
**User Request:** "Show me how my modules depend on each other"

**Claude Action:**
```bash
node "C:\Users\matthew.heath\Git\JSharpener\dist\cli\index.js" callgraph ./src --module-level -o modules.dot
dot -Tsvg modules.dot -o modules.svg
```

**Interpretation:**
- Shows high-level module dependencies
- Helps understand architecture
- Useful for refactoring planning

## Common Patterns

### Refactoring Workflow
1. Find unused code: `treeshake --entry src/index.ts`
2. Review unused exports (might be public API)
3. Delete unused functions and variables
4. Remove unused imports
5. Re-run analysis to verify

### Understanding Code Flow
1. Generate call graph: `callgraph --function main -o main.dot`
2. Visualize: `dot -Tsvg main.dot -o main.svg`
3. Explore dependencies: `deps`
4. Check for circular dependencies: `deps --circular`

### Code Review Preparation
1. Run full analysis: `analyze ./src -o analysis.json`
2. Find dead code: `treeshake ./src -o unused.txt`
3. Check dependencies: `deps ./src -o deps.txt`
4. Generate graphs for key functions

### CI/CD Integration
```yaml
# Example GitHub Actions workflow
- name: Check for unused code
  run: |
    node "C:\Users\matthew.heath\Git\JSharpener\dist\cli\index.js" treeshake ./src --format json -o unused.json

- name: Detect circular dependencies
  run: |
    node "C:\Users\matthew.heath\Git\JSharpener\dist\cli\index.js" deps ./src --circular

- name: Upload analysis
  uses: actions/upload-artifact@v3
  with:
    name: code-analysis
    path: |
      unused.json
      deps.txt
```

## Limitations

This is a first version with some known limitations:

1. **Method Call Tracking**: Method calls through object instances may not be fully tracked in the call graph
2. **Dynamic Imports**: Dynamic imports (`import()`) are not fully supported
3. **Module Resolution**: Some edge cases in module resolution may not be handled
4. **Variable Usage**: Variable usage tracking is simplified
5. **JSX/TSX**: Limited support for React JSX/TSX files
6. **Eval/Dynamic Code**: Code using `eval()` or dynamic code generation is not analyzed

## Performance Tips

1. **Use Patterns**: Narrow analysis with `--include` and `--exclude` patterns
2. **Exclude Tests**: Use `--exclude "**/*.test.ts" "**/*.spec.ts"` for faster analysis
3. **Module-Level Graphs**: Use `--module-level` for high-level overview instead of full call graph
4. **Limit Depth**: Use `--depth 5` for large projects to limit call graph depth
5. **Entry Points**: Specify entry points for more accurate tree shaking

## Troubleshooting

### "No files found"
- Check path is correct
- Verify include/exclude patterns
- Try absolute path instead of relative

### "TypeScript errors"
- Project doesn't need to compile for analysis to work
- JSharpener uses TypeScript Compiler API with permissive settings
- Syntax errors may cause files to be skipped

### Call graph is too large
- Use `--function` to focus on specific function
- Use `--depth` to limit traversal
- Use `--module-level` for high-level view
- Exclude test files

### Unused code detection misses something
- Specify entry points with `--entry`
- Check if code is used via dynamic imports
- Verify include/exclude patterns

### Module resolution errors
- Check tsconfig.json paths
- Verify import statements are correct
- Some complex module resolution may not work

## Integration with Other Tools

### Graphviz
```bash
# Install Graphviz for visualization
# Windows: choco install graphviz
# macOS: brew install graphviz
# Linux: apt-get install graphviz

# Convert DOT to various formats
dot -Tsvg callgraph.dot -o callgraph.svg    # SVG
dot -Tpng callgraph.dot -o callgraph.png    # PNG
dot -Tpdf callgraph.dot -o callgraph.pdf    # PDF
```

### VS Code
```json
// .vscode/tasks.json
{
  "version": "2.0.0",
  "tasks": [
    {
      "label": "JSharpener: Analyze",
      "type": "shell",
      "command": "node",
      "args": [
        "C:/Users/matthew.heath/Git/JSharpener/dist/cli/index.js",
        "analyze",
        "${workspaceFolder}/src"
      ]
    },
    {
      "label": "JSharpener: Find Unused Code",
      "type": "shell",
      "command": "node",
      "args": [
        "C:/Users/matthew.heath/Git/JSharpener/dist/cli/index.js",
        "treeshake",
        "${workspaceFolder}/src"
      ]
    }
  ]
}
```

### ESLint Plugin (Future)
```js
// Potential integration with ESLint
module.exports = {
  plugins: ['jsharpener'],
  rules: {
    'jsharpener/no-circular-deps': 'error',
    'jsharpener/no-unused-exports': 'warn'
  }
};
```

## Future Enhancements

- HTML code browser with cross-references (LXR-style)
- JSDoc/TypeScript documentation generator
- Improved method call tracking through object instances
- Full JSX/TSX support
- Watch mode for continuous analysis
- VS Code extension with inline warnings
- ESLint plugin integration
- Webpack/Rollup plugin for tree shaking optimization
- Type dependency graph
- Import cost analysis

## Notes

- JSharpener uses TypeScript Compiler API (same as VS Code)
- Works with both JavaScript and TypeScript files
- Analyzes code without executing it (static analysis)
- No runtime dependencies needed in analyzed project
- Thread-safe and can analyze multiple projects in parallel
- Results are deterministic (same input = same output)

## Support

- GitHub: https://github.com/lawless-m/JSharpener (to be published)
- Built with TypeScript Compiler API
- Inspired by CSharpener

## Quick Reference

```bash
# Basic commands
analyze [path]                    # Project statistics
callgraph [path] -o file.dot     # Generate call graph
treeshake [path]                  # Find unused code
deps [path]                       # Dependency analysis

# Common options
--include "src/**/*.ts"          # Include pattern
--exclude "**/*.test.ts"         # Exclude pattern
--config jsharpener.json         # Config file
-o output.file                   # Output file

# Call graph options
--function name                  # Focus on function
--reverse                        # Reverse call graph
--depth 5                        # Limit depth
--module-level                   # Module view

# Tree shaking options
--entry src/index.ts            # Entry point
--format json                   # JSON output

# Dependency options
--circular                      # Only circular deps
--external                      # External packages
```

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…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.