agentleFS
AstorgatoAstorgato/asistente-cv-linkedin/.claude/skills/linkedin/SKILL.md

linkedin

Skill0 starsChanged 2 months agoMITView on GitHub

Audita y pone al día el perfil de LinkedIn de la persona contra datos/hechos.yaml. Por defecto entrega los textos listos para pegar; en modo asistido (opcional) navega con Playwright MCP, siempre con confirmación antes de cada cambio. Úsalo para leer el perfil, detectar qué está desactualizado o aplicar cambios.

23 other projects use a version of this.

Adopted by

Most recently taken up by

Used with

Projects with it also use reddit, instagram and 3 more.

Other files people use alongside this one.

Files found in the same public projects as a version of this one, more often than they turn up anywhere else. Each project counts once, large collections count for less, and this file's own repository is left out.
  • ReScienceLabSkill

    reddit

    Search and retrieve content from Reddit. Get posts, comments, subreddit info, and user profiles via the public JSON API. Use when user mentions Reddit, a subreddit, or r/ links.

    Also in 6 projects that use this

  • refly-aiSkill

    instagram

    Integrate with Instagram for social media. Use when you need to: (1) post content to Instagram, (2) manage media and insights, or (3) automate Instagram publishing workflows.

    Also in 4 projects that use this

  • G-HunterAiSkill

    tiktok

    TikTok platform integration. Manage videos, view analytics, and track engagement.

    Also in 3 projects that use this

  • anshul-garg27Skill

    newsletter

    Create engaging email newsletters with subject lines, sections, and CTAs for Substack, Beehiiv, ConvertKit, or plain email

    Also in 3 projects that use this

  • refly-aiSkill

    youtube

    Integrate with YouTube for video management. Use when you need to: (1) upload videos to YouTube, (2) manage channel content, or (3) retrieve video analytics and insights.

    Also in 3 projects that use this

The file

We split this skill into the rules it gives an agent

1 rule. 0 are common, 0 are distinctive, and 1 is very specific to this project.

  • 0

    Common

    Most of the 19 edited versions we read keep these.

  • 0

    Distinctive

    This author's own choices. Worth a look.

  • 1

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Very specific:

    No hay alternativa por API: editar un perfil requiere el permiso w_compliance, que está cerrado y no se puede solicitar.

    line 24

“Common” is measured: kept by at least 6 in 10 of the 19 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

LinkedIn

LinkedIn es la fuente primaria de habilidades: el CV va recortado para una vacante, LinkedIn lleva el stack completo. Pero suele estar desactualizado, así que el trabajo va en dos direcciones: leer lo que hay (hacia hechos.yaml) y escribir lo que falta (desde hechos.yaml).

El perfil está en hechos.yaml → identidad.linkedin. El plan vive en datos/linkedin-plan.yaml.

Elegir el modo

Manual (por defecto)Asistido (opt-in)
LecturaLa persona exporta el perfil a PDF (Más → Guardar en PDF) y las aptitudes con Ctrl+PNavegador con Playwright MCP
EscrituraEl asistente entrega el texto exacto; la persona lo pegaEl asistente edita, con confirmación de cada cambio
Riesgo con LinkedInNingunoSu User Agreement prohíbe la automatización. La decisión es de la persona

No hay alternativa por API: editar un perfil requiere el permiso w_compliance, que está cerrado y no se puede solicitar.

Usa el modo asistido solo si existe .mcp.json con el servidor playwright y la persona lo pidió explícitamente. Si ya lo decidió sabiendo el riesgo, no lo vuelvas a discutir: el trabajo es minimizar el riesgo operacional. Para textos largos como el "Acerca de", ofrece igual el modo manual: es igual de válido y más rápido.

