開源的 AI 求職代理人。
English |
Español |
Deutsch |
Français |
Português (Brasil) |
한국어 |
日本語 |
简体中文 |
繁體中文 |
Українська |
Русский |
Polski |
Dansk |
தமிழ் |
العربية |
हिन्दी |
Türkçe |
Tiếng Việt |
Bahasa Indonesia
網站目前只有簡體中文版:career-ops.org/zh
由 @santifer 建立, 700+ 位貢獻者 參與
幾個月投出去的履歷,全都石沉大海。
所以我做了自己需要的那個過濾器。
740 個職缺已評估。68 個已投遞。12 場面試。1 份 offer。
我是它的第一個使用者。我拿到了那份工作。然後把它開源了。
貼上一個職缺,它在你的機器上告訴你:還有沒有在徵人,適不適合你。
它為你客製履歷、草擬回答。由你按下送出。
我自己的求職,進行到一半,介面是西班牙文。
企業用 AI 篩選候選人。
我把 AI 交給候選人,讓他們來挑選 企業。
六個月後,我離開了那份工作。
現在我們打造 career-ops,讓你也能上岸。
拿一個職缺試試 ↓ · 閱讀完整故事 →
不想用終端機? 加入網頁版的候補名單 →
在我之後來的人,寫下了他們是怎麼拿到 offer 的。
每張卡片都是一個可以打開的公開 issue。你也上岸了?留下你的卡片 →
⭐ 如果 career-ops 幫到了你,一顆星就能幫下一個人找到它。
## 輪到你了
把你今晚本來打算投的一個職缺貼進來。如果回傳的是不要投 ,你剛剛把這個晚上贏回來了。如果回傳的是一份計畫,你就知道下一步該做什麼。
```bash
npx @santifer/career-ops init
```
開源。本機執行。就在你已經在用的 AI CLI 裡。包含免費模型和本機模型。
## 你不必一個人找工作
按下送出之後的沉默,與你無關。看到同一件事的人夠多,於是把這套實踐寫了下來,只有六行:
> 投得更少,投得更好。訊號勝過數量。證據勝過關鍵字。由人來決定。本機優先。桌子兩邊都有尊嚴。
其中幾位,用他們自己的話。
每一個簽名都是一次可稽核的提交。讀完全部,或加上你的 →
招募不會自己修好。正在經歷它的人可以,而且他們已經在這個房間裡,交換筆記,互相修各自的設定。
[修復就是在這裡寫出來的](CONTRIBUTING.md)。是房間,不是俱樂部。**一起來建。**
## 贊助商
career-ops 對求職者永久免費。這些公司贊助了本專案:
SerpApi · 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.
> 贊助買到的是清楚標示的曝光,絕不是影響力:再多的錢也改變不了路線圖,也放不進產品裡任何東西。贊助商絕不會出現在評估、排名或推薦中。
## 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 評估並推薦,你決定並行動。系統從不送出申請:最終決定權永遠在你手上 |
| **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`) |
它還能做的所有事
| 功能 | 說明 |
| ------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------- |
| **自動流程** | 貼上一個 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) |
## 運作原理
## 快速開始
**最快的方式,一道指令:**
```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 會透過對話引導你完成設定(你的履歷、個人資料和目標職缺)。不需要手動編輯任何東西。**
想手動設定?(git clone)
```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 中呼叫它們:見下方「使用方式」。
```
### 全域安裝
```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` | 哪些申請該跟進了,並附草稿 |
所有命令,依求職階段分類
`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 預覽與相容性檢查 |
## 預設掃描平台
掃描器內建 **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
```
驗證是循序執行的,而且只針對新職缺(去重之後),所以成本是有上限的。
## 儀表板 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` 時,限定這些寫入範圍的追蹤工作區是資料根目錄,而不是程式碼的 checkout。
- **追蹤檔覆寫下的 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 批次檔案
也可以在任何遵循 agent skill 標準的 CLI 中執行。見支援的 CLI 。
## 同樣開源
- **[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)。如果安裝過程中技能因 symlink 錯誤而載入失敗,解法在 [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)「按原樣」提供,不附帶任何形式的保證。
## 貢獻者
每一位貢獻過程式碼、文件、翻譯或測試的人都列在
[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 歷史
由 Santiago Fernández de Valderrama Aparicio (@santifer )建立並維護
## 聯絡我
[](https://santifer.io)
[](https://linkedin.com/in/santifer)
[](https://x.com/santifer)
[](https://discord.gg/8pRpHETxa4)
[](mailto:hi@santifer.io)