Back to skills
SkillHub ClubShip Full StackFull Stack

analyze-m1-module-for-migration

Systematically analyze a Magento 1 module to determine its purpose, usage, and migration requirements for Magento 2. Use when you need to decide whether to migrate a M1 module, find alternatives, or skip it.

Packaged view

This page reorganizes the original catalog entry around fit, installability, and workflow context first. The original raw source lives below.

Stars
7
Hot score
83
Updated
March 20, 2026
Overall rating
C1.7
Composite score
1.7
Best-practice grade
B84.0

Install command

npx @skill-hub/cli install proxiblue-claude-skills-analyze-m1-module-for-migration

Repository

ProxiBlue/claude-skills

Skill path: analyze-m1-module-for-migration

Systematically analyze a Magento 1 module to determine its purpose, usage, and migration requirements for Magento 2. Use when you need to decide whether to migrate a M1 module, find alternatives, or skip it.

Open repository

Best for

Primary workflow: Ship Full Stack.

Technical facets: Full Stack.

Target audience: everyone.

License: Unknown.

Original source

Catalog source: SkillHub Club.

Repository owner: ProxiBlue.

This is still a mirrored public skill entry. Review the repository before installing into production workflows.

What it helps with

  • Install analyze-m1-module-for-migration into Claude Code, Codex CLI, Gemini CLI, or OpenCode workflows
  • Review https://github.com/ProxiBlue/claude-skills before adding analyze-m1-module-for-migration to shared team environments
  • Use analyze-m1-module-for-migration for development workflows

Works across

Claude CodeCodex CLIGemini CLIOpenCode

Favorites: 0.

Sub-skills: 0.

Aggregator: No.

Original source / Raw SKILL.md

---
name: analyze-m1-module-for-migration
description: Systematically analyze a Magento 1 module to determine its purpose, usage, and migration requirements for Magento 2. Use when you need to decide whether to migrate a M1 module, find alternatives, or skip it.
---

# Skill: Analyze M1 Module for Migration

**Purpose:** Systematically analyze a Magento 1 module to determine its purpose, usage, and migration requirements for Magento 2.

**When to use:** When you encounter a Magento 1 module during migration and need to decide whether to migrate it, find alternatives, or skip it.

## Overview

This skill provides a repeatable process to:
1. Understand what a module does
2. Verify if it's actively being used in production
3. Determine if it should be migrated to M2
4. Research available M2 alternatives
5. Make a migration recommendation with supporting data

## Process

### Step 1: Locate and Identify the Module

**Objective:** Find the module files and basic metadata.

**Tasks:**
1. Locate the module directory:
   ```bash
   # M1 modules are typically in:
   # - app/code/local/{Vendor}/{Module}/
   # - app/code/community/{Vendor}/{Module}/
   # - app/code/core/{Vendor}/{Module}/ (avoid modifying core)

   find /path/to/m1 -type d -name "{ModuleName}" 2>/dev/null
   ```

2. Read module metadata:
   - `app/code/{pool}/{Vendor}/{Module}/etc/config.xml` - Module version, dependencies, configuration
   - `app/etc/modules/{Vendor}_{Module}.xml` - Module activation status, code pool

3. Extract key information:
   - Module name and version
   - Vendor/author
   - Dependencies (other modules required)
   - Is it active? (check `<active>true</active>`)

**Output:** Basic module identification and status.

---

### Step 2: Analyze Module Structure and Functionality

**Objective:** Understand what the module does and how it works.

**Tasks:**

#### 2.1 Configuration Analysis
Read `etc/config.xml` to identify:
- **Admin configuration** (`<adminhtml>` section)
- **Events/Observers** (`<events>` section)
- **Rewrites** (`<rewrite>` sections) - what core classes are modified
- **Routes** (`<routers>` section) - custom controllers
- **Cron jobs** (`<crontab>` section)
- **Layout updates** (`<layout>` section)

#### 2.2 Database Schema Analysis
Check for database modifications:
```bash
# Look for SQL setup files
find app/code/{pool}/{Vendor}/{Module}/ -name "*install*.php" -o -name "*upgrade*.php"
ls -la app/code/{pool}/{Vendor}/{Module}/sql/
```

Read setup scripts to identify:
- Custom tables created
- Columns added to core tables
- Indexes and foreign keys

#### 2.3 Code Component Analysis

**Models** (`Model/` directory):
- What data structures does it manage?
- What are the main CRUD operations?