Reglas del modo asistido (no se negocian)

  1. Confirmación antes de cada escritura. Navegar y leer puede fluir. Cualquier browser_type, clic en Guardar o envío de formulario requiere un sí para ese cambio concreto. Nunca en lote.
  2. Ritmo humano. Una acción a la vez, con pausa. Nada de ráfagas.
  3. La persona presente y la ventana visible. Nunca headless, nunca en tareas programadas ni en segundo plano.
  4. Solo su propio perfil. Nunca perfiles de terceros.
  5. Captcha, aviso de seguridad o re-autenticación → detenerse y avisar. No sortearlo.
  6. Nunca escribir credenciales. Si aparece el login, la persona entra a mano en la ventana abierta; la sesión queda guardada en datos/navegador-perfil/.

LECTURA — traer lo que LinkedIn sabe

Secciones: el perfil principal y /in/<slug>/details/<seccion>/ para experience, education, skills, certifications, projects, courses y recommendations.

⚠️ Cómo leer sin equivocarse

La ventana no scrollea. window.scrollTo y document.body.scrollHeight no sirven: el body mide ~900 px siempre. El contenido vive en main#workspace. Leyendo mal salen ~1.800 caracteres de un perfil; bien, ~21.500. Con la lectura corta se llegó a afirmar que un perfil no tenía "Acerca de" ni Python — las dos cosas eran falsas.

const cont = document.querySelector('main#workspace');   // en modales: [role="dialog"]
let prev = -1;
for (let i = 0; i < 40 && cont.scrollHeight !== prev; i++) {
  prev = cont.scrollHeight;
  cont.scrollTop = cont.scrollHeight;
  await new Promise(r => setTimeout(r, 700));
}
return cont.innerText;

Si un selector "no existe", antes de concluir nada: busca el contenedor con overflowY: auto|scroll y scrollHeight > clientHeight, scrolléalo hasta que deje de crecer y recién ahí vuelve a buscar. Expande los "Mostrar todos" antes de leer.

Excepción: /details/skills/ virtualiza la lista y ni así se resuelve (el navegador vio 26 aptitudes de 67). Para inventariar aptitudes, pide el PDF (Ctrl+P → Guardar como PDF en esa página) y vuélcalo a datos/linkedin-aptitudes.yaml.

Regla general: nunca le digas a la persona que "le falta" algo en LinkedIn a partir de una sola lectura por navegador. Contrasta primero con una segunda fuente.

Al volcar a hechos.yaml

  • fuentes: [linkedin] (o linkedin-pdf) en cada dato nuevo.
  • LinkedIn coincide con algo ya registrado → agrega la fuente. Sube a confirmado solo si la persona lo confirma.
  • LinkedIn contradice algo que la persona ya confirmó → no pises nada. Gana su confirmación: regístralo en linkedin-plan.yaml → discrepancias y propón corregir LinkedIn.
  • LinkedIn contradice algo no confirmado → estado: conflicto y pregunta.
  • Habilidad que está en LinkedIn y en ningún CV → estado: por_confirmar, cobertura: 0. Si entró con el temario de una certificación, dilo: no acredita uso.
  • Certificaciones: captura número de credencial, emisión y vencimiento. Si vence en menos de 6 meses, avisa.

AUDITORÍA — qué está desactualizado

Compara LinkedIn contra hechos.yaml y arma linkedin-plan.yaml → cambios, ordenado por impacto. No apliques nada todavía. El orden típico:

  1. Titular (220 caracteres): es lo que más pesa en las búsquedas de reclutadores.
  2. Aptitudes del cargo objetivo que faltan. El hueco suele ser de vocabulario, no de cantidad: agregar ~10 aptitudes núcleo rinde más que reordenar 60. Si un tercio son servicios de una certificación, diluyen la señal.
  3. Acerca de (2.600 caracteres; se ven ~250 antes de "ver más").
  4. Experiencia con logros verificados (2.000 caracteres por cargo) y sin huecos.
  5. Certificaciones con número de credencial y URL de verificación.
  6. Redacciones prohibidas ya publicadas (grado como título, bootcamp como certificación).
  7. Abierto a trabajar y su visibilidad.
  8. Coherencia con lo que se enlaza: un portafolio o GitHub viejo, enlazado desde un perfil recién pulido, lo contradice.

