Sachverhalt: A. Das Kantonsgericht St. Gallen verurteilte X._ zweitinstanzlich wegen mehrfacher Drohung, Hausfriedensbruchs, mehrfacher Beschimpfung und Tätlichkeiten zu einer Freiheitsstrafe von neun Monaten, unter Anrechnung der Untersuchungs- und Sicherheitshaft von 338 Tagen, einer Geldstrafe von 20 Tagessätzen zu Fr. 30.-- sowie einer Busse von Fr. 200.--. Es schob den Vollzug der Freiheitsstrafe zugunsten einer stationären Massnahme im Sinne von Art. 59 Abs. 1 StGB auf. B. X._ beantragt mit Beschwerde in Strafsachen, das angefochtene Urteil sei teilweise aufzuheben und die Sache zur neuen Entscheidung an die Vorinstanz zurückzuweisen. Diese sei anzuweisen, ein den gesetzlichen Anforderungen genügendes Gutachten einzuholen und - auf dessen Grundlage - das Strafmass neu festzusetzen bzw. über eine allfällige Massnahme neu zu entscheiden. C. Das Kantonsgericht und die Staatsanwaltschaft des Kantons St. Gallen verzichten auf eine Vernehmlassung. D. Das Bundesgericht hat das Urteil öffentlich beraten (Art. 58 Abs. 1 BGG). 