Faits:
A. A._, ressortissant marocain né en 1970, se trouve en détention préventive depuis le 3 mars 2010 sous l'inculpation de tentative de meurtre (art. 111 et 22 al. 1 CP), subsidiairement de lésions corporelles graves (art. 122 CP), de menaces (art. 180 CP) et de possession de stupéfiants (art. 19a LStup). Il lui est notamment reproché d'avoir, dans la nuit du 26 au 27 février 2010, vers 1h05, avec un groupe de sept ou huit personnes armées de couteaux et de pierres, porté plusieurs coups de couteau à Ali Ahmed ou d'avoir accepté que ses comparses le fassent. La victime, qui tentait de fuir, aurait reçu au minimum six coups de couteaux, dont au moins un à la hauteur des omoplates et dont un autre aurait tranché son nerf sciatique provoquant une paralysie de sa jambe gauche.
La détention préventive a été régulièrement prolongée par la Chambre d'accusation du canton de Genève (ci-après: la Chambre d'accusation), en raison des risques de réitération et de collusion. La procédure a été communiquée au Ministère public du canton de Genève le 30 juin 2010. Par arrêt du 4 août 2010 (1B_233/2010), le Tribunal fédéral a rejeté un recours formé par A._ contre un refus de mise en liberté, considérant que les charges étaient suffisantes et que le risque de réitération apparaissait suffisamment démontré, compte tenu de la gravité des actes et des antécédents du recourant, condamné en 2008 pour lésions corporelles simples et infraction à la LStup.
B. Par ordonnance du 12 novembre 2010, la Chambre d'accusation a rejeté une nouvelle requête de mise en liberté, en reprenant les motifs retenus par le Tribunal fédéral et en ajoutant qu'aucun fait nouveau pertinent n'était survenu et que le principe de la proportionnalité était respecté.
Par acte du 16 novembre 2010, A._ forme un recours en matière pénale par lequel il demande l'annulation de l'ordonnance de la Chambre d'accusation et sa mise en liberté, subsidiairement le renvoi de la cause à la cour cantonale pour nouvelle décision dans le sens des considérants. Il requiert l'assistance judiciaire.
La Chambre d'accusation se réfère à sa décision. Le Procureur général conclut au rejet du recours. Le recourant a pu répliquer.
Considérant en droit:
1. Le recours en matière pénale (art. 78 al. 1 LTF) est ouvert contre une décision relative au maintien en détention préventive. Le recourant a qualité pour agir au sens de l'art. 81 al. 1 let. a LTF; il a agi en temps utile (art. 100 al. 1 LTF) contre une décision rendue en dernière instance cantonale (art. 80 LTF) et les conclusions formées à l'appui de son recours sont recevables au regard de l'art. 107 al. 2 LTF.
2. Le recourant ne conteste pas à ce stade l'existence de charges suffisantes et d'un risque de récidive, tels qu'ils ont notamment été retenus dans l'arrêt du Tribunal fédéral du 4 août 2010. Il critique incidemment la formulation d'un considérant de cet arrêt qui, selon lui, violerait la présomption d'innocence, sans toutefois en tirer un argument qui pourrait conduire à sa mise en liberté.
2.1 Le recourant relève que selon une communication de la Cour correctionnelle devant laquelle il a été renvoyé en jugement, la procédure ne sera pas jugée en 2010, aucune date d'audience n'ayant encore été fixée. Il invoque dès lors l'art. 221 al. 1 let. c du code de procédure pénale suisse (CPP), qui entrera en vigueur le 1er janvier 2011, disposition selon laquelle un risque de récidive ne pourrait être admis que si l'inculpé a commis, par le passé, au moins deux infractions graves de même nature. Le recourant n'ayant qu'un antécédent judiciaire, pour des infractions moins graves - lésions corporelles simples et infraction à la LStup -, il devrait certainement être libéré dès le 1er janvier 2011 en application du CPP, de sorte que son maintien en détention jusqu'à la fin de l'année serait disproportionné.
2.2 Selon l'art. 80 al. 1 LTF, le recours est recevable contre les décisions prises par les autorités cantonales de dernière instance. Cette règle d'épuisement des instances a pour conséquence que seuls sont recevables devant le Tribunal fédéral les griefs qui, pouvant l'être, ont été présentés à l'autorité cantonale de dernière instance (ATF 135 I 91 consid. 2.1 p. 93; 134 III 524 consid. 1.3 p. 527). En l'occurrence, l'ordonnance attaquée n'examine pas la question de l'application du CPP, et le recourant ne prétend pas lui avoir valablement soumis ce grief. Sa recevabilité à ce stade apparaît ainsi pour le moins douteuse.
2.3 Au demeurant, le CPP n'entrera en vigueur que le 1er janvier 2011 (RO 2010 p. 1881), et les actes ordonnés ou accomplis avant cette date conserveront leur validité (art. 448 al. 2 CPP). Il n'est dès lors pas question d'en appliquer les dispositions par anticipation. Le principe de la proportionnalité invoqué à ce propos par le recourant, ne saurait lui permettre de bénéficier d'une application anticipée d'une disposition qui lui serait, par hypothèse, plus favorable. Les conditions d'un maintien en détention sont pour l'heure exclusivement régies par le droit cantonal applicable, dont le recourant ne prétend pas qu'il serait contraire au droit constitutionnel ou conventionnel. Le recourant ne conteste pas que ces conditions sont en l'occurrence réunies, s'agissant du risque de récidive, et ne soutient pas non plus que la détention constituerait une mesure disproportionnée en l'état du droit actuel.
3. Le recours, manifestement mal fondé doit ainsi être rejeté. Cette issue, évidente, conduit au rejet de la demande d'assistance judiciaire. Les frais judiciaires sont mis à la charge du recourant qui succombe (art. 66 al. 1 LTF).
Par ces motifs, le Tribunal fédéral prononce:
1. Le recours est rejeté dans la mesure où il est recevable.
2. La demande d'assistance judiciaire est rejetée.
3. Les frais judiciaires, arrêtés à 1000 fr., sont mis à la charge du recourant.
4. Le présent arrêt est communiqué au mandataire du recourant, au Ministère public et à la Chambre d'accusation du canton de Genève.
Lausanne, le 1er décembre 2010
Au nom de la Ire Cour de droit public
du Tribunal fédéral suisse
Le Président: Le Greffier:
Féraud Kurz