diff --git a/data/cv-en.json b/data/cv-en.json index ba20f3e..dd5557b 100644 --- a/data/cv-en.json +++ b/data/cv-en.json @@ -1,22 +1,22 @@ { "personal": { "name": "Juan Andrés Moreno Rubio", - "title": "Lead Technical Consultant, FullStack Developer", + "title": "Senior Technical Consultant & Full-Stack Developer", "titleBadges": [ "Technical Consultant", "Full-Stack Engineer", "Authentication Specialist", - "Solution Architect" + "Open Source Contributor" ], "location": "Arrecife, Las Palmas de Gran Canaria, Spain", "email": "txeo.msx@gmail.com", "phone": "", - "dateOfBirth": "1980-03-02", - "placeOfBirth": "Plasencia (Cáceres), Spain", + "dateOfBirth": "", + "placeOfBirth": "", "citizenship": "Spanish", "linkedin": "https://www.linkedin.com/in/juan-andres-moreno-rubio", "github": "https://github.com/juanatsap", - "domestika": "https://www.domestika.org/es/txeo/portfolio", + "domestika": "", "website": "https://juan.andres.morenorub.io", "photo": "/static/images/profile.jpg", "firstName": "Juan Andrés", @@ -26,12 +26,12 @@ "seo": { "pageTitle": "Curriculum Vitae", "metaTitle": "Professional CV", - "metaDescription": "18 years of experience in web development, SAP CDC, React, Node.js, Go, HTMX and AI-assisted development", - "ogDescription": "Senior Technical Consultant with 18 years of experience", - "keywords": "CV, Resume, FullStack Developer, SAP CDC, React, Node.js, Go, HTMX, AI, Web Development, Technical Consultant" + "metaDescription": "Senior Technical Consultant and Full-Stack Developer — Go, HTMX, React, Node.js. SAP CDC, authentication systems, AI integration, open-source tools", + "ogDescription": "Senior Technical Consultant & Full-Stack Developer — Go, AI, HTMX, SAP CDC", + "keywords": "CV, Resume, FullStack Developer, Go, Swift, macOS, MCP, AI, HTMX, React, Node.js, SAP CDC, Native Apps, CLI Tools, Open Source" }, - "summary": "Full-stack developer specialized in high-availability systems. I've worked on Olympic Games platforms, airport authentication systems with millions of users, and built around 20 websites for diverse sectors (e-commerce, enterprise, institutional). Certified SAP Customer Data Cloud consultant, advising 35-40 international clients on digital identity solutions.", - "skillsSummary": "Full-stack developer with experience in Go, Node.js, React, and HTMX for modern applications, plus Java and PHP knowledge for legacy projects. I've worked on around 20 websites and provided consulting for 35-40 international clients, from e-commerce and enterprise platforms to authentication systems managing millions of users. Familiar with AI-assisted development workflows and infrastructure management (Linux, Docker, CI/CD). I adapt well to both independent work and collaborative teams across different countries.", + "summary": "Full-stack developer specialized in authentication systems and high-availability platforms. I've worked on Olympic Games platforms, airport authentication systems with millions of users, and built around 20 websites for diverse sectors. Certified SAP Customer Data Cloud consultant, advising 35-40 international clients on digital identity solutions. I also develop open-source tools and native applications independently through Drolosoft.", + "skillsSummary": "Full-stack developer with experience in Go, Node.js, React, and HTMX for modern applications. I've provided consulting for 35-40 international clients, from e-commerce and enterprise platforms to authentication systems managing millions of users. I integrate AI tools into my development workflows and build projects that use LLMs and MCP. I also create open-source tools and native macOS apps independently. Comfortable managing infrastructure with Linux, Docker, and CI/CD.", "experience": [ { "position": "Senior SAP Technical Consultant", @@ -350,24 +350,23 @@ "technical": [ { "category": "Programming Languages", - "proficiency": 4, + "proficiency": 7, "items": [ - "JavaScript (ES6+)", "Go", + "Swift", + "JavaScript (ES6+)", "TypeScript", "Node.js", "Python", "Shell Scripting (Bash/Unix)", "PHP", "Java", - "Groovy", - "SQL", - "Assembler" + "SQL" ] }, { "category": "JavaScript Ecosystem", - "proficiency": 5, + "proficiency": 8, "sidebar": "left", "items": [ "Node.js & Express", @@ -380,7 +379,7 @@ }, { "category": "Go Ecosystem", - "proficiency": 5, + "proficiency": 8, "sidebar": "left", "items": [ "Hono - High-Performance Web Framework", @@ -393,15 +392,26 @@ ] }, { - "category": "Frontend Technologies", + "category": "Swift & macOS Development", "proficiency": 5, "sidebar": "left", + "items": [ + "Swift 6 & SwiftUI", + "AppKit & macOS APIs", + "Native Menu Bar Applications", + "UserNotifications & AVFoundation", + "macOS App Distribution & Notarization" + ] + }, + { + "category": "Frontend Technologies", + "proficiency": 9, + "sidebar": "left", "items": [ "HTMX - Hypermedia-Driven Applications", "HTML5 & Semantic Web", "CSS3, Tailwind CSS, SASS/LESS", "JavaScript - DOM Manipulation & AJAX", - "jQuery", "Progressive Enhancement & Accessibility", "Responsive & Mobile-First Design", "Template Engines (Handlebars, Panini, Mustache)" @@ -409,7 +419,7 @@ }, { "category": "Backend Technologies", - "proficiency": 5, + "proficiency": 8, "sidebar": "left", "items": [ "Go - Current Primary Stack", @@ -420,21 +430,9 @@ "Database Design & Optimization" ] }, - { - "category": "Legacy Enterprise Technologies", - "proficiency": 3, - "sidebar": "left", - "items": [ - "Java & J2EE", - "Spring Framework, Struts, Hibernate", - "PHP & WordPress", - "Yii Framework, Zend Framework", - "Enterprise Application Servers (Tomcat, JBoss, WebLogic)" - ] - }, { "category": "Infrastructure & Servers", - "proficiency": 5, + "proficiency": 7, "sidebar": "right", "items": [ "Linux Server Administration", @@ -446,7 +444,7 @@ }, { "category": "DevOps & CI/CD", - "proficiency": 5, + "proficiency": 7, "sidebar": "right", "items": [ "CI/CD Pipeline Design & Implementation", @@ -458,7 +456,7 @@ }, { "category": "Databases", - "proficiency": 4, + "proficiency": 6, "sidebar": "right", "items": [ "PostgreSQL", @@ -472,32 +470,19 @@ }, { "category": "Team Management", - "proficiency": 4, + "proficiency": 6, "sidebar": "right", "items": [ - "Preparation and projects startup", - "Fluid communication with clients", - "Recruitment", - "Tasks management", - "Monthly reports" - ] - }, - { - "category": "Design Tools", - "proficiency": 3, - "sidebar": "right", - "items": [ - "Corel Draw", - "Adobe PhotoShop", - "Adobe Illustrator", - "Affinity", - "Excalidraw", - "GIMP" + "Cross-Functional Team Coordination", + "Client Advisory & Stakeholder Management", + "Technical Mentoring & Onboarding", + "Project Planning & Delivery", + "International Team Collaboration" ] }, { "category": "SAP Technologies", - "proficiency": 5, + "proficiency": 9, "sidebar": "right", "items": [ "SAP Customer Data Cloud (CDC)", @@ -507,15 +492,16 @@ ] }, { - "category": "AI-Assisted Development", - "proficiency": 5, + "category": "AI Engineering & Integration", + "proficiency": 7, "sidebar": "right", "items": [ - "AI Development Workflows (Claude Code, Copilot, GPT-4)", - "Agent-Based & Spec-Driven Development", - "Prompt Engineering & AI Integration", - "Automated Code Generation & Documentation", - "OpenAI & Anthropic APIs" + "MCP Servers (Model Context Protocol)", + "Google ADK & Gemini Integration", + "LLM APIs (OpenAI, Anthropic, Google)", + "AI-Driven Development Workflows (Claude Code, Copilot)", + "CLIP Embeddings & Visual Search", + "Agentic Workflows & Automation" ] } ], @@ -528,7 +514,7 @@ "Training & Mentoring", "Client Relationship Management", "Flexibility & Adaptability", - "Marketing & Resource Management" + "Product Development & Shipping" ] }, "languages": [ @@ -608,6 +594,59 @@ ], "projectID": "cmux-resurrect" }, + { + "title": "SoundInbox - Native macOS Email Sound Alerts", + "projectName": "SoundInbox", + "projectDesc": "Native macOS Email Sound Alerts", + "url": "https://drolosoft.com/soundinbox.html?lang=en", + "gitRepoUrl": "https://github.com/drolosoft/soundinbox", + "projectLogo": "soundinbox.png", + "location": "Online", + "startDate": "2026", + "current": true, + "technologies": [ + "Swift 6", + "SwiftUI", + "AppKit", + "AVFoundation", + "macOS Native" + ], + "shortDescription": "Open-source native macOS menu bar app that turns important emails into unmistakable sounds. Formula-based email detection with curated alert sounds, custom rule engine, and zero dependencies.", + "responsibilities": [ + "Built native macOS menu bar application in Swift 6 with SwiftUI and AppKit", + "Implemented formula-based email detection engine with AND/OR logic and regex matching", + "Created 10 pre-built detection formulas (payments, sales, urgent, shipping, security)", + "Designed match history timeline with statistics and 15 curated alert sounds", + "Published as open-source with 137 tests across 11 test suites" + ], + "projectID": "soundinbox" + }, + { + "title": "Commando - Terminal Command Manager for macOS", + "projectName": "Commando", + "projectDesc": "Terminal Command Manager for macOS", + "url": "https://drolosoft.com/commando.html?lang=en", + "projectLogo": "commando.png", + "location": "Online", + "startDate": "2026", + "current": true, + "technologies": [ + "Go", + "SwiftUI", + "SQLite FTS5", + "macOS Native", + "CLI Tools" + ], + "shortDescription": "Native macOS terminal command manager combining Go backend with SwiftUI frontend. Organize, search, and execute terminal commands with full-text search, TUI manager, and alias discovery.", + "responsibilities": [ + "Built hybrid native macOS app combining Go backend with SwiftUI frontend", + "Implemented full-text search using SQLite FTS5 with BM25 ranking (<50ms results)", + "Created TUI manager for launching terminal UIs (htop, lazygit, lazydocker)", + "Built alias manager that discovers and manages shell aliases across bash, zsh, and fish", + "Designed freemium model with free basic features and Pro tier for advanced tools" + ], + "projectID": "commando" + }, { "title": "Somos Una Ola - Beach Cleaning Initiative", "projectName": "Somos Una Ola", @@ -834,10 +873,8 @@ "duration": "Various", "shortDescription": "Professional development courses in SAP technologies, UX design, security, and data analytics through LinkedIn Learning's comprehensive training platform.", "responsibilities": [ - "
Aprende lectura rápida April 2020: Speed reading techniques and comprehension strategies for professional development and efficient information processing
", "
A Tour of the SAP Cloud Platform February 2020: Comprehensive overview of SAP Cloud Platform services, architecture, and integration capabilities for enterprise cloud solutions
", "
Learning Android Security February 2020: Android security best practices, encryption methods, secure coding practices, and mobile application security fundamentals
", - "
Persuasive UX: Creating Credibility January 2020: User experience design principles focused on building trust, credibility, and persuasive design patterns for web applications
", "
Big Data Foundations: Techniques and Concepts December 2019: Fundamentals of big data technologies, distributed computing, data processing frameworks, and analytics techniques
" ], "courseID": "linkedin-learning-certificatio" @@ -976,11 +1013,11 @@ } ], "other": { - "driverLicense": "Type B" + "driverLicense": "" }, "meta": { - "version": "2025-11-09", - "lastUpdated": "2025-11-08", + "version": "2026-04-12", + "lastUpdated": "2026-04-12", "format": "JSON Resume Extended", "language": "en" } diff --git a/data/cv-es.json b/data/cv-es.json index a5caab2..0d2164e 100644 --- a/data/cv-es.json +++ b/data/cv-es.json @@ -1,22 +1,22 @@ { "personal": { "name": "Juan Andrés Moreno Rubio", - "title": "Consultor Técnico Senior, Desarrollador FullStack", + "title": "Consultor Técnico Senior & Desarrollador Full-Stack", "titleBadges": [ "Consultor Técnico", "Ingeniero Full-Stack", "Especialista en Autenticación", - "Arquitecto de Soluciones" + "Contribuidor Open Source" ], "location": "Arrecife, Las Palmas de Gran Canaria, España", "email": "txeo.msx@gmail.com", "phone": "", - "dateOfBirth": "1980-03-02", - "placeOfBirth": "Plasencia (Cáceres), España", + "dateOfBirth": "", + "placeOfBirth": "", "citizenship": "Española", "linkedin": "https://www.linkedin.com/in/juan-andres-moreno-rubio", "github": "https://github.com/juanatsap", - "domestika": "https://www.domestika.org/es/txeo/portfolio", + "domestika": "", "website": "https://juan.andres.morenorub.io", "photo": "/static/images/profile.jpg", "firstName": "Juan Andrés", @@ -26,12 +26,12 @@ "seo": { "pageTitle": "Curriculum Vitae", "metaTitle": "CV Profesional", - "metaDescription": "18 años de experiencia en desarrollo web, SAP CDC, React, Node.js, Go, HTMX y desarrollo asistido por IA", - "ogDescription": "Consultor Técnico Senior con 18 años de experiencia", - "keywords": "CV, Curriculum Vitae, Desarrollador FullStack, SAP CDC, React, Node.js, Go, HTMX, IA, Desarrollo Web, Consultor Técnico" + "metaDescription": "Consultor Técnico Senior y Desarrollador Full-Stack — Go, HTMX, React, Node.js. SAP CDC, sistemas de autenticación, integración IA, herramientas open-source", + "ogDescription": "Consultor Técnico Senior & Desarrollador Full-Stack — Go, IA, HTMX, SAP CDC", + "keywords": "CV, Curriculum Vitae, Desarrollador FullStack, Go, Swift, macOS, MCP, IA, HTMX, React, Node.js, SAP CDC, Apps Nativas, Herramientas CLI, Open Source" }, - "summary": "Desarrollador full-stack especializado en sistemas de alta disponibilidad. He participado en plataformas de Juegos Olímpicos, sistemas de autenticación aeroportuaria con millones de usuarios, y desarrollado unos 20 sitios web para diversos sectores (e-commerce, empresariales, institucionales). Consultor certificado de SAP Customer Data Cloud, asesorando a 35-40 clientes internacionales en soluciones de identidad digital.", - "skillsSummary": "Desarrollador full-stack con experiencia en Go, Node.js, React y HTMX para aplicaciones modernas, además de conocimientos en Java y PHP para proyectos legacy. He trabajado en unos 20 sitios web y realizado consultoría para 35-40 clientes internacionales, desde e-commerce y plataformas empresariales hasta sistemas de autenticación que gestionan millones de usuarios. Familiarizado con flujos de trabajo asistidos por IA y gestión de infraestructura (Linux, Docker, CI/CD). Me adapto bien tanto al trabajo independiente como colaborativo en equipos internacionales.", + "summary": "Desarrollador full-stack especializado en sistemas de autenticación y plataformas de alta disponibilidad. He participado en plataformas de Juegos Olímpicos, sistemas de autenticación aeroportuaria con millones de usuarios, y desarrollado unos 20 sitios web para diversos sectores. Consultor certificado de SAP Customer Data Cloud, asesorando a 35-40 clientes internacionales en soluciones de identidad digital. También desarrollo herramientas open-source y aplicaciones nativas de forma independiente a través de Drolosoft.", + "skillsSummary": "Desarrollador full-stack con experiencia en Go, Node.js, React y HTMX para aplicaciones modernas. He realizado consultoría para 35-40 clientes internacionales, desde e-commerce y plataformas empresariales hasta sistemas de autenticación que gestionan millones de usuarios. Integro herramientas de IA en mis flujos de desarrollo y construyo proyectos que usan LLMs y MCP. También creo herramientas open-source y apps nativas macOS de forma independiente. Cómodo gestionando infraestructura con Linux, Docker y CI/CD.", "experience": [ { "position": "Consultor Técnico Senior SAP", @@ -350,24 +350,23 @@ "technical": [ { "category": "Lenguajes de Programación", - "proficiency": 4, + "proficiency": 7, "items": [ - "JavaScript (ES6+)", "Go", + "Swift", + "JavaScript (ES6+)", "TypeScript", "Node.js", "Python", "Shell Scripting (Bash/Unix)", "PHP", "Java", - "Groovy", - "SQL", - "Assembler" + "SQL" ] }, { "category": "Ecosistema JavaScript", - "proficiency": 5, + "proficiency": 8, "sidebar": "left", "items": [ "Node.js y Express", @@ -380,7 +379,7 @@ }, { "category": "Ecosistema Go", - "proficiency": 5, + "proficiency": 8, "sidebar": "left", "items": [ "Hono - Framework Web de Alto Rendimiento", @@ -393,15 +392,26 @@ ] }, { - "category": "Tecnologías Frontend", + "category": "Swift y Desarrollo macOS", "proficiency": 5, "sidebar": "left", + "items": [ + "Swift 6 y SwiftUI", + "AppKit y APIs macOS", + "Aplicaciones Nativas de Barra de Menú", + "UserNotifications y AVFoundation", + "Distribución y Notarización de Apps macOS" + ] + }, + { + "category": "Tecnologías Frontend", + "proficiency": 9, + "sidebar": "left", "items": [ "HTMX - Aplicaciones Basadas en Hipermedia", "HTML5 y Web Semántica", "CSS3, Tailwind CSS, SASS/LESS", "JavaScript - Manipulación DOM y AJAX", - "jQuery", "Mejora Progresiva y Accesibilidad", "Diseño Responsive y Mobile-First", "Motores de Plantillas (Handlebars, Panini, Mustache)" @@ -409,7 +419,7 @@ }, { "category": "Tecnologías Backend", - "proficiency": 5, + "proficiency": 8, "sidebar": "left", "items": [ "Go - Stack Principal Actual", @@ -420,21 +430,9 @@ "Diseño y Optimización de Bases de Datos" ] }, - { - "category": "Tecnologías Enterprise Anteriores", - "proficiency": 3, - "sidebar": "left", - "items": [ - "Java y J2EE", - "Spring Framework, Struts, Hibernate", - "PHP y WordPress", - "Yii Framework, Zend Framework", - "Servidores de Aplicaciones Enterprise (Tomcat, JBoss, WebLogic)" - ] - }, { "category": "Infraestructura y Servidores", - "proficiency": 5, + "proficiency": 7, "sidebar": "right", "items": [ "Administración de Servidores Linux", @@ -446,7 +444,7 @@ }, { "category": "DevOps y CI/CD", - "proficiency": 5, + "proficiency": 7, "sidebar": "right", "items": [ "Diseño e Implementación de Pipelines CI/CD", @@ -458,7 +456,7 @@ }, { "category": "Bases de Datos", - "proficiency": 4, + "proficiency": 6, "sidebar": "right", "items": [ "PostgreSQL", @@ -472,32 +470,19 @@ }, { "category": "Gestión de Equipos", - "proficiency": 4, + "proficiency": 6, "sidebar": "right", "items": [ - "Preparación y puesta en marcha de proyectos", - "Comunicación fluida con los clientes", - "Contratación de personal", - "Gestión de tareas", - "Reportes mensuales" - ] - }, - { - "category": "Herramientas de Diseño", - "proficiency": 3, - "sidebar": "right", - "items": [ - "Corel Draw", - "Adobe PhotoShop", - "Adobe Illustrator", - "Affinity", - "Excalidraw", - "GIMP" + "Coordinación de Equipos Multidisciplinares", + "Asesoramiento a Clientes y Gestión de Stakeholders", + "Mentoría Técnica e Incorporación", + "Planificación y Entrega de Proyectos", + "Colaboración en Equipos Internacionales" ] }, { "category": "Tecnologías SAP", - "proficiency": 5, + "proficiency": 9, "sidebar": "right", "items": [ "SAP Customer Data Cloud (CDC)", @@ -507,15 +492,16 @@ ] }, { - "category": "Desarrollo Asistido por IA", - "proficiency": 5, + "category": "Ingeniería IA e Integración", + "proficiency": 7, "sidebar": "right", "items": [ - "Flujos de Desarrollo con IA (Claude Code, Copilot, GPT-4)", - "Desarrollo Basado en Agentes y Especificaciones", - "Ingeniería de Prompts e Integración de IA", - "Generación Automática de Código y Documentación", - "APIs OpenAI y Anthropic" + "Servidores MCP (Model Context Protocol)", + "Google ADK e Integración con Gemini", + "APIs de LLMs (OpenAI, Anthropic, Google)", + "Flujos de Desarrollo con IA (Claude Code, Copilot)", + "Embeddings CLIP y Búsqueda Visual", + "Flujos de Trabajo Agénticos y Automatización" ] } ], @@ -528,12 +514,7 @@ "Formación y Mentoría", "Gestión de Relaciones con Clientes", "Flexibilidad y Adaptabilidad", - "Marketing y Gestión de Recursos", - "Preparación y puesta en marcha de proyectos", - "Comunicación fluida con los clientes", - "Contratación de personal", - "Gestión de tareas", - "Reportes mensuales" + "Desarrollo de Producto y Publicación" ] }, "languages": [ @@ -613,6 +594,59 @@ ], "projectID": "cmux-resurrect" }, + { + "title": "SoundInbox - Alertas Sonoras de Email para macOS", + "projectName": "SoundInbox", + "projectDesc": "Alertas Sonoras de Email para macOS", + "url": "https://drolosoft.com/soundinbox.html?lang=es", + "gitRepoUrl": "https://github.com/drolosoft/soundinbox", + "projectLogo": "soundinbox.png", + "location": "Online", + "startDate": "2026", + "current": true, + "technologies": [ + "Swift 6", + "SwiftUI", + "AppKit", + "AVFoundation", + "macOS Nativo" + ], + "shortDescription": "App nativa open-source de barra de menú para macOS que convierte emails importantes en sonidos inconfundibles. Detección basada en fórmulas con sonidos de alerta seleccionados, motor de reglas personalizado y cero dependencias.", + "responsibilities": [ + "Desarrollé aplicación nativa de barra de menú para macOS en Swift 6 con SwiftUI y AppKit", + "Implementé motor de detección de emails basado en fórmulas con lógica AND/OR y coincidencia regex", + "Creé 10 fórmulas de detección predefinidas (pagos, ventas, urgente, envíos, seguridad)", + "Diseñé historial de coincidencias con estadísticas y 15 sonidos de alerta seleccionados", + "Publicado como open-source con 137 tests en 11 suites de pruebas" + ], + "projectID": "soundinbox" + }, + { + "title": "Commando - Gestor de Comandos de Terminal para macOS", + "projectName": "Commando", + "projectDesc": "Gestor de Comandos de Terminal para macOS", + "url": "https://drolosoft.com/commando.html?lang=es", + "projectLogo": "commando.png", + "location": "Online", + "startDate": "2026", + "current": true, + "technologies": [ + "Go", + "SwiftUI", + "SQLite FTS5", + "macOS Nativo", + "Herramientas CLI" + ], + "shortDescription": "Gestor nativo de comandos de terminal para macOS combinando backend Go con frontend SwiftUI. Organiza, busca y ejecuta comandos con búsqueda de texto completo, gestor TUI y descubrimiento de alias.", + "responsibilities": [ + "Desarrollé app híbrida nativa para macOS combinando backend Go con frontend SwiftUI", + "Implementé búsqueda de texto completo usando SQLite FTS5 con ranking BM25 (<50ms resultados)", + "Creé gestor TUI para lanzar interfaces de terminal (htop, lazygit, lazydocker)", + "Desarrollé gestor de alias que descubre y gestiona aliases de shell en bash, zsh y fish", + "Diseñé modelo freemium con funciones básicas gratuitas y tier Pro para herramientas avanzadas" + ], + "projectID": "commando" + }, { "title": "Somos Una Ola - Iniciativa de Limpieza de Playas", "projectName": "Somos Una Ola", @@ -839,10 +873,8 @@ "duration": "Varios", "shortDescription": "Cursos de desarrollo profesional en tecnologías SAP, diseño UX, seguridad y análisis de datos a través de la plataforma de formación integral de LinkedIn Learning.", "responsibilities": [ - "
Aprende lectura rápida Abril 2020: Técnicas de lectura rápida y estrategias de comprensión para desarrollo profesional y procesamiento eficiente de información
", "
A Tour of the SAP Cloud Platform Febrero 2020: Visión general completa de servicios de SAP Cloud Platform, arquitectura y capacidades de integración para soluciones empresariales en la nube
", "
Learning Android Security Febrero 2020: Mejores prácticas de seguridad Android, métodos de encriptación, prácticas de codificación segura y fundamentos de seguridad de aplicaciones móviles
", - "
Persuasive UX: Creating Credibility Enero 2020: Principios de diseño de experiencia de usuario enfocados en generar confianza, credibilidad y patrones de diseño persuasivo para aplicaciones web
", "
Big Data Foundations: Techniques and Concepts Diciembre 2019: Fundamentos de tecnologías big data, computación distribuida, frameworks de procesamiento de datos y técnicas de análisis
" ], "courseID": "certificaciones-linkedin-learn" @@ -981,11 +1013,11 @@ } ], "other": { - "driverLicense": "Tipo B" + "driverLicense": "" }, "meta": { - "version": "2025-11-09", - "lastUpdated": "2025-11-08", + "version": "2026-04-12", + "lastUpdated": "2026-04-12", "format": "JSON Resume Extended", "language": "es" } diff --git a/internal/chat/agent.go b/internal/chat/agent.go index 1996f3e..cbb39fd 100644 --- a/internal/chat/agent.go +++ b/internal/chat/agent.go @@ -61,6 +61,7 @@ QUERY STRATEGY BY QUESTION TYPE: - NEVER search only projects or only experience — always use cross-section search. - Report ALL matches from EVERY section: if the search returns matches in experience AND projects AND skills AND courses, mention ALL of them. - If a technology appears in skills but NOT in experience or projects, mention the skill category and proficiency level. + - IMPORTANT: Proficiency is on a scale of 1 to 10 (not 1 to 5). Always say "X out of 10" or "X/10". Each unit represents half a star on a 5-star visual scale. - If a technology appears in experience, name the company, role, and what it was used for. 2. COMPANY / EMPLOYER QUESTIONS (e.g. "What companies?", "Tell me about SAP"): diff --git a/internal/handlers/cv_pages_test.go b/internal/handlers/cv_pages_test.go index 80c141f..d05b879 100644 --- a/internal/handlers/cv_pages_test.go +++ b/internal/handlers/cv_pages_test.go @@ -1,9 +1,11 @@ package handlers import ( + "fmt" "net/http" "net/http/httptest" "testing" + "time" ) // TestHome tests the Home handler @@ -132,6 +134,8 @@ func TestDefaultCVShortcut(t *testing.T) { handler := newTestCVHandler(t, "localhost:1999", nil) + currentYear := fmt.Sprintf("%d", time.Now().Year()) + tests := []struct { name string path string @@ -139,12 +143,12 @@ func TestDefaultCVShortcut(t *testing.T) { }{ { name: "Valid shortcut URL (current year EN)", - path: "/cv-jamr-2025-en.pdf", + path: "/cv-jamr-" + currentYear + "-en.pdf", expectStatus: http.StatusOK, }, { name: "Valid shortcut URL (current year ES)", - path: "/cv-jamr-2025-es.pdf", + path: "/cv-jamr-" + currentYear + "-es.pdf", expectStatus: http.StatusOK, }, { @@ -154,7 +158,7 @@ func TestDefaultCVShortcut(t *testing.T) { }, { name: "Invalid language", - path: "/cv-jamr-2025-fr.pdf", + path: "/cv-jamr-" + currentYear + "-fr.pdf", expectStatus: http.StatusNotFound, }, { diff --git a/internal/models/cv/validation.go b/internal/models/cv/validation.go index 23b9ccf..6abaf9e 100644 --- a/internal/models/cv/validation.go +++ b/internal/models/cv/validation.go @@ -246,11 +246,11 @@ func (s *Skills) Validate() error { }) } - // Proficiency should be between 1-5 (typical skill rating) - if cat.Proficiency < 1 || cat.Proficiency > 5 { + // Proficiency should be between 1-10 (half-star increments over 5 stars) + if cat.Proficiency < 1 || cat.Proficiency > 10 { errors = append(errors, ValidationError{ Field: fmt.Sprintf("technical[%d].proficiency", i), - Message: "proficiency must be between 1 and 5", + Message: "proficiency must be between 1 and 10", }) } diff --git a/internal/models/cv/validation_test.go b/internal/models/cv/validation_test.go index 7ccbea7..d2d3dde 100644 --- a/internal/models/cv/validation_test.go +++ b/internal/models/cv/validation_test.go @@ -308,7 +308,7 @@ func TestSkills_Validate(t *testing.T) { }, }, wantErr: true, - errMsg: "proficiency must be between 1 and 5", + errMsg: "proficiency must be between 1 and 10", }, { name: "Invalid - Proficiency too high", @@ -316,13 +316,13 @@ func TestSkills_Validate(t *testing.T) { Technical: []cv.SkillCategory{ { Category: "Backend", - Proficiency: 6, + Proficiency: 11, Items: []string{"Go"}, }, }, }, wantErr: true, - errMsg: "proficiency must be between 1 and 5", + errMsg: "proficiency must be between 1 and 10", }, { name: "Invalid - No skill items", @@ -609,7 +609,7 @@ func TestCV_Validate(t *testing.T) { Technical: []cv.SkillCategory{ { Category: "Backend", - Proficiency: 10, // Invalid + Proficiency: 11, // Invalid Items: []string{"Go"}, }, }, diff --git a/tests/mjs/86-chat-response-rules.test.mjs b/tests/mjs/86-chat-response-rules.test.mjs index 9a31a9c..d7009c9 100644 --- a/tests/mjs/86-chat-response-rules.test.mjs +++ b/tests/mjs/86-chat-response-rules.test.mjs @@ -10,6 +10,10 @@ * - Responds in the same language as the question * - Off-topic questions redirect to CV scope with email * - Technology questions use cross-section search + * - Proficiency uses 1-10 scale (never 1-5) + * - Knows new projects (SoundInbox, Commando) + * - Knows new skills (Swift, MCP, AI Engineering) + * - Does not claim removed skills (jQuery, Corel Draw) * * NOTE: These tests call a live LLM and are inherently non-deterministic. * A single failure may be a flaky response — run twice to confirm real issues. @@ -137,7 +141,50 @@ async function testResponseRules() { console.log('\n9️⃣ Years of Experience'); const years = await chat('How many years of experience does Juan have?'); - record('Years: mentions 21', /21/.test(years)); + record('Years: mentions 20 or 21', /20|21/.test(years)); + + // ================================================================ + // 10. PROFICIENCY SCALE — must use /10, never /5 + // ================================================================ + console.log('\n🔟 Proficiency Scale (1-10)'); + + const cssProficiency = await chat('What is Juan\'s proficiency level in CSS and frontend technologies?'); + record('CSS: uses /10 scale', /\/10|out of 10|over 10/i.test(cssProficiency), cssProficiency.substring(0, 150)); + record('CSS: does NOT use /5 scale', !/\b[0-9]\/5\b|out of 5|over 5/i.test(cssProficiency)); + record('CSS: high rating (8-10)', /[89]\/10|9 out of 10|10\/10|10 out of 10|8\/10|8 out of 10/i.test(cssProficiency)); + + // ================================================================ + // 11. NEW PROJECTS — SoundInbox, Commando + // ================================================================ + console.log('\n1️⃣1️⃣ New Projects (SoundInbox, Commando)'); + + const swift = await chat('Does Juan have experience with Swift or macOS development?'); + record('Swift: mentions SoundInbox', /soundinbox/i.test(swift)); + record('Swift: mentions Swift or SwiftUI', /swift/i.test(swift)); + + const commando = await chat('Tell me about the Commando project'); + record('Commando: mentions terminal/command', /terminal|command/i.test(commando)); + record('Commando: mentions Go or SQLite', /go|sqlite/i.test(commando)); + + // ================================================================ + // 12. NEW SKILLS — MCP, AI Engineering + // ================================================================ + console.log('\n1️⃣2️⃣ New Skills (MCP, AI)'); + + const mcp = await chat('Does Juan have experience with MCP or Model Context Protocol?'); + record('MCP: mentions MCP', /mcp|model context protocol/i.test(mcp)); + record('MCP: mentions Immich project', /immich/i.test(mcp)); + + // ================================================================ + // 13. REMOVED SKILLS — should not claim expertise + // ================================================================ + console.log('\n1️⃣3️⃣ Removed Skills (no false claims)'); + + const jquery = await chat('Does Juan know jQuery?'); + record('jQuery: honest — not listed or minimal', !/expert|proficien|specialist|strong|extensive/i.test(jquery)); + + const corel = await chat('Does Juan use Corel Draw?'); + record('Corel: not found or not listed', /not found|no se encontr|not listed|not included|not mention|did not find|does not|no result|couldn/i.test(corel)); // ================================================================ // SUMMARY