A code-smell detection CLI tool that scans repositories for common issues
npm install software-entropy

A code-smell detection CLI tool that scans code repositories for common issues like long functions, large files, and TODO/FIXME density.
- ๐ Pluggable Rule System: Easy to extend with custom rules
- ๐ Multiple Output Formats: JSON and pretty console output
- ๐ฏ Common Code Smells: Detects long functions, large files, TODO/FIXME density
- ๐งช Well Tested: Comprehensive Jest test suite
- โก Fast: Efficient scanning with configurable file patterns
``bash`
npm install
npm run build
`bash`
npm start --
- -o, --output : Output JSON report to file--json
- : Output only JSON (no pretty report)--no-pretty
- : Disable pretty console output--max-function-lines
- : Maximum lines per function (default: 50)--max-file-lines
- : Maximum lines per file (default: 500)--max-todo-density
- : Maximum TODO/FIXME density per 100 lines (default: 5)--include
- : Comma-separated glob patterns to include--exclude
- : Comma-separated glob patterns to exclude
`bashScan current directory
npm start -- .
Rules
$3
Detects functions that exceed a specified line count threshold.
Default threshold: 50 lines
$3
Detects files that exceed a specified line count threshold.
Default threshold: 500 lines
$3
Detects files with high density of TODO, FIXME, XXX, HACK, or NOTE comments.
Default threshold: 5% (5 per 100 lines)
Creating Custom Rules
Rules implement the
Rule interface and extend BaseRule:`typescript
import { BaseRule } from './rules/Rule';
import { RuleContext, CodeSmell } from './types';export class MyCustomRule extends BaseRule {
name = 'my-custom-rule';
description = 'Detects my custom code smell';
run(context: RuleContext): CodeSmell[] {
const smells: CodeSmell[] = [];
// Your detection logic here
if (/ condition /) {
smells.push(
this.createSmell(
'Your message here',
context.file,
'medium', // or 'low' or 'high'
lineNumber, // optional
columnNumber, // optional
{ / optional metadata / }
)
);
}
return smells;
}
}
`Then add your rule to the scanner:
`typescript
import { Scanner } from './scanner';
import { MyCustomRule } from './rules/MyCustomRule';const rules = [new MyCustomRule()];
const scanner = new Scanner(rules);
`Development
$3
`bash
npm run build
`$3
`bash
npm test
npm run test:watch
npm run test:coverage
`Project Structure
`
software-entropy/
โโโ src/
โ โโโ cli.ts # CLI entry point
โ โโโ scanner.ts # Core scanning engine
โ โโโ report.ts # Report generation
โ โโโ types.ts # TypeScript type definitions
โ โโโ rules/ # Pluggable rules
โ โ โโโ Rule.ts # Base rule class
โ โ โโโ LongFunctionRule.ts
โ โ โโโ LargeFileRule.ts
โ โ โโโ TodoFIXMERule.ts
โ โ โโโ index.ts
โ โโโ reporters/ # Report generators
โ โโโ JsonReporter.ts
โ โโโ PrettyReporter.ts
โ โโโ index.ts
โโโ dist/ # Compiled output
โโโ tests/ # Test files
``MIT