CharacterControllers move through each other while moving with Move()

So I need to make a system where PlayerCharacter and NPCs can’t move through each other and can’t push each other, so if a collision happens, so they just stay in one place.
I’m using CharacterController component with Move() method to move my PlayerCharacter and NPCs. NPCs get a direction where to face from Navmeshagent and move there with RootMotion from their animations.

Everything works fine when one CharacterController moves into another CharacterController which stands still. No pushing, no going through, it works perfect.
But when two CharacterControllers are being moved with Move() and they collide with each other, there’s a very large chance that one of the CCs will just go through another, ignoring any collision. Is there any way to to circumvent that?
I’m trying to use Physics.CapsuleCast to cast the exact same Capsule slightly in front of the moving CC to check if there any collisions with other NPC/PlayerCharacter and if there’s one - stop using Move() at all, but it doesn’t work 100%, a controllable PlayerCharacter still can move through a moving NPC with relative ease

Ok, so in the end it was actually a NavMeshAgent that was moving the NPC, I just got lost in my code. Moving both PC and NPC with CharacterController’s Move() provide no pushing behaviour, but there’s a problem with CharacterControllers with large radius, they will try to climb to smaller CharacterControllers no matter the slope and step limit settings I use