Antes de cambiar nada, anota la línea base en linkedin-plan.yaml: apariciones en búsquedas (7 días) y visualizaciones del perfil. Se vuelve a mirar en dos semanas.

ESCRITURA — aplicar cambios

Para cada cambio, de a uno:

  1. Muestra el texto exacto que va a quedar, en un bloque.
  2. Verifícalo contra hechos.yaml: cada frase se tiene que poder trazar a una entrada (anótalas en trazabilidad). Si no, se elimina antes de proponerla. Revisa también redacciones_prohibidas y no_defendibles.
  3. Pide confirmación de ese cambio puntual.
  4. Modo manual: la persona pega y avisa. Modo asistido: navega, edita, guarda; una acción a la vez.
  5. Verifica (snapshot, o que la persona confirme lo que ve) y registra en linkedin-plan.yaml → aplicados con la fecha.

Dónde se edita cada cosa

  • Titular: lápiz de la tarjeta principal → "Titular". 220 caracteres.
  • Acerca de: sección "Acerca de". 2.600 caracteres; los primeros ~250 son los visibles.
  • Experiencia: "+" de la sección, o lápiz en cada cargo. Descripción: 2.000.
  • Aptitudes: /details/skills/. Se pueden destacar algunas arriba (la documentación hablaba de 3; en un perfil real aparecieron 5 — verifica cuántas deja el suyo).
  • Licencias y certificaciones: número de credencial y URL de verificación.
  • Abierto a trabajar: botón "Abierto a". Ojo con la visibilidad: "Solo reclutadores" vs "Todos". Si la persona tiene empleo, "Todos" lo ve su empleador.

Receta probada: agregar una aptitud (modo asistido)

  1. Navega a https://www.linkedin.com/in/<slug>/skills/edit/forms/new/.
  2. browser_type en input[aria-label="Aptitudes"] con slowly: true.
  3. ArrowDown + Enter para tomar la opción del autocompletado.
  4. Para asociarla a un cargo: clic en [role="checkbox"]:has-text("CARGO") label. El input del checkbox está oculto y los clics por JS no prenden en React: hay que clicar el label.
  5. Clic en [data-testid="dialog"] button:has-text("Guardar").
  • Éxito: la URL cambia a .../skills/edit/forms/next-action/add-another-skill/.
  • Duplicado: aparece "Esta aptitud ya está en tu perfil". No rompe nada.
  • LinkedIn normaliza los nombres: "ETL" queda como "Extraer, transformar y cargar (ETL)", "Pipelines de datos" como "Canalización de datos", "pandas" como "Pandas (Software)". Al verificar, busca por el nombre normalizado y anótalo en linkedin-aptitudes.yaml → nombres_normalizados.
  • Asocia cada aptitud al cargo donde de verdad se usó. Asociada vale más que suelta, pero colgarla de un cargo donde no se usó es inventar. Si ningún cargo la respalda, déjala sin asociar.

Estos selectores funcionaban en julio de 2026. LinkedIn cambia su interfaz: si uno falla, toma un snapshot, busca el equivalente y avisa. No fuerces clics a ciegas.

Redacción para LinkedIn (distinta de un CV)

  • El titular nombra los cargos que la persona quiere que le ofrezcan, no necesariamente el que tiene hoy. Dos, no cuatro: cuatro no posicionan ninguno. Si es aspiracional, que se pueda sostener en una entrevista.
  • LinkedIn es superconjunto: aquí sí va el stack completo. La selección se hace en el CV.
  • "Acerca de" en primera persona; el CV no.
  • Las mismas reglas que en el CV: nada que no esté en hechos.yaml, cifras solo si están respaldadas.

Al terminar

Actualiza datos/linkedin-plan.yaml (aplicado, pendiente, discrepancias) y dile a la persona qué quedó sin hacer y por qué.

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.