Ensures code quality through clean coding standards and refactoring.

Install

mkdir -p .claude/skills/clean-code-claude-dev-suite && curl -L -o skill.zip "https://agentskills.codes/api/skills/download/17147" && unzip -o skill.zip -d .claude/skills/clean-code-claude-dev-suite && rm skill.zip

Installs to .claude/skills/clean-code-claude-dev-suite

Activation

This is the description your AI agent reads to decide when to run this skill — the better it matches your request, the more reliably it fires.

Clean code principles. Covers naming, functions, and readability. Use when writing or reviewing code for quality. USE WHEN: user mentions "code quality", "readability", "refactor", "clean up code", "naming", "magic numbers", asks about "how to write better code", "code smells", "DRY", "KISS", "YAGNI", "single responsibility" DO NOT USE FOR: SOLID principles - use `solid-principles` instead, Git workflow - use `git-workflow` instead, Performance optimization - use `performance` instead
489 chars✓ has a “when” triggerlonger than Claude Code's old 250-char listing cap (fine on current versions)
Intermediate

Key capabilities

  • Suggest better names for variables, functions, and classes
  • Refactor functions to have a single responsibility
  • Implement early returns to reduce nested conditions
  • Replace magic numbers with named constants
  • Apply DRY (Don't Repeat Yourself) principle
  • Identify and suggest fixes for anti-patterns like God Objects and deep nesting

How it works

The skill provides examples and explanations of clean code principles, demonstrating bad and good practices for naming, functions, and control flow.

Inputs & outputs

You give it
Code snippet or description of a code quality issue
You get back
Suggestions for improving code readability and maintainability

When to use clean-code

  • Refactor messy functions
  • Improve variable naming
  • Apply DRY principles

About this skill

Clean Code Core Principles

Deep Knowledge: Use mcp__documentation__fetch_docs with technology: clean-code for comprehensive documentation.

Naming

// ❌ Bad
const d = new Date();
const yyyymmdd = formatDate(d);
function calc(a, b) { return a + b; }
const list = users.filter(x => x.active);

// ✅ Good
const currentDate = new Date();
const formattedDate = formatDate(currentDate);
function calculateTotal(price, quantity) { return price * quantity; }
const activeUsers = users.filter(user => user.isActive);

Functions

// ❌ Bad - Too many responsibilities
function processUser(user) {
  validateUser(user);
  saveToDatabase(user);
  sendWelcomeEmail(user);
  updateAnalytics(user);
}

// ✅ Good - Single responsibility
function createUser(userData: UserInput): User {
  const user = validateAndBuildUser(userData);
  return userRepository.save(user);
}

// Separately handle side effects
async function onUserCreated(user: User) {
  await sendWelcomeEmail(user);
  await analytics.trackSignup(user);
}

Early Returns

// ❌ Bad - Nested conditions
function getDiscount(user) {
  if (user) {
    if (user.isPremium) {
      if (user.yearsActive > 2) {
        return 0.2;
      } else {
        return 0.1;
      }
    } else {
      return 0;
    }
  }
  return 0;
}

// ✅ Good - Early returns
function getDiscount(user: User | null): number {
  if (!user) return 0;
  if (!user.isPremium) return 0;
  if (user.yearsActive > 2) return 0.2;
  return 0.1;
}

Avoid Magic Numbers

// ❌ Bad
if (user.age >= 18 && items.length <= 10) { ... }
setTimeout(callback, 86400000);

// ✅ Good
const MINIMUM_AGE = 18;
const MAX_CART_ITEMS = 10;
const ONE_DAY_MS = 24 * 60 * 60 * 1000;

if (user.age >= MINIMUM_AGE && items.length <= MAX_CART_ITEMS) { ... }
setTimeout(callback, ONE_DAY_MS);

Principles Summary

PrincipleDescription
DRYDon't Repeat Yourself
KISSKeep It Simple, Stupid
YAGNIYou Aren't Gonna Need It
SRPSingle Responsibility Principle
CompositionFavor composition over inheritance

When NOT to Use This Skill

This skill is focused on code-level quality. Do NOT use for:

  • SOLID principles - Use solid-principles skill for OOP design principles
  • Git commit quality - Use git-workflow skill for version control best practices
  • Performance optimization - Use performance skill for speed/memory optimization
  • Security vulnerabilities - Use OWASP or security-specific skills
  • Build/tooling configuration - Use framework-specific skills (e.g., biome, vite)

Anti-Patterns

Anti-PatternWhy It's BadClean Code Solution
God ObjectClass with too many responsibilitiesSplit into focused classes (SRP)
Magic NumbersHard to understand contextUse named constants
Deep NestingDifficult to follow logicEarly returns, extract functions
Long Parameter ListsHard to use and maintainParameter objects or builder pattern
Copy-Paste CodeDuplicate bugs, hard to maintainExtract shared functions (DRY)
Vague Namesdata, temp, xIntention-revealing names
Side Effects in GettersUnexpected behaviorPure functions, separate queries from commands
Comments Instead of CodeOutdated comments, clutteredSelf-documenting code with clear names

Quick Troubleshooting

IssueCheckSolution
Complex functionCyclomatic complexity > 10Extract smaller functions, use early returns
Unreadable codeNeed comments to explainRename variables/functions, extract logic
Duplicated logicCopy-paste across filesExtract to shared utility/service
Long file> 300 linesSplit by responsibility, separate concerns
Unclear variableName doesn't reveal intentRename to describe what it contains/represents
Magic number appearingUnexplained literal valuesDefine const with descriptive name

Authoritative Sources

Production Readiness

Code Quality Gates

// eslint.config.js
export default [
  {
    rules: {
      // Complexity limits
      complexity: ['error', { max: 10 }],
      'max-depth': ['error', 4],
      'max-lines-per-function': ['warn', { max: 50 }],
      'max-params': ['warn', { max: 4 }],

      // Maintainability
      'no-duplicate-imports': 'error',
      'no-else-return': 'error',
      'prefer-const': 'error',
      'no-var': 'error',
    },
  },
];

// biome.json
{
  "linter": {
    "rules": {
      "complexity": {
        "noExcessiveCognitiveComplexity": {
          "level": "error",
          "options": { "maxAllowedComplexity": 15 }
        }
      }
    }
  }
}

Error Handling Patterns

// Custom error hierarchy
class AppError extends Error {
  constructor(
    message: string,
    public code: string,
    public statusCode: number = 500,
    public isOperational: boolean = true
  ) {
    super(message);
    this.name = this.constructor.name;
    Error.captureStackTrace(this, this.constructor);
  }
}

class ValidationError extends AppError {
  constructor(message: string) {
    super(message, 'VALIDATION_ERROR', 400);
  }
}

class NotFoundError extends AppError {
  constructor(resource: string, id: string) {
    super(`${resource} not found: ${id}`, 'NOT_FOUND', 404);
  }
}

// Error boundary pattern
async function handleRequest<T>(operation: () => Promise<T>): Promise<Result<T>> {
  try {
    const data = await operation();
    return { success: true, data };
  } catch (error) {
    if (error instanceof AppError && error.isOperational) {
      return { success: false, error };
    }
    // Log unexpected errors
    logger.error('Unexpected error', { error });
    throw error; // Re-throw for crash recovery
  }
}

Code Review Automation

# .github/workflows/code-quality.yml
name: Code Quality

on: [push, pull_request]

jobs:
  quality:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: SonarCloud Scan
        uses: SonarSource/sonarcloud-github-action@master
        env:
          SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}

      - name: Check cognitive complexity
        run: npx @biomejs/biome check --diagnostic-level=error .

      - name: Detect code duplication
        run: npx jscpd src/ --threshold 5