**Resource Models** (`Model/Resource/` or `Model/Mysql4/`):
- What database operations are performed?
- Are there custom queries or complex logic?

**Blocks** (`Block/` directory):
- What UI elements are added/modified?
- Admin blocks vs. frontend blocks

**Controllers** (`controllers/` directory):
- What admin actions are available?
- What frontend endpoints exist?

**Helpers** (`Helper/` directory):
- What utility functions are provided?

**Observers** (`Model/Observer.php`):
- What events are being listened to?
- What actions are triggered?

**Example analysis command:**
```bash
# Get overview of module structure
tree -L 3 app/code/{pool}/{Vendor}/{Module}/

# Count files by type
find app/code/{pool}/{Vendor}/{Module}/ -name "*.php" | grep -E "Model|Block|Controller|Helper|Observer" | sort
```

**Output:** Detailed functionality description - "This module does X by doing Y when Z happens."

---

### Step 3: Check Database Usage (Production Verification)

**Objective:** Verify if the module is actively being used with real data.

**Tasks:**

#### 3.1 Identify Custom Tables
From setup scripts, list all custom tables:
```sql
SHOW TABLES LIKE '%{module_prefix}%';
```

#### 3.2 Count Records
For each custom table:
```sql
SELECT COUNT(*) as total_records FROM {table_name};
```

#### 3.3 Check Data Freshness
Determine if data is recent/active:
```sql
-- If table has timestamps
SELECT
    MIN(created_at) as oldest,
    MAX(created_at) as newest,
    COUNT(*) as total
FROM {table_name};

-- Check associations with active entities
SELECT COUNT(DISTINCT {foreign_key})
FROM {table_name}
WHERE {foreign_key} IS NOT NULL;
```

#### 3.4 Sample Data Analysis
Pull sample records to understand usage patterns:
```sql
SELECT * FROM {table_name} LIMIT 10;
```

#### 3.5 Show Products Using the Feature (Max 10)
**Objective:** Display real products that actively use the module's functionality for testing/verification purposes.

**Purpose:**
- Provides concrete test cases for M2 migration
- Shows real-world usage patterns
- Helps identify which products to verify after migration
- Useful for stakeholder review (they can see familiar products)

**Query Template:**
```sql
-- Generic template (adjust based on module's data structure)
SELECT
    module_table.id,
    module_table.{key_field},
    cpe.entity_id,
    cpe.sku,
    cpev.value as product_name,
    module_table.{relevant_data_column}
FROM {module_table_name} AS module_table
LEFT JOIN catalog_product_entity cpe
    ON module_table.product_id = cpe.entity_id
LEFT JOIN catalog_product_entity_varchar cpev
    ON cpe.entity_id = cpev.entity_id
    AND cpev.attribute_id = (
        SELECT attribute_id
        FROM eav_attribute
        WHERE attribute_code = 'name'
        AND entity_type_id = 4
    )
WHERE module_table.product_id IS NOT NULL
ORDER BY cpe.entity_id
LIMIT 10;
```

**Example (Custom Option Default Values):**
```sql
-- Show 10 products with default option values configured
SELECT
    dov.option_id,
    dov.option_type_id,
    dov.product_id,
    cpe.sku,
    cpev.value as product_name,
    cpot.title as option_name,
    cpotv.title as default_value_title
FROM default_option_value dov
LEFT JOIN catalog_product_entity cpe
    ON dov.product_id = cpe.entity_id
LEFT JOIN catalog_product_entity_varchar cpev
    ON cpe.entity_id = cpev.entity_id
    AND cpev.attribute_id = (
        SELECT attribute_id
        FROM eav_attribute
        WHERE attribute_code = 'name'
        AND entity_type_id = 4
    )
LEFT JOIN catalog_product_option cpo
    ON dov.option_id = cpo.option_id
LEFT JOIN catalog_product_option_title cpot
    ON cpo.option_id = cpot.option_id
    AND cpot.store_id = 0
LEFT JOIN catalog_product_option_type_value cpotv
    ON dov.option_type_id = cpotv.option_type_id
WHERE dov.product_id IS NOT NULL
ORDER BY cpe.entity_id
LIMIT 10;
```

