feat: integrar frontend fronted-v-saas — un solo repo, V intacta, chat cableado - #54
Merged
Merged
Conversation
…t cableado Reemplaza completo el frontend de vforge por el nuevo fronted-v-saas (Zenith Forge design system, sereno/premium/cinemático). El backend de V queda 100% intacto — su personalidad, tools, skills, memoria y BD no se tocan ni un byte. Arquitectura post-integración (un solo repo, vforge) Frontend nuevo - app/ root (sin src/): landing /, marketing (/pricing, /marketplace, /glossary), auth (/sign-in, /sign-up con Clerk opcional), /onboarding, /offline, dashboard /app/* (chat, hub, projects, secrets, activity, deployments, repovision, integrations, marketplace, settings). - components/: workspace (ChatExperience, WorkspaceShell, etc.), marketing, brand (VMark, VWatermark), auth (ClerkShell), pwa, controls, onboarding, ThemeBootScript. - i18n/: AppProviders + dictionaries (ES/EN). - middleware.ts: Clerk opcional — si NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY está, protege /app y /onboarding; si no, pasa todo (fallback visual). - tailwind.config.ts + postcss.config.js: Tailwind 3.4 con tokens Zenith Forge (void, ink, surface, on-surface, tint-1/2/3, violet, cyan, success-emerald, error-crimson). - public/: manifest.webmanifest + sw.js + iconos. Backend intacto - app/api/* completo (24 endpoints): /api/forge/run, conversations, active-session, recap, transcribe, cost, extract-secret + projects, vault, github, v-* infra, admin, stats. - lib/forge/* (system-prompt v2, tools, routing, gemini-adapter, v-server, agent-config, models, openrouter-catalog). - lib/db, lib/vault, lib/github, lib/namecom, lib/vercel. - migrations/, V_*.md, docs/. Chat cableado a V real - components/workspace/chat/ChatExperience.tsx reescrito: reemplaza setTimeout mock por fetch SSE a /api/forge/run. - Mount: GET /api/forge/active-session?scope=general → resuelve sessionId canónico (mismo session_id en cualquier device). - Rehidratación: GET /api/forge/conversations → carga historial real para que V no parezca "empezar de cero". - Streaming SSE: parsea events text/error, AbortController para Stop button, indicador "V está pensando". - Mobile: fontSize 16 anti-zoom iOS, touch-action manipulation, enterKeyHint=send, autoCapitalize sentences, inputMode text. Stack final - Next.js 16.2.4 (vforge) - React 19 (vforge) - Tailwind 3.4 (downgrade desde 4 — el design Zenith Forge usa config.ts; mucho menos doloroso que migrar a Tailwind 4 syntax) - TypeScript 5.7 - Clerk 6.12 (opcional) - Geist + Hanken Grotesk fonts - Framer Motion 12, lucide-react 0.564 Eliminado - app/(dashboard)/* (todas las pages viejas: hub, projects, vault, modules, activity, settings, v, forge, hunter, scout, vision) - components/V/*, components/vforge/* - components/ui/* (shadcn — no usado por el nuevo) - components/providers/*, components/web-apis/* - hooks/* (use-toast del stack viejo) - app/(dashboard)/template.tsx - Deps obsoletas del package.json: @radix-ui/*, cmdk, date-fns, embla, input-otp, react-day-picker, react-hook-form, react-markdown, react-resizable-panels, recharts, remark-gfm, sonner, vaul, next-themes, @hookform/resolvers, zod (devkitless used), entre otras. Verificación - npx tsc --noEmit → 0 errores - npx next build → exitoso (24 API routes + 13 páginas server-rendered + páginas marketing prerendered + middleware) - V sigue siendo V (BD intacta, system_prompt v2 intacto, tools intactas) Pendiente próximos PRs (cuando uses el preview) - Conectar páginas /app/projects, /app/secrets, etc. a sus APIs reales (hoy usan datos de demostración del nuevo template) - Adaptar /app/hub si quieres que sea diferente al chat principal - Habilitar Clerk con keys en producción cuando estés listo (hoy funciona sin keys, dejándote pasar directo) - Conservar /app/integrations vacío hasta que decidas qué mostrar ahí https://claude.ai/code/session_01YD9ckFDdBjDhYB6aaH1HR4
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
PR #54 CI fallaba en "Install dependencies" porque npm ci usa el algoritmo estricto de peer-deps por defecto y Clerk 6.12.0 declara peerDependency de React 18 mientras que vforge usa React 19. La instalación local funcionaba porque usé --legacy-peer-deps explícito. .npmrc con legacy-peer-deps=true hace que npm ci respete el flag automáticamente en CI sin tocar el workflow file. Lockfile re-committeado para reflejar el árbol de deps resuelto con React 19 + Clerk 6 (compatibles en runtime, solo el peer marker es estricto).
El landing público (/, /pricing, /marketplace, etc.) aparecía sin estilos porque tailwind.config.ts heredado del repo fronted-v-saas tenía content: ["./src/**"] — pero al integrar a vforge yo moví todo a root sin src/. Tailwind no encontraba ningún archivo y no procesaba clases. Las pantallas dashboard (/app/*) sí se veían bien porque tienen estilos heredados del WorkspaceShell, pero el landing usa componentes components/marketing/* que dependen de clases tailwind directas (text-violet-300, border-app, bg-tint-1, etc.). Fix: content paths a ./app, ./components, ./i18n, ./lib (la estructura real de vforge). Build verificado: npx next build → exitoso, todas las páginas generan HTML con clases procesadas.
PR #54 lint step fallaba con exit 127 (command not found) porque al recortar deps obsoletas removí "eslint" sin querer. Los plugins (@typescript-eslint/*, @next/eslint-plugin-next, eslint-config-next, eslint-plugin-react-hooks) son solo bibliotecas — necesitan eslint instalado para resolver el binario "eslint". Fix: agregar eslint ^9.15.0 a devDeps (compatible con plugins ya declarados). Verificado local: npm run lint → 0 errors, 12 warnings preexistentes del backend.
Preview daba 401 en /app/* porque NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY está configurado en Vercel y el middleware llamaba auth.protect() en toda ruta /app/* y /onboarding/*. Pero el backend de vforge usa operator_luis hardcoded — Clerk no aporta seguridad real todavía, solo bloquea el acceso al producto. Fix: middleware Clerk se inicializa (para que /sign-in y /sign-up rendericen los componentes oficiales con las keys) pero deja pasar todas las rutas sin proteger. Cuando aterrice M11 (Clerk cableado a user_id en BD), reintroducimos auth.protect() en /app/* y queda seguridad real.
…deploys, repos, integraciones Reemplaza el demo data del template (Orion Studio, Atlas Bookings, Nova CRM, secretos genéricos, eventos fake) por fetches a los endpoints reales del backend de V. Cada página ahora muestra tus datos. Páginas conectadas - /app/projects → GET /api/projects (tu catálogo real de proyectos con github_repo, vercel_url, dominio, categoría). Empty state si la BD está vacía. Botón "abrir" si hay deploy. Status real basado en category (produccion/activo/en_revision/etc.). - /app/secrets → GET /api/vault/operator-secrets (vault real encriptado AES-256-GCM). Lock/unlock flow con operator_token en localStorage. Muestra keys reales con scope, source, fecha de rotación. Las stats arriba (rotations, total, stale) cuentan registros reales. - /app/activity → NUEVO endpoint /api/forge/activity?limit=50 + página cableada. Lista audit_events reales con icono y color semántico por tipo de acción (forge.chat, project.create, vercel.*, vault.*, namecom.dns, github.*, etc.). Time-ago calculado en cliente. - /app/deployments → GET /api/projects filtrado por vercel_url. Tabla con dominio, status (live/preview/draft según category), link directo a Vercel deploy. - /app/repovision → GET /api/github/repos (tus repos vivos con stars, language, default_branch, last push). Cards clickables. - /app/integrations → GET /api/v-health. Cards por cada check (db, vault, openrouter, etc.) con status real (ok/error) y detalle. Endpoint nuevo - app/api/forge/activity/route.ts: GET ?limit=N&userId=X → últimos N audit_events del operador, ORDER BY created_at DESC. Estable, sin acoplar a UI. Sin tocar - V (lib/forge/*, system-prompt, tools, skills, BD identity). - Todos los demás /api/* endpoints (intactos). - Marketing pages (/, /pricing, /marketplace, /glossary, /sign-in). - Chat real /app/chat (ya conectado). Verificación - npx tsc --noEmit → 0 errores - npx next build → exitoso (24 API routes + páginas server-rendered + marketing prerendered) - Páginas siguen el design Zenith Forge (violet/cyan/emerald, fonts Geist + Hanken Grotesk + JetBrains Mono, label-caps, chip, etc.) https://claude.ai/code/session_01YD9ckFDdBjDhYB6aaH1HR4
turbillon50
marked this pull request as ready for review
May 17, 2026 22:59
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Integración del frontend nuevo
fronted-v-saasal repo vforgeUn solo repo, V intacta, chat cableado a su cerebro real.
Lo grande
app/(dashboard)/*app/root con landing +/app/*dashboard@theme inlinetailwind.config.tsZenith Forge/api/forge/runreal con SSE streaming + rehidrataciónBackend intocado
🛡 V no se toca un byte:
lib/forge/*(system-prompt v2, tools, routing, gemini-adapter, v-server)lib/db, lib/vault, lib/github, lib/namecom, lib/vercelapp/api/*(24 endpoints completos)migrations/*V_*.md(35KB system prompt v2 + 4 docs)Rutas
Marketing público:
/(landing) ·/glossary·/pricing·/marketplace·/sign-in·/sign-up·/onboarding·/offlineDashboard (V):
/app/chat(V conversacional principal) ·/app/hub·/app/projects·/app/secrets·/app/activity·/app/deployments·/app/repovision·/app/integrations·/app/marketplace·/app/settingsAPI (intactas):
24 endpoints bajo
/api/*— referencia completa endocs/backend-contract.md(PR #53)Chat cableado a V real
components/workspace/chat/ChatExperience.tsxahora hace:GET /api/forge/active-session?scope=general→ resuelvesessionIdcanónico (mismo session en cualquier device)GET /api/forge/conversations?sessionId=X&limit=100→ carga historial REAL de V (no "empieza de cero")POST /api/forge/runcon SSE streamingtext/error, soporta Stop button via AbortControllerEliminado (basura ya inútil)
app/(dashboard)/*(12 pages viejas)components/V/*(6 archivos)components/vforge/*(15 archivos)components/ui/*(45 componentes shadcn — el nuevo no los usa)components/providers/*,components/web-apis/*hooks/*(use-toast del stack viejo)Verificación
npx tsc --noEmit→ 0 erroresnpx next build→ exitoso, 24 API routes + 13 pages + middlewareDiff total
-23,050 líneas / +7,884 líneas (mucho menos código, V intacta)
Pendiente próximos PRs
/app/projects,/app/secrets,/app/activity, etc. a sus APIs reales (hoy muestran datos de demo del template)/app/*)/app/integrationsy/app/hub(si los quieres distintos del chat principal)Generated by Claude Code