커버레터 린트(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). 그런 다음, 글머리 기호나 제목 없이 평문 문장으로 작성하세요:
- 클라이언트 스타일에 맞는 인사말, 그리고 그들의 게시글의 구체적인 세부 사항 하나(버그, 스택, 마감일)와 그 원인이나 접근 방식에 대한 언급. 게시글을 반복하지 마세요.
- 사실 파일에서 실제로 일치하는 하나의 증빙 줄(비슷한 작업, 역할, 데모 링크). 개인 프로젝트는 개인 프로젝트라고 부르세요. 정직하게 일치하는 내용이 없으면 증빙을 생략합니다.
- 한두 문장으로 된 계획(사용자가 요율을 알려준 경우 시간과 가격 포함).
- 하나의 질문. 범위나 가격을 바꾸는 답변을 이끌어낼 질문이어야 합니다.
- 사용자의 이름을 한 줄에 씁니다.
게시글 스타일을 반영하세요: 세 줄의 캐주얼한 게시글에는 세 줄의 캐주얼한 답변을, 다른 언어의 게시글에는 같은 언어로 답변하세요.
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. 전달하기
편지와 린터의 마지막 줄을 보여주세요. 선택한 가격과 질문을 명시하여 사용자가 변경할 수 있게 하세요. 그런 다음 사실 파일과 대조하여 직접 다시 한 번 읽으세요: 린터는 링크, 연수 및 기술 이름만 확인하고 모든 문장을 확인하지는 않습니다. 사용자가 보내는 것입니다. 절대 사용자를 대신하여 제출하지 마세요.