Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Maps architectural components in a codebase and measures their size to identify what should be extracted first. Use when asking "how big is each module?", "what components do I have?", "which service is too large?", "analyze codebase structure", "size my monolith", or planning where to start decomposing. Do NOT use for runtime performance sizing or infrastructure capacity planning.
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-02 | ✗→✓ | ▲ Improved | 78% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 118% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 224% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 150% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 141% | 0% |
This skill identifies architectural components (logical building blocks) in a codebase and calculates size metrics to assess decomposition feasibility and identify oversized components.
Request analysis of your codebase:
Example 1: Complete Analysis
User: "Identify and size all components in this codebase"
The skill will:
1. Map directory/namespace structures
2. Identify all components (leaf nodes)
3. Calculate size metrics (statements, files, percentages)
4. Generate component inventory table
5. Flag oversized/undersized components
6. Provide recommendationsExample 2: Find Oversized Components
User: "Which components are too large?"
The skill will:
1. Calculate mean and standard deviation
2. Identify components >2 std dev or >10% threshold
3. Analyze functional areas within large components
4. Suggest specific splits with estimated sizesExample 3: Component Size Analysis
User: "Analyze component sizes and distribution"
The skill will:
1. Calculate all size metrics
2. Generate size distribution summary
3. Identify outliers
4. Provide statistics and recommendationsApply this skill when:
A component is an architectural building block that:
Key Rule: Components are identified by leaf nodes in directory/namespace structures. If a namespace is extended (e.g., services/billing extended to services/billing/payment), the parent becomes a subdomain, not a component.
Statements (not lines of code):
Component Size Indicators:
Scan the codebase directory structure:
services/, routes/, models/, utils/com.company.domain.service)app/billing/payment)services/BillingService/ is a componentservices/BillingService/payment/ extends it, making BillingService a subdomainFor each component:
.js, .ts, .java, .py, etc.) component_percent = (component_statements / total_statements) * 100
total_statements / number_of_componentssqrt(sum((size - mean)^2) / (n - 1))(component_size - mean) / std_devOversized Components (candidates for splitting):
Undersized Components (candidates for consolidation):
Well-Sized Components:
markdown## Component Inventory | Component Name | Namespace/Path | Statements | Files | Percent | Status | | --------------- | ---------------------------- | ---------- | ----- | ------- | ------------ | | Billing Payment | services/BillingService | 4,312 | 23 | 5% | ✅ OK | | Reporting | services/ReportingService | 27,765 | 162 | 33% | ⚠️ Too Large | | Notification | services/NotificationService | 1,433 | 7 | 2% | ✅ OK |
Status Legend:
markdown## Size Analysis Summary **Total Components**: 18 **Total Statements**: 82,931 **Mean Component Size**: 4,607 statements **Standard Deviation**: 5,234 statements **Oversized Components** (>2 std dev or >10%): - Reporting (33% - 27,765 statements) - Consider splitting into: - Ticket Reports - Expert Reports - Financial Reports **Well-Sized Components** (within 1-2 std dev): - Billing Payment (5%) - Customer Profile (5%) - Ticket Assignment (9%) **Undersized Components** (<1 std dev): - Login (2% - 1,865 statements) - Consider consolidating with Authentication
markdown## Component Size Distribution
Component Size Distribution (by percent of codebase)
Visual representation or histogram if possible]
Largest: ████████████████████████████████████ 33% (Reporting) ████████ 9% (Ticket Assign) ██████ 8% (Ticket) ██████ 6% (Expert Profile) █████ 5% (Billing Payment) ████ 4% (Billing History) ...
`### Recommendations
Reporting Component (33% of codebase):
Login Component (2% of codebase):
Most components are appropriately sized. Continue monitoring during decomposition.
`## Analysis Checklist **Component Identification**: - [ ] Mapped all directory/namespace structures - [ ] Identified leaf nodes (components) vs parent nodes (subdomains) - [ ] Created complete component inventory - [ ] Documented namespace/path for each component **Size Calculation**: - [ ] Counted statements (not lines) for each component - [ ] Counted source files (excluding tests/configs) - [ ] Calculated percentage of total codebase - [ ] Calculated mean and standard deviation **Size Assessment**: - [ ] Identified oversized components (>threshold or >2 std dev) - [ ] Identified undersized components (<1% or <1 std dev) - [ ] Flagged components for splitting or consolidation - [ ] Documented size distribution **Recommendations**: - [ ] Suggested splits for oversized components - [ ] Suggested consolidations for undersized components - [ ] Prioritized recommendations by impact - [ ] Created architecture stories for refactoring ## Implementation Notes ### For Node.js/Express Applications Components typically found in: - `services/` - Business logic components - `routes/` - API endpoint components - `models/` - Data model components - `utils/` - Utility components - `middleware/` - Middleware components **Example Component Identification**:
services/ ├── BillingService/ ← Component (leaf node) │ ├── index.js │ └── BillingService.js ├── CustomerService/ ← Component (leaf node) │ └── CustomerService.js └── NotificationService/ ← Component (leaf node) └── NotificationService.js
### For Java Applications
Components identified by package structure:
- `com.company.domain.service` - Service components
- `com.company.domain.model` - Model components
- `com.company.domain.repository` - Repository components
**Example Component Identification**:
com.company.billing.payment ← Component (leaf package) com.company.billing.history ← Component (leaf package) com.company.billing ← Subdomain (parent of payment/history)
### Statement Counting
**JavaScript/TypeScript**:
- Count statements terminated by `;` or newline
- Include: assignments, function calls, returns, conditionals, loops
- Exclude: comments, blank lines, declarations without assignment
**Java**:
- Count statements terminated by `;`
- Include: method calls, assignments, returns, conditionals
- Exclude: class/interface declarations, comments, blank lines
**Python**:
- Count executable statements (not comments or blank lines)
- Include: assignments, function calls, returns, conditionals
- Exclude: docstrings, comments, blank lines
## Fitness Functions
After identifying and sizing components, create automated checks:
### Component Size Threshold
// Alert if any component exceeds 10% of codebase function checkComponentSize(components, threshold = 0.1) { const totalStatements = components.reduce((sum, c) => sum + c.statements, 0) return components .filter((c) => c.statements / totalStatements > threshold) .map((c) => ({ component: c.name, percent: ((c.statements / totalStatements) 100).toFixed(1), issue: 'Exceeds size threshold', })) }
### Standard Deviation Check
// Alert if component is >2 standard deviations from mean function checkStandardDeviation(components) { const sizes = components.map((c) => c.statements) const mean = sizes.reduce((a, b) => a + b, 0) / sizes.length const stdDev = Math.sqrt(sizes.reduce((sum, size) => sum + Math.pow(size - mean, 2), 0) / (sizes.length - 1))
return components .filter((c) => Math.abs(c.statements - mean) > 2 stdDev) .map((c) => ({ component: c.name, deviation: ((c.statements - mean) / stdDev).toFixed(2), issue: 'More than 2 standard deviations from mean', })) }
## Best Practices
### Do's ✅
- Use statements, not lines of code
- Identify components as leaf nodes only
- Calculate both percentage and standard deviation
- Consider application size when setting thresholds
- Document namespace/path for each component
- Create visual size distribution if possible
### Don'ts ❌
- Don't count test files in component size
- Don't treat parent directories as components
- Don't use fixed thresholds without considering app size
- Don't ignore small components (may need consolidation)
- Don't skip standard deviation calculation
- Don't mix infrastructure and domain components in same analysis
## Next Steps
After completing component identification and sizing:
1. **Apply Gather Common Domain Components Pattern** - Identify duplicate functionality
2. **Apply Flatten Components Pattern** - Remove orphaned classes from root namespaces
3. **Apply Determine Component Dependencies Pattern** - Analyze coupling between components
4. **Create Component Domains** - Group components into logical domains
## Notes
- Component size thresholds vary by application size
- Small apps (<10 components): 30% threshold may be appropriate
- Large apps (>20 components): 10% threshold is more appropriate
- Standard deviation is more reliable than fixed percentages
- Well-sized components are 1-2 standard deviations from mean
- Oversized components often contain multiple functional areas that can be splitOther measured skills in the registry, with their headline benchmark lift.