**Example (Product Images):**
```sql
-- Show 10 products with custom images uploaded
SELECT
    cpe.entity_id,
    cpe.sku,
    cpev.value as product_name,
    cpotv.option_type_id,
    cpotv.image as image_path,
    cpotv.title as option_value_title
FROM catalog_product_option_type_value cpotv
INNER JOIN catalog_product_option cpo
    ON cpotv.option_id = cpo.option_id
INNER JOIN catalog_product_entity cpe
    ON cpo.product_id = cpe.entity_id
LEFT JOIN catalog_product_entity_varchar cpev
    ON cpe.entity_id = cpev.entity_id
    AND cpev.attribute_id = (
        SELECT attribute_id
        FROM eav_attribute
        WHERE attribute_code = 'name'
        AND entity_type_id = 4
    )
WHERE cpotv.image IS NOT NULL
ORDER BY cpe.entity_id
LIMIT 10;
```

**Output Format:**
Present the results in a clear, readable format:
```
Sample Products Using {Feature}:

1. SKU: X9458146 | Product: "500 Gallon Vertical Tank" | Option: "Tank Color" → Default: "White"
2. SKU: X2264184 | Product: "1000 Gallon Horizontal Tank" | Option: "FDA Compliant" → Default: "Yes"
3. SKU: X2197105 | Product: "1500 Gallon Vertical Tank" | Option: "Specific Gravity" → Default: "1.5"
...
10. SKU: X4297366 | Product: "2500 Gallon Vertical Tank" | Option: "Base Type" → Default: "Flat Bottom"

Total Products: 1,222 (showing 10 for reference)
```

**Why Limit to 10?**
- Keeps output concise and readable
- Provides sufficient examples without overwhelming the analysis
- Allows for quick manual verification in M2 after migration
- Can be easily included in reports and documentation

**Usage in Report:**
Include this list in the "Usage Analysis" section of the migration report under a "Sample Products for Testing" heading.

#### 3.6 Check Core Table Modifications
If module adds columns to core tables:
```sql
-- Check if custom columns exist
DESCRIBE {core_table};

-- Count records using custom columns
SELECT COUNT(*) FROM {core_table} WHERE {custom_column} IS NOT NULL;
```

**Output:**
- Record counts for all tables
- Active vs. inactive data
- Sample data showing real usage
- Percentage of entities using the feature

---

### Step 4: Check File System Usage

**Objective:** Verify if the module uses external files (images, uploads, generated files).

**Tasks:**

```bash
# Check for custom media directories
ls -la pub/media/ | grep -i {module_name}

# Count files if directory exists
find pub/media/{module_dir}/ -type f | wc -l

# Check file sizes
du -sh pub/media/{module_dir}/

# List recent files
ls -lt pub/media/{module_dir}/ | head -20
```

**Output:** File counts, storage usage, recent activity.

---

### Step 5: Research M2 Alternatives

**Objective:** Find existing M2 solutions before considering custom migration.

**Tasks:**

#### 5.1 Official Module Check
```
Search: "{VendorName} {ModuleName} Magento 2"
Check: Official vendor website, GitHub repositories
```

#### 5.2 Marketplace Search
```
Search Adobe Commerce Marketplace: https://commercemarketplace.adobe.com/
Keywords: Module functionality (not just vendor name)
```

#### 5.3 Open Source Alternatives
```
GitHub search: "{functionality} magento 2"
Example: "custom option default value magento 2"
```

#### 5.4 Free Alternatives
Check common sources:
- MagePal (often has free modules)
- Mageworx (has both free and paid)
- Mageplaza (extensive free module catalog)
- GitHub repositories

#### 5.5 Document Findings
For each alternative found, record:
- Name and vendor
- Cost (free, one-time, subscription)
- Features (matches M1 module?)
- Reviews/ratings
- Maintenance status (last update, active development)
- Repository URL or marketplace link

**Output:** Comparison table of M2 alternatives with recommendations.

---

### Step 6: Migration Decision Matrix

**Objective:** Make an informed decision on migration approach.

**Decision Criteria:**

| Criterion | Weight | Assessment Questions |
|-----------|--------|---------------------|
| **Is it in use?** | Critical | Record counts > 0? Active data? |
| **Is it business-critical?** | High | Affects customer experience? Revenue? Orders? |
| **Data volume** | Medium | How many records need migration? |
| **Functionality complexity** | Medium | Simple data storage or complex logic? |
| **M2 alternatives exist?** | High | Free? Paid? Feature-complete? |
| **Migration effort** | High | Data only? Code + data? Testing complexity? |
| **Cost consideration** | Medium | Free module vs. paid vs. custom development? |

#### Decision Tree:

