There are lots of possible choices of universal gate sets. However, if you are starting with Clifford gates, then it turns out to be sufficient for you to add support for a T=sqrt(S) gate; essentially T and H have the property that these two gates by themselves are sufficient to efficiently approximate any 1-qubit gate arbitrarily well (by combining these discrete rotations about the two different angles in the Bloch sphere in specific ways via the Solovay-Kitaev Theorem), and being able to perform an arbitrary 1-qubit gate and having access to an entangling 2-qubit gate (CNOT) lets you extend this to an efficient arbitrarily good approximation of any gate on an any number of qubits.
Hmm, interesting. Which gates are missing if you want to, say, implement a Quantum Fourier transform?
There are lots of possible choices of universal gate sets. However, if you are starting with Clifford gates, then it turns out to be sufficient for you to add support for a T=sqrt(S) gate; essentially T and H have the property that these two gates by themselves are sufficient to efficiently approximate any 1-qubit gate arbitrarily well (by combining these discrete rotations about the two different angles in the Bloch sphere in specific ways via the Solovay-Kitaev Theorem), and being able to perform an arbitrary 1-qubit gate and having access to an entangling 2-qubit gate (CNOT) lets you extend this to an efficient arbitrarily good approximation of any gate on an any number of qubits.