Faits : A. A.a. Les époux H.Z._ et F.Z._ ont conclu le 14 mai 2010 avec la société A._ Sàrl un « contrat d'entreprise générale à prix forfaitaire pour la construction d'une villa familiale » sur la parcelle n° yyy du cadastre communal de V._ (VS). Le préambule du contrat avait la teneur suivante: « Maître de l'ouvrage M. H.Z._ et Mme F.Z._, qui sont en rapport contractuel direct avec l'entrepreneur général par un contrat d'entreprise au sens des articles 363 ss du Code des Obligations Suisse. Entrepreneur général A._ Sàrl, auquel l'exécution des travaux de construction est confiée par le maître de l'ouvrage à l'entrepreneur général. Direction des travaux A._ Sàrl, assume la direction des travaux confiés par le maître de l'ouvrage à l'entrepreneur général. » Selon l'art. 10 du contrat, l'entrepreneur général devait conclure les contrats avec les entrepreneurs et fournisseurs en son nom propre et pour son propre compte. Quant au maître de l'ouvrage, il ne pouvait prétendre à aucun droit de regard concernant les offres et devis avant et après l'adjudication des travaux. Selon l'art. 11 du contrat, le maître de l'ouvrage avait le droit de contrôler l'avancement des travaux, mais n'était pas autorisé à « donner des ordres aux tiers qui exécutent les travaux de construction et qui sont en rapport contractuel avec l'entrepreneur général ». Le prix de l'ouvrage a été fixé à 424'000 fr.; l'art. 5 du contrat énonçait une liste de prestations non comprises dans ce prix forfaitaire, soit notamment les plus-values, « les fouilles et les canalisations extérieures », « le terrassement en terrain difficile » et « l'évacuation de terre excédante, leur [sic!] chargement et déchargement ». Le 18 janvier 2011, l'entrepreneur général et les maîtres de l'ouvrage ont signé un plan de financement établi sur papier à en-tête de l'entrepreneur. Ce document reprenait le prix forfaitaire de 424'000 fr., une plus-value non contestée de 79'500 fr. pour un garage et un agrandissement, ainsi que divers postes supplémentaires, dont un de 28'000 fr. pour les « canalisations extérieures et introduction eau, gaz » et un autre de 40'000 fr. pour l'évacuation de la terre. Le coût total, y compris le terrain chiffré à 160'000 fr., s'élevait à 860'000 francs. A.b. Le 20 juillet 2011, l'entrepreneur général et la société X._ SA ont conclu un contrat d'entreprise ayant pour objet des travaux de terrassement relatifs à la villa pour un montant forfaitaire de 9'300 francs. Ce montant a été payé par l'entrepreneur. X._ SA a encore établi deux factures, l'une de 53'646 fr. le 23 septembre 2011 pour des travaux de canalisation, l'autre de 139'600 fr. le 29 novembre 2011 pour l'évacuation des matériaux. Elle les a adressées à l'entrepreneur général. Les maîtres de l'ouvrage en ont eu connaissance à une date indéterminée du printemps 2012. Ces factures n'ayant pas été payées, X._ SA a requis le 4 avril 2012 l'inscription provisoire d'une hypothèque légale des artisans et des entrepreneurs sur la parcelle des maîtres pour le montant de 203'358 fr. 65. La requête, tardive au regard de l'art. 839 al. 2 CC, a été rejetée par décision du 21 juin 2012. L'hypothèque avait toutefois été annotée à titre provisoire dès le dépôt de la requête. Les maîtres de l'ouvrage, l'entrepreneur général et la société X._ SA ont par la suite tenté de trouver un accord qui n'a toutefois pas abouti. Dans ce cadre, les maîtres ont versé 40'000 fr. à X._ SA, à une date indéterminée. Selon l'accord discuté, l'entrepreneur général devait également participer au règlement. Les maîtres n'ont pas eu connaissance du contrat conclu entre l'entrepreneur général et X._ SA. Ils n'ont eu aucun contact avec celle-ci avant qu'elle entreprenne des travaux sur leur bien-fonds. B. B.a. Le 29 octobre 2013, X._ SA (ci-après: la demanderesse) a déposé une demande devant le juge du district de Sierre en concluant à ce que H.Z._ et F.Z._ (ci-après: les défendeurs, les maîtres) soient condamnés à lui payer 153'246 fr. plus intérêt à 5% dès le 23 septembre 2011. Les défendeurs ont conclu au rejet de la demande, au motif qu'ils n'avaient pas conclu de contrat avec la demanderesse. En audience d'instruction du 2 octobre 2014, après l'audition de quatre témoins, les parties ont sollicité un jugement préjudiciel sur la légitimation passive des défendeurs. B.b. Le témoin B._, employé de la demanderesse, a expliqué avoir constaté que le terrassement serait important et coûteux et avoir signalé ce fait tant à F.Z._ qu'à C._, directeur de l'entrepreneur général, à qui il a demandé si un supplément avait été prévu en plus du forfait. Le directeur lui aurait répondu par la négative. Entendu en qualité de partie, l'administrateur de la demanderesse D._ a déclaré n'avoir eu aucun contact avec les maîtres de l'ouvrage. Le contrat forfaitaire écrit conclu avec l'entrepreneur général ne portait que sur la creuse, à savoir l'activité d'une excavatrice creusant le sol; les autres travaux exécutés par la demanderesse - terrassement, évacuation de la terre et canalisations - l'avaient été à la requête de l'entrepreneur général. Il avait estimé que celui-ci pouvait agir de la sorte sur la base des expériences faites sur d'autres chantiers. A l'époque des travaux, il n'avait aucune connaissance des rapports contractuels entre les maîtres de l'ouvrage et l'entrepreneur général, sauf que celui-ci « représentait » des clients s'appelant les époux Z._ et qu'il vendait des maisons. E._, collaborateur de l'entrepreneur général ayant signé pour celui-ci le contrat d'entreprise générale et le plan de financement, a déclaré avoir lu le contrat aux maîtres de l'ouvrage, avoir commenté le plan financier et avoir expliqué quelle était la part forfaitaire et les frais annexes. A la question de savoir s'il était exact que l'entrepreneur s'était engagé à assumer la direction des travaux et à conclure tous les contrats avec les entrepreneurs et fournisseurs en son nom et pour son propre compte dans le cadre de la réalisation de ce bien, il a répondu que tel était bien le cas, qu'il s'agissait de la commande d'une villa « clé en mains » et que le contrat précisait ce qui était exactement compris dans la notion « clé en mains ». Il a encore confirmé que les maîtres ne pouvaient prétendre à aucun droit de regard concernant les offres et devis avant et après l'adjudication des travaux, pour la partie « clé en mains ». Il a finalement précisé que l'évaluation du coût du poste «évacuation de terre» avait été augmentée de 12'000 fr. à 40'000 fr. sur la base d'une estimation grossière qu'il avait faite après s'être rendu sur le terrain; le poste « canalisation » avait aussi été estimé de manière grossière. C._, directeur de l'entrepreneur général A._ Sàrl, a déclaré que cette société avait travaillé à de nombreuses reprises avec la demanderesse; à chaque fois, cette dernière s'était vu confier une partie des travaux par l'entrepreneur général et une autre partie directement par le maître de l'ouvrage. Le témoin a précisé que « [c]e qui était payé par A._ Sàrl c'était le terrassement, c'est-à-dire la creuse et la remise en place des terres, conformément aux plans mis à l'enquête. L'évacuation des terres était à la charge des propriétaires. Les travaux de X._ SA en lien avec les canalisations étaient également à la charge des propriétaires ». S'agissant des factures à la charge des propriétaires, elles étaient reçues pour contrôle par l'entrepreneur général qui établissait un bon de paiement et le transmettait aux propriétaires pour qu'ils le signent et le fassent suivre à leur banque. Entendus comme parties, les maîtres de l'ouvrage ont confirmé que pour les prestations hors forfait, l'entrepreneur général leur adressait les factures pour paiement après les avoir contrôlées. B.c. Statuant le 16 décembre 2014, le juge de district a rejeté l'objection de défaut de légitimation passive. Il a considéré en bref que selon l'accord des parties, l'entrepreneur général avait assumé un double rôle dans la construction de la villa des défendeurs, à savoir celui d'entrepreneur général pour une partie des prestations et celui de directeur des travaux pour le reste. L'entrepreneur devait assumer la direction des travaux hors forfait et, à ce titre, commandait les travaux en question au nom des maîtres, qui avaient ainsi bel et bien conclu un contrat avec la demanderesse, par l'intermédiaire de leur représentant. B.d. Par jugement du 16 octobre 2015, la Cour civile I du Tribunal cantonal du Valais a admis l'appel formé par les maîtres, rejeté la demande, condamné la demanderesse à payer des frais et dépens d'appel et renvoyé la cause au juge de district pour qu'il statue sur les frais et dépens de première instance. En substance, les juges cantonaux ont considéré que comme les défendeurs n'avaient eu aucun contact avec la demanderesse, leur volonté de s'engager n'avait pu être manifestée que par l'entrepreneur général, ce qui supposait que celui-ci en ait eu le pouvoir. Ce pouvoir ne pouvait découler que du contrat d'entreprise générale du 14 mai 2010, que les cocontractants interprétaient de façon divergente; il convenait d'examiner comment les défendeurs pouvaient comprendre ce contrat, respectivement s'ils pouvaient en déduire que A._ Sàrl agissait à la fois comme entrepreneur général et comme directeur des travaux. Or, l'interprétation objective du contrat ne permettait pas de considérer que les défendeurs auraient conféré un double rôle à l'entrepreneur général et lui auraient donné, en contradiction avec les termes clairs du contrat, le pouvoir d'agir en leur nom. Les défendeurs n'avaient ainsi pas de lien direct avec la demanderesse et n'avaient donc pas la légitimation passive, ce qui conduisait au rejet de l'action. C. La demanderesse a saisi le Tribunal fédéral d'un recours en matière civile dans lequel elle conclut à l'annulation de l'arrêt sur appel, la légitimation passive des maîtres de l'ouvrage étant reconnue et la cause étant renvoyée à l'autorité de première instance pour suite de la procédure. L'autorité intimée s'est référée aux considérants de son jugement. Les défendeurs ont conclu au rejet du recours. La demanderesse a déposé une réplique spontanée. Les défendeurs ont dupliqué.