Lint de carta de apresentação
Objetivo: uma carta de apresentação de 50 a 90 palavras que um cliente ocupado leia até o final e responda, com cada afirmação respaldada pelo próprio arquivo de fatos do usuário.
O linter é scripts/lint-cover.mjs na pasta desta skill (Node 20+, sem dependências). Execute-o pelo caminho completo:
node ${CLAUDE_SKILL_DIR}/scripts/lint-cover.mjs no Claude Code (também para instalação como plugin).
Outros agentes não preenchem essa variável, então use a pasta, por exemplo, node .claude/skills/cover-letter-lint/scripts/lint-cover.mjs para instalação no projeto ou node ~/.claude/skills/cover-letter-lint/scripts/lint-cover.mjs para instalação global.
1. Encontre o arquivo de fatos
Procure por facts.md, me/facts.md ou um .cover-lint.json com um caminho "facts" no projeto atual.
- Encontrado: leia-o. As afirmações vêm somente daí.
- Não encontrado: ofereça-se para criar
facts.mda partir detemplates/facts.mdna pasta desta skill e preencha-o com o usuário (habilidades, papéis, histórico, links de prova, coisas para nunca dizer). Não invente nada disso. Se o usuário recusar, execute o linter sem--factse avise que as afirmações não foram verificadas.
2. Escreva (pule se o usuário já trouxe seu próprio rascunho)
Salve o anúncio de vaga em um arquivo se o usuário colou um (por exemplo, job.md). Em seguida, escreva, como frases simples, sem marcadores ou cabeçalhos:
- Uma saudação no estilo do cliente, depois um detalhe concreto do anúncio DELE (o bug, a stack, o prazo) e o que provavelmente o causa ou como você abordaria isso. Nunca reescreva o anúncio.
- Uma linha de prova do arquivo de fatos que realmente corresponda (um trabalho semelhante, um papel, um link de demonstração). Um projeto pessoal é chamado de projeto pessoal. Se não houver correspondência honesta: omita a prova.
- O plano em uma ou duas frases, com horas e um preço se o usuário forneceu suas taxas.
- Uma pergunta, aquela cuja resposta muda o escopo ou o preço.
- O primeiro nome do usuário em sua própria linha.
Espelhe o anúncio: três linhas casuais recebem três linhas casuais de volta, outro idioma recebe aquele idioma.
3. Lint e corrija
node ${CLAUDE_SKILL_DIR}/scripts/lint-cover.mjs --facts facts.md --job job.md proposal.md
(- lê da entrada padrão; --mode message para respostas de clientes, que não têm faixa de palavras; --json para saída de máquina.)
Corrija cada erro e execute novamente até que saia com código 0. Avisos: corrija-os a menos que haja um motivo, e diga o motivo.
Para unlisted-skill, remova a afirmação ou pergunte ao usuário se deseja adicionar a habilidade ao arquivo de fatos.
Nunca edite o arquivo de fatos para fazer uma afirmação passar sem que o usuário diga que é verdadeira.
| Regra | Nível | O que detecta |
|---|---|---|
| ai-phrase | erro | ~75 frases modelo: "Espero que esta mensagem te encontre bem", "perfeito", "Estou animado para", "a chave é"… |
| not-x-but-y | erro | Contrastes do estilo "Isso não é apenas X, mas Y" |
| dash | erro | Travessões e hífens usados como travessões |
| placeholder | erro | [Seu Nome], {{name}}, <cliente>, TODO, lorem ipsum |
| off-platform | erro | E-mails, números de telefone, "mande uma mensagem para mim no WhatsApp", pagamento fora do marketplace |
| unbacked-claim | erro | Links e "N anos" que não estão no arquivo de fatos |
| never-say | erro | Frases listadas em "Nunca diga" no arquivo de fatos |
| word-count | erro / aviso | Acima de 90 palavras (erro), abaixo de 50 (aviso) no modo carta |
| unlisted-skill | aviso | Um framework ou serviço que a carta nomeia e que não está nem no arquivo de fatos nem no anúncio de vaga |
| question | aviso | Nenhuma pergunta, ou mais de uma |
| list, greeting, exclamation, emoji, long-sentence, i-start | aviso | Listas, "Prezado Senhor", "!!", emoji, frases com 35+ palavras, muitas frases começando com "Eu" |
Ajustes por projeto vão em .cover-lint.json (todas as chaves opcionais):
{"facts": "facts.md", "maxWords": 90, "minWords": 50, "extraPhrases": [], "allowPhrases": [], "disable": []}.
4. Entregue
Mostre a carta e a última linha do linter. Nomeie o preço e a pergunta que você escolheu para que o usuário possa alterá-los. Em seguida, leia-a mais uma vez contra o arquivo de fatos você mesmo: o linter verifica links, anos e nomes de tecnologias, não cada frase. O usuário a envia; nunca envie nada por ele.