Faits : A. Le 26 novembre 2014, A._, ressortissant érythréen né en 1991, a été prévenu par le Ministère public genevois de tentative de meurtre, brigandage aggravé et instigation à entrave à l'action pénale. Il lui est reproché d'avoir pris part à l'agression de B._, le 28 juin 2014 vers 4 heures du matin, avec C._ qu'il aurait incité à agir. La victime avait reçu de nombreux coups, notamment à la tête alors qu'elle était inconsciente; elle avait souffert d'une hémorragie cérébrale et d'un arrêt cardio-respiratoire durant six minutes. Le prévenu aurait dérobé ses deux téléphones portables ainsi que sa montre. Il aurait par ailleurs incité ses co-prévenus à de fausses déclarations. Par ordonnance du 27 novembre 2014, le Tribunal des mesures de contrainte du canton de Genève (Tmc) l'a placé en détention provisoire pour trois mois; cette mesure a été reconduite le 23 février 2015 en raison des risques de fuite, de collusion et de réitération. B. Le 10 mars 2015, le prévenu a présenté une demande de mise en liberté. Il contestait les risques de fuite, de collusion et de réitération et demandait à tout le moins le prononcé de mesures de substitution (assignation à domicile avec un bracelet électronique et confiscation des papiers d'identité, interdiction d'entrer en contact avec les parties et des tiers, avec surveillance téléphonique). Cette demande a été écartée par le Ministère public et transmise au Tmc qui, par ordonnance du 17 mars 2015, l'a rejetée. Le risque de fuite ne pouvait être exclu, de même que le risque de réitération, compte tenu des trois condamnations pour vol prononcées en 2010 et d'une autre procédure pendante pour vol en bande. Le risque de collusion perdurait à l'égard de la victime et des co-prévenus. Les mesures de substitution proposées n'apparaissaient pas efficaces. Une nouvelle demande de mise en liberté a été rejetée le 30 avril 2015 par le Tmc, en substance pour les mêmes motifs. Par arrêt du 15 mai 2015, la Chambre pénale de recours de la Cour de justice genevoise a rejeté le recours formé par le prévenu. Celui-ci tentait de minimiser les faits mais les charges étaient suffisantes et le risque de collusion confirmé. Le risque de réitération était très concret vu les antécédents de l'intéressé, le rapport de police du 30 avril 2013 faisant état d'une nouvelle agression commise le 31 octobre 2014. La question du risque de fuite n'a pas été examinée. Les mesures de substitution ont à nouveau été jugées insuffisantes. C. Par acte du 17 juin 2015, A._ forme un recours en matière pénale par lequel il demande l'annulation de l'arrêt cantonal et sa mise en liberté immédiate, éventuellement moyennant des mesures de substitution; plus subsidiairement, il conclut au renvoi de la cause aux autorités cantonales pour nouvelle décision dans les sens considérants. Il requiert en outre l'assistance judiciaire. La cour cantonale se réfère aux considérants de son arrêt, sans observations. Le Ministère public conclut au rejet du recours en relevant que l'instruction touche à sa fin et qu'un avis de prochaine clôture a été envoyé aux parties. Le recourant a répliqué, persistant dans ses griefs et ses conclusions.