Testing Standards

// Test naming convention
describe('UserService', () => {
  describe('createUser', () => {
    it('should create user with valid data', async () => {
      // Arrange
      const userData = { name: 'John', email: '[email protected]' };

      // Act
      const user = await userService.createUser(userData);

      // Assert
      expect(user.id).toBeDefined();
      expect(user.name).toBe('John');
    });

    it('should throw ValidationError for invalid email', async () => {
      // Arrange
      const invalidData = { name: 'John', email: 'invalid' };

      // Act & Assert
      await expect(userService.createUser(invalidData))
        .rejects.toThrow(ValidationError);
    });
  });
});

// Test coverage thresholds
// vitest.config.ts
{
  test: {
    coverage: {
      provider: 'v8',
      thresholds: {
        branches: 80,
        functions: 80,
        lines: 80,
        statements: 80,
      },
    },
  },
}

Documentation Standards

/**
 * Creates a new user in the system.
 *
 * @param data - User creation data
 * @returns The created user with generated ID
 * @throws {ValidationError} If the data is invalid
 * @throws {ConflictError} If email already exists
 *
 * @example
 * ```ts
 * const user = await createUser({
 *   name: 'John Doe',
 *   email: '[email protected]'
 * });
 * ```
 */
async function createUser(data: CreateUserData): Promise<User> {
  // Implementation
}

