关于 apply
通过浏览器自动化填写 Greenhouse、Lever 和 Workday 求职表单的技能。它会准备申请材料、提交答案供确认,并在提交前要求用户明确批准。
主要功能
- 01自动填写 Greenhouse、Lever 和 Workday 表单
- 02按职位信息定制简历
- 03按需生成求职信
- 04拟定并填写表单答案
- 05记录申请状态
适用场景
- 01准备并填写求职申请
- 02复用已保存的个人资料和答案
- 03提交前检查已填写的申请
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ infrasity-labs/ dev-gtm-claude-skills --skill apply安装后在 Claude Code 中输入/apply确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/ats-patterns.mdbrowser-setup.mddata-directory.mdprerequisites.mdpriority-hierarchy.mdscripts/fill-page.md详细介绍
应用技能
优先级层级:有关冲突处理,请参阅
references/priority-hierarchy.md。
使用浏览器自动化填写 Greenhouse、Lever 和 Workday 上的求职申请表。
文件结构
scripts/
fill-page.md # Form-filling subagent prompt
数据目录
按照 references/data-directory.md 确定数据目录。
工作流
步骤 0:检查前置条件
确定数据目录,然后按照 references/prerequisites.md 检查前置条件。必须提供简历文件。如果 DATA_DIR/application-data.md 存在,则加载它(如果不存在,将在步骤 2 中创建)。
步骤 1:确定目标职位
解析 $ARGUMENTS:
如果是 URL:
- 检查
DATA_DIR/jobs/中是否存在匹配的职位文件夹(按文件夹名称中的公司 slug 或 URL 匹配)。如果找到,则从该文件夹加载posting.md、resume.md和cover-letter.md。 - 如果没有匹配项,则按照
references/browser-setup.md设置浏览器,获取职位信息,并将其保存到DATA_DIR/jobs/[company-slug]-[date]/posting.md新文件夹中。
如果是 "last" 或为空:
- 在
DATA_DIR/jobs/中查找最近修改的职位文件夹 - 加载其中的
posting.md、resume.md和cover-letter.md - 向用户确认这是哪份职位申请
如果是 "current":
- 跳过导航——直接使用当前浏览器标签页
- 尽可能将标签页 URL 与已保存的职位文件夹匹配,以加载相关信息
报告已加载的内容:
Applying to [Role] at [Company].
步骤 2:构建/加载申请数据
如果 DATA_DIR/application-data.md 存在,则读取并加载其中的值。
如果不存在:
- 从简历中提取可用信息:姓名、电子邮箱、电话、LinkedIn、所在地
- 向用户展示提取的信息,请他们确认并补充缺失内容:工作授权、签证担保、EEO 偏好(默认将所有 EEO 项设为“拒绝自我认定”)
- 按以下格式保存到
DATA_DIR/application-data.md:
# Application Data
## Personal Information
- First Name: ...
- Last Name: ...
- Email: ...
- Phone: ...
- City: ...
- Country: United States
## Online Profiles
- LinkedIn: ...
- GitHub: ...
- Portfolio: ...
## Standard Answers
- How did you hear about us: Job Board
- Previously worked at this company: No
- Authorized to work in the US: Yes
- Requires visa sponsorship: No
## EEO / Voluntary Disclosures
- Gender: Decline to self-identify
- Race/Ethnicity: Decline to self-identify
- Veteran status: I am not a veteran
- Disability: I don't wish to answer
步骤 3:导航至申请表并检查要求
按照 references/browser-setup.md 设置浏览器(tabs_context → tabs_create → navigate)。
如果 $ARGUMENTS 是 "current":跳过导航。调用 tabs_context_mcp 获取活动标签页。
否则,根据 URL 模式检测 ATS 类型(参见 references/ats-patterns.md),并进行相应导航:
Lever(jobs.lever.co/...):
- 导航至附加
/apply的职位发布 URL,或导航至职位页面并点击“APPLY FOR THIS JOB”
Greenhouse(boards.greenhouse.io/... 或包含 grnhse_iframe 的页面):
- 导航至职位发布 URL
- 使用
javascript_tool提取 iframe 令牌:const iframe = document.getElementById('grnhse_iframe'); const url = new URL(iframe.src); JSON.stringify({ boardToken: url.searchParams.get('for'), jobToken: url.searchParams.get('token') }); - 导航至直接表单 URL:
https://job-boards.greenhouse.io/embed/job_app?for={boardToken}&token={jobToken}
Workday(*.myworkdayjobs.com/...):
- 导航至职位页面。点击“Apply Now”。
- 如果出现包含 Autofill/Manual 选项的落地页,点击“Apply Manually”。
- 如果出现身份验证关卡,告知用户先登录,然后在准备好时回复“continue”。创建账户属于禁止操作——用户必须自行完成身份验证。
未知 ATS:
- 导航至该 URL,并截取屏幕截图
- 尝试识别表单。如果无法识别,告知用户并寻求指导。
检查表单。 进入申请表后,快速浏览(read_page(filter="interactive"),或在 Workday 上滚动查看)以确定:
- 表单是否包含简历/CV 上传字段?
- 表单是否包含求职信上传字段或文本框?
- 是否有任何需要特别注意的特殊必填字段?
记录这些要求——它们决定了步骤 4 中要生成哪些材料。
步骤 4:生成缺少的材料
目标是在开始填写前准备好所有材料,让用户尽量少做工作。
始终针对职位定制简历。 检查此职位是否存在 DATA_DIR/jobs/[job-folder]/resume.md:
- 如果存在:简历已针对该职位定制。跳过。
- 如果不存在:直接运行 tailor-resume 技能。按照
skills/tailor-resume/SKILL.md中的工作流程,使用职位发布信息(已加载)、原始简历和工作经历档案生成定制简历。保存到职位文件夹中。继续之前,将简历交给用户快速审核。
仅在表单要求时生成求职信。 如果第 3 步的侦察发现有求职信字段:
- 检查是否存在
DATA_DIR/jobs/[job-folder]/cover-letter.md - 如果存在:已完成。跳过。
- 如果不存在:直接运行 cover-letter 技能。按照
skills/cover-letter/SKILL.md中的工作流程,使用职位发布信息、定制后的简历和档案。保存到职位文件夹中。交给用户快速审核。
如果表单没有求职信字段,则完全跳过求职信生成。
告知用户生成了哪些内容:
Prepared for [Role] at [Company]:
- Tailored resume: [generated / already existed]
- Cover letter: [generated / already existed / not required by form]
Ready to fill the application. Proceeding...
步骤 5:扫描所有字段
填写任何内容之前,扫描整个表单,找出所有字段。此步骤中不要填写字段,只读取。
对于 Lever/Greenhouse(单页表单):
- 调用
read_page(tabId, filter="interactive")一次获取所有字段
对于 Workday(多步骤向导):
- 从上到下滚动扫描当前页面,并在每个视口位置调用
read_page - 收集所有字段标签、类型及其是否为必填项
- 注意:到达每个向导页面时再扫描该页面(参见步骤 7)
对于找到的每个字段,记录:
- 字段标签
- 字段类型(文本、下拉菜单、单选框、复选框、文件上传)
- 是否为必填项
- 供后续填写时使用的元素引用
步骤 6:提出答案并征求批准
按照以下优先级为每个字段生成建议答案:
- 申请数据 — 根据下方的字段匹配参考,从
application-data.md中匹配 - 合理的默认值 — 对于申请数据中未包含的常见字段:
- 法定名/姓 → 与名/姓相同
- 电子签名 → 全名
- 仲裁/条款协议 → 接受(告知用户)
- 面试流程确认 → 接受
- AI 转录同意 → 接受
- 合同/临时工作相关问题 → “否”(除非申请数据另有说明)
- 自定义答案 — 检查
application-data.md的“自定义答案”部分,查看之前缓存的答案 - 最佳推测 — 对于其余字段,根据字段标签和职位背景生成合理答案
- 无法确定 — 仅在确实含糊且没有合理默认值时使用
向用户提供一份汇总:
Here's my plan for the [Company] application:
**Auto-fill from your data:**
- First Name: Jane
- Last Name: Doe
- Email: [email protected]
- Phone: 555-0123
- LinkedIn: https://linkedin.com/in/janedoe
...
**Proposed answers (please review):**
- Legal First Name: Jane (same as first name)
- Electronic signature: Jane Doe
- Arbitration agreement: Accept
- Contract work: No
- [Any other non-obvious fields]: [proposed answer]
**Needs your input:**
- [Only truly ambiguous fields, if any]
**Manual upload needed:**
- Resume: [file path]
- Cover letter: [file path] (if applicable)
Approve and I'll fill everything in. Or tell me what to change.
核心原则:只询问一次,只填写一次。 不要针对每个字段分别提问。唯一需要用户参与的环节应是这次审批(以及步骤 8 中最终提交前的确认)。
用户批准(并提出任何修改)后,将新增答案缓存到 DATA_DIR/application-data.md 的“自定义答案”部分,以便在今后的申请中重复使用。
步骤 7:填写表单
获得批准后,一次性填写所有内容。
委派给子 Agent。 调用 scripts/fill-page.md,并提供:
- ATS 类型(lever/greenhouse/workday/unknown)
- 已批准的字段→值映射(所有答案,不只是申请资料)
- 标签页 ID
- 简历和求职信的文件路径
子 Agent 会填写当前页面的所有字段,然后返回已填写和剩余的内容。
对于多页表单(Workday):
- 填写当前页面 → 点击“Save and Continue”
- 如果出现验证错误:读取错误信息,修正字段,然后重试
- 在新页面上:扫描字段(步骤 5 的逻辑),与已批准的答案匹配,填写并继续
- 重复以上步骤,直到到达审核页面
文件上传处理:
MCP 工具只能通过 upload_image 上传图片。对于 PDF/DOCX 格式的简历和求职信,请告知用户文件路径,并让用户手动上传。这是已知限制——在步骤 6 的摘要中附上路径,以便用户审核时上传。
步骤 8:提交前审核
到达审核/确认页面,或填写完单页表单的所有字段后:
- 截取屏幕截图
- 确认所有内容看起来正确
- 在提交前向用户明确征求确认——根据浏览器自动化规则,这是必须获得明确许可的操作
用户确认之前,切勿点击 Submit/Send。
步骤 9:记录申请
提交后(或用户决定不提交时):
创建 DATA_DIR/jobs/[company-slug]-[date]/applied.md:
# Application Log
- **Date**: YYYY-MM-DD
- **ATS**: Greenhouse/Lever/Workday
- **Status**: Submitted / Draft (not submitted)
- **Notes**: [any relevant notes]
更新 DATA_DIR/job-history.md——找到该职位对应的条目,并附上申请状态和日期。
向用户展示:
Applied to [Role] at [Company] on [date].
Files saved to: DATA_DIR/jobs/[folder]/
字段匹配参考
将表单字段标签(不区分大小写,模糊匹配)与申请资料对应:
| 标签模式 | 数据来源 | 输入方式 |
|---|---|---|
first name | Personal.FirstName | form_input / type |
last name | Personal.LastName | form_input / type |
full name | Personal.FirstName + LastName | form_input / type |
email | Personal.Email | form_input / type |
phone | Personal.Phone | form_input / type |
city, location, current location | Personal.City | form_input / type / combobox |
country | Personal.Country | 下拉菜单选择 |
linkedin | Profiles.LinkedIn | form_input / type |
github | Profiles.GitHub | form_input / type |
portfolio, website | Profiles.Portfolio | form_input / type |
resume, cv | 文件上传:简历 PDF | 文件上传 |
cover letter | 文件上传:求职信 | 文件上传 |
how did you hear | StandardAnswers.HowHeard | 下拉菜单:“Job Board” |
previously worked | StandardAnswers.PreviouslyWorked | 单选按钮/复选框:“No” |
authorized to work, work authorization | StandardAnswers.WorkAuth | 单选按钮/下拉菜单 |
sponsorship | StandardAnswers.Sponsorship | 单选按钮/下拉菜单 |
gender | EEO.Gender | 下拉菜单:“Decline” |
race, ethnicity | EEO.Race | 下拉菜单:“Decline” |
veteran | EEO.Veteran | 下拉菜单/单选按钮:拒绝回答选项 |
disability | EEO.Disability | 下拉菜单/单选按钮:拒绝回答选项 |
无法识别的字段:检查字段是否为必填。如果是必填,请询问用户。如果是可选字段,则跳过。将用户的答案缓存在 DATA_DIR/application-data.md 的“Custom Answers”下,以便重复使用。
ATS 特定交互说明
Lever:对所有字段类型(包括下拉菜单),使用带有 value 或 text 的 form_input 即可直接填写。
Greenhouse:导航到表单的直接 URL(位于 iframe 外)后,使用带有 value 的 form_input 即可填写。
Workday:
read_page(filter="interactive")只会返回视口中可见的元素。必须从上到下滚动,并在每个滚动位置调用read_page。read_page不会返回单选按钮 — 请使用find工具或通过computer在相应坐标处点击。- 下拉菜单是会打开弹出面板的
button元素。点击按钮 → 使用find或read_page定位选项 → 点击选项。对于分层下拉菜单(如「How Did You Hear」),请使用 Search 文本框在弹出面板中搜索。
响应格式
面向用户的输出应包含以下部分:
- 申请状态 — 已填写的内容、已跳过的内容以及提交确认信息
- 已保存文件 — 已保存的申请日志路径
- 后续步骤 — 如果缺少求职信,则建议补充;否则建议开始下一次求职搜索