I developed a
physics-based puzzle game a while ago and the approach that I took there, which worked quite well, was to only add a new feature or mechanic once I'd finished creating levels that fully exhausted all the possibilities of the existing object-set without repeating anything. Once I'd finished building those levels and playtesting them, I then had a pretty good idea of what mechanic to add next to complement what was there, I then built a bunch of levels utilising that mechanic which I interwove with the ones I'd already created and so on until I considered the game was big enough to call finished.
What I found by doing that was that my own process of exploring the possibilities of the mechanics mirrored the similar process which the player would go through and resulted in a level set that introduced new features at a manageable pace. I also found that I needed far fewer elements than I originally thought I would - I had plenty of ideas that I didn't implement because they turned out not to really be necessary and indeed probably would have detracted from the experience. So, I advise not trying to plan everything out from the start - you'll probably end up with too many elements which you are not using to their full potential and that do not necessarily complement one another. Get the simplest possible version of the game you can think of working and then iterate on that design, gradually adding new mechanics.