```
Is module in use? (records > 0)
├─ NO → Skip migration, disable module
└─ YES → Is it business-critical?
    ├─ NO → Low priority, consider alternatives first
    └─ YES → Are M2 alternatives available?
        ├─ YES → Compare:
        │   ├─ Free alternative with all features → Use alternative
        │   ├─ Paid alternative ($) < Custom dev ($$$$) → Use alternative
        │   └─ No suitable alternative → Custom migration
        └─ NO → Custom migration required
```

**Output:** Clear recommendation with justification.

---

### Step 7: Generate Migration Analysis Report

**Objective:** Document findings for stakeholder review.

**Report Template:**

```markdown
# Migration Analysis: {Vendor}_{Module}

## Executive Summary
- **Module Name:** {Vendor}_{Module}
- **Purpose:** {1-2 sentence description}
- **In Use:** {Yes/No} - {X records, Y products, Z files}
- **Recommendation:** {Migrate / Use Alternative / Skip}
- **Estimated Effort:** {Low/Medium/High}

## Module Overview
### Functionality
{Detailed description of what the module does}

### Technical Components
- Database Tables: {list tables}
- Custom Fields: {list modified core tables}
- Admin Features: {list admin functionality}
- Frontend Features: {list customer-facing features}
- Events/Observers: {list hooks}

## Usage Analysis
### Database Statistics
- **Total Records:** {X,XXX}
- **Active Products:** {X,XXX} ({XX%} of catalog)
- **Date Range:** {oldest} to {newest}
- **Sample Data:** {show 3-5 examples}

### Sample Products for Testing
List of 10 products actively using this feature (for M2 migration verification):

1. **SKU:** {sku} | **Product:** "{name}" | **Feature Data:** {relevant detail}
2. **SKU:** {sku} | **Product:** "{name}" | **Feature Data:** {relevant detail}
3. **SKU:** {sku} | **Product:** "{name}" | **Feature Data:** {relevant detail}
4. **SKU:** {sku} | **Product:** "{name}" | **Feature Data:** {relevant detail}
5. **SKU:** {sku} | **Product:** "{name}" | **Feature Data:** {relevant detail}
6. **SKU:** {sku} | **Product:** "{name}" | **Feature Data:** {relevant detail}
7. **SKU:** {sku} | **Product:** "{name}" | **Feature Data:** {relevant detail}
8. **SKU:** {sku} | **Product:** "{name}" | **Feature Data:** {relevant detail}
9. **SKU:** {sku} | **Product:** "{name}" | **Feature Data:** {relevant detail}
10. **SKU:** {sku} | **Product:** "{name}" | **Feature Data:** {relevant detail}

*Total: {X,XXX} products (showing 10 representative samples)*

### File System Usage
- **Directory:** pub/media/{path}/
- **File Count:** {XXX} files
- **Storage:** {XX MB/GB}

## M2 Alternatives Research
| Alternative | Type | Cost | Features | Status | Rating |
|-------------|------|------|----------|--------|--------|
| {Name} | {Free/Paid} | ${XX} | {✓/✗ feature match} | {Active/Stale} | {X/5 stars} |

### Recommended Alternative
{Name of alternative or "Custom migration required"}

**Rationale:**
{Why this alternative was chosen or why custom migration is needed}

## Migration Approach
### Option 1: {Recommended approach}
- **Effort:** {X hours/days}
- **Cost:** ${X,XXX}
- **Risks:** {list risks}
- **Steps:**
  1. {Step 1}
  2. {Step 2}
  3. {Step 3}

### Option 2: {Alternative approach}
{Same structure as Option 1}

## Data Migration Strategy
### Tables to Migrate
| M1 Table | M2 Table | Records | Migration Method |
|----------|----------|---------|------------------|
| {m1_table} | {m2_table} | {X,XXX} | {Direct/Transform/Manual} |

### Migration SQL Script
```sql
-- Add to migration_from_m1/run-data-migration.step6.sh
# Step #XX: Migrate {module} data
{SQL migration script}
```

## Testing Requirements
- [ ] Admin UI: {what to test}
- [ ] Frontend: {what to test}
- [ ] Data integrity: {what to verify}
- [ ] Performance: {what to benchmark}

## Rollback Plan
{How to undo migration if issues arise}

## Timeline
- Analysis: {completed}
- Development: {X days}
- Testing: {X days}
- Deployment: {X days}
- **Total:** {X days}

## Appendix
### M1 Module Files
```
{tree structure of module}
```

### Database Schema
```sql
{CREATE TABLE statements}
```

### Configuration Samples
```xml
{Relevant config.xml excerpts}
```
```

