Linter de cartas de presentación
Objetivo: una carta de presentación de 50–90 palabras que un cliente ocupado lea hasta el final y responda, con cada afirmación respaldada por el archivo de hechos del usuario.
El linter es scripts/lint-cover.mjs en la carpeta de esta skill (Node 20+, sin dependencias). Llámalo con su ruta completa:
node ${CLAUDE_SKILL_DIR}/scripts/lint-cover.mjs en Claude Code (también para instalación como plugin).
Otros agentes no completan esa variable, así que usa la carpeta, por ejemplo:
node .claude/skills/cover-letter-lint/scripts/lint-cover.mjs para una instalación en el proyecto o
node ~/.claude/skills/cover-letter-lint/scripts/lint-cover.mjs para una instalación global.
1. Encontrar el archivo de hechos
Busca facts.md, me/facts.md o un .cover-lint.json con una ruta "facts" en el proyecto actual.
- Encontrado: léelo. Las afirmaciones solo vienen de ahí.
- No encontrado: ofrece crear
facts.mda partir detemplates/facts.mden la carpeta de esta skill, y complétalo con los datos del usuario (habilidades, roles, historial, enlaces de prueba, cosas que nunca decir). No inventes nada. Si el usuario lo rechaza, ejecuta el linter sin--factse indica que las afirmaciones no se verificaron.
2. Escribir (omitir si el usuario ya trajo su borrador)
Guarda la oferta de trabajo en un archivo si el usuario la pegó (por ejemplo, job.md). Luego escribe, en oraciones simples sin viñetas ni encabezados:
- Un saludo en el estilo del cliente, luego un detalle concreto de SU oferta (el error, el stack, la fecha límite) y qué lo causa probablemente o cómo lo abordarías. Nunca repitas la oferta.
- Una línea de prueba del archivo de hechos que realmente coincida (un trabajo similar, un rol, un enlace de demostración). Un proyecto personal se llama proyecto personal. Sin coincidencia honesta: omite la prueba.
- El plan en una o dos oraciones, con horas y precio si el usuario te dio tarifas.
- Una pregunta, aquella cuya respuesta cambie el alcance o el precio.
- El nombre de pila del usuario en su propia línea.
Refleja la oferta: tres líneas informales reciben tres líneas informales, otro idioma recibe ese idioma.
3. Revisar y corregir
node ${CLAUDE_SKILL_DIR}/scripts/lint-cover.mjs --facts facts.md --job job.md proposal.md
(- lee de la entrada estándar; --mode message para respuestas de cliente, que no tienen rango de palabras; --json para salida en formato máquina).
Corrige cada error y vuelve a ejecutar hasta que termine con código 0. Advertencias: corrígelas a menos que haya una razón, y explica la razón.
Para unlisted-skill, elimina la afirmación o pregunta al usuario si desea agregar la habilidad al archivo de hechos.
Nunca edites el archivo de hechos para que una afirmación pase sin que el usuario diga que es cierta.
| Regla | Nivel | Qué detecta |
|---|---|---|
| ai-phrase | error | ~75 frases plantilla: "Espero que este mensaje te encuentre bien", "sin fisuras", "Estoy emocionado de", "la clave es"… |
| not-x-but-y | error | Contrastes del estilo "Esto no es solo X, sino Y" |
| dash | error | Guiones largos y guiones usados como tales |
| placeholder | error | [Tu Nombre], {{nombre}}, <cliente>, TODO, lorem ipsum |
| off-platform | error | Correos electrónicos, números de teléfono, "escríbeme por WhatsApp", pago fuera del marketplace |
| unbacked-claim | error | Enlaces y "N años" que no están en el archivo de hechos |
| never-say | error | Frases listadas bajo "Nunca decir" en el archivo de hechos |
| word-count | error / aviso | Más de 90 palabras (error), menos de 50 (aviso) en modo carta |
| unlisted-skill | aviso | Un framework o servicio que nombra la carta y que no está ni en el archivo de hechos ni en la oferta |
| question | aviso | Sin pregunta, o más de una |
| list, greeting, exclamation, emoji, long-sentence, i-start | aviso | Listas, "Estimado Sr.", "!!", emojis, oraciones de 35+ palabras, demasiadas oraciones que empiezan con "Yo" |
Los ajustes por proyecto van en .cover-lint.json (todas las claves opcionales):
{"facts": "facts.md", "maxWords": 90, "minWords": 50, "extraPhrases": [], "allowPhrases": [], "disable": []}.
4. Entregar
Muestra la carta y la última línea del linter. Indica el precio y la pregunta que elegiste para que el usuario pueda cambiarlos. Luego revísala una vez más contra el archivo de hechos tú mismo: el linter verifica enlaces, años y nombres de tecnologías, no cada oración. El usuario la envía; nunca envíes nada por él.