# LinkedSign – AI Development Agent (Codex) ## Context You are working on a full-stack web application called **LinkedSign**, a digital document signing platform using PFX/P12 certificates. ## Tech Stack (MANDATORY) - Backend: Node.js + Express - Frontend: React (Vite) - Database: MariaDB - Auth: JWT (access + refresh) - Encryption: - bcrypt or argon2 for passwords - AES-256-GCM for sensitive data - Architecture: REST API (frontend/backend separated) ## Environment - OS: Debian 12 (no GUI) - IDE: code-server - Root path: /home/mgonzalez/desarrollo/react/linkedsign/ --- ## Global Rules (CRITICAL) - Always maintain modular architecture (domain-based modules) - NEVER break existing structure - Prefer minimal changes over rewrites - All code must be production-ready - Always validate inputs - Always apply security best practices by default - Always log critical actions - Never expose secrets in code - Use environment variables (.env) --- ## Backend Architecture Each module must follow: controller → service → repository → routes → validator Modules: - auth - users - subscriptions - documents - certificates - signatures - invitations - mail - audit - legal - health --- ## Security Requirements - Rate limiting on login - Brute-force protection - Helmet enabled - CORS restricted - Input validation (Joi/Zod) - File validation (PDF only) - Encrypt: - PFX files (or protect access) - certificate passwords - Audit: - login attempts - IP address - timestamps - document actions --- ## Storage Rules - Documents stored in: /storage/documentos/YYYY/MM/ - NEVER store files inside database --- ## Frontend Rules - Use React with modular structure (features-based) - Responsive UI (mobile + desktop) - Clean modern UI (prefer Tailwind or clean CSS) - Use services layer for API calls - Use hooks for logic reuse --- ## Features to Build 1. Authentication (with email confirmation) 2. Document management (upload, download, delete) 3. Certificate management (PFX/P12) 4. Digital signature (single + multi-user) 5. Invitations (guest signing via link) 6. Audit system 7. Legal acceptance (terms & privacy) --- ## API Requirements - All endpoints must be documented - Provide cURL examples for each endpoint - Use consistent response format: { success: boolean, data: any, error: string | null } --- ## Code Quality - Use async/await - Use centralized error handling - Avoid duplicated logic - Use clear naming conventions --- ## Testing - Add tests when logic is critical - Do not break existing functionality --- ## Workflow Before writing code: 1. Analyze current structure 2. Propose plan 3. Wait for approval (IMPORTANT) 4. Then implement --- ## Language Rules - Explain in Spanish - Code in English --- ## Skills Usage (IMPORTANT) You can use skills when appropriate: - Use "refactor" skill for improving structure - Use "security review" skill before finalizing modules - Use "ui improvement" skill for frontend polishing - Use "generate tests" skill for critical flows Always suggest when a skill can be applied. --- ## Goal Build a secure, scalable, production-ready digital signing platform suitable for multi-user environments and legal compliance. --- ## Guía rápida: nuevo tipo de estampado Cuando se cree o ajuste un nuevo estampado visual de firma, revisar siempre estas capas: ### 1. Vista previa en configuración - Archivo: `frontend/src/components/ui/SignatureStylePicker.jsx` - Aquí se agrega el nuevo estilo al arreglo `STYLES` - Cambiar: - `id` - `label` - `desc` - `preview(...)` ### 2. Vista previa al colocar la firma sobre el PDF - Archivo: `frontend/src/components/ui/PdfSignaturePlacer.jsx` - Aquí se dibuja el estampado que el usuario ve antes de firmar - Cambiar: - rama `if (signatureStyle === 'nuevo-estilo')` - ancho dinámico si aplica en `getSignatureWidth(...)` - partición de nombre o textos fijos si aplica ### 3. Estilos CSS de las vistas previas - Archivo: `frontend/src/index.css` - Aquí viven: - `.sig-preview-*` - `.sp-*` - Cambiar: - borde - fondo - tipografía - separadores - layout del QR y textos ### 4. PDF final real que se incrusta al firmar - Archivo: `backend/src/modules/signing/signing.service.js` - Este es el archivo clave del sello visible real dentro del PDF - Cambiar: - función nueva tipo `drawStyleNuevo(...)` - selección del estilo en `signPdf(...)` - helper de líneas/nombre si aplica - QR, bordes, divisor, tipografía y textos fijos ### 5. Flujo backend que llama al generador PDF - Firma normal web: - `backend/src/modules/signatures/signatures.service.js` - Firma por invitación: - `backend/src/modules/invitations/invitations.service.js` - PDF legal firmado: - `backend/src/modules/legal/legal.service.js` Si el estampado no cambia en el PDF final, verificar primero que el flujo usado realmente pase por `backend/src/modules/signing/signing.service.js`. ### 6. Orden correcto de trabajo 1. Ajustar preview en `SignatureStylePicker.jsx` 2. Ajustar preview de estampado en `PdfSignaturePlacer.jsx` 3. Ajustar CSS en `frontend/src/index.css` 4. Ajustar sello PDF real en `backend/src/modules/signing/signing.service.js` 5. Validar: - `cd frontend && npm run build` - `cd backend && node -e "require('./src/app')"` 6. Si va a producción: - `commit` - `push` - deploy web ### 7. Regla práctica importante Si el cambio se ve en la web pero no en el PDF firmado: - casi seguro falta tocar `backend/src/modules/signing/signing.service.js` - o el backend runtime de producción quedó desalineado respecto a `source` ### 8. Verificación obligatoria en producción para cambios backend Cuando el cambio afecta el PDF final o cualquier lógica backend: 1. hacer deploy 2. reiniciar `linkedsign-backend` 3. confirmar que el `PID` cambió: - `ps -ef | grep 'node .*src/server.js' | grep -v grep` 4. revisar que el proceso activo escucha en `:4000` 5. recién después hacer la prueba funcional Caso ya confirmado en producción: - el archivo en disco puede tener el fix correcto - pero si `linkedsign-backend` no reinicia de verdad, el proceso sigue firmando con código viejo en memoria ### 9. Método recomendado para depurar un estampado nuevo Si un sello no refleja cambios y hay duda de ruta: 1. agregar una marca visual temporal en `backend/src/modules/signing/signing.service.js` 2. desplegar 3. reiniciar backend y confirmar cambio de `PID` 4. firmar un PDF nuevo 5. comprobar si la marca aparece en el PDF final 6. quitar la marca temporal antes de cerrar el trabajo