求职信linter
目标:一封50-90词、忙碌客户能读到最后并回复的求职信,信中每项声明都基于用户自己的事实文件。
linter是该技能文件夹中的scripts/lint-cover.mjs(Node 20+,无依赖)。在Claude Code(也适用于插件安装)中通过完整路径调用:node ${CLAUDE_SKILL_DIR}/scripts/lint-cover.mjs。其他agent不会填充该变量,因此对于项目安装请使用类似node .claude/skills/cover-letter-lint/scripts/lint-cover.mjs的路径,对于全局安装则使用node ~/.claude/skills/cover-letter-lint/scripts/lint-cover.mjs。
1. 查找事实文件
在当前项目中查找facts.md、me/facts.md或包含"facts"路径的.cover-lint.json。
- 找到:读取它。声明只能来自该文件。
- 未找到:提供从该技能文件夹中的
templates/facts.md创建facts.md的选项,并让用户填写内容(技能、角色、过往成绩、证据链接、绝不提及的事项)。不要编造任何内容。如果用户拒绝,则在不带--facts的情况下运行linter,并告知他们声明未经检查。
2. 撰写(如果用户已提供草稿,则跳过此步骤)
如果用户粘贴了职位发布内容,则将其保存到一个文件中(例如job.md)。然后以纯句子形式撰写,不使用项目符号或标题:
- 用客户风格的问候语开头,然后提及客户帖子的一个具体细节(bug、技术栈、截止日期),以及可能的原因或你打算如何处理它。绝不重述帖子内容。
- 从事实文件中选取一条真正匹配的证据(类似的工作、角色、演示链接)。个人项目就称为个人项目。如果没有诚实的匹配项,则省略证据。
- 用一两句话描述计划,如果用户提供了费率,则加上工时和价格。
- 提出一个问题,一个答案会改变项目范围或价格的问题。
- 将用户的名字单独放在一行。
模仿帖子的风格:三行随意的帖子用三行随意的回复,其他语言的帖子用该语言回复。
3. Lint并修复
node ${CLAUDE_SKILL_DIR}/scripts/lint-cover.mjs --facts facts.md --job job.md proposal.md
(-表示读取stdin;--mode message用于客户回复,此类回复没有字数范围;--json用于机器输出。)
修复每一个错误并重新运行,直到退出码为0。对于警告:除非有理由,否则也修复它们,并说明理由。对于unlisted-skill,要么移除该声明,要么询问用户是否要将该技能添加到事实文件中。切勿为了通过声明而编辑事实文件,除非用户承认该声明确实属实。
| 规则 | 级别 | 检测内容 |
|---|---|---|
| ai-phrase | 错误 | 约75个模板短语:“I hope this finds you well”、“seamless”、“I'm excited to”、“the key is”…… |
| not-x-but-y | 错误 | “This is not just X, but Y”之类的对比句式 |
| dash | 错误 | 长破折号以及用作长破折号的连字符 |
| placeholder | 错误 | [Your Name]、{{name}}、<client>、TODO、lorem ipsum |
| off-platform | 错误 | 电子邮件、电话号码、“message me on WhatsApp”、市场平台外付款 |
| unbacked-claim | 错误 | 事实文件中不存在的链接和“N years” |
| 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. 交付
展示信件以及linter的最后一行输出。明确说明你设定的价格和你选择的问题,以便用户能够修改。然后你自己再对照事实文件通读一遍:linter检查的是链接、年份和技术名称,而不是每一个句子。由用户发送;切勿替用户提交任何内容。