1. I don't think this could be called seamless. But I just don't use the normal Nix-Darwin installer. I:
a. build darwin-rebuild from the Nix-Darwin flake
b. do a darwin-rebuild build --flake of the target system
c. delete all of the files Nix-Darwin will complain about colliding with upon first install, including `/etc/nix/nix.conf`
d. run the activation scripts in the built system directly, like
./result/activate-user
sudo ./result/activate
For (d), make sure you run them in that order because it's actually the user activation script which ensures that /run/current-system exists.
For (c), just inspect the files in `result/etc` (or wherever you put the symlink to your built system, or directly from the Nix store) and compare them to what already exists in `/etc`, e.g.,
find result/etc/ -type l | sed -E 's|^result||g' | xargs -I{} sh -c "test -f '{}' && echo '{}'"
should give you a list of files to nuke or back up or whatever, if you're trying to automate this.
2. Nix-Darwin has its own uninstaller whose job is to go remove all the references to `/etc/static` from `/etc` and some launchd crap, which are the bits and pieces that the Determinate Nix Installer finds and complains about when you try to uninstall Nix with an active Nix-Darwin installation. The uninstaller gets installed by default (try `less $(which darwin-uninstaller)`), but if it's missing for some reason you can also run it from the flake like `nix run github:LnL7/nix-darwin#darwin-uninstaller`.