核心问题: 一条本地运行、按量表打分的流水线能否取代你手工刷招聘网站的筛选方式?你敢不敢直接按这个分数行动?
RepoDaily 采用评分
RepoDaily 将该项目的采用分评为 90/100(强):分数来自文章来源、安装路径、生产风险、差异化、许可证清晰度以及 AI/Agent 适配度。
包含 6 个来源、覆盖 3 类来源;如有 RepoDaily 独有模块,会进一步提高证据分。
检测到 6 个工作流步骤、5 个下一步动作,以及 7 个命令/安装信号。
趋势热度为 +855 stars;如内容中有 release、issue 或维护信号,会提高维护可信度。
采纳风险标记为 medium,并包含 5 条安全说明与 4 条跳过条件。
3 个机会视角、5 个替代方案,以及 4 个类型化模块支撑差异化判断。
文章中包含许可证来源或许可证表述。
文章正文和元数据中检测到 6 个 AI/Agent 相关信号。
项目概览
career-ops 是一个 MIT 协议的 JavaScript 项目,把整套求职过程打包成本地流水线。package.json 标注的 1.28.0 版本于 2026-08-20 发布,自述为"AI 驱动的求职流水线","可配合任何 AI 编码 CLI(Claude Code、Codex、OpenCode、Antigravity、Grok、Qwen、Kimi、Copilot)"。它不是托管 SaaS:你本来就开着的 CLI 负责编排,底层 Node 脚本完成扫描、打分、文档生成与追踪。
核心卖点是结构化。career-ops 扫描招聘门户与 ATS 系统,让每条职位按结构化 A-F 量表评分并映射为 1.0-5.0 的数值,而不是凭感觉扫一眼就投。流水线延伸到简历定制与投递追踪,还捕捉职位描述之外的信号:1.28.0 新增了按 RFC #1506 schema v1 的"无回复摩擦"信号(#2787),以及编号为 Block G Signal 15 的"AI 筛选披露"信号(#2892)。这些雇主行为数据,多数追踪工具从不记录。
本期排名第 5、周期 855 星,背后是发布节奏。趋势日前一天,v1.28.0 落地,包含 13 项功能和一批修复:Gemini 原生 Node.js 批量评分器(#1650)、yourator 招聘板 provider、示例门户模板里的 Wellfound 搜索词,以及会探测"长尾 ATS 供应商、而不只是三大"的 discover-ats 模式。CONTRIBUTING.md 自称总星数 55K+、几乎每周发布,changelog 的密度佐证了这一点。
工程上它比典型的 AI 套壳克制得多。运行时依赖只有四个(@google/generative-ai ^0.24.1、dotenv ^17.0.0、js-yaml ^5.3.0、playwright 精确锁定 1.62.1),engines 要求 Node >=18,doctor 命令检查环境,Dockerfile 基于 mcr.microsoft.com/playwright:v1.62.1-jammy 构建,附带 Go 1.23.4 工具链(用于 dashboard TUI)和 TeX Live(用于 PDF 输出)。测试也有:eval:golden 金标准评分测试和 Playwright 简历渲染视觉测试。
为什么现在变热
- 2026-08-21 趋势日周期增星 855,排名第 5(RepoDaily 统计)。
- v1.28.0 于趋势日前一天(2026-08-20)发布:13 项功能加一批修复,包括 Gemini 批量评分器(#1650)与 AI 筛选披露信号(#2892)。
- 运行在开发者本来就开着的工具里:package.json 列出 Claude Code、Codex、OpenCode、Antigravity、Grok、Qwen、Kimi、Copilot 八种 CLI。
- A-F 量表映射 1.0-5.0 分,把凭感觉筛职位变成可复核的数字,这是仓库的核心差异点。
- MIT 协议、本地优先:无账号、无托管后端;SECURITY.md 直说 career-ops 本地运行,"我们没有可被攻击的服务器"。
- 对求职工具而言少见的雇主侧信号:拒绝时延、重复发帖检测、表格新鲜度检查,以及新增的无回复摩擦信号(RFC #1506)。
解决什么问题
- 职位分散在众多门户与 ATS 系统,人工浏览决定了你能看到的上限。
- 没有固定标准,同一条 JD 在不同疲惫程度下会得到不同的判断。
- 逐条定制简历是重复劳动,时间一紧就悄悄被省略。
- 投递记录大多退化成一份不再更新的表格,没有跟进节奏。
- 雇主行为——已读不回、重复发帖、AI 筛选——要等几周浪费时间后才能察觉。
工作原理
- 定义目标:复制 templates/portals.example.yml(1.28.0 在其中加入 Wellfound 搜索词),填入你关注的公司;用 npm run validate:portals 和 npm run verify:portals 校验。
- 扫描看板:npm run scan 从已配置门户拉取;scan:full 带 --seeds yc,a16z 这类种子做全板扫描;discover-ats 探测长尾 ATS 供应商;新的免认证 provider(yourator 刚在 1.28.0 落地)无需登录。
- 给职位打分:每条 JD 按 A-F 量表评出 1.0-5.0 分。选择执行器:gemini:eval(批量模式自 #1650 起为原生 Node.js)、本地模型的 ollama:eval、openai:eval,或经 OpenRouter 的 npm run or:eval。
- 定制文档:openai:tailor 调整简历,generate-cover-letter.mjs 按载荷生成求职信,cv:verify-facts 核对事实,generate-pdf.mjs 渲染输出——Docker 镜像为此专门打包了 texlive-xetex 和 latexmk。
- 追踪与复盘:add、tracker、find 管理条目;reposts 检测重复发帖;rejection-latency 与 company-history 记录雇主真实行为;weekly-digest 出周报。1.28.0 还给 Machine Summary schema 加了 reports_to 字段。
- 守护流水线:eval:golden 做金标准评分测试,verify 端到端检查,doctor.mjs 直接输出结论,例如 Gemini 需要 Node 20+(#3032),不再只写在说明文字里。
命令面:58 个 npm 脚本、四个运行时依赖
v1.28.0 的 package.json 定义了 58 个脚本,广度本身就是产品:scan(scan.mjs)、scan:full(scan-ats-full.mjs)、tracker、find、digest、upskill、invite-match、paste-reply,以及负责自更新的 update 和 rollback。没有任何后台守护进程——每个阶段都是一个可以直接打开阅读的 Node 文件。
- 打分执行器:gemini:eval、ollama:eval、openai:eval、or:eval(openrouter-runner.mjs),外加 eval:golden 金标准测试。
- 文档工具:pdf(generate-pdf.mjs)、img-to-pdf、cover-letter、cv:verify-facts、sync-check,以及 Playwright 简历视觉测试(test:cv-visual,配置为 playwright.cv.config.mjs)。
- 追踪维护:dedup、merge(merge-tracker.mjs)、normalize、freshness、rejection-latency、reposts、liveness。
- 平台自检:doctor(node doctor.mjs)、经 scripts/check-syntax.mjs 的 lint、带回滚的 update,以及运行 npx playwright install chromium --with-deps 的 postinstall。
- 面板:build:dashboard 与 serve:dashboard,后者通过 cd dashboard && go run . --path .. 启动 Go TUI。
集成面:八种 CLI、四条模型通路、一个 Go 面板
career-ops 把自己定位为 AI 编码 CLI 之上的运行时层,而不是独立应用。package.json 的 description 列出 Claude Code、Codex、OpenCode、Antigravity、Grok、Qwen、Kimi、Copilot,keywords 数组重复了这些名字并加上 ai-agent-skill。
- 模型供应商:依赖里唯一的 AI SDK 是 @google/generative-ai ^0.24.1;Ollama、OpenAI、OpenRouter 走各自的脚本(ollama-eval.mjs、openai-eval.mjs、openrouter-runner.mjs)。
- 浏览器层:playwright 精确锁定 1.62.1,与 Docker 基础镜像自带的 Chromium 版本对齐;browser-extract.mjs 负责提取。
- 面板:dashboard/ 下的 Go TUI,由 serve:dashboard 启动;Dockerfile 专门安装 Go 1.23.4,以保持"与 README 安装方式的完整功能对等"。
- 职位来源:门户模板加专用扫描器——scan:interamt(scan-interamt.mjs)、company:funded(company-funded.mjs),以及 1.28.0 新增的 yourator provider。
部署要点:单容器、源码 bind-mount
Dockerfile 基于 mcr.microsoft.com/playwright:v1.62.1-jammy 构建,设置 PLAYWRIGHT_BROWSERS_PATH=/ms-playwright,以 tini 为入口,并安装 curl、git、latexmk、texlive-latex-extra、texlive-xetex 以及支持 amd64 和 arm64 的 Go 1.23.4。源码刻意不做 COPY——项目在运行时经 docker compose bind-mount,本地改动即刻反映到容器内。
- engines.node 要求 >=18,但 doctor 现在会直接输出 Gemini 专属的 Node 20+ 结论(#3032)——把批量打分走 Gemini 前先检查。
- 镜像也是内核层面受阻主机的逃生通道:Dockerfile 明确点名 Ubuntu 26.04 这类会拦截 Playwright Chromium 安装器的系统,镜像内置浏览器仍可运行。
- npm install 之后,postinstall 钩子就会尝试 npx playwright install chromium --with-deps,浏览器准备不是额外的手工步骤。
维护风险:高频发布、人工审阅、单维护者风险
项目迭代很快:仅 1.28.0 就带了 13 项功能,且与 RFC 和编号信号挂钩(RFC #1506 schema v1、Block G Signal 15)。CONTRIBUTING.md 承诺人工审阅——"我们不合入 AI 垃圾"——并称 issue/PR 通常一两天内回复,还附了 Discord 邀请(discord.gg/8pRpHETxa4)。
- good-first-issue 机制:评论 /assign 即可认领;7 天无进展自动释放(第 3 天提醒一次);/extend 重置计时,/unassign 干净退出;名额留给在本仓库合并 PR 少于 3 个的新人。
- 功能性 PR 需先开 issue;修 bug、新增免认证扫描 provider、文档和翻译可以直接提 PR。
- package.json 的作者字段只有一人(Santiago Fernández de Valderrama,santifer.io)——采用度可见,巴士系数同样可见。
- 安全响应有白纸黑字:发送至 [email protected],72 小时内回复,协调披露并在发布说明中致谢报告者。
谁适合关注
适合关注
- 已经为 AI 编码 CLI 或模型 API 付费、习惯终端操作的求职者。
- 瞄准初创公司看板的候选人——scan:seeds 自带 yc 和 a16z 种子集预设。
- 注重隐私的用户:全部本地运行,无账号、无托管后端。
- 想拿到第一个开源合并 PR 的新人:CONTRIBUTING.md 就是这样招人的,附带带工时估算的小任务和 /assign 认领流程。
- 想找具体切入点的 Go 和 Playwright 开发者——dashboard TUI 与浏览器提取都是文档点名的贡献方向。
可以先跳过
- 想要带引导流程、多端同步和手机 App 的托管网页产品的人。
- 不愿为打分阶段管理 API 密钥、也不打算本地跑 Ollama 的用户。
- 必须确保完全符合各招聘门户服务条款的人——包含 #2764 这类 CSRF 握手修复的扫描流水线,与部分看板天然存在张力。
- 招聘方和 HR;这是求职者侧的软件。
风险与注意事项
本地优先加 MIT 协议消除了厂商风险,但项目自己的 SECURITY.md 承认了尖锐面:一个可被浏览器和局域网访问的本地 Web 面板、会触碰外部站点的爬虫脚本,以及本地配置里的密钥。
- Web 面板是本地 HTTP 服务器;SECURITY.md 明确警告它可被你访问的跨域页面和同网络的其他设备触达,并把经其 API 的命令注入列为受理范围。
- 所有 *.mjs 脚本都在命令注入、路径穿越和 SSRF 的受理范围内——项目认真对待自己的攻击面,恰好说明攻击面确实存在。
- 爬虫会失效:仅 1.28.0 就修复了 POST 前先做 GET /jobs CSRF 握手(#2764)和批量执行器空 JD 文件回退(#2492)的问题。
- 模型接入是用户自己的事:云端打分需要把 API 密钥存本地(配置类"密钥暴露、不安全默认值"属受理范围),本地打分需要 Ollama。
- 版本锁定有意义:playwright 固定在 1.62.1 以对齐 Docker 镜像的 Chromium,随手升级依赖可能弄坏提取功能。
- 设计上本地运行;SECURITY.md 指出没有他们的托管服务器可攻击——但紧接着补充"本地不等于不可达"。
- 受理范围:*.mjs 脚本中的命令注入、路径穿越、SSRF;templates/ 生成的 HTML 与 PDF 中的 XSS;web/ 面板 API 的命令注入;配置中的密钥暴露。
- 披露流程:发送描述、复现步骤和影响到 [email protected];72 小时内回复;协调披露,并在发布说明中致谢报告者。
- 不受理:第三方依赖的缺陷(请上游报告)、物理接触、社会工程。
- 四个运行时依赖的精简依赖面让审计范围保持狭窄。
替代方案比较
| 方案 | 适用场景 | 代价 |
|---|---|---|
LinkedIn Jobs | 想要最大的网络与猎头触达,能接受算法信息流而非量表打分。 | 免费;Premium 订阅增加洞察与 InMail |
Teal | 想要带简历工具和浏览器插件的托管职位追踪器,而不是终端流水线。 | 免费增值 SaaS |
Huntr | 主要需要看板式投递追踪,不需要扫描和打分。 | 免费增值 SaaS |
JobSpy | 想要一个开源 Python 库,把多家看板的职位爬取进 dataframe 自己分析。 | 开源 |
Reactive-Resume | 只需要自托管的简历构建器,不需要扫描与追踪环节。 | 开源、自托管 |
这个趋势说明了什么
提交一个免认证扫描 provider
CONTRIBUTING.md 把新的零认证扫描 provider 列为少数可以跳过"先开 issue"规则的贡献——你可以直接提 PR,yourator 正是 1.28.0 这样加进来的。
向 templates/portals.example.yml 加一个看板,确认 npm run validate:portals 和 verify:portals 通过,并照抄现有 provider 的模式。
用你自己的判断复核量表
A-F 量表及其 1.0-5.0 映射是产品核心主张,eval:golden 的存在就是为了跨版本保持打分稳定。
挑十条你已人工看过的职位打分,把量表输出与你自己的排序对比,判断差距是信号还是噪声。
加固本地面板
SECURITY.md 把跨域请求和面板 API 命令注入列为 web/ 的现实隐患;社区在这里的测试或补丁有直接、成文的价值。
在局域网一台机器上启动面板,从另一台设备和浏览器的跨域 fetch 探测,再把结果报告到 [email protected]。
RepoDaily 判断
career-ops 是一套认真做出来的本地优先基础设施,解决一个人人抱怨却少有人工程化的问题。命令面宽但透明——58 个可读脚本、四个运行时依赖、一个会告诉你哪里会坏的 doctor。安全文档坦白列出真实攻击面,而不是营销话术。代价由使用者承担:API 密钥或本地模型、爬虫的脆弱性,以及一块绝不该暴露给局域网的面板。对终端熟练的求职者来说,花一小时跑 doctor.mjs、给十条职位打分,是一次便宜而决定性的试验。