refactor: extract skills from commands across 8 plugins
Refactored commands to extract reusable skills following the Commands → Skills separation pattern. Each command is now <50 lines and references skill files for detailed knowledge. Plugins refactored: - claude-config-maintainer: 5 commands → 7 skills - code-sentinel: 3 commands → 2 skills - contract-validator: 5 commands → 6 skills - data-platform: 10 commands → 6 skills - doc-guardian: 5 commands → 6 skills (replaced nested dir) - git-flow: 8 commands → 7 skills Skills contain: workflows, validation rules, conventions, reference data, tool documentation Commands now contain: YAML frontmatter, agent assignment, skills list, brief workflow steps, parameters Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
119
plugins/code-sentinel/skills/refactoring-patterns.md
Normal file
119
plugins/code-sentinel/skills/refactoring-patterns.md
Normal file
@@ -0,0 +1,119 @@
|
||||
---
|
||||
description: Code refactoring patterns and techniques for improving structure and maintainability
|
||||
---
|
||||
|
||||
# Refactoring Patterns Skill
|
||||
|
||||
## Structure Patterns
|
||||
|
||||
| Pattern | Description | When to Use |
|
||||
|---------|-------------|-------------|
|
||||
| `extract-method` | Extract code block into named function | Long functions, repeated logic |
|
||||
| `extract-class` | Move related methods to new class | Class doing too much |
|
||||
| `inline` | Inline trivial function/variable | Over-abstracted code |
|
||||
| `rename` | Rename with all references updated | Unclear naming |
|
||||
| `move` | Move function/class to different module | Misplaced code |
|
||||
|
||||
### extract-method Example
|
||||
```python
|
||||
# BEFORE
|
||||
def process_order(order):
|
||||
# Validate (extract this)
|
||||
if not order.items:
|
||||
raise ValueError("Empty order")
|
||||
if order.total < 0:
|
||||
raise ValueError("Invalid total")
|
||||
# Process
|
||||
for item in order.items:
|
||||
inventory.reserve(item)
|
||||
return create_invoice(order)
|
||||
|
||||
# AFTER
|
||||
def validate_order(order):
|
||||
if not order.items:
|
||||
raise ValueError("Empty order")
|
||||
if order.total < 0:
|
||||
raise ValueError("Invalid total")
|
||||
|
||||
def process_order(order):
|
||||
validate_order(order)
|
||||
for item in order.items:
|
||||
inventory.reserve(item)
|
||||
return create_invoice(order)
|
||||
```
|
||||
|
||||
## Simplification Patterns
|
||||
|
||||
| Pattern | Description | When to Use |
|
||||
|---------|-------------|-------------|
|
||||
| `simplify-conditional` | Flatten nested if/else | Deep nesting (>3 levels) |
|
||||
| `remove-dead-code` | Delete unreachable code | After refactoring |
|
||||
| `consolidate-duplicate` | Merge duplicate code blocks | DRY violations |
|
||||
| `decompose-conditional` | Break complex conditions into named parts | Long boolean expressions |
|
||||
|
||||
### simplify-conditional Example
|
||||
```python
|
||||
# BEFORE
|
||||
if user:
|
||||
if user.active:
|
||||
if user.has_permission:
|
||||
do_action()
|
||||
|
||||
# AFTER (guard clauses)
|
||||
if not user:
|
||||
return
|
||||
if not user.active:
|
||||
return
|
||||
if not user.has_permission:
|
||||
return
|
||||
do_action()
|
||||
```
|
||||
|
||||
## Modernization Patterns
|
||||
|
||||
| Pattern | Description | When to Use |
|
||||
|---------|-------------|-------------|
|
||||
| `use-comprehension` | Convert loops to list/dict comprehensions | Simple transformations |
|
||||
| `use-pathlib` | Replace os.path with pathlib | File path operations |
|
||||
| `use-fstring` | Convert .format() to f-strings | String formatting |
|
||||
| `use-typing` | Add type hints | Public APIs, complex functions |
|
||||
| `use-dataclass` | Convert class to dataclass | Data-holding classes |
|
||||
|
||||
### use-dataclass Example
|
||||
```python
|
||||
# BEFORE
|
||||
class User:
|
||||
def __init__(self, name, email, age):
|
||||
self.name = name
|
||||
self.email = email
|
||||
self.age = age
|
||||
|
||||
# AFTER
|
||||
@dataclass
|
||||
class User:
|
||||
name: str
|
||||
email: str
|
||||
age: int
|
||||
```
|
||||
|
||||
## Code Smell Detection
|
||||
|
||||
| Smell | Indicators | Suggested Pattern |
|
||||
|-------|------------|-------------------|
|
||||
| Long Method | >20 lines, multiple responsibilities | extract-method |
|
||||
| Large Class | >10 methods, low cohesion | extract-class |
|
||||
| Primitive Obsession | Many related primitives | use-dataclass |
|
||||
| Nested Conditionals | >3 nesting levels | simplify-conditional |
|
||||
| Duplicate Code | Copy-pasted blocks | consolidate-duplicate |
|
||||
| Dead Code | Unreachable branches | remove-dead-code |
|
||||
|
||||
## Metrics
|
||||
|
||||
After refactoring, measure improvement:
|
||||
|
||||
| Metric | Good Target | Tool |
|
||||
|--------|-------------|------|
|
||||
| Cyclomatic Complexity | <10 per function | radon, lizard |
|
||||
| Function Length | <25 lines | manual count |
|
||||
| Class Cohesion | LCOM <0.5 | pylint |
|
||||
| Duplication | <3% | jscpd, radon |
|
||||
Reference in New Issue
Block a user