| name | jd-tailor |
| description | 输入一份 JD 职位介绍,用 profile/ 信息源库把简历做成适配该 JD 的单页 PDF 专门版。用户说「按 JD 定制简历」「适配这个岗位」「生成专门版简历」「针对这个 JD 改简历」或贴出一段 JD 要求定制时使用。产出落 refs/JD/(本地永不提交),正典 src/data.tsx 零改动。 |
jd-tailor:JD 定制专门版简历
一轮七步:保鲜 → 解析 JD → 匹配选材 → 产出方案(审核点)→ 隔离 worktree 物化 → 门禁+渲染 → 收尾。
设计文档:docs/superpowers/specs/2026-07-12-jd-tailor-skill-design.md(§2 决策记录不得推翻)。
唯一硬约束:正典 main 的 src/data.tsx 全程不改——所有变体改动只发生在临时 worktree 内。适配是对现有「简历级」内容的重投影(重排/选取/强调 + 填个人优势),不是改写事实、不引入新主张或新数字。红线继承现行法(见下 §红线闸),本 skill 不新设标准。
0. 参数与保鲜
输入:JD 文本(用户直接粘贴)或 JD 文件路径,二者都收。先确定公司名(从 JD 提取,用于目录名;提取不到则用 unknown-co)。
DATE=$(date +%F)
COMPANY=<从 JD 提取的公司名,小写 kebab;提取不到用 unknown-co>
JDDIR="refs/JD/${DATE}-${COMPANY}"
mkdir -p "$JDDIR"
node scripts/sync-lark.mjs --check; echo "sync-check exit=$?"
保鲜:退出码 10 表示飞书有新增/过期篇目 → 跟跑 node scripts/sync-lark.mjs --pull 并按受影响卡更新;lark 不可用(命令失败)→ 降级用现有快照,在 analysis.md 声明快照日期(refs/Lark/.sync-state.json 的 generated_at),不阻断。
Bash 调用之间 shell 变量不保留:记下 DATE/COMPANY/JDDIR,后续命令代入字面值。
1. 解析 JD
从 JD 文本提取结构化关键词,仅提取不判断:
- 技术栈:语言/框架/工具(React、TS、Node、RAG、MCP…)
- 方向:前端/全栈/AI 应用/工程效能…
- 层级:实习/校招/初级;硬性要求(学历、年限、地点)
2. 匹配选材(强度分级硬闸)
先读 profile/INDEX.md(JD 定制工作流规程)与 profile/skills-evidence.md(技能↔证据索引)。对每个 JD 关键词:
- 在
skills-evidence.md 找对应域,取其强度分级与证据卡指针。
- 只有「简历级」可进 PDF 产出;「可聊级」最多记入面试口头层、不上纸面;「仅了解」不进任何产出。
- 卡不够用时按
profile/sources/MANIFEST.md 进 refs/ 原始层深挖,引用前过脱敏红线。
- 记录「JD 要但无简历级证据支撑」的缺口——如实标注,不编造。
3. 产出适配方案(写 analysis.md)
按 .claude/skills/jd-tailor/templates/jd-analysis.md 模板,写 ${JDDIR}/analysis.md,含:
- 关键词→证据映射表:JD 关键词 | 命中证据(卡指针)| 强度 | 拟纸面动作。
- 拟调整清单(只用允许的变换,见 §适配词汇表):experiences/projects/bullets 重排与选取、技能栏重排、个人优势 3 条。
- 个人优势 3 条草案:每条一句话,把 JD 一个诉求映射到一条简历级证据,并在括注里标注其回指的证据条目。
- 红线自查:逐项对照 §红线闸给结论(强度分级/数字口径/禁用词/脱敏)。
- 单页预算:个人优势加 N 行、拟从哪些低相关 bullet 删字回补。
- 缺口清单:JD 要但接不住的项(仅供口头层,不上纸面)。
4. ══ 审核点:停下让用户审 ══
把 analysis.md 的要点(尤其个人优势 3 条散文与红线自查结论)呈现给用户,明确请求确认。未获确认,不进 worktree、不改任何 data.tsx。 用户要改就改方案、重呈。
5. 隔离 worktree 物化变体
用户确认后,从 main 开临时 worktree。用 --detach 在 main 的 tip 建游离 HEAD——变体是一次性产物无需分支,且可避开「main 已被主工作区检出」导致 worktree add 失败(用户跑 skill 时通常正在 main):
git worktree add --detach ".worktrees/jd-${COMPANY}" main
在 worktree 内(.worktrees/jd-${COMPANY}/)改 src/data.tsx,只用 §适配词汇表允许的变换:
- 重排/选取 experiences、openSource、bullets;重排/强调 skills;
- 给
profile 填 summary: [<3 条已确认要点>]。
不在此处生成 patch:§6 的删字回合还会继续改 data.tsx 收敛单页,此刻存的 patch 会与最终 PDF 不一致。data.tsx.patch 统一在 §6 门禁全绿、单页达成后从最终 data.tsx 生成。
6. 门禁 + 渲染(全部在 worktree 内)
worktree 是 git 检出,refs/ 已 gitignore → 不在检出内,两处需补偿:
leak-check 找不到 refs/leak-blocklist.txt 会静默降级为仅内置模式(少量模式却仍报「通过」)——必须先从主工作区拷进来,且拷贝失败要 fail-fast,绝不让降级的 leak-check 蒙混过关。
- 变体故意填了
profile.summary,会触发 data.test.ts 的「正典留空」断言——用 JD_VARIANT=1 跳过该单条(其余测试照常),见该测试注释。
先跑门禁(set -euo pipefail + test -f 让 blocklist 缺失即中止,不进降级门禁):
cd ".worktrees/jd-${COMPANY}"
set -euo pipefail
test -f ../../refs/leak-blocklist.txt
mkdir -p refs && cp ../../refs/leak-blocklist.txt refs/leak-blocklist.txt
npm run type-check && JD_VARIANT=1 npm run test && npm run leak-check && npm run print-check
print-check 溢出第 2 页 → 删字回合:砍最低相关 bullet 或精简个人优势,改完重跑上面整段直至 1 页;绝不缩字号、压间距。
leak-check 失败 / blocklist 缺失 / worktree 建失败 → 停下报错,不改用旧产物;正典不受影响。
门禁全绿、单页达成之后,再从最终 data.tsx 一并生成交付 PDF 与 patch(此顺序保证 patch 能复现交付的 PDF):
bash scripts/render-pdf.sh "<仓库绝对路径>/${JDDIR}/王景宏简历.pdf"
git diff main -- src/data.tsx > "<仓库绝对路径>/${JDDIR}/data.tsx.patch"
- 渲染出的单页 PDF 用 Read 目视确认折行与个人优势区块无异常。
7. 收尾
cd <仓库根>
git worktree remove ".worktrees/jd-${COMPANY}" --force
向用户交付:${JDDIR}/王景宏简历.pdf(单页专门版,交付文件名固定为「王景宏简历.pdf」,直接可投递)、${JDDIR}/analysis.md(审计轨)、${JDDIR}/data.tsx.patch(可复现);并列出缺口清单(JD 要但接不住的项)。
不自动提交、不自动回灌正典:变体是一次性本地产物(refs/JD/ 已 gitignore)。是否把某条改进吸收进正典由用户另行决定,走现行工作流(小改直提 main / 复杂 issue→PR→CR)。
红线闸(继承现行法,不新设标准)
方案生成(§3)与物化(§5)两处都过:
- 强度分级:仅「简历级」上纸面(
profile/skills-evidence.md 唯一口径)。
- 数字口径:数字只走
profile/facts/numbers.md 锚点,遵「只放大数字、小计数不写数字」。
- 禁用词:主导 / 大厂 / AI 理论主张(RNN/Transformer 内部机制);字节段脱敏铁律(内部仓库/平台/工单/域名不出现)。
- leak-check:worktree 内
npm run leak-check 必过。
- 单页守恒:
print-check + 目视;字数问题用删字解决。
适配词汇表
允许(对简历级内容的重投影):重排 experiences/projects/bullets 顺序;在多 bullet 里选取最相关、单页预算内略去低相关;重排/强调六行技能栏;填个人优势 3 条(每条回指简历级证据)。
禁止:改写事实措辞、引入新主张/新数字、动 tagline(全栈开发 × AI 应用 锁死)、把「可聊级/仅了解」升上纸面、写禁用词。