---

## Example Usage

```bash
# 1. Identify module
ls -la /home/lucas/workspace/uptactics/ntotankM1/app/code/local/Magebuzz/Customoption

# 2. Analyze structure
tree -L 3 /home/lucas/workspace/uptactics/ntotankM1/app/code/local/Magebuzz/Customoption

# 3. Check database usage
ddev exec mysql ntosource -e "SELECT COUNT(*) FROM default_option_value;"
ddev exec mysql ntosource -e "SELECT COUNT(DISTINCT product_id) FROM default_option_value WHERE product_id IS NOT NULL;"

# 4. Get 10 sample products using the feature
ddev exec mysql ntosource -e "
SELECT
    dov.product_id,
    cpe.sku,
    cpev.value as product_name,
    cpot.title as option_name,
    cpotv.title as default_value
FROM default_option_value dov
LEFT JOIN catalog_product_entity cpe ON dov.product_id = cpe.entity_id
LEFT JOIN catalog_product_entity_varchar cpev ON cpe.entity_id = cpev.entity_id AND cpev.attribute_id = (SELECT attribute_id FROM eav_attribute WHERE attribute_code = 'name' AND entity_type_id = 4)
LEFT JOIN catalog_product_option cpo ON dov.option_id = cpo.option_id
LEFT JOIN catalog_product_option_title cpot ON cpo.option_id = cpot.option_id AND cpot.store_id = 0
LEFT JOIN catalog_product_option_type_value cpotv ON dov.option_type_id = cpotv.option_type_id
WHERE dov.product_id IS NOT NULL
LIMIT 10;
"

# 5. Research alternatives
# Use WebSearch for "magento 2 custom option default value"

# 6. Make recommendation based on findings
```

## Tips and Best Practices

### Do's ✅
- **Always check production data** - Module may be installed but unused
- **Look at sample data** - Understand real-world usage patterns
- **Research thoroughly** - Free alternative might exist, saving $$$$
- **Consider consolidation** - Can functionality be merged into existing M2 module?
- **Document everything** - Future you will thank present you
- **Check file system** - Modules often have media files not in database

### Don'ts ❌
- **Don't assume active** - Installed ≠ in use
- **Don't skip alternatives** - Custom dev is expensive
- **Don't migrate blindly** - Understand what you're migrating first
- **Don't forget dependencies** - Other modules may depend on this one
- **Don't ignore edge cases** - Sample data reveals real usage
- **Don't overlook observers** - They may affect core functionality

## Common Pitfalls

1. **False positives on usage**
   - Old test data still in database
   - Module was used historically but no longer
   - Check date ranges and active associations

2. **Missing dependencies**
   - Module depends on another M1 module
   - Check `<depends>` in config.xml
   - Some dependencies are implicit (not declared)

3. **Underestimating data migration**
   - IDs change between M1 and M2
   - Need mapping tables for foreign keys
   - Data transformation may be required

4. **Overlooking configuration**
   - Module may have admin configuration that needs migration
   - Check `core_config_data` table for module settings

5. **Missing file migrations**
   - Images, PDFs, uploads need to be copied
   - File paths may change in M2
   - Verify permissions after copy

## Success Criteria

A thorough analysis should answer:
- ✅ What does this module do? (clear explanation)
- ✅ Is it being used? (concrete data)
- ✅ How much is it used? (record counts, percentages)
- ✅ Which products use it? (10 sample products for testing)
- ✅ Should we migrate it? (justified recommendation)
- ✅ What are the alternatives? (researched options)
- ✅ How do we migrate it? (step-by-step plan)
- ✅ How long will it take? (time estimate)
- ✅ What are the risks? (identified and mitigated)

## Output Deliverables

After completing this skill, you should have:

1. **Analysis Report** (markdown document)
2. **Migration SQL Scripts** (if migrating)
3. **Testing Checklist** (verification steps)
4. **Sample Data** (for testing)
5. **Alternative Comparison** (if applicable)
6. **Effort Estimate** (hours/days)
7. **Cost Analysis** (custom vs. alternative)

## Related Skills

- `create-backend-controller` - If custom M2 module needed
- `magento-controller-refactor` - If migrating M1 controllers to M2

## Version History

- **v1.1** (2025-01-05) - Added Step 3.5: Show 10 sample products using the feature for testing/verification
- **v1.0** (2025-01-05) - Initial skill creation based on Magebuzz_Customoption analysis
analyze-m1-module-for-migration | SkillHub