// README template for modules
/**
 * # User Module
 *
 * ## Overview
 * Handles user management including CRUD operations.
 *
 * ## Usage
 * ```ts
 * import { UserService } from './user';
 * const service = new UserService(repository);
 * ```
 *
 * ## API
 * - `createUser(data)` - Creates a new user
 * - `getUser(id)` - Retrieves user by ID
 * - `updateUser(id, data)` - Updates user data
 */

Monitoring Metrics

MetricTarget
Cognitive complexity< 15
Cyclomatic complexity< 10
Code duplication< 5%
Test coverage> 80%
Technical debt ratio< 5%

Checklist

  • Meaningful variable/function names
  • Single responsibility functions
  • Early returns to reduce nesting
  • Constants for magic numbers
  • Consistent error handling
  • Complexity limits in linter
  • Test coverage thresholds
  • JSDoc for public APIs
  • Code duplication detection
  • SonarQube quality gate

Reference Documentation

When not to use it

  • For SOLID principles
  • For Git workflow
  • For Performance optimization

Limitations

  • Does not cover SOLID principles
  • Does not cover Git commit quality
  • Does not cover performance optimization

How it compares

This approach offers concrete code examples and refactoring patterns to improve code quality, rather than just theoretical guidelines.

Compared to similar skills

clean-code side by side with the closest alternatives in the catalog.

SkillInstallsUpdatedSafetyDifficulty
clean-code (this skill)05moNo flagsIntermediate
effective-go32310moNo flagsBeginner
solid-principles579moNo flagsIntermediate
typescript-review392moNo flagsIntermediate

Try saying

Example prompts that trigger this skill in your AI assistant.

You might also like

effective-go

openshift

Apply Go best practices, idioms, and conventions from golang.org/doc/effective_go. Use when writing, reviewing, or refactoring Go code to ensure idiomatic, clean, and efficient implementations.

323536

solid-principles

SmidigStorm

Enforce SOLID principles (Single Responsibility, Open/Closed, Liskov Substitution, Interface Segregation, Dependency Inversion) in object-oriented design. Use when writing or reviewing classes and modules.

57236

typescript-review

metabase

Review TypeScript and JavaScript code changes for compliance with Metabase coding standards, style violations, and code quality issues. Use when reviewing pull requests or diffs containing TypeScript/JavaScript code.

39178

ast-grep

ast-grep

Guide for writing ast-grep rules to perform structural code search and analysis. Use when users need to search codebases using Abstract Syntax Tree (AST) patterns, find specific code structures, or perform complex code queries that go beyond simple text search. This skill should be used when users ask to search for code patterns, find specific language constructs, or locate code with particular structural characteristics.

17135

serena

massgen

This skill provides symbol-level code understanding and navigation using Language Server Protocol (LSP). Enables IDE-like capabilities for finding symbols, tracking references, and making precise code edits at the symbol level.

1597

typescript

lobehub

TypeScript code style and optimization guidelines. Use when writing TypeScript code (.ts, .tsx, .mts files), reviewing code quality, or implementing type-safe patterns. Triggers on TypeScript development, type safety questions, or code style discussions.

2877

Search skills

Search the agent skills registry