Skill
Community

dry-check

Install
1
Install the plugin
$
npx claudepluginhub metasaver/metasaver-marketplace --plugin core-claude-plugin

Want just this skill?

Then install: npx claudepluginhub u/[userId]/[slug]

Description

Scans new/modified code against multi-mono shared libraries (@metasaver/core-utils, @metasaver/core-service-utils, @metasaver/core-components) to detect DRY violations. Use when auditing code for duplicate functions, types, or components that already exist in shared packages. Returns violation reports with suggested import replacements.

Tool Access

This skill uses the workspace's default tool permissions.

Supporting Assets
View in Repository
templates/extraction-patterns.txt
templates/scan-script.sh.template
templates/violation-report.txt
Skill Content

DRY Check Skill

Purpose: Prevent code duplication by scanning new/modified code against multi-mono shared libraries.

Use when:

  • Running Standards Audit phase
  • Reviewing pull requests for DRY violations
  • Checking if utility function already exists
  • Validating components use @metasaver/core-components
  • Ensuring services use @metasaver/core-service-utils

Target libraries (packages/):

  • @metasaver/core-utils - String helpers (capitalize, toKebabCase, toCamelCase), color helpers, style helpers (cn)
  • @metasaver/core-service-utils - Service factory, middleware, auth, health checks
  • @metasaver/core-database - Database client utilities
  • @metasaver/core-agent-utils - Agent factory patterns
  • @metasaver/core-mcp-utils - MCP server utilities
  • @metasaver/core-workflow-utils - Workflow with HITL

Target components (components/):

  • @metasaver/core-components - Core UI: ZButton, ZCard, ZDataTable, ZErrorBoundary, ZLoading
  • @metasaver/core-layouts - Layouts: ZAdminLayout, ZUserDropdown, useImpersonation

What This Skill Catches

Violation TypeLibraryExamples
String utilities@metasaver/core-utilscapitalize(), toKebabCase(), toCamelCase()
Style utilities@metasaver/core-utilscn(), getColorClasses()
Service patterns@metasaver/core-service-utilscreateService(), authMiddleware(), healthCheck()
Database clients@metasaver/core-databasecreateClient(), database types
Core UI components@metasaver/core-componentsZButton, ZCard, ZDataTable, ZErrorBoundary
Layout components@metasaver/core-layoutsZAdminLayout, ZUserDropdown, useImpersonation

Workflow

1. Identify Modified Files

Get list of new/modified files from git:

# Staged files
git diff --cached --name-only --diff-filter=AM

# Uncommitted changes
git diff --name-only --diff-filter=AM

# Specific branch vs main
git diff main...HEAD --name-only --diff-filter=AM

Filter to code files only: .ts, .tsx, .js, .jsx

2. Extract Signatures

For each modified file, extract:

  • Function signatures: export function functionName(), export const functionName = ()
  • Type definitions: export type TypeName, export interface InterfaceName
  • Component definitions: export function ComponentName(), export const ComponentName: React.FC
  • Zod schemas: export const schemaName = z.object()

Use Grep tool with patterns from templates/extraction-patterns.txt

3. Scan Shared Libraries

For each extracted signature, check if similar exists in shared packages:

Scan multi-mono packages/:

# Search utils for function
grep -r "export.*functionName" packages/utils/src/

# Search service-utils for middleware/factory
grep -r "export.*functionName" packages/service-utils/src/

# Search database for client utilities
grep -r "export.*functionName" packages/database/src/

Scan multi-mono components/:

# Search core components
grep -r "export.*ZComponentName" components/core/src/

# Search layouts
grep -r "export.*ZLayoutName" components/layouts/src/

Use fuzzy matching for similar names (e.g., capitalize matches toCapitalize, capitalizeFirst)

4. Compare Implementations

If potential match found:

  1. Read both implementations (new code vs library)
  2. Compare function signatures and logic
  3. Calculate similarity score (0-100%)
  4. Flag if similarity > 70%

Comparison heuristics:

  • Same parameter count and types = +30%
  • Same return type = +20%
  • Similar variable names = +20%
  • Similar control flow = +30%

5. Generate Report

For each violation, output using format from templates/violation-report.txt:

āŒ VIOLATION: [file]:[line] [signature]
   Duplicates: @metasaver/[package]/[module].[export]
   Similarity: [score]%
   FIX: import { [export] } from '@metasaver/[package]/[module]'

   [Brief comparison of implementations]

For clean scans:

āœ… DRY CHECK PASSED
   Files scanned: [count]
   Signatures checked: [count]
   No duplications found

Output Format

See templates/violation-report.txt for complete format specification.

Console output example:

šŸ” DRY CHECK: Scanning 3 modified files...

āŒ VIOLATION: src/utils/text.ts:5 capitalize()
   Duplicates: @metasaver/core-utils.capitalize()
   Similarity: 95%
   FIX: import { capitalize } from '@metasaver/core-utils'

   Both implementations capitalize first letter using same algorithm.

āŒ VIOLATION: src/components/Button.tsx:10 Button
   Duplicates: @metasaver/core-components.ZButton
   Similarity: 85%
   FIX: import { ZButton } from '@metasaver/core-components'

   Local Button component has same props and styling as ZButton.

šŸ“Š SUMMARY:
   Files scanned: 3
   Signatures checked: 12
   Violations: 2
   Clean signatures: 10

Examples

Example 1: String Helper Violation

Input:

// src/utils/text.ts
export function capitalize(str: string): string {
  return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase();
}

Output:

āŒ VIOLATION: src/utils/text.ts:2 capitalize()
   Duplicates: @metasaver/core-utils.capitalize()
   Similarity: 100%
   FIX: import { capitalize } from '@metasaver/core-utils'

Example 2: Component Duplication

Input:

// src/components/Button.tsx
export function Button({ children, variant, onClick }) {
  return (
    <button className={buttonVariants({ variant })} onClick={onClick}>
      {children}
    </button>
  );
}

Output:

āŒ VIOLATION: src/components/Button.tsx:2 Button
   Duplicates: @metasaver/core-components.ZButton
   Similarity: 90%
   FIX: import { ZButton } from '@metasaver/core-components'

Example 3: Clean Scan

Input: 3 modified files with unique implementations

Output:

āœ… DRY CHECK PASSED
   Files scanned: 3
   Signatures checked: 8
   No duplications found

Template Files

  • templates/extraction-patterns.txt - Regex patterns for extracting signatures
  • templates/violation-report.txt - Output format specification
  • templates/scan-script.sh.template - Shell script for batch scanning

Tool Usage

StepToolPurpose
1BashRun git diff to get modified files
2GrepExtract function/type signatures
3Bash/GrepSearch shared library packages
4ReadCompare implementations
5Direct outputFormat and display results

Related Skills

  • /skill cross-cutting/coding-standards - DRY principle reference
  • /skill cross-cutting/serena-code-reading - Code analysis workflow
  • /skill domain/monorepo-audit - Monorepo structure validation
Stats
Stars0
Forks0
Last CommitDec 16, 2025

Similar Skills