尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證製作者的介紹僅有上面的一句話。 更多詳情請閱讀儲存庫 README。 儲存庫 README ↗
正在載入完整 README。
檢視完整 README ↗Panel de coach y plan semanal de cada atleta. Next.js en Vercel, login con Google (Firebase Auth), datos en Firestore y Firebase Admin SDK en rutas API privadas. Proyecto hecho desde cero con Claude Code. El diseño respeta el de la web original del plan de Claudia (rosa, celeste, amarillo y menta; Oswald y Nunito Sans; tarjetas por día con check y cuenta regresiva), con tres temas a elegir: rosa, azul y oscuro.
/ es el sitio informativo de Training Please (propósito, cómo funciona, piloto y "Crece con nosotros"). Contenido editable en src/lib/site.ts (testimonios, pasos y pilares); estilos en src/app/site.css./entrar es el login de la app. Las páginas privadas redirigen ahí si no hay sesión.pilotRequests/{correo} vía /api/solicitudes. El coach la ve en Panel coach › Solicitudes del piloto: Aprobar crea el alta (igual que el alta manual) y Descartar la cierra./api/bootstrap comprueba el correo (lista ADMIN_EMAILS o alta del coach), crea users/{uid} y pone el rol como custom claim. Un correo no registrado no entra.LEGAL_VERSION en src/lib/legal.ts). Puede revocarlo desde Ajustes › Privacidad; desde ese momento el coach deja de ver sus registros.| Ruta | Qué guarda | Quién escribe |
|---|---|---|
users/{uid} | rol, nombre, correo, tema, carrera objetivo, perfil, consentimiento vigente | servidor al crear; el atleta edita tema, perfil, carrera y consentimiento |
allowlist/{correo} | altas manuales pendientes o usadas | solo servidor |
pilotRequests/{correo} | solicitudes del sitio: datos de contacto, nivel, carrera, autorización y estado (pending, approved, dismissed) | solo servidor; el coach lee |
investorContacts/{id} | mensajes de "Crece con nosotros" | solo servidor; el coach lee |
consents/{uid}/events/{id} | evidencia: versión, finalidades, fecha, navegador, otorgado o revocado | atleta (solo agrega) |
plans/{uid}/weeks/{semanaISO} | título, fase, objetivo, notas, marca de IA | coach |
plans/{uid}/weeks/{semanaISO}/sessions/{id} | fecha, deporte, título, duración, distancia, RPE objetivo, instrucciones | coach |
logs/{uid}/entries/{sessionId} | realizada, RPE real, comentario | atleta |
"No realizada" no se guarda: se calcula al leer. Una sesión sin marcar queda pendiente hasta el final del día siguiente y luego no realizada. El cumplimiento cuenta solo las sesiones principales (las extra y el descanso no).
trainingplease, ya creado): activar Authentication › Google y Firestore (región sugerida southamerica-east1 o us-east1). En Authentication › Settings › Authorized domains, agregar el dominio de Vercel.npx firebase deploy --only firestore:rules --project <id>..env.example):
NEXT_PUBLIC_FIREBASE_*: opcionales; la configuración web del proyecto trainingplease ya está en src/lib/firebase.ts.FIREBASE_SERVICE_ACCOUNT: el JSON de la cuenta de servicio (Configuración del proyecto › Cuentas de servicio › Generar nueva clave), pegado en una línea. Nunca subirlo al repo.ADMIN_EMAILS: correos de Google de la coach y admins, separados por coma.npm run seed:plan -- [email protected] data/claudia-plan.json y la cuenta de servicio.data/claudia-plan.json (semanas y sesiones) y data/claudia-meta.json (fases, mes a mes, "lo mejor de mí y mi reto", niveles de meta) guardan el contenido de la web estática de Claudia, que se retiró del repo. Sirven para cargar su plan y para construir más adelante las vistas "La meta" y "Lo mejor de mí".
npm install
npm run lint # tipos
npm test # fechas, estados y cumplimiento
npm run test:rules # reglas de Firestore en el emulador (requiere Java)
cp .env.emulators.example .env.local && npm run dev:emu # app completa con emuladores
Con emuladores, en la consola del navegador __tpSignIn('[email protected]') inicia sesión sin la ventana de Google.
En la ficha de cada atleta (panel coach) hay dos paneles:
scripts/seed-plan.mjs ([{ id, week, sessions }]) o un archivo exportado. Muestra una vista previa y lo guarda por /api/admin/plan con el mismo comportamiento que el script: fusiona la semana y crea o reemplaza sus sesiones, sin borrar otras.Cada domingo a las 4 pm de Lima (cron de Vercel, vercel.json) el agente principal analiza la semana que cierra de cada atleta y arma la siguiente. Si el Guardián no encuentra problemas, la carga sola en el plan del atleta; si encuentra, queda pendiente en la ficha del atleta (sección "Agente principal") para que el coach la apruebe, la edite o la descarte. Antes de las 4 pm el coach puede dejar una nota para la próxima semana de cada atleta, y el atleta sus avisos (viajes, días sin entrenar); el agente lee ambos. El coach también puede pedir la semana en el momento con "Generar la semana siguiente ahora", que siempre queda para aprobar.
src/lib/agent/metrics.ts (Análisis): cumplimiento, km, RPE y alertas, en código.src/lib/agent/methodology.ts (Ciencia): la metodología vigente que sigue el modelo (versión 2: principios publicados de Daniels y reglas de seguridad con estudios; detalle en 09-metodologia-agente-ciencia.md).src/lib/agent/fitness.ts (Ciencia): índice de forma, equivalencias y ritmos por atleta con las ecuaciones de Daniels y Gilbert, a partir del tiempo de referencia que el coach guarda en la ficha (sección "Forma actual").src/lib/agent/headCoach.ts: llama a la Claude API (salida JSON con esquema) y corrige hasta 3 veces si el Guardián encuentra problemas.src/lib/agent/guardrails.ts (Guardián): reglas duras sobre la propuesta: tope de +20 % de km por semana (+30 % sobre hace dos), ninguna salida más de 10 % sobre la más larga de 30 días, fondo hasta 150 min, topes por tipo de sesión, días duros, taper, días suaves tras una carrera, descarga, dolor, enfermedad y formato. En un ajuste puntual las reglas de estructura quedan como avisos.proposals/{uid}/weeks/{semana}, athleteMemory/{uid} (ficha, tiempo de referencia, meta de tiempo e historial) y agentRuns/{id} (registro con tokens y costo). Solo servidor; las reglas de Firestore ya los niegan al cliente.ANTHROPIC_API_KEY (clave de la Claude API) y CRON_SECRET (cualquier texto largo; Vercel lo envía al cron).RESEND_API_KEY: sin ella no se envía ningún correo y todo lo demás funciona igual (/api/health muestra email).EMAIL_FROM (opcional, por defecto Training Please <[email protected]>): remitente de un dominio verificado en Resend.RESEND_SEGMENT_BOLETIN y RESEND_SEGMENT_ATLETAS (opcionales): ids de segmentos de Resend./#boletin) guarda newsletter/{correo} con su consentimiento y suma el contacto al segmento del boletín. El boletín y los comunicados se escriben y envían desde Broadcasts en Resend, que agrega la baja./coach/blog (posts en posts/{slug}, con versión en inglés opcional y marca «Solo atletas»). "Enviar a los atletas" manda un correo a cada atleta con consentimiento, en su idioma; "Enviar al boletín" crea y envía un broadcast al segmento RESEND_SEGMENT_BOLETIN (solo posts públicos). Los me gusta pasan por /api/blog/like: uno por cuenta o por navegador, y como máximo 5 anónimos por post desde una misma conexión (la IP se guarda solo como hash con LIKE_SALT, o CRON_SECRET si no existe).08-arquitectura-agentes-ia.md en los documentos del proyecto.