README.cn.md
Rama main · réplica de lectura del repositorio original.
<p align="center"><picture><source media="(prefers-color-scheme: dark)" srcset="docs/wordmark-dark.svg"><img src="docs/wordmark-light.svg" alt="career-ops" width="250" height="56"></picture></p>
<p align="center">开源的 AI 求职智能体。</p>
<p align="center">
<a href="README.md">English</a> |
<a href="README.es.md">Español</a> |
<a href="README.de.md">Deutsch</a> |
<a href="README.fr.md">Français</a> |
<a href="README.pt-BR.md">Português (Brasil)</a> |
<a href="README.ko-KR.md">한국어</a> |
<a href="README.ja.md">日本語</a> |
<a href="README.cn.md">简体中文</a> |
<a href="README.zh-TW.md">繁體中文</a> |
<a href="README.ua.md">Українська</a> |
<a href="README.ru.md">Русский</a> |
<a href="README.pl.md">Polski</a> |
<a href="README.da.md">Dansk</a> |
<a href="README.ta.md">தமிழ்</a> |
<a href="README.ar.md">العربية</a> |
<a href="README.hi.md">हिन्दी</a> |
<a href="README.tr.md">Türkçe</a> |
<a href="README.vi.md">Tiếng Việt</a> |
<a href="README.id.md">Bahasa Indonesia</a>
</p>
<p align="center"><a href="https://career-ops.org/zh/docs?utm_source=readme&utm_content=zh">开源 AI 求职智能体 · 完整中文文档</a></p>
<!-- The non-breaking spaces ( ) and word joiners (⁠) below decide where each line wraps on a phone. Keep them when editing. -->
<p align="center"><a href="https://github.com/santifer"><img src="docs/avatar-santifer.png" width="48" height="48" align="middle" alt="Santiago Fernández de Valderrama Aparicio"></a> 由 <a href="https://github.com/santifer"><strong>@santifer</strong></a> 创建, <a href="https://github.com/career-ops-hq/career-ops/blob/main/README.cn.md#builders"><picture><source media="(prefers-color-scheme: dark)" srcset="docs/builders-stack-dark.svg"><img src="docs/builders-stack-light.svg" alt="" height="32" align="middle"></picture></a> <a href="https://github.com/career-ops-hq/career-ops/blob/main/README.cn.md#builders">700+ 位贡献者</a>参与</p>
<p align="center">
<strong>几个月投出的简历,全都石⁠沉⁠大⁠海。</strong><br>
于是我做了自己需要的那个过⁠滤⁠器。
</p>
<p align="center">
<strong>740 个职位已评估。68 个已投递。12 次⁠面⁠试。⁠1 份 offer。</strong><br>
我是它的第一个用户。我⁠拿⁠到⁠了⁠那⁠份⁠工⁠作。然⁠后⁠把⁠它⁠开⁠源⁠了。
</p>
<p align="center">
粘贴一个职位,它在你的机器上告⁠诉⁠你:还⁠在⁠不⁠在⁠招,适⁠不⁠适⁠合⁠你。<br>
它为你定制简历、起草回⁠答。<strong>由⁠你⁠点⁠击⁠提⁠交。</strong>
</p>
<p align="center">
<img src="docs/demo.gif" alt="作者本人在 career-ops 仪表板里的求职:打过分的职位列表、标为“不要投”的职位的红色计数,然后是一份完整的评估报告" width="800">
</p>
<p align="center"><sub>我自己的求职,进行到一半,界面是西⁠班⁠牙⁠语。</sub></p>
<p align="center">
公司用 AI 筛选候选人。<br>
<strong>我把 AI 交给候选人,让⁠他⁠们⁠来⁠<em>挑⁠选</em>⁠公⁠司。</strong>
</p>
<p align="center">
六个月后,<strong>我离开了那份工作。</strong><br>
现在我们打造 career-ops,让⁠你⁠也⁠能⁠上⁠岸。
</p>
<p align="center"><a href="#轮到你了">拿一个职位试试 ↓</a> · <a href="https://santifer.io/career-ops-system">阅读完整故事 →</a></p>
<p align="center"><sub>不想用终端? <a href="https://career-ops.org/zh/waitlist?ref=readme-cn">加入网页版的候补名单 →</a></sub></p>
<br>
<p align="center"><a href="HIRED.md"><img src="docs/hired-badge.svg" alt="Hired with career-ops: public stories on the record"></a></p>
<p align="center">在我之后来的人,写下了他们是怎么拿到 offer 的。</p>
<p align="center">
<a href="HIRED.md"><img src="docs/hired-wall.svg" alt="可以打开阅读的录用故事" width="800"></a>
</p>
<p align="center"><sub>每张卡片都是一个可以打开的公开 issue。你也上岸了?<a href="https://github.com/career-ops-hq/career-ops/issues/new?template=i-got-hired.yml">留下你的卡片 →</a></sub></p>
<p align="center">⭐ <strong>如果 career-ops 帮到了你,一⁠颗⁠星就⁠能帮⁠下⁠一⁠个⁠人找⁠到⁠它。</strong></p>
<br>
<p align="center">
<a href="https://wired.com.gr/article/to-ai-ergaleio-pou-fernei-epanastasi-ston-tropo-pou-psachnoume-douleia/" rel="noopener noreferrer nofollow"><picture><source media="(prefers-color-scheme: dark)" srcset="docs/press/wired-dark.svg"><img src="docs/press/wired.svg" alt="WIRED" height="32"></picture></a>
<a href="https://www.businessinsider.com/how-i-built-tool-filter-job-listings-landed-head-ai-2026-4" rel="noopener noreferrer nofollow"><picture><source media="(prefers-color-scheme: dark)" srcset="docs/press/business-insider-dark.svg"><img src="docs/press/business-insider.svg" alt="Business Insider" height="32"></picture></a>
</p>
<p align="center">
<a href="https://vercel.com/open-source-program"><img alt="Vercel OSS Program" src="https://vercel.com/oss/program-badge-2026.svg" height="32"></a>
</p>
<p align="center">
<a href="https://trendshift.io/repositories/25195" rel="noopener noreferrer"><img src="https://trendshift.io/api/badge/repositories/25195" alt="GitHub Trending: #1 repository of the day (Trendshift)" width="250" height="55"></a>
<a href="https://www.producthunt.com/products/santifer-io?utm_source=badge-featured&utm_medium=badge" rel="noopener noreferrer"><img src="docs/press/producthunt.svg" alt="Featured on Product Hunt" width="206" height="54"></a>
</p>
## 轮到你了
把你今晚本来打算投的一个职位粘贴进来。如果返回的是<em>不要投</em>,你刚刚把这个晚上赢回来了。如果返回的是一份计划,你就知道下一步该做什么。
```bash
npx @santifer/career-ops init
```
<p align="center"><sub>开源。本地运行。就在你已经在用的 AI CLI 里。<a href="docs/RUNNING_ON_A_BUDGET.md">包含免费模型和本地模型。</a></sub></p>
## 你不必一个人找工作
点下发送之后的沉默,与你无关。看到同一件事的人足够多,于是把这套实践写了下来,只有六行:
> 投得更少,投得更好。信号胜过数量。证据胜过关键词。由人来决定。本地优先。桌子两边都有尊严。
<p align="center"><a href="https://career-ops.org/manifesto?utm_source=readme"><img src="https://img.shields.io/badge/dynamic/regex?url=https%3A%2F%2Fraw.githubusercontent.com%2Fcareer-ops-hq%2Fcareer-ops%2Fmain%2FSIGNATURES.md&search=n%3A(%5Cd%2B)%5Cs*%24&replace=%241%20signatories&label=THE%20CAREEROPS%20MANIFESTO&color=DD7627&style=for-the-badge&labelColor=2b3137" alt="CareerOps 宣言:实时签署人数"></a></p>
<p align="center">其中几位,用他们自己的话。</p>
<p align="center">
<a href="https://career-ops.org/manifesto?utm_source=readme"><img src="docs/manifesto-wall.svg" alt="CareerOps 宣言的三个签名,用他们自己的话" width="800"></a>
</p>
<p align="center"><sub>每一个签名都是一次可审计的提交。<a href="https://career-ops.org/manifesto?utm_source=readme">读完全部,或加上你的 →</a></sub></p>
<br>
招聘不会自己修好。正在经历它的人可以,而且他们已经在这个房间里,交换笔记,互相修各自的配置。
<a id="builders"></a>
<p align="center"><a href="CONTRIBUTING.md"><img src="https://warpchart.dev/api/builders?lang=cn" alt="贡献者 GitHub 头像组成的动态墙,自 2026年4月 起按加入顺序依次填满,下一个方格留空。" width="100%"></a></p>
[修复就是在这里写出来的](CONTRIBUTING.md)。是房间,不是俱乐部。**一起来建。**
<p align="center"><a href="https://discord.gg/8pRpHETxa4"><img src="docs/discord-badge.svg" alt="Discord:career-ops 服务器的实时成员数"></a></p>
## 赞助商
career-ops 对求职者永久免费。这些公司赞助了本项目:
<p align="center">
<a href="https://serpapi.com/career-ops-org" title="SerpApi"><img src="docs/sponsors/serpapi.svg" alt="SerpApi" height="48"></a>
</p>
<p align="center"><strong>SerpApi</strong> · Build a portfolio project with live search data. SerpApi gives developers structured JSON/Markdown from Google Search, Maps, Shopping, and other engines through a simple API call.</p>
> 赞助买到的是清楚标注的曝光,绝不是影响力:再多的钱也改变不了路线图,也放不进产品里任何东西。赞助商绝不会出现在评估、排名或推荐中。
## career-ops 为你做什么
粘贴一个职位。它告诉你这个晚上值不值得。
- **还在招吗?** 在你写下一个字之前,它先确认这个职位仍在招聘。
- **不是你?** 用你真实的简历给职位打分,匹配度弱就让你跳过。你可以不听。
- **值得投?** 它起草简历、求职信和申请答案。你来读。你来发。
- **该找谁聊?** 它找到那个人,起草那条消息。它从不替你发出。
- **这些东西都去哪了?** 每一份申请都留在你的机器上。没有任何东西上传给我们。
- **我该学什么?** 连续被拒之后,它说出差距在哪。
最初几次运行会很粗糙。它还不了解你。跟它聊:你的简历、你想要什么、你拒绝什么。把它当成一个招聘顾问的第一周。
第一次启动时,它会在聊天里把这些都问一遍。没有任何需要手动配置的东西。
## career-ops 不做的事
- **自动提交申请。** 它为每个字段起草答案;你审阅,然后点击提交。脚本从不发出 POST(`prepare-application.mjs`)。
- **发送邮件。** 只写草稿。整个代码库里没有任何邮件发送模块。
- **回传数据。** 没有遥测,没有我们的后端。你的简历只从你的机器发往你选择的 AI 提供商,不去任何别的地方。唯一的公开记录就是这个仓库:`HIRED.md` 和它的 issue。
- **催你申请低于 4.0/5 的职位。** 它会告诉你别申请。你可以不听,它会明说。
它会改写你的简历,但绝不能编造。代码里有一道检查:PDF 里的数字或事实如果在你的简历和 `article-digest.md` 里都找不到,就会被拦下;但它还无法判断每一处改写。每份简历发出前都请自己读一遍。详情见 [FAQ](#常见问题faq)。
## 功能特性
| 功能 | 说明 |
| ------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------- |
| **A-H 评估** | 职位摘要、简历匹配(标注每条要求在这个职位里有多重要,以及权重来自职位描述的措辞、结构还是估算,逐条标注;估算永远不能进入最高档)、级别策略、薪酬调研、个性化、面试准备(STAR+R),再加上区块 G 的职位可信度检查(是否仍在招、是否为重复发布:只陈述观察,不下定论),以及一个工作许可信号(把明确不提供签证担保的职位描述标记为硬性阻碍) |
| **Human-in-the-Loop** | AI 评估并推荐,你决定并行动。系统从不提交申请:最终决定始终在你手中 <!-- hitl: absolute guarantee. Do not add "automatically", "by itself", "without your permission" or any other hedge when translating this row. --> |
| **ATS PDF 生成** | ATS 可读的简历,基于你自己的经历、针对每份职位描述定制,采用 Space Grotesk + DM Sans 设计 |
| **求职信生成器** | 基于调研的求职信:关键词呼应、四个交互式角度提问(为什么/问题/方法/语气)、在聊天中审批草稿,以及通过与简历相同的 HTML + Playwright 流水线生成 A4 PDF。每次评估自动起草;用 `/career-ops cover` 按需完成并生成 |
| **简历之外** | 公司调研([`deep`](modes/deep.md))揭示 AI 战略、近期动向、工程文化,以及你的简历应该采取的角度。联系人发现([`contacto`](modes/contacto.md))找出值得联系的招聘经理、招聘人员或团队成员,并起草一条不超过 300 字符、针对联系人类型调整过的 LinkedIn 消息。正式申请邮件草稿([`email`](modes/email.md))把已评估的报告或粘贴的职位描述变成主题、正文和附件清单,不发送、不提交、不点击任何内容。申请让你排进队伍,调研让你获得对话。 |
| **模式分析** | 拒信模式和各 ATS 渠道的推进率(`analyze-patterns.mjs`)、整个求职周期的漏斗统计(`stats.mjs`)、重复发布检测,重复发布可能是幽灵职位的迹象(`detect-reposts.mjs`) |
<details>
<summary><b>它还能做的所有事</b></summary>
| 功能 | 说明 |
| ------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------- |
| **自动流水线** | 粘贴一个 URL,获得完整评估 + PDF + 追踪记录 |
| **面试故事库** | 跨评估积累 STAR+反思故事:5 到 10 个主故事,可以针对你遇到的行为面试问题灵活改编 |
| **谈判话术** | 薪资谈判框架、应对地域折价、利用竞争 offer 作为筹码 |
| **申请邮件草稿** | 从报告或粘贴的职位描述生成给招聘人员、内推或冷申请的正式邮件,包含主题、附件清单、有据可查的匹配点和来自你个人资料的联系信息块。仅限草稿:career-ops 从不发送、提交或点击任何内容。 |
| **招聘平台扫描器** | 预配置 100+ 家公司(Anthropic、OpenAI、ElevenLabs、Retool、n8n…)+ 跨 Ashby、Greenhouse、Lever、Wellfound 的自定义网页搜索查询 |
| **已融资公司发现** | 以审阅为先的 `company:funded` 命令从结构化的公开数据源中列出近期获得融资的公司和来源诊断,不改动你的数据 |
| **批量处理** | 用无头 CLI worker(`claude -p` / `opencode run`)并行评估 |
| **Dashboard TUI** | 在终端里浏览、筛选和排序你的流水线 |
| **流水线完整性** | 自动合并、去重、状态规范化、健康检查 |
| **面试套件** | 按时间块安排的准备计划、带反馈的练习环节、面试后复盘([`interview/`](modes/interview/README.md)),以及公司危险信号检测器([`interview-redflag`](modes/interview-redflag.md)) |
| **Offer 阶段** | 合同阅读助手:逐条款解读加上给律师的问题清单([`offer-prep`](modes/offer-prep.md)),以及期望/公布/实际薪资差距分析器(`salary-gap.mjs`) |
| **跟进与回复** | 跟进节奏计算器和预置提醒(`followup-cadence.mjs`、`followup-seed.mjs`);把雇主回复归类为追踪记录更新([`reply-watch`](modes/reply-watch.md)) |
| **插件系统** | 可选集成(Gmail、Notion、Apify + 社区注册表),默认关闭;见 [docs/PLUGINS.md](docs/PLUGINS.md) |
</details>
## 工作原理
<p align="center"><picture><source media="(prefers-color-scheme: dark)" srcset="docs/how-it-works-dark.svg"><img src="docs/how-it-works-light.svg" alt="How it works: you paste a job URL or description. Archetype Detection classifies it as LLMOps, Agentic, PM, SA, FDE or Transformation. The A-H Evaluation reads cv.md and covers match, gaps, comp research, STAR stories and legitimacy. It produces a report (reports/*.md), the tailored CV in the format set by cv.output_format — a PDF by default — and a tracker entry (data/applications.md)." width="760"></picture></p>
## 快速开始
**最快的方式,一条命令:**
```bash
npx @santifer/career-ops init
```
> 💡 `npx` 随 [Node.js](https://nodejs.org) 一起提供:它只运行一次安装程序,
> 不会全局安装任何东西。还没有 Node?先安装它。
> (已经在用 Claude Code / Codex CLI?那你已经有了。)
这会把最新版本克隆到 `./career-ops` 并安装依赖。然后:
```bash
cd career-ops
claude # or codex / qwen / opencode / agy / grok — open your AI CLI here
```
**首次启动时,career-ops 会通过对话引导你完成设置(你的简历、个人资料和目标职位)。不需要手动编辑任何东西。**
<details>
<summary><b>想手动设置?(git clone)</b></summary>
```bash
git clone https://github.com/career-ops-hq/career-ops.git
cd career-ops && npm install
npx playwright install chromium # only needed for PDF generation
# On a non-Debian/Ubuntu Linux distro (Fedora, Arch, ...), Chromium's system
# libraries aren't installed by the line above — install them yourself with
# your distro's package manager if PDF generation fails to launch the browser
# (Playwright's own docs list the required libraries per platform).
# 2. Open your AI CLI in this directory. On first launch it walks you
# through setup (your CV, profile and target roles) by chatting
claude # or codex / opencode / qwen / agy / grok
# Then ask your CLI to adapt the system to you:
# "Change the archetypes to backend engineering roles"
# "Translate the modes to English"
# "Add these 5 companies to portals.yml"
# "Update my profile with this CV I'm pasting"
# 3. Start using
# 粘贴职位链接或职位描述文本,即可触发 auto-pipeline。
# 其他所有模式,以及如何在你的 CLI 中调用它们:见下方「用法」。
```
</details>
### 全局安装
```bash
npm i -g @santifer/career-ops
```
这会全局安装 `career-ops` 二进制文件,让你不用 `npx` 就能运行 `career-ops init [folder]`。`init` 是它唯一的命令:它只负责搭建工作区,之后的一切都在你的 AI 编码 CLI 里进行(见下方“用法”),而不是通过这个二进制文件。
**该用哪个?**
- `npx @santifer/career-ops init`:最适合首次使用;会创建一个专用的项目文件夹。
- `npm i -g @santifer/career-ops`:如果你更想输入 `career-ops init` 而不是 `npx` 的写法。它不会增加其他命令。
### 其他运行方式
- **在任意文件夹中,作为 Claude Code 插件:** [docs/CLAUDE_PLUGIN.md](docs/CLAUDE_PLUGIN.md)。
- **不使用 AI CLI:** 独立的 Gemini、Ollama 和 OpenAI 兼容脚本可以单独评估一份职位描述。见 [docs/SCRIPTS.md](docs/SCRIPTS.md#geminieval--ollamaeval--openaieval)。
> **这个系统就是设计成由你的 AI 编码 CLI 自己来定制的。** 模式、原型、评分权重、谈判话术:直接让它改就行。它读取的正是它自己使用的文件,所以它清楚该改哪里。
完整安装指南见 [docs/SETUP.md](docs/SETUP.md);用自定义或本地模型低成本运行 career-ops 的方法见 [docs/RUNNING_ON_A_BUDGET.md](docs/RUNNING_ON_A_BUDGET.md)(在 Antigravity CLI 免费层零成本运行见 [docs/FREE_TIER.md](docs/FREE_TIER.md));定时扫描和零 token 的"初筛到短名单"配方见 [docs/AUTOMATION.md](docs/AUTOMATION.md);ATS 自动填表流程的细节见 [docs/APPLY_AUTOFILL.md](docs/APPLY_AUTOFILL.md);把 LinkedIn 联系人导出与漏斗中的公司交叉比对见 [docs/LINKEDIN_JOIN.md](docs/LINKEDIN_JOIN.md);常见设置问题的解答见 [docs/FAQ.md](docs/FAQ.md),包括[故事溯源如何防止编造数字](docs/FAQ.md#why-does-career-ops-refuse-to-use-a-number-from-my-story-bank)。设计原则在 [ARCHITECTURE.md](ARCHITECTURE.md);运行时流程在 [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md)。
## 用法
把职位链接或职位描述粘贴到你的 AI CLI 中。career-ops 会检查带链接的职位是否仍在招(粘贴的文本没有可检查的链接),对照你的简历打分,撰写报告,定制你的简历(默认生成 PDF),并在你的追踪表中新增一行。大多数日子里这就够了。其余一切都是按名称调用的模式。如果无法读取某个职位,流水线会停下并请你粘贴文本。
### 如何调用模式
| CLI | 如何调用 `scan` |
| --- | --- |
| Claude Code, OpenCode, Antigravity CLI (`agy`), Grok Build CLI | `/career-ops scan` |
| Pi | `/skill:career-ops scan` |
| Codex、Qwen、Cursor 或任何其他受支持的 CLI | 自然语言:“Run the career-ops scan mode” |
单独输入 `/career-ops` 会显示命令菜单(在使用它的 CLI 中)。自然语言在所有受支持的 CLI 中都能用。作为 Claude Code 插件使用时,命令是 `/career-ops:career-ops`。
它们共用同一个路由器 `.agents/skills/career-ops/SKILL.md` 和同一批 `modes/*.md` 文件,所以每个 CLI 都以相同方式路由请求(依赖浏览器的模式还需要 Playwright 工具)。Codex 不保证支持斜杠命令:请用自然语言提出请求,或用 `codex exec "Evaluate this JD with career-ops auto-pipeline: https://company.com/jobs/123"` 以无头方式运行一条提示词([docs/CODEX.md](docs/CODEX.md))。如何在每个受支持的 CLI 中运行、带有无头命令的 CLI 的对应命令,以及 各 CLI 的设置说明,都在 [docs/SUPPORTED_CLIS.md](docs/SUPPORTED_CLIS.md) 中。
### 日常命令
| 命令 | 作用 |
| --- | --- |
| *粘贴链接或职位描述* | 完整流水线:职位是否仍在招的检查(仅限链接)、A-G 评估(高分时另加 H)、报告、定制简历(默认 PDF)、追踪表新增一行 |
| `scan` | 扫描你的招聘平台以发现新职位,并加入收件箱(`data/pipeline.md`) |
| `pipeline` | 处理收件箱中等待的链接(standard 和 premium 档位可能跳过明显不匹配的) |
| `apply` | 与你一起逐个字段填写申请表。提交前会停下 |
| `tracker` | 每份申请当前的进展 |
| `followup` | 哪些申请该跟进了,并附草稿 |
<details>
<summary><b>全部命令,按求职阶段划分</b></summary>
`oferta`、`ofertas` 和 `contacto` 保留原来的西班牙语名称,意思分别是:offer、多个 offer、联系人。
**寻找职位**
| 命令 | 作用 |
| --- | --- |
| [`scan`](modes/scan.md) | 扫描招聘平台并发现新职位 |
| [`discover`](modes/discover.md) | 把公司名称列表解析为可扫描的 ATS 招聘页。默认只预览,仅在加 `--write` 时才写入 `portals.yml`(零 token) |
| [`pipeline`](modes/pipeline.md) | 处理收件箱(`data/pipeline.md`)里待处理的链接 |
| [`triage`](modes/triage.md) | 在完整评估之前,依据 `modes/_brief.md` 快速做一轮是否值得投的初筛(不写入任何文件) |
| [`batch`](modes/batch.md) | 用无头 worker 评估大量职位(Claude 下并行,其他 CLI 下逐个处理) |
| [`titles`](modes/titles.md) | 根据你的简历推荐相近的职位名称,以拓宽搜索范围 |
**评估职位**
| 命令 | 作用 |
| --- | --- |
| *粘贴链接或职位描述* | [Auto-pipeline](modes/auto-pipeline.md):评估 + 报告 + 定制简历(默认 PDF) + 追踪表条目 |
| [`oferta`](modes/oferta.md) | 仅评估,区块 A 到 G,高分时另加 H(不生成 PDF) |
| [`ofertas`](modes/ofertas.md) | 比较并排序多个职位 |
| [`deep`](modes/deep.md) | 针对公司的深度调研提示词 |
| [`eu-swe`](modes/regional/eu-swe.md) | 在准备简历、申请或面试之前,校准一份欧洲软件工程岗位的申请 |
**申请**
| 命令 | 作用 |
| --- | --- |
| [`pdf`](modes/pdf.md) | ATS 优化简历,输出为 PDF |
| [`ats`](modes/ats.md) | 检查生成的简历对 ATS 是否友好:评分及可修复的问题 |
| [`text`](modes/text.md) | 定制的 markdown 简历(与 `cv.md` 一致,不生成 PDF) |
| [`latex`](modes/latex.md) | 把简历导出为 LaTeX/Overleaf 的 `.tex` |
| [`latex-tex`](modes/latex-tex.md) | 就地定制你自己的 `resume.tex`(需主动开启;默认仍是 `cv.md`) |
| [`cover`](modes/cover.md) | 求职信,基于粘贴的职位描述或已评估的报告(`cover {slug}`) |
| [`email`](modes/email.md) | 正式的求职邮件草稿。仅限草稿:绝不发送、提交或点击 |
| [`contacto`](modes/contacto.md) | 找到招聘经理、招聘人员或同行,并起草一条 LinkedIn 消息 |
| [`apply`](modes/apply.md) | 实时申请助手(使用此仓库中的 Playwright)。不会提交 |
**面试**
| 命令 | 作用 |
| --- | --- |
| [`interview-prep`](modes/interview-prep.md) | 针对具体公司的面试准备文档 |
| [`interview/plan`](modes/interview/plan.md) | 为即将到来的面试制定按时间块划分的准备计划 |
| [`interview/practice`](modes/interview/practice.md) | 模拟面试,一次一个问题,并给出反馈 |
| [`interview/debrief`](modes/interview/debrief.md) | 面试后复盘:补齐短板,预测下一轮 |
| [`interview-redflag`](modes/interview-redflag.md) | 入职前分析雇主的警示信号 |
**申请之后**
| 命令 | 作用 |
| --- | --- |
| [`tracker`](modes/tracker.md) | 申请状态总览 |
| [`followup`](modes/followup.md) | 跟进节奏:标记逾期的申请,生成草稿 |
| [`reply-watch`](modes/reply-watch.md) | 对雇主的回复分类,并建议更新追踪表 |
| [`outcome`](modes/outcome.md) | 记录申请结果并归档相关产物 |
| [`offer-prep`](modes/offer-prep.md) | 与你一起阅读收到的 offer 或合同:逐条梳理条款,并列出要问律师的问题(不构成法律建议) |
**你的个人资料和简历**
| 命令 | 作用 |
| --- | --- |
| [`interview`](modes/interview.md) | 资料设置:围绕你的经历进行交互式访谈,据此构建简历和个人资料(不是面试练习) |
| [`intake`](modes/intake.md) | 根据 `documents/` 中的文件(主简历、LinkedIn 导出)建立或充实你的个人资料。未经你确认不会写入任何内容 |
| [`master-profile`](modes/master-profile.md) | 导入、审阅并校验你的 Master Career Profile,并把选定的事实准备成简历要点 |
| [`add`](modes/add.md) | 向简历添加项目、论文或职位(抓取、预览、确认) |
| [`expand`](modes/expand.md) | 根据你的个人资料链接,发现简历中缺少的能力 |
| [`retro`](modes/retro.md) | 回顾本次会话,把你教给它的内容保存为规则(只写入你接受的) |
**优化你的投递方向**
| 命令 | 作用 |
| --- | --- |
| [`patterns`](modes/patterns.md) | 分析被拒模式并优化投递方向 |
| [`calibrate`](modes/calibrate.md) | 检查你的评估分数能否预测真实结果。仅供参考:绝不改动评分 |
| [`upskill`](modes/upskill.md) | 基于你已评估的全部报告做技能差距分析 |
| [`training`](modes/training.md) | 对照你的 North Star 评估课程或证书 |
| [`project`](modes/project.md) | 评估作品集项目的想法 |
**系统**
| 命令 | 作用 |
| --- | --- |
| [`agent-inbox`](modes/agent-inbox.md) | 把请求排入下一次会话的队列,并在那时处理(`data/agent-inbox.md`)。`inbox` 同样可用 |
| [`update`](modes/update.md) | 更新 career-ops 系统文件,附带 diff 预览和兼容性检查 |
</details>
## 预配置平台
扫描器自带 **100+ 家公司**可直接扫描,以及覆盖主流招聘网站的 **35+ 条搜索查询**。把 `templates/portals.example.yml` 复制为 `portals.yml`,再添加你自己的:
**AI 实验室:** Anthropic、OpenAI、Mistral、Cohere、LangChain、Pinecone
**语音 AI:** ElevenLabs、PolyAI、Parloa、Hume AI、Deepgram、Vapi、Bland AI
**AI 平台:** Retool、Airtable、Vercel、Temporal、Glean、Arize AI
**联络中心:** Ada、LivePerson、Sierra、Decagon、Talkdesk、Genesys
**企业级:** Salesforce、Twilio、Gong、Dialpad
**LLMOps:** Langfuse、Weights & Biases、Lindy、Cognigy、Speechmatics
**自动化:** n8n、Zapier、Make.com
**欧洲:** Factorial、Attio、Tinybird、Clarity AI、Travelperk
**搜索的招聘网站:** 55+ 个提供方模块覆盖 ATS API、整站数据源、XML/RSS 源、markdown 源和本地解析器。完整表格见[支持的招聘网站](docs/SUPPORTED_JOB_BOARDS.md)。
默认情况下 `node scan.mjs`(即 `npm run scan`)信任每个 ATS 数据源返回的内容。有些公司在职位关闭后仍会把过期职位留在公开 API 里,这些过期条目可能会混进 `pipeline.md`。加上 `--verify` 可以在 API 阶段之后启动 Playwright,在过期职位进入流水线之前把它们剔除:
```bash
node scan.mjs --verify # zero-token discovery + Playwright liveness check
```
验证是顺序执行的,并且只针对新职位(去重之后),所以成本是有上限的。
## Dashboard TUI
内置的终端仪表板让你可视化地浏览你的流水线:
```bash
npm run serve:dashboard # launch the TUI
npm run build:dashboard # optional: build the standalone binary
```
功能:10 个筛选标签、8 种排序模式、分组/平铺视图、延迟加载预览、内联状态修改。
还有一个**实验性的 Web UI**(alpha 版,可选:除非你主动启动,否则不会运行任何东西):见 [`web/README.md`](web/README.md)。
## 项目结构
```
career-ops/
├── AGENTS.md # Canonical agent instructions (all CLIs)
├── CLAUDE.md # Claude Code wrapper (imports AGENTS.md)
├── CODEX.md # Codex wrapper (imports AGENTS.md)
├── OPENCODE.md # OpenCode wrapper (imports AGENTS.md)
├── GEMINI.md # Legacy no-op guard to avoid Antigravity duplicate context
├── cv.md # Your CV (create this)
├── article-digest.md # Your proof points (optional)
├── config/
│ └── profile.example.yml # Template for your profile
├── modes/ # Skill modes
│ ├── _shared.md # Shared context (customize this)
│ ├── oferta.md # Single evaluation
│ ├── pdf.md # PDF generation
│ ├── cover.md # Cover letter generation
│ ├── email.md # Formal application email drafts
│ ├── scan.md # Portal scanner
│ ├── batch.md # Batch processing
│ └── ...
├── templates/
│ ├── cv-template.html # ATS-optimized CV template
│ ├── portals.example.yml # Scanner config template
│ └── states.yml # Canonical statuses
├── batch/
│ ├── batch-prompt.md # Self-contained worker prompt
│ └── batch-runner.sh # Orchestrator script
├── dashboard/ # Go TUI pipeline viewer
├── data/ # Your tracking data (gitignored)
├── reports/ # Evaluation reports (gitignored)
├── output/ # Generated PDFs (gitignored)
├── fonts/ # Space Grotesk + DM Sans
├── docs/ # Setup, customization, budget guide, architecture
└── examples/ # Sample CV, report, proof points
```
## 外部数据目录(可选)
默认情况下,用户层数据(如 `cv.md`、`portals.yml`,以及 `data/`、`reports/`、`output/` 文件夹)位于项目根目录内。
为了把个人数据和代码分开(更方便切换分支、拉取更新或测试多个个人资料),你可以按以下优先级配置一个外部数据目录:
1. **环境变量:** 设置 `CAREER_OPS_ROOT` 或 `CAREER_OPS_DATA_DIR` 环境变量:
```bash
export CAREER_OPS_ROOT=~/my-career-data
```
2. **标记文件:** 在仓库根目录创建一个 `.career-ops-data` 文件,内容是你的数据目录路径。
3. **默认:** 使用仓库根目录。
解析完成后,所有用户文件都相对于该文件夹解析和写入,而提示词文件和脚本仍然相对于仓库解析。
- **覆盖追踪文件:** 你也可以设置 `CAREER_OPS_TRACKER` 直接覆盖申请追踪文件的路径。
- **写入:** 所有写入操作(如合并)都以 `{DATA_ROOT}/data/applications.md` 为规范目标。
- **扫描器配置:** `portals.yml` 在 `{DATA_ROOT}/portals.yml` 读取和校验,所以 `node validate-portals.mjs` 检查的正是 `scan.mjs` 读取的那个文件。
- **生成的文档:** 定制简历和求职信写入 `{DATA_ROOT}/output/`,把它们关联到报告的 PDF 清单位于 `{DATA_ROOT}/data/pdf-index.tsv`。在未设置 `CAREER_OPS_TRACKER` 时,限定这些写入范围的追踪工作区是数据根目录,而不是代码检出目录。
- **追踪文件覆盖下的 PDF:** `generate-pdf.mjs` 会先解析 `CAREER_OPS_TRACKER`,再推导工作区,所以设置了覆盖时,工作区就是存放该追踪文件的文件夹(如果追踪文件位于 `data/` 文件夹中,则是它的上一级文件夹)。这时简历的 HTML 和每个 PDF 都必须位于该工作区内,清单也会移到它的 `data/pdf-index.tsv`。求职信仍以 `{DATA_ROOT}/output/` 为目标,所以当该文件夹不在追踪文件的工作区内时,求职信会被拒绝写入。
- **代码层保持不动:** `node_modules/`、`providers/`、`modes/` 以及脚本本身始终相对于仓库解析,从不相对于数据根目录。
Go 版仪表板 TUI、Node.js 脚本和 AI 代理模式都会自动遵循这一解析层级。
## 技术栈





- **代理**:带共享 skill 和模式的 AI 编码 CLI(`AGENTS.md` + 各 CLI 的包装)
- **PDF**:Playwright + HTML 模板
- **求职信**:HTML 模板 + Playwright(A4 PDF,与简历相同的流水线)
- **扫描器**:Playwright + Greenhouse API + WebSearch
- **仪表板**:Go + Bubble Tea + Lipgloss(Catppuccin Mocha 主题)
- **数据**:Markdown 表格 + YAML 配置 + TSV 批处理文件
<p align="center">
<a href="https://github.com/career-ops-hq/career-ops/releases/latest"><img src="docs/npm-badge.svg" alt="Latest release"></a>
</p>
<p align="center">
<a href="https://claude.com/claude-code"><img src="https://img.shields.io/badge/Built_with-Claude_Code-000?style=for-the-badge&logo=anthropic&logoColor=white" alt="Built with Claude Code"></a>
</p>
<p align="center">
<sub>也可以在任何遵循 agent skill 标准的 CLI 中运行。见<a href="docs/SUPPORTED_CLIS.md">支持的 CLI</a>。</sub><br>
<img src="https://img.shields.io/badge/Claude_Code-000?style=flat&logo=anthropic&logoColor=white" alt="Claude Code">
<img src="https://img.shields.io/badge/OpenCode-111827?style=flat&logo=terminal&logoColor=white" alt="OpenCode">
<img src="https://img.shields.io/badge/Antigravity_CLI-4285F4?style=flat&logo=google&logoColor=white" alt="Antigravity CLI">
<img src="https://img.shields.io/badge/Codex-412991?style=flat&logo=openai&logoColor=white" alt="Codex">
<img src="https://img.shields.io/badge/Qwen-615CED?style=flat" alt="Qwen">
<img src="https://img.shields.io/badge/Kimi-FF4B4B?style=flat" alt="Kimi">
<img src="https://img.shields.io/badge/GitHub_Copilot-000?style=flat&logo=githubcopilot&logoColor=white" alt="GitHub Copilot">
<img src="https://img.shields.io/badge/Grok_Build_CLI-000?style=flat&logo=x&logoColor=white" alt="Grok Build CLI">
<img src="https://img.shields.io/badge/Pi-4B3F72?style=flat" alt="Pi">
<br>
<img src="https://img.shields.io/badge/Node.js-339933?style=flat&logo=node.js&logoColor=white" alt="Node.js">
<img src="https://img.shields.io/badge/Go-00ADD8?style=flat&logo=go&logoColor=white" alt="Go">
<img src="https://img.shields.io/badge/Playwright-2EAD33?style=flat&logo=playwright&logoColor=white" alt="Playwright">
<img src="https://img.shields.io/badge/Bubble_Tea-FF75B5?style=flat&logo=go&logoColor=white" alt="Bubble Tea">
<img src="https://img.shields.io/badge/License-MIT-blue.svg" alt="MIT">
<a href="TRADEMARK.md"><img src="https://img.shields.io/badge/Trademark-Policy-blue.svg" alt="Trademark Policy"></a>
</p>
## 也已开源
- **[cv-santiago](https://github.com/santifer/cv-santiago)**:作品集网站(santifer.io),带 AI 聊天机器人、LLMOps 仪表板和案例研究。如果你需要一个配合求职展示的作品集,fork 它,改成你自己的。
## 常见问题(FAQ)
**career-ops 是什么?**
career-ops([career-ops.org](https://career-ops.org),也称 **careerops**) 是一个开源的 AI 求职工具,在你的 AI 编码 CLI(Claude Code、Codex、OpenCode 等)里本地运行,把每一个决定都留给你。它根据你的简历评估职位,生成适配 ATS 的 PDF,找到合适的联系人,并在一个地方追踪所有进展:最终决定始终在你手中。它是 [CareerOps 宣言](https://career-ops.org/manifesto)的首个参考实现。
**定制简历会编造内容吗?**
不应该,提示词里也这么写:只改写,绝不编造。`generate-pdf` 会拦下数字或事实在你的资料来源中找不到的简历,除非你传入 `--skip-fact-check`。`pdf` 模式还会运行 `cv-title-check.mjs`:它按公司和日期,把定制简历中的每个职位名称与 cv.md 中同一份工作的职位名称对比,有不同就请你决定保留还是改回。它只提醒、不拦截,因为调整职位名称的写法有时是你自己的选择。目前还没有任何检查评判改写:[#1411](https://github.com/career-ops-hq/career-ops/issues/1411)(不通过即阻止的真实性检查)在跟进这一点。在此之前,每份简历发出前都请自己读一遍。[法律声明](LEGAL_DISCLAIMER.md) 用更长的篇幅说了同样的话。
**我可以免费运行 career-ops,或使用更便宜的本地模型吗?**
可以。career-ops 不受特定 CLI 限制,可以用免费和本地模型运行(OpenRouter 免费模型、Ollama 或任何兼容 OpenAI 的端点),因此你不必绑定付费订阅。完整设置见 [docs/RUNNING_ON_A_BUDGET.md](docs/RUNNING_ON_A_BUDGET.md)。
**我付了 Claude Pro/Max,但 career-ops 在消耗 API 额度。为什么?**
因为环境里的 `ANTHROPIC_API_KEY` 优先于你已登录的订阅:CLI 会使用这个密钥并按 token 计费。运行 `echo $ANTHROPIC_API_KEY`,如果有输出,就把它从 shell 配置里删掉,重启终端并运行 `/login`。批量模式是例外,因为 `claude -p` worker 不使用交互式登录:运行一次 `claude setup-token`,把结果导出为 `CLAUDE_CODE_OAUTH_TOKEN`。完整步骤见 [docs/RUNNING_ON_A_BUDGET.md](docs/RUNNING_ON_A_BUDGET.md#2b-already-paying-for-a-subscription-make-sure-you-are-using-it)。
**career-ops 支持哪些 AI CLI?**
career-ops 通过开放的 Agent Skill Standard 运行在任何主流 AI 编码 CLI 上(Claude Code、Codex、Gemini / Antigravity、OpenCode、Grok、Qwen 等),所以永远不会被单一厂商锁定。用你已经有的 CLI 就行。
**如何在 Windows 上安装 career-ops?**
career-ops 可以在 Windows 上运行。平台相关的设置和已知的坑(Git Bash 检测、行尾符、任务计划程序)在 [docs/WINDOWS.md](docs/WINDOWS.md)。如果安装时因符号链接错误导致 skills 无法加载,解决方法在 [docs/FAQ.md](docs/FAQ.md)。完整步骤见 [docs/SETUP.md](docs/SETUP.md)。
**career-ops 会替我自动申请职位吗?**
不会。career-ops 是一个过滤器,不是海投的自动申请器。AI 负责评估、排序和起草;你负责审阅与决定。它起草、填写,但从不提交。由你点击提交。这种保留人工决策的设计正是重点所在。
**career-ops 是免费开源软件吗?**
是。career-ops 是免费开源软件,而且对求职者会一直如此。它是 [CareerOps 宣言](https://career-ops.org/manifesto)的首个参考实现。读一读,如果它说出了你的想法,就签名。
## 关于作者
我是 [Santiago Fernández de Valderrama Aparicio](https://santifer.io/about)(santifer),曾经是创业者:我创办并卖掉了一家至今仍以我的名字运营的公司。我打造 career-ops 是为了管理自己的求职,它奏效了:它帮我拿到了一个 Head of Applied AI 的职位。六个月后,我离开了那个职位,全职投入 career-ops 的开发。
想知道这么大的仓库,是怎样由一支 AI 代理团队维护、每次合并都由人来决定的?读一读 [Agentic maintenance: how career-ops is run by a fleet of AI agents](https://santifer.io/ai-agent-fleet)。
我的作品集和其他开源项目 → [santifer.io](https://santifer.io)
Wikidata:[Santiago Fernández de Valderrama Aparicio](https://www.wikidata.org/wiki/Q138710224) · [career-ops](https://www.wikidata.org/wiki/Q139007988)。
## 免责声明
**career-ops 是一个本地运行的开源工具,不是托管服务。** 使用本软件即表示你确认:
1. **你掌控自己的数据。** 你的简历、联系方式和个人数据留在你的机器上,直接发送给你选择的 AI 提供商(Anthropic、OpenAI 等)。我们不收集、不存储、也无法访问你的任何数据。
2. **你掌控 AI。** 默认提示词指示 AI 不要自动提交申请,但 AI 模型可能出现不可预测的行为。如果你修改了提示词或使用其他模型,风险自负。**提交前务必检查 AI 生成内容的准确性。**
3. **你遵守第三方条款。** 你必须按照所交互招聘平台(Greenhouse、Lever、Workday、LinkedIn 等)的服务条款使用本工具。不要用本工具向雇主发送垃圾信息或冲击 ATS 系统。
4. **不作任何保证。** 评估是建议,不是事实。AI 模型可能虚构技能或经历。作者不对就业结果、被拒的申请、账号限制或任何其他后果负责。
完整内容见 [LEGAL_DISCLAIMER.md](LEGAL_DISCLAIMER.md)。本软件依据 [MIT 许可证](LICENSE)"按原样"提供,不附带任何形式的保证。
## 贡献者
<a href="https://github.com/career-ops-hq/career-ops/graphs/contributors">
<img src="https://contrib.rocks/image?repo=career-ops-hq/career-ops&v=2" />
</a>
每一位贡献过代码、文档、翻译或测试的人都列在
[CONTRIBUTORS.md](CONTRIBUTORS.md) 里,包括上面的图表无法展示的
非代码贡献。
用 career-ops 找到工作了?[分享你的故事!](https://github.com/career-ops-hq/career-ops/issues/new?template=i-got-hired.yml)
## 许可证与商标
代码以 [MIT](LICENSE) 许可证发布。"career-ops" 的名称和
品牌受[商标政策](TRADEMARK.md)约束:对社区使用宽松,
对商业产品命名和背书保留权利。
## Star 历史
<p align="center">
<a href="https://warpchart.dev/hq">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://warpchart.dev/api/chart?theme=dark&v=3">
<img alt="Live star telemetry of career-ops-hq/career-ops" src="https://warpchart.dev/api/chart?theme=light&v=3" loading="lazy">
</picture>
</a>
</p>
<p align="center"><sub>由 <a href="https://santifer.io">Santiago Fernández de Valderrama Aparicio</a>(<a href="https://github.com/santifer">@santifer</a>)创建并维护</sub></p>
## 联系我们
[](https://santifer.io)
[](https://linkedin.com/in/santifer)
[](https://x.com/santifer)
[](https://discord.gg/8pRpHETxa4)
[](mailto:hi@santifer.io)