| name |
migrate-framework |
| description |
Use when switching a project or component between frameworks - React to Vue, Vue to Svelte, or any supported framework pair. |
| user-invocable |
true |
| argument-hint |
[source-framework] to [target-framework] [file-or-directory] |
| allowed-tools |
Read, Write, Edit, Bash, Glob, Grep |
/migrate-framework - Cross-Framework Migration
Migrate code from one framework to another while preserving functionality.
Arguments: $ARGUMENTS (e.g., "react to vue src/components/Button.tsx")
| From |
To |
Status |
| React |
Vue 3 |
Full |
| React |
Svelte |
Full |
| Vue 2 |
Vue 3 |
Full |
| Vue 3 |
React |
Full |
| Vue 3 |
Svelte |
Full |
| Angular |
React |
Partial |
| Angular |
Vue 3 |
Partial |
- Parse source framework code
- Identify:
- Component structure
- Props and state
- Lifecycle hooks
- Event handlers
- Computed values
- Side effects
| React |
Vue 3 |
useState |
ref() / reactive() |
useEffect |
onMounted, watch |
useMemo |
computed() |
useCallback |
Regular function |
useContext |
provide/inject |
props |
defineProps() |
children |
<slot /> |
className |
class |
onClick |
@click |
// React
function Button({ label, onClick }) {
const [count, setCount] = useState(0)
useEffect(() => {
console.log('mounted')
}, [])
return (
<button className="btn" onClick={() => setCount(c => c + 1)}>
{label}: {count}
</button>
)
}
// Vue 3
<script setup lang="ts">
import { ref, onMounted } from 'vue'
const props = defineProps<{ label: string }>()
const emit = defineEmits<{ click: [] }>()
const count = ref(0)
onMounted(() => {
console.log('mounted')
})
</script>
<template>
<button class="btn" @click="count++">
{{ label }}: {{ count }}
</button>
</template>
| Vue 3 |
React |
ref() |
useState |
reactive() |
useState with object |
computed() |
useMemo |
watch |
useEffect |
onMounted |
useEffect(fn, []) |
provide/inject |
useContext |
<slot /> |
children |
v-if |
{condition && ...} |
v-for |
.map() |
@click |
onClick |
| React |
Svelte |
useState |
let variable |
useEffect |
onMount, $: |
useMemo |
$: derived |
props |
export let |
children |
<slot /> |
className |
class |
onClick |
on:click |
- Create target file structure
- Convert component syntax
- Migrate state management
- Update imports
- Convert templates/JSX
- Adapt styling approach
- Check TypeScript types
- Verify props match
- Test component renders
- Compare behavior
──── Migration Complete ────
Source: React (src/components/Button.tsx)
Target: Vue 3 (src/components/Button.vue)
Conversions:
✓ useState → ref (2 instances)
✓ useEffect → onMounted (1 instance)
✓ Props interface → defineProps
✓ JSX → Vue template
✓ className → class
Manual review needed:
- Line 15: Complex useEffect dependency array
- Line 23: Custom hook needs separate migration
Files created:
- src/components/Button.vue
- Preserve behavior - Functionality must match
- Type safety - Maintain TypeScript types
- Idiomatic code - Use target framework patterns
- Flag manual work - Mark complex conversions
- Keep original - Don't delete source files
- Custom hooks require separate migration
- Third-party component libraries may not have equivalents
- Some patterns don't translate directly
- CSS-in-JS needs manual adaptation