开源 AI 求职自动化:career-ops 的 A-H 评估、1-5 评分体系与本地部署全解
career-ops(又称 careerops)是一个运行在你的 AI 编码 CLI 内部的开源求职自动化系统:它扫描职位门户、把招聘信息评估为结构化 A-H 报告并给出 1-5 综合评分、按 JD 定制 ATS 优化简历并跟踪每一次申请,而最终决策权始终在你手里。读完本文,你将掌握它的端到端工作流、评分与反幻觉机制、配置文件语义,以及从一行命令初始化到批量处理与门户扫描的完整上手路径。
项目定位:career-ops 是什么、不是什么
career-ops 的自我定位相当克制:它是一把过滤器,而不是"海投"(spray-and-pray)工具。README 明确写道,它帮助你在上百个职位里挑出值得投入时间的少数几个,并强烈建议不要投递任何评分低于 4.0/5 的机会——你的时间宝贵,招聘官的时间同样宝贵,投递前永远需要人工复核(见 README.md "What Is This" 一节)。
这种定位源自其作者自身的求职实践。README 记录称,作者正是用该系统完成了 740+ 个职位的评估、100+ 份定制简历的生成,并最终落地一份 Applied AI 方向负责人的工作(该用例属于 README 中作者的自我陈述,作为项目背景参考)。career-ops 被作者称为 CareerOps 实践的第一个参考实现,愿景文档见 MANIFESTO.md。
与"自动投递机器人"划清界限是理解本项目的关键:
- 系统具备 agent 能力:所选 AI 编码 CLI 用 Playwright 浏览招聘页、评估"你的简历 vs 职位描述"的匹配度(基于推理而非关键词匹配)、并为每个职位定制简历;
- 但它在架构上从不代替你提交任何东西。README 的 FAQ 回答"Does career-ops auto-apply to jobs for me?"时用了明确的 No:评估、排序、草稿都交给 AI,审查与决定属于你,"you always have the final call"这一人机协同(Human-in-the-Loop)设计是它存在的全部意义。这个"绝不自动提交/发送/点击"的保证甚至在 README 的 Feature 表格中被标注为"绝对保证,翻译任何语言都不得添加'自动地、自行地、未经允许地'这类对冲词"(见 README.md 中 Human-in-the-Loop 一行的 HITL 注释)。
运行形态:career-ops 不是 SaaS,而是一个本地仓库 + 一组 Markdown 模式(modes)+ Node/Go 脚本的组合。它遵循开放 Agent Skill 标准,可在任意主流 AI 编码 CLI 中运行——README 列出的支持面包括 Claude Code、Codex、OpenCode、Antigravity CLI、Gemini CLI、Grok Build CLI、Qwen、Kimi、GitHub Copilot 等(详见 docs/SUPPORTED_CLIS.md)。
端到端工作流:从"粘贴一个 URL"到报告、PDF 与跟踪
README 给出的运行逻辑非常直白:
You paste a job URL or description
│
▼
┌──────────────────┐
│ Archetype │ Classifies: LLMOps / Agentic / PM / SA / FDE / Transformation
│ Detection │
└────────┬─────────┘
│
┌────────▼─────────┐
│ A-H Evaluation │ Match, gaps, comp research, STAR stories, legitimacy
│ (reads cv.md) │
└────────┬─────────┘
│
┌────┼────┐
▼ ▼ ▼
Report PDF Tracker
.md .pdf entry
docs/ARCHITECTURE.md 把同一流程拆成了更细的运行级描述:
- 输入:粘贴 JD 文本或 URL;
- 抽取:Playwright / WebFetch 从 URL 抽取职位描述;
- 归类:把职位判定为 6 种 archetype 之一;
- 评估:逐块生成 A–H 报告内容;
- 评分:五个维度整合为一个 1–5 的全局分;
- 落盘:报告写入
reports/{###}-{company-slug}-{YYYY-MM-DD}.md(三位零填充序号); - PDF:由 generate-pdf.mjs 生成 ATS 优化简历;
- 跟踪:新增条目先写
batch/tracker-additions/下的 TSV,再由 merge-tracker.mjs 合并,状态更新走 set-status.mjs。
模式(modes):把工作流变成可路由的"技能"
模式目录 modes/README.md 称 modes 是 career-ops 的"大脑":每个模式文件定义一条工作流,agent 读取"模式 + 共享上下文 + 你的用户文件"后执行。核心模式包括:
| 文件 | 用途 |
|---|---|
| modes/oferta.md | 单职位完整评估(README 中 A–H 结构的主实现) |
| modes/auto-pipeline.md | 粘贴 JD/URL 即触发"评估 + PDF + 跟踪"全自动流水线 |
| modes/pipeline.md | 处理 URL 收件箱 data/pipeline.md |
| modes/scan.md | 门户扫描(职位发现) |
| modes/batch.md | headless worker 批量处理 |
| modes/pdf.md、modes/cover.md、modes/email.md | PDF / 求职信 / 正式申请邮件草稿 |
| modes/interview.md、modes/offer-prep.md | 面试与 offer 阶段陪伴 |
模式的个人化内容放在用户层文件 modes/_profile.md(archetype、叙述、议价脚本)与 modes/_custom.md(个人规则),二者被 gitignore 且不会被更新器覆盖,与系统层模式文件严格分离。
A-H 评估模型与 1-5 综合评分
README 对本项目最核心的产出物——结构化评估报告——做了精确定义。报告按 A–H 块组织,用一个 1–5 的全局分表达综合判断,且这个分数由五个维度的整体性判断(holistic judgement)得出,而非某个算术公式(见 README.md 与 modes/_shared.md "Scoring System" 节)。
五个评分维度与报告块的对应关系在 modes/_shared.md 中有明确说明:
| 维度 | 衡量内容 |
|---|---|
| Match con CV(与 CV 的匹配) | 技能、经验、proof point 对齐度 |
| North Star alignment(北极星对齐) | 职位与你在 _profile.md 中目标 archetype 的契合度 |
| Comp(薪酬) | 薪水 vs 市场(5=市场前 25%,1=远低于市场) |
| Cultural signals(文化信号) | 公司文化、成长性、稳定性、远程政策 |
| Red flags(红旗) | 阻断项、警示(负向调整) |
| Global | 整合上述五维的全局判断(无算术公式) |
评分解读(在 modes/_shared.md 中为机器可执行规则):
- 4.5+ → 强烈匹配,建议立即申请;
- 4.0–4.4 → 良好匹配,值得申请;
- 3.5–3.9 → 尚可但不理想,仅在具体理由下申请;
- 3.5 以下 → 建议不要申请(对应 AGENTS.md 的伦理使用规则)。
两个"评分中立"信号:Block B 重要性与 Block G 合法性
README 强调了一个容易被误读的设计:Block B 中每条要求的"重要性"列、以及 Block G 的"发帖合法性"评估,都是独立、不影响分数(score-neutral)的信号。Block B 的重要性列只是"优先级排序 + 面试准备"的表层;Block G 只是"该职位是否真实活跃"的定性判断。这样设计是为了让 CV-match 维度始终保持整体判断——由此,跨越全部历史(会被 analyze-patterns.mjs、stats.mjs、funnel-velocity.mjs、rank-pipeline.mjs 等工具折叠分析)的 4.0 申请线语义始终一致,报告前后可比(见 modes/_shared.md "Posting Legitimacy" 一节)。
Block G 用三层置信度给出结论:High Confidence(真实活跃,绝大多数信号正面)、Proceed with Caution(信号混杂)、Suspicious(多重 ghost 迹象,建议先调查)。其信号按可靠性加权,例如:发帖年龄(<30 天好、30–60 天混杂、60 天+可疑)、申请按钮是否仍可点击、JD 技术具体度、要求现实度、近期裁员新闻、重发模式(90 天内同一职位重发 2 次以上可疑)、薪酬透明度等。模式文件强制一条伦理红线:绝不把评估呈现为对雇主的"不诚实指控",只呈现信号并说明合理解释、由用户自行决策。
README 还提到 Work-Auth 信号:当 JD 明确写"不提供 sponsorship"而你的配置需要它时,会被标记为硬阻断项;对应配置见下文 location 一节。
Block H:只在 4.5+ 才草拟的"申请答案"
README 开篇即注明"block H is drafted only at 4.5 and above"。在 modes/apply.md 中 Block H 对应 ## Application Answers——即评估阶段为高分职位预草拟的申请表问答内容。该模式同时记录了 application-answers 工具的解析约定:报告没有 Block H 时返回 null,且"Block H 是评估草拟的版本,不代表候选人真正提交的内容",填写表单时优先采用实际提交的记录(见 modes/apply.md 中对 freeText 解析的说明)。
六个职位 Archetype
评估前的第一步是 archetype 检测,modes/_shared.md 给了每个类型的 JD 关键词指纹:
| Archetype | JD 信号关键词 |
|---|---|
| AI Platform / LLMOps | observability、evals、pipelines、monitoring、reliability |
| Agentic / Automation | agent、HITL、orchestration、workflow、multi-agent |
| Technical AI PM | PRD、roadmap、discovery、stakeholder、product manager |
| AI Solutions Architect | architecture、enterprise、integration、design、systems |
| AI Forward Deployed | client-facing、deploy、prototype、fast delivery、field |
| AI Transformation | change management、adoption、enablement、transformation |
检测出 archetype 后,系统会读取 _profile.md 中针对该 archetype 的定制叙述与 proof point。
面试故事银行与协议
README 的 Feature 表中还有 Interview Story Bank:跨多次评估累积 STAR+Reflection 故事,沉淀出 5–10 条能应对任何行为面试题的主线故事;以及 Negotiation Scripts(薪酬谈判框架、地域折扣反驳、竞品 offer 杠杆)。这些子模块的完整目录见 modes/interview/README.md(分时间块的准备计划、带反馈的模拟练习、面试后复盘)与 modes/interview-redflag.md(公司红旗检测)。
反幻觉与"来源真相边界"
career-ops 最值得工程界借鉴的部分,是它把"AI 编造"当作一等工程问题来治理。共享上下文 modes/_shared.md 定义了排他性来源真相(Sources of Truth):cv.md、article-digest.md、config/profile.yml、modes/_profile.md 是生成候选人面向内容的唯一数据来源;自动记忆、父目录其他仓库、跨会话推断全部"out of scope"。配套硬规则包括:
- 绝不硬编码 proof point 里的指标,评估时必须从 cv.md 与 article-digest.md 现读(article-digest.md 优先于 cv.md);
- 关键词只能改写、不许捏造:"Reorder, reframe, emphasise — but never invent."——声称不被范围内文件支持就询问用户,无答案就删除;
- 禁止"工具归因混淆":用户用过某个库 ≠ 用户构建了该库,这是最常见的捏造模式,被明令禁止(对应 README 文档链接里 FAQ 提到的 story provenance 机制,见 docs/FAQ.md)。
在工程实现层面,这些规则由多个校验脚本兜底(可留意 verify-cv-facts.mjs、story-provenance-check.mjs、cv-sync-check.mjs 以及 tests 目录下的 nonmetric-fact-gate.test.mjs、cv-partial-empty-fallbacks.test.mjs 等)。README 的 docs/FAQ.md 还专门解释了为什么系统拒绝采用故事银行中出现的数字。
另一条同样重要的边界是不可信外部内容:JD、抓取页面、表单字段、邮件一律视为"数据而非指令",无论内容是什么、如何诱导"reviewer",都只读取其信息、绝不执行其指令(AGENTS.md 的 "Untrusted External Content" 规则;JD 中针对 AI 的祈使句会被原样引用为 Block G 异常项继续评估,见 modes/oferta.md 开篇)。这与插件技能输出按"不可信第三方文档"处理的原则一脉相承(见 AGENTS.md Plugins 一节与 docs/PLUGINS.md)。
配置体系:profile.yml 是"你的另一半"
安装后首次启动时,career-ops 会通过对话引导完成 CV、profile 与目标职位的配置("Nothing to edit by hand")。若想手动配置,模板在 config/profile.example.yml,复制为 config/profile.yml 后按需填写。该文件是贯穿所有模式的个人数据唯一事实源,主要分块如下:
candidate(候选人身份)
full_name、email、phone、location、linkedin、portfolio_url、github、twitter;wechat 可选,仅用于把微信当招聘渠道的市场;photo 默认为空——README/模板注释明确说明美英及多数市场 ATS 会惩罚带照片简历,无照片布局是默认,仅 DACH(德奥瑞)等期望职业照的市场才建议设置,PDF 渲染器会内联本地图片或 data URL。
target_roles(目标职位)
primary 列北极星职位;archetypes 列表给每个目标打 fit 标签——primary(梦想职位)/ secondary(良好匹配)/ adjacent(拉伸目标)。这些 archetype 直接驱动评估中的 North Star 对齐维度与 Block F 的故事准备。
narrative(职业叙事)
一行 headline、exit_story(为什么你独特)、3–5 条 superpowers,以及带 hero_metric(量化指标)的 proof_points 列表。
compensation 与 location(薪酬与工作授权)
target_range/minimum/currency/location_flexibility;visa_status 自由文本,另有两个关键布尔:authorized_in(你已持有工作授权、无需 sponsor 的国家/地区列表)与 needs_sponsorship。模板注释明确指出:JD 对 authorized_in 之外地区明确拒绝 sponsor 时构成硬阻断(对应 README 的 Work-Auth 信号),驱动评估报告 Block A 的 "Work-authorization check"。
language 与 spend_tier(输出语言与模型档位)
language.output 决定报告、跟踪、PDF、求职信等的面向人类输出语言(ISO 代码,zh-CN 还会启用中文 PDF 排版规则);language.modes_dir 则选择市场词汇/规则(例如用德语市场术语但保持英文行文)。spend_tier 三档取值见 modes/_shared.md 的 "Spend Tier" 节:economy(最便宜最快、无扩展思考,适合高量扫描)、standard(缺省默认、均衡模型)、premium(最强模型 + 自适应扩展思考,适合高价值职位)。三档只影响模型选择,绝不改变 A-H 报告结构与分节(输出一致性有硬性保证)。
cv 与样式
cv.output_format:html(默认,走 Playwright PDF)/ latex / text(定制化 Markdown,不产 PDF);cv.template 用 kebab-case 选择 templates/cv-template.modern.html 这类命名模板(中文技术简历可用 template: zh-minimal);cv.sections 可重排 HTML 输出的小节顺序(如 [skills, education, certifications, awards]),且仅在 profile 中生效、不会因模板被 update-system.mjs 还原而丢失——但 cv.md 仍是真相源,顺序守卫仍会比较渲染结果并保持一致。可选 style 块注入五个 CSS 自定义属性(accent_color/secondary_color/font_family/font_size/margin)做视觉主题覆盖(对应 tests 下的 theme-style.test.mjs)。
流水线调优(几个常被低估的开关)
auto_pdf_score_threshold:评估时只有当分数 ≥ 该阈值才自动生成定制 PDF(PDF 每份约 30–60 秒,而扫描出的多数 2.x/3.x 职位永远不会变成真正申请,阈值避免了无效渲染)。默认 3.0,/career-ops pdf {slug}可随时按需补生成;设为 0 则每份都生成;pipeline.triage_threshold/triage_min_urls:批量流水线先跑一遍轻量预筛(modes/triage.md),低于阈值直接过滤,混合批次可省约一半 token;批次过小(默认 <5 条)则跳过预筛直接全量评估;re_apply_windows:对近期申请过的公司定义冷却窗口,扫描器在窗口期内跳过其新发帖;culture_screen.require+deprioritize_if_absent:给"文化信号"维度做结构封顶——列出的要求若无 JD 证据支持且该开关为 true,则该维度最多 2/5,避免"技术分高"掩盖文化不匹配。
完整字段注释请直接阅读 config/profile.example.yml,它是自解释最充分的配置模板。其他用户层文件还包括根目录的 cv.md(Markdown 简历,真相源)与可选的 article-digest.md(文章/项目指标清单)、portals.yml(扫描器公司清单,模板在 templates/portals.example.yml)、data/blacklist.md(不投递公司黑名单,命中即停在 Block A 之前,永不自动添加)。
安装与三种接入方式
README 的 Quick Start 提供两条互补路径:
① 一条命令初始化(推荐首次使用)
npx @santifer/career-ops init
npx 随 Node.js 自带,只运行一次安装器而不做全局安装;该命令会把最新 release 克隆进 ./career-ops 并安装依赖。然后进入目录、打开你的 AI CLI(仓库根 package.json 声明 "node": ">=18"):
cd career-ops
claude # 或 codex / qwen / opencode / agy / grok
首次启动后系统通过纯对话引导完成 CV、profile 与目标角色配置。README 特意提示:头几次评估不会太好——系统还不认识你,需要持续喂给它 CV、职业故事、proof point、偏好与回避项,就像 onboarding 一位新招聘官一样,越养越好。
② 全局安装(已有项目目录后的日常用法)
npm i -g @santifer/career-ops
这会安装全局 career-ops 二进制,让你在任何终端直接调用,而非像 npx init 那样引导一个项目目录。取舍建议:首次用 ①,拥有项目目录后想直接跑命令时用 ②。
③ 手动部署(git clone):克隆仓库 → npm install → 需要 PDF 时执行 npx playwright install chromium → npm run doctor 校验全部前置条件 → 复制 config/profile.example.yml 为 config/profile.yml、按 templates/portals.example.yml 定制公司清单 → 在根目录建立 cv.md → 在目录中打开 AI CLI,直接对 CLI 用自然语言提出定制需求(如"把 archetype 改成后端工程方向""把这 5 家公司加进 portals.yml")。
共享命令路由器
在支持斜杠命令的 CLI 中,全部功能通过统一入口暴露(README "Usage" 节完整清单):
/career-ops → 显示全部可用命令
/career-ops {粘贴 JD} → 全自动流水线(评估 + PDF + 跟踪)
/career-ops scan → 扫描门户寻找新职位
/career-ops pdf → 生成 ATS 优化简历
/career-ops cover → 求职信生成器
/career-ops email → 正式申请邮件草稿(仅草稿,绝不发送)
/career-ops batch → 批量评估多个职位
/career-ops tracker → 查看申请状态
/career-ops apply → AI 填写申请表
/career-ops outcome → 记录申请结果并归档产物
/career-ops pipeline → 处理待处理 URL
/career-ops contacto → 找到招聘经理/招聘官/同事,起草 ≤300 字符的 LinkedIn 消息
/career-ops deep → 生成 6 轴公司研究提示词
/career-ops training → 评估课程/证书
/career-ops project → 评估作品集项目
也可以直接把职位 URL 或描述粘贴进去——系统自动识别并运行完整流水线。技能本体以开放标准定义在 .agents/skills/career-ops/SKILL.md,并为各 CLI 做符号链接/引用(.claude/、.cursor/、.qwen/、.antigravitycli/、.grok/ 等,见 AGENTS.md)。
各 CLI 的差异化接入
- Antigravity CLI / Grok Build CLI:原生支持,与 Claude Code/OpenCode 相同——进入目录后打开
agy/grok,使用统一/career-ops子命令。Grok 的无头批量 worker 用grok -p "prompt"(加--yolo自动批准工具执行)。Antigravity 一节还提到GEMINI.md目前只是 no-op 兼容守卫,避免 Antigravity 同时读AGENTS.md与GEMINI.md造成上下文重复; - Codex:走同一共享路由器但调用模型不同——斜杠命令不保证可用。交互式用
codex后以自然语言请求("Run the career-ops scan mode and summarize new matches.");一次性任务用codex exec "..."。完整指南见 docs/CODEX.md; - Gemini 独立 API 脚本:不想装 CLI 时,
cp .env.example .env配置GEMINI_API_KEY后直接node gemini-eval.mjs "JD..."或node gemini-eval.mjs --file ./jds/my-job.txt(对应 npm scriptnpm run gemini:eval -- "JD text here"),并可用node agent-inbox.mjs add "..."为下个会话排队请求。
预算敏感与免费运行
README 明确指出系统 CLI 无关,可跑在免费或本地模型上——OpenRouter 免费模型、Ollama、任意 OpenAI 兼容端点均可(对应 ollama-eval.mjs、openai-eval.mjs、openrouter-runner.mjs)。完整低预算配置见 docs/RUNNING_ON_A_BUDGET.md,Antigravity 免费层零成本运行的说明见 docs/FREE_TIER.md。
FAQ 中还有一个很实际的坑:订阅 Claude Pro/Max 却烧 API 点数——原因是环境变量 ANTHROPIC_API_KEY 优先级高于登录态订阅,CLI 会走按 token 计费的 key。排查命令是 echo $ANTHROPIC_API_KEY,有输出就从 shell 配置里删掉并重启终端、重新 /login;批量模式是例外,因为 claude -p worker 不用交互登录,需要 claude setup-token 并把结果导出为 CLAUDE_CODE_OAUTH_TOKEN。
门户扫描器:100+ 公司与自定义查询
扫描器开箱预配置了 100+ 家公司与跨主流职位板的 45+ 条搜索查询(AI Labs、Voice AI、AI Platforms、Contact Center、Enterprise、LLMOps、Automation、European 等类目下的 Anthropic、OpenAI、ElevenLabs、Retool、n8n 等;模板 templates/portals.example.yml)。复制为 portals.yml 后可自行增删。职位发现覆盖 Ashby、Greenhouse、Lever、Wellfound 等 ATS 与聚合板。
提供方架构:职位发现并非单一爬虫,而是一组可插拔的 provider 模块,仓库 providers/ 目录下共 95 个 .mjs 文件(含共享工具与 55+ 具体提供方模块),覆盖 ATS API、整板 feed、XML/RSS、Markdown feed 与本地解析器;完整对照表在 docs/SUPPORTED_JOB_BOARDS.md。新增提供方的规范见 providers/ADDING_A_PROVIDER.md,每个 provider 都有对应测试(tests/providers/ 下 101 个测试文件,如 scan-ats-full-dedup-key.test.mjs、board-title-entities.test.mjs)。
过期帖子的处理:默认 node scan.mjs(即 npm run scan)信任 ATS feed 返回的内容,而有些公司即使职位关闭也把陈旧帖子留在公开 API 里,这些"幽灵条目"可能泄漏进 pipeline.md。README 给出的对策是加 --verify,让 Playwright 在 API 扫描之后做存活校验:
node scan.mjs --verify # zero-token discovery + Playwright liveness check
该校验是顺序执行的,且只针对去重后的新职位运行,成本保持有界。抓取预算与并发纪律由 modes/_shared.md 的"Subagent delegation"规则约束:公司/职位/薪酬研究永远内联进行,禁止把研究交给会递归嵌套、可烧掉千万级 token 的开放研究技能;oferta 的 liveness gate 也要求在评估任何 URL 前确认职位仍存活,死链绝不进入 Block A。
此外扫描类目下还有 node scan-hn.mjs(Hacker News 扫描)、npm run scan:full/scan:seeds(scan-ats-full.mjs,种子目录如 YC/a16z,见 seeds/vc-portfolios.mjs)、npm run scan:interamt 等细分入口(package.json scripts)。
跟踪器与流水线完整性
所有评估过的职位都必须进入跟踪器(modes/_shared.md 的 ALWAYS 规则第 5 条:"Ignore the tracker"被列入 NEVER 清单)。跟踪器的规范写入路径是 {DATA_ROOT}/data/applications.md。为保护这个"唯一事实源",docs/ARCHITECTURE.md 列出了一整套完整性工具:
| 脚本 | 职责 |
|---|---|
| merge-tracker.mjs | 把批量 TSV 增量合并进 applications.md |
| verify-pipeline.mjs | 健康检查:状态、重复、链接 |
| dedup-tracker.mjs | 按 公司+职位 去重 |
| normalize-statuses.mjs | 把状态别名映射为规范值(模板 templates/states.yml) |
| cv-sync-check.mjs | 校验配置一致性 |
关键约定是 tracker 新增必须以 TSV 追加、绝不直接改 applications.md:把带表头的一行数据写进 batch/tracker-additions/,表头让 merge-tracker.mjs 按列名解析字段,而不是去猜哪列是分数哪列是状态(规则出处见 AGENTS.md 的 TSV 约定与 modes/_shared.md ALWAYS 规则;测试见 merge-tracker.test.mjs)。周边工具还包括拒绝模式分析(npm run patterns)、重发/幽灵职位检测(detect-reposts.mjs)、回复节奏计算器(followup-cadence.mjs)、雇主回复分类(reply-watch.mjs)。
可视化层:Go TUI 仪表盘
package.json 提供两个仪表盘命令:
npm run serve:dashboard # 启动 TUI
npm run build:dashboard # 可选:构建独立二进制
仪表盘是位于 dashboard 的独立 Go 应用(按 docs/ARCHITECTURE.md 由 Go + Bubble Tea + Lipgloss 构建,Catppuccin Mocha 主题),提供 6 个过滤标签、4 种排序、分组/平铺视图、惰性加载的报告预览与内联状态切换(过滤器含 Top ≥4 等,见 dashboard/README.md)。另有实验性 Web UI(alpha、opt-in,不启动则不运行任何东西,见 web/README.md)。
数据层设计:系统文件与用户文件的严格分层
ARCHITECTURE 文档把仓库分成两个清晰层次:系统层(提示词、脚本、模板,随升级更新)与用户层(cv.md、portals.yml、data/、reports/、output/ 等,被 gitignore)。用户层数据默认放在仓库根目录;想把自己的数据与代码分离(便于切换分支、拉更新、多 profile 测试)时,README 给出三级解析优先级:
- 环境变量:
CAREER_OPS_ROOT或CAREER_OPS_DATA_DIR,如export CAREER_OPS_ROOT=~/my-career-data; - 标记文件:仓库根目录放
.career-ops-data,内容为数据目录路径; - 默认:仓库根目录。
路径一旦解析,所有用户文件都相对该目录读写,而提示词与脚本仍相对仓库解析;CAREER_OPS_TRACKER 可单独覆盖跟踪器文件路径;所有合并写入规范地指向 {DATA_ROOT}/data/applications.md。Go TUI、Node 脚本与 AI agent 模式都会自动遵守这套层级(规则全文在 modes/_shared.md "Data Root & Path Resolution" 一节,数据契约见 DATA_CONTRACT.md;相关测试如 tracker-cwd-independence.test.mjs、scan-data-paths-under-data-root.test.mjs 覆盖了跨目录行为)。
项目结构速览
README 给出的顶层结构如下(节选关键项,全部已在仓库确认):
career-ops/
├── AGENTS.md # 规范 Agent 指令(所有 CLI 通用)
├── CLAUDE.md / CODEX.md / OPENCODE.md # 各 CLI 包装器(import AGENTS.md)
├── cv.md # 你的简历(需自建)
├── config/profile.example.yml # profile 模板
├── modes/ # 技能模式(_shared.md、oferta.md、pdf.md、scan.md…)
├── templates/ # cv-template*.html、portals.example.yml、states.yml
├── batch/ # 批量 worker(batch-runner.sh、batch-prompt.md)
├── dashboard/ # Go TUI 流水线查看器
├── providers/ # 95+ 职位源模块
├── data/ · reports/ · output/ # 你的跟踪数据/报告/PDF(均 gitignored)
├── docs/ # 设置、定制、预算指南、架构说明
└── examples/ # 示例 CV、报告、proof point
配套文档地图与 FAQ 提炼
README 把后续阅读路径组织得很清晰:
- 完整安装:docs/SETUP.md;
- 预算/免费运行:docs/RUNNING_ON_A_BUDGET.md、docs/FREE_TIER.md;
- 定时扫描与零 token"初筛到短名单"配方:docs/AUTOMATION.md;
- ATS 自动填表细节:docs/APPLY_AUTOFILL.md;
- LinkedIn 通讯录导出 × 漏斗公司交叉比对:docs/LINKEDIN_JOIN.md;
- 设计原则在根 ARCHITECTURE.md,运行时流程在 docs/ARCHITECTURE.md;
- Windows 专属坑点(Git Bash 发现、行尾、任务计划程序):docs/WINDOWS.md;
- 常见问题:根 README.md 的 FAQ 节与 docs/FAQ.md;
- 插件(Gmail、Notion、Apify 及社区注册表,默认关闭、opt-in):docs/PLUGINS.md。
FAQ 里的几个关键澄清适合直接记住:career-ops 可在 Windows 运行;它"免费且开源,对候选人永远如此";它也支持极便宜的模型组合,用户不必被付费订阅绑定(Ollama/OpenRouter 免费模型/OpenAI 兼容端点都行,ollama:eval、openai:eval、or:* 等 npm script 可直接调用,见 package.json)。
伦理、免责与使用前提
career-ops 是一个本地开源工具,不是托管服务。README 的 Disclaimer 明确四点:① 你的数据(CV、联系方式)只留在本机,仅发送给你选定的 AI 提供商(Anthropic/OpenAI 等),项目方不收集、不存储、无法访问;② 默认提示词禁止 AI 自动提交,但 AI 可能不可预测——提交前务必复核所有 AI 生成内容;③ 使用者须遵守所交互门户(Greenhouse、Lever、Workday、LinkedIn 等)的服务条款,禁止用它骚扰雇主或压垮 ATS;④ 评估只是建议而非真相,作者不对求职结果、被拒、账号限制等承担任何责任。法律全文在 LEGAL_DISCLAIMER.md,代码以 MIT 许可发布(LICENSE),"career-ops"名称另受 TRADEMARK.md 品牌政策约束(社区使用宽松、商业产品命名与背书需保留)。
由此也回到本文开篇的核心判断:career-ops 最大的工程价值不在"自动投了多少份简历",而在于它演示了如何在一个完全由 LLM 驱动的流水线里,用结构化的评分语义、排他性数据来源、评分中性信号与永不代行的人类最终决定权,构建一个既高效又诚实可信的求职系统。想要深入其中任何一条机制的读者,直接沿本文给出的 modes/oferta.md、modes/_shared.md、config/profile.example.yml 与 docs/ARCHITECTURE.md 路径继续阅读源码即可。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0632
MiniCPM5-2BMiniCPM5-2B 是一款面向端侧、本地部署和资源受限场景的 2B 稠密 Transformer,能够达到同尺寸开源模型 SOTA 水平。Markdown00
video-shotcraftAI宣传片skill,使用 Remotion 制作电影级产品视频:提供106 张镜头配方卡和可复用的视频魔板。适用于 Claude Code 与 Codex以及所有其他智能体Markdown00
HivisionIDPhotos⚡️HivisionIDPhotos: a lightweight and efficient AI ID photos tools. 一个轻量级的AI证件照制作算法。Python09
DragonOSDragonOS is an operating system developed from scratch using Rust, with Linux compatibility. It is designed for **Serverless** scenarios. 使用Rust从0自研内核,具有Linux兼容性的操作系统,面向云计算Serverless场景而设计。Rust00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00
