Community라이팅 & 에디팅github.com

atokim4/cover-letter-lint

프리랜서 커버레터, 제안서, 입찰 또는 클라이언트 메시지를 실제 사람이 쓴 것처럼 보이게 작성하거나 검토합니다. 작성자가 입증할 수 있는 내용만 주장하도록 합니다.

cover-letter-lint란 무엇인가요?

이 스킬은 프리랜서(Upwork, Fiverr, PeoplePerHour, Freelancer.com 등)나 구인 게시판을 위한 커버레터, 제안서 또는 입찰을 작성하거나 검토할 때 사용됩니다. 사용자가 직접 작성 또는 개선을 요청하거나, '이 글은 AI가 쓴 것처럼 들리나요?'라고 물을 때도 작동합니다. 핵심은 노드(Node) 기반 린터(linter)를 실행하여 AI 전형적 표현, 줄표(em dash), 'X가 아니라 Y' 패턴, 플레이스홀더, 플랫폼 외 연락처, 50-90단어 범위, 마무리 질문, 그리고 사용자의 사실(facts) 파일에 없는 주장을 자동으로 찾아내고 수정하도록 안내합니다. 이 스킬은 Claude Code에서 직접 실행되며, 로컬 프로젝트나 전역 설치가 가능하고 Node 20 이상만 필요합니다.

지원 대상✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/atokim4/cover-letter-lint/tree/HEAD/skills/cover-letter-lint

Installed? Explore more 라이팅 & 에디팅 skills: steipete/notion, langchain-ai/langchain, bytedance/podcast-generation · View all 6 →

즐겨 사용하는 AI에게 물어보기

이 에이전트 스킬이 미리 로드된 새 채팅을 엽니다.

문서

커버레터 린트(Cover letter lint)

목표: 바쁜 클라이언트가 끝까지 읽고 답변할 수 있는 50-90단어의 커버레터. 모든 주장은 사용자의 사실(facts) 파일로 뒷받침되어야 합니다.

린터는 이 스킬 폴더 안의 scripts/lint-cover.mjs입니다(Node 20+, 추가 의존성 없음). 전체 경로로 호출하세요: node ${CLAUDE_SKILL_DIR}/scripts/lint-cover.mjs (Claude Code, 플러그인 설치 시에도 동일). 다른 에이전트는 이 변수를 채우지 않으므로, 프로젝트 설치의 경우 .claude/skills/cover-letter-lint/scripts/lint-cover.mjs와 같은 폴더를 사용하고, 전역 설치의 경우 node ~/.claude/skills/cover-letter-lint/scripts/lint-cover.mjs를 사용하세요.

1. 사실(facts) 파일 찾기

현재 프로젝트에서 facts.md, me/facts.md 또는 "facts" 경로가 포함된 .cover-lint.json 파일을 찾으세요.

  • 찾은 경우: 파일을 읽습니다. 주장(claims)은 오직 여기서만 가져옵니다.
  • 찾지 못한 경우: templates/facts.md(이 스킬 폴더 내)에서 facts.md를 생성할 것을 제안하고, 사용자의 정보(기술, 역할, 실적, 증빙 링크, 절대 말하지 말아야 할 것)를 채우도록 안내하세요. 어떤 내용도 지어내지 마세요. 사용자가 거절하면 --facts 없이 린트를 수행하고, 주장을 확인하지 않았다고 알리세요.

2. 작성하기 (사용자가 직접 초안을 가져온 경우 건너뜁니다)

사용자가 구인 게시글을 붙여넣은 경우 파일로 저장하세요(예: job.md). 그런 다음, 글머리 기호나 제목 없이 평문 문장으로 작성하세요:

  1. 클라이언트 스타일에 맞는 인사말, 그리고 그들의 게시글의 구체적인 세부 사항 하나(버그, 스택, 마감일)와 그 원인이나 접근 방식에 대한 언급. 게시글을 반복하지 마세요.
  2. 사실 파일에서 실제로 일치하는 하나의 증빙 줄(비슷한 작업, 역할, 데모 링크). 개인 프로젝트는 개인 프로젝트라고 부르세요. 정직하게 일치하는 내용이 없으면 증빙을 생략합니다.
  3. 한두 문장으로 된 계획(사용자가 요율을 알려준 경우 시간과 가격 포함).
  4. 하나의 질문. 범위나 가격을 바꾸는 답변을 이끌어낼 질문이어야 합니다.
  5. 사용자의 이름을 한 줄에 씁니다.

게시글 스타일을 반영하세요: 세 줄의 캐주얼한 게시글에는 세 줄의 캐주얼한 답변을, 다른 언어의 게시글에는 같은 언어로 답변하세요.

3. 린트 및 수정

node ${CLAUDE_SKILL_DIR}/scripts/lint-cover.mjs --facts facts.md --job job.md proposal.md

(-는 표준 입력(stdin)을 읽습니다. --mode message는 단어 범위가 없는 클라이언트 답장용입니다. --json은 기계 출력용입니다.) 모든 오류를 수정하고 종료 코드 0이 나올 때까지 다시 실행하세요. 경고(warnings): 이유가 있지 않은 한 수정하고, 그 이유를 설명하세요. unlisted-skill의 경우: 주장을 제거하거나, 사용자에게 사실 파일에 스킬을 추가할지 물어보세요. 사용자가 사실이라고 말하지 않았는데 주장이 통과되도록 사실 파일을 절대 편집하지 마세요.

규칙수준탐지 내용
ai-phrase오류약 75개의 템플릿 문구: "이 글이 잘 전달되길 바랍니다", "완벽한", "기대됩니다", "핵심은" 등
not-x-but-y오류"이것은 단순한 X가 아니라 Y입니다" 스타일의 대비
dash오류줄표(em dash) 및 그 용도로 사용된 대시
placeholder오류[이름], {{name}}, <client>, TODO, 로렘 입숨
off-platform오류이메일, 전화번호, "WhatsApp으로 메시지 보내기", 마켓플레이스 외부 결제
unbacked-claim오류사실 파일에 없는 링크 및 "N년"
never-say오류사실 파일의 "Never say" 목록에 있는 문구
word-count오류 / 경고커버 모드에서 90단어 초과(오류), 50단어 미만(경고)
unlisted-skill경고편지에 언급되었지만 사실 파일이나 구인 게시글에 없는 프레임워크 또는 서비스
question경고질문 없음 또는 둘 이상
list, greeting, exclamation, emoji, long-sentence, i-start경고목록, "Dear Sir", "!!", 이모지, 35단어 이상 문장, "I"로 시작하는 문장이 너무 많음

프로젝트별 조정은 .cover-lint.json에서 합니다(모든 키는 선택 사항): {"facts": "facts.md", "maxWords": 90, "minWords": 50, "extraPhrases": [], "allowPhrases": [], "disable": []}.

4. 전달하기

편지와 린터의 마지막 줄을 보여주세요. 선택한 가격과 질문을 명시하여 사용자가 변경할 수 있게 하세요. 그런 다음 사실 파일과 대조하여 직접 다시 한 번 읽으세요: 린터는 링크, 연수 및 기술 이름만 확인하고 모든 문장을 확인하지는 않습니다. 사용자가 보내는 것입니다. 절대 사용자를 대신하여 제출하지 마세요.

Individual skills in this repo

This repo contains 1 individual skill — each has its own dedicated page.

관련 스킬