home / skills / rsmdt / the-startup / pattern-detection

This skill helps you identify and apply consistent project patterns across codebases, ensuring naming, architecture, and testing conventions match established

npx playbooks add skill rsmdt/the-startup --skill pattern-detection

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

Files (2)
SKILL.md
5.5 KB
---
name: pattern-detection
description: Identify existing codebase patterns (naming conventions, architectural patterns, testing patterns) to maintain consistency. Use when generating code, reviewing changes, or understanding established practices. Ensures new code aligns with project conventions.
---

# Pattern Recognition

## When to Use

- Before writing new code to ensure consistency with existing patterns
- During code review to verify alignment with established conventions
- When onboarding to understand project-specific practices
- Before refactoring to preserve intentional design decisions

## Core Methodology

### Pattern Discovery Process

1. **Survey representative files**: Read 3-5 files of the type you will create or modify
2. **Identify recurring structures**: Note repeated patterns in naming, organization, imports
3. **Verify intentionality**: Check if patterns are documented or consistently applied
4. **Apply discovered patterns**: Use the same conventions in new code

### Priority Order for Pattern Sources

1. **Existing code in the same module/feature** - Most authoritative
2. **Project style guides or CONTRIBUTING.md** - Explicit documentation
3. **Test files** - Often reveal expected patterns and naming
4. **Similar files in adjacent modules** - Fallback when no direct examples exist

## Naming Convention Recognition

### File Naming Patterns

Detect and follow the project's file naming style:

| Pattern | Example | Common In |
|---------|---------|-----------|
| kebab-case | `user-profile.ts` | Node.js, Vue, Angular |
| PascalCase | `UserProfile.tsx` | React components |
| snake_case | `user_profile.py` | Python |
| camelCase | `userProfile.js` | Legacy JS, Java |

### Function/Method Naming

Identify the project's verb conventions:

- **get** vs **fetch** vs **retrieve** for data access
- **create** vs **add** vs **new** for creation
- **update** vs **set** vs **modify** for mutations
- **delete** vs **remove** vs **destroy** for deletion
- **is/has/can/should** prefixes for booleans

### Variable Naming

Detect pluralization and specificity patterns:

- Singular vs plural for collections (`user` vs `users` vs `userList`)
- Hungarian notation presence (`strName`, `iCount`)
- Private member indicators (`_private`, `#private`, `mPrivate`)

## Architectural Pattern Recognition

### Layer Identification

Recognize how the codebase separates concerns:

```
COMMON LAYERING PATTERNS:
- MVC: controllers/, models/, views/
- Clean Architecture: domain/, application/, infrastructure/
- Hexagonal: core/, adapters/, ports/
- Feature-based: features/auth/, features/billing/
- Type-based: components/, services/, utils/
```

### Dependency Direction

Identify import patterns that reveal architecture:

- Which modules import from which (dependency flow)
- Shared vs feature-specific code boundaries
- Framework code vs application code separation

### State Management Patterns

Recognize how state flows through the application:

- Global stores (Redux, Vuex, MobX patterns)
- React Context usage patterns
- Service layer patterns for backend state
- Event-driven vs request-response patterns

## Testing Pattern Recognition

### Test Organization

Identify how tests are structured:

| Pattern | Structure | Example |
|---------|-----------|---------|
| Co-located | `src/user.ts`, `src/user.test.ts` | Common in modern JS/TS |
| Mirror tree | `src/user.ts`, `tests/src/user.test.ts` | Traditional, Java-style |
| Feature-based | `src/user/`, `src/user/__tests__/` | React, organized features |

### Test Naming Conventions

Detect the project's test description style:

- **BDD style**: `it('should return user when found')`
- **Descriptive**: `test('getUser returns user when id exists')`
- **Function-focused**: `test_get_user_returns_user_when_found`

### Test Structure Patterns

Recognize Arrange-Act-Assert or Given-When-Then patterns:

- Setup block conventions (beforeEach, fixtures, factories)
- Assertion style (expect vs assert vs should)
- Mock/stub patterns (jest.mock vs sinon vs manual)

## Code Organization Patterns

### Import Organization

Identify import ordering and grouping:

```
COMMON IMPORT PATTERNS:
1. External packages first, internal modules second
2. Grouped by type (React, libraries, local)
3. Alphabetized within groups
4. Absolute imports vs relative imports preference
```

### Export Patterns

Recognize module boundary conventions:

- Default exports vs named exports preference
- Barrel files (index.ts re-exports) presence
- Public API definition patterns

### Comment and Documentation Patterns

Identify documentation conventions:

- JSDoc/TSDoc presence and style
- Inline comment frequency and style
- README conventions per module/feature

## Best Practices

- **Follow existing patterns even if imperfect** - Consistency trumps personal preference
- **Document deviations explicitly** - When breaking patterns intentionally, explain why
- **Pattern changes require migration** - Dont introduce new patterns without updating existing code
- **Check tests for patterns too** - Test code often reveals expected conventions
- **Prefer explicit over implicit** - When patterns are unclear, ask or document assumptions

## Anti-Patterns to Avoid

- Mixing naming conventions in the same codebase
- Introducing new architectural patterns without team consensus
- Assuming patterns from other projects apply here
- Ignoring test patterns when writing implementation
- Creating "special" files that dont follow established structure

## References

- `examples/common-patterns.md` - Concrete examples of pattern recognition in action

Overview

This skill identifies and documents recurring patterns in an existing codebase so new work aligns with project conventions. It focuses on naming, architecture, testing, imports/exports, and documentation to reduce friction when adding or reviewing code. Use it to preserve consistency and minimize unnecessary style debates.

How this skill works

I survey a small set of representative files (3–5) for the area you will change, extract repeating structures and naming rules, and check for explicit documentation or test conventions that confirm intent. I prioritize examples in the same module or feature, then project style guides, test files, and adjacent modules. Finally, I summarize the discovered patterns and provide concrete, actionable recommendations to apply in new code.

When to use it

  • Before writing new code or scaffolding files
  • During code review to validate adherence to conventions
  • When onboarding to quickly learn project practices
  • Before refactoring to avoid breaking established structure
  • When adding tests to match the project test style

Best practices

  • Follow existing patterns even when imperfect — consistency matters more than personal preference
  • Document any intentional deviations and the reason for them
  • Verify patterns in tests and sample files, not just inferred rules
  • Prefer local examples (same module/feature) as the authoritative source
  • Avoid introducing new patterns without a migration plan and team agreement

Example use cases

  • Generate a new component that matches file naming, exports, and import ordering used by the project
  • Review a pull request and flag naming or architectural inconsistencies
  • Onboard a new engineer with a concise summary of repository conventions
  • Add tests that follow the project’s test organization, naming, and setup patterns
  • Refactor code while preserving dependency direction and layer boundaries

FAQ

How many files should you inspect to discover patterns?

Start with 3–5 representative files of the same type; expand if patterns are inconsistent or unclear.

What if I find conflicting patterns?

Prefer the most local, consistently applied examples (same module/feature). If conflicts remain, document assumptions and ask the team before changing patterns.