yanliudesign/job-description-skill
Job Description 解码器 + Offer 策略系统。把任何 JD 翻译成「这家公司到底在招什么人 / 我的匹配度 / Gap 在哪 / 为什么投/不投 / 面试会问什么 / 下一步怎么走」。只有 3 步:贴 JD → 给简历 → 自动生成并打开一份 HTML Offer Strategy Report。是整个求职链路的入口,向下衔接 Resume Skill 和 BQ Skill。关键词:job description, JD, 职位描述, 匹配度, ATS, resume tailor, 简历定制, 招聘经理, 投不投, should I apply, 面试预测, offer strategy。
This is a copy. The original lives at yanliudesign/job-description-job-description-skill.
npx skills add https://github.com/yanliudesign/offer-toolkit-skill --skill job-description-skill
把一份 JD 从「招聘话术」翻译成「你能用的求职情报」,一次性产出一份单文件 HTML Offer Strategy Report,自动在浏览器打开。
下游可一键接 Resume Skill(拿着 Gap / Tailor 结果继续打磨简历)和 BQ Skill(拿着预测题目去练故事),形成完整求职链路。
开场只说一句话:
> "把你想分析的 Job Description 链接或全文 贴给我。链接抓不到内容就直接粘贴 JD 文本。"
收到后:
三选一,明牌列出来:
> "为了算匹配度 / 出 Gap / 预测面试题,需要了解你。三选一:
> - 🅰️ 上传 / 粘贴简历全文(PDF / Word / 文本都行)— 强烈推荐,结果最准
> - 🅱️ 粘贴你的 LinkedIn 全文(不是只给 URL,要全文)
> - 🅲️ 简略介绍一下自己(还没有简历的情况)"
如果用户选 🅲️,一次问一个问题,别一次列 6 个:当前 Title + 年限 → 行业 → 近 2-3 段经历(公司 + 负责什么 + 1 个最亮成果)→ 最强 1-2 个技能 → 想往哪个方向走。
⚠️ 选 🅲️ 路径的副作用:报告里所有"匹配度 / Tailor / Gap"结论都要标 "基于用户自述,未经简历事实校验",并强烈建议跑完后去 Resume Skill 做一份正式简历再回头精修。
收齐 JD + 简历后,不要再分别请示用户跑 Decode / Match / Predict / Should I Apply — 一口气在后台跑完 5 条流程(prompts/ 下的 5 份文件),把结果直接组装成一份 HTML Offer Strategy Report:
<footer> 里的 JD SKILL. brand mark + Created by Dreameryanyan 副标题 + LinkedIn / X / 小红书三个社交按钮(含对应 CSS:.brand-block / .brand-mark / .socials / .foot-meta)。这是作者署名,无论报告多长、数据多少都不许删或简化。生成时直接从 frameworks/offer-strategy-report.md 末尾「📌 强制 Footer 区块」整段抄过去。~/Desktop/Claude skills/offer-strategy-<company>-<role>-<YYYYMM>.html。Dreameryanyan、brand-mark、yanliudreamer、xiaohongshu 四个关键词,缺任一 = footer 被丢了。<html lang="en"> 必须默认为 en(不允许 zh / zh-CN),且 grep -c 'data-lang="en"' 与 grep -c 'data-lang="zh"' 数量相等且 ≥ 80。少于 80 = 模型又把内文写成了单语,已知失败模式,参见铁律四。双语 span 对的写法与适用范围见 frameworks/offer-strategy-report.md。open "<完整路径>"(macOS)/ xdg-open (Linux) / start (Windows),让 HTML 直接在浏览器弹出来。<slug>.md,更新 jd-bank/_index.md,文件末尾加一行 > 📊 HTML 报告:~/Desktop/Claude skills/offer-strategy-<slug>.html。最后一句收尾:
> "报告已生成并在浏览器打开 ✅
> · 📊 ~/Desktop/Claude skills/offer-strategy-<slug>.html
> · 内置 Export PDF 和 Export Markdown 两个按钮
> · 这份 JD 已存进 jd-bank/,下次提到自动复用
>
> 下一步:
> - 决定投 → 交给 Resume Skill 做整体简历打磨
> - 准备 Behavior 题 → 转 BQ Skill 挖故事
> - 看下一份 JD → 直接贴过来"
铁律一 · 先解码,再做任何事。
跑 Match / Tailor / Predict 之前必须先在内存里跑完 JD Decoder 的 5 图层(招聘经理真实需求 / Must Have / Nice to Have / Hidden Signals / Level 判断)。直接拿原始 JD 去算匹配度,是在跟「招聘话术」对齐,不是跟「招聘经理真实需求」对齐 — 这是 90% 求职工具最大的盲区。
铁律二 · 不替用户编简历内容、不编公司情报。
[需用户补充],别编。铁律三 · 数据没齐就不要硬出报告。
JD 缺关键内容 / 用户没给简历或自述 → 先把缺的要齐,别硬跑。报告底部的“假设说明”章节必须显式列出所有假设(薪资底线 / visa / on-site 接受度 / Title 接受度 等),并写明“任一不对告诉我重新生成”。
铁律四 · 报告必须真双语,不是代码已插了切换按钮就算数。
模板 .report-tools 里的 EN / 中文 切换按钮靠 CSS 根据 <html lang> 切显 [data-lang="en"] / [data-lang="zh"] 两个 span。若你把正文写成单语(全中文或混排),按钮看起来能点但切什么都不变 — 这比报告内容自身错更严重,因为它伪造了交付完整度。
<html lang="en">。EN 在前、ZH 在后:<span data-lang="en">English</span><span data-lang="zh">中文</span>。data-lang="en" 与 data-lang="zh" 数量不相等或总数 < 80)。| 流程 | 干什么 | Prompt 文件 |
|---|---|---|
| 1 · Decode | 5 图层拆解 JD 真实意图 | prompts/jd-decoder.md |
| 2 · Match | 匹配度(0.6/0.2/0.2 加权)+ Must Have 逐条命中 + Gap 三档 | prompts/match-score.md |
| 3 · Tailor | 简历 diff(仅取关键改写片段进报告,整体打磨交 Resume Skill) | prompts/resume-tailor.md |
| 4 · Predict | Top 20 面试题(报告里只放 Top 10,导流 BQ Skill) | prompts/interview-predictor.md |
| 5 · Should I Apply | 五件套决策(⭐ / 值得投 / 不值得投 / 拿面概率 / 下一步) | prompts/should-i-apply.md |
这几个步骤在 Step 3 里被调用一次,结果全部塞进同一份 HTML 报告。 用户看不到"现在在跑匹配步"这种内部状态。
如果用户明确只想要某一条流程("只解码不要别的" / "只算匹配度")→ 跳过 Step 3 的报告生成,直接吐这一条流程的纯文本结果。这是例外路径,不是默认。
jd-bank/,每份分析过的 JD 一个 .md。<公司缩写>-<岗位slug>-<YYYYMM>.md,如 openai-product-designer-202606.md。_index.md。这个 skill 不替代另外两个:
三者形成的用户路径:
看到 Dream Job
↓
JD Skill:贴 JD → 给简历 → HTML 报告自动弹出
↓(决定投)
Resume Skill:整体简历打磨
↓(拿到面试)
BQ Skill:挖故事 / 模拟面试
↓
拿 Offer
Prompts(5 条内部流程的执行脚本)
Frameworks(知识词典 + 报告规格)
Examples
JD Bank(情报库)
Take yanliudesign/job-description-skill from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.