Add: semantic version comparison