更新日誌
GitHub每一項重大變更,逐版記錄。同一份檔案隨儲存庫發布,並已翻譯為全部 19 種語言。
[1.173.0] — 2026-08-13
新增 (LOW, 設定) — Hermes 加入被偵測的 AI CLI 清單 (career-ops 對齊)。
新增
#/config→ 「AI CLI 工具」分頁現在會偵測 Hermes(Nous Research),即父專案新支援的代理執行環境(二進位hermes)。server/lib/routes/cli-detect.mjs的固定白名單從 10 個擴充到 11 個工具;偵測仍為唯讀 PATH 掃描(絕不執行任何二進位)。
說明
- 無 i18n / 路由 / CSP / SSRF / 父寫入變更;此清單為固定白名單,絕非輸入。套件:2444(cli-detect 金絲雀更新 10 → 11)。
[1.172.0] — 2026-08-13
修復 (MEDIUM, 掃描器) — 格式錯誤的 HTML 實體可能使掃描來源崩潰 (career-ops #2150 對齊)。
修復
oraclecloud、gem與dassault來源在String.fromCodePoint之前僅以簡單的Number.isFinite檢查來解碼數字 HTML 實體 — 超過0x10FFFF的參照(例如格式錯誤或惡意來源中的�)會擲出未捕捉的RangeError,中止該來源的整個解析。共用模組server/lib/html-entities.mjs(鏡射父專案的_html-entities.mjs)現在將數字參照限制在 XML 1.0 §2.2 Char 集合內,使String.fromCodePoint永不擲出,並分別比對十六進位與十進位,因此a2;不再被錯誤解析。三個來源皆匯入它。
說明
- 對有效來源無行為變化;無 JS / i18n / 路由 / CSP / SSRF / 父寫入變更。合併其餘約 20 個來源內解碼器副本的工作記錄於
qa/PARENT-SYNC-WORKLIST-v1.26.0.md。 - 測試:
tests/html-entities.test.mjs(+7)。套件:2444(+7)。
[1.171.0] — 2026-08-13
變更 (LOW,設計系統) — 字級刻度 + z-index 層權杖(D-4,第一步)。 尺寸和堆疊此前按元件寫成字面量。
變更
- z-index 層 — 引入
--z-*權杖(--z-topbar…--z-skiplink),並遷移所有 z-index 字面量。值保持不變,堆疊一致;新的探針禁止新的魔法數字。 - 字級刻度 —
--font-size-*刻度(xs 11…2xl 28,base = Inter 15px);遷移元件已用的核心字級(無視覺變化)。刻度外的值逐步遷移(docs/UX-ROADMAP.md)。
說明
- 僅 CSS 權杖;無行為/JS/i18n/路由/CSP/SSRF/寫入變更。無像素變化。
tests/design-tokens-scale.test.mjs(+3)。套件:2437 (+3)。
[1.170.0] — 2026-08-13
新增 (LOW) — 長 AI 生成的誠實 ETA 提示(P4-ETA)。 繁重的生成(職涯規劃 ~40 秒、定位 / 市場 / 人脈 ~30 秒、two-pager ~20 秒)只顯示「生成中…」,沒有時長感知。
新增
- 每個長生成按鈕旁現在顯示柔和的
⏱ ~N秒提示(與#/auto的 ETA 一致)。共享.eta-hint樣式 + 兩個通用鍵(common.eta~{n}s、common.etaTitle)。
說明
- 僅用戶端;無路由/CSP/SSRF/寫入變更。i18n 鍵 +2 ×17(快照 1219 → 1221)。
tests/generation-eta-hint.test.mjs(+2)。套件:2434 (+2)。
[1.169.0] — 2026-08-13
新增 (LOW) — 內聯 PDF 預覽(D-5)。 GET /api/output/pdfs/:name 強制 Content-Disposition: attachment,因此連 #/cv 的「開啟」連結也是下載而非顯示。
新增
?inline=1以Content-Disposition: inline提供同一個經過驗證的檔案,讓瀏覽器在新分頁中算繪為 👁 預覽。預設(無參數)仍為下載。無新路由;相同的名稱防護。#/cvPDF 清單的第一個按鈕現為 👁 預覽(在下載旁邊)。cv.openPdf「開啟」→「預覽」×17。
說明
- 無 CSP/SSRF 變更 — 相同的
sanitizePathName。重寫 1 個現有 i18n 鍵 ×17(快照 1219)。tests/output-pdfs.test.mjs(+3)。套件:2432 (+3)。
[1.168.0] — 2026-08-13
修復 (LOW, a11y) — 核取方塊列現在符合 WCAG 2.5.8 的 24×24 最小目標尺寸(D-2)。 #/scan、#/config、#/evaluate、#/cv-studio 上的核取方塊/單選標籤處於 ~22 px 的帶中。
修復
- 限定規則
label:has(> input[type="checkbox"/"radio"]) { min-height: 24px }保證 ≥24 px 的帶。僅min-height— 標籤本就是 flex,無位移;.apply-checklist(32 px)已合規。
說明
- 僅 CSS;無行為/JS/i18n/路由/CSP/SSRF/寫入變更。
tests/checkbox-target-size.test.mjs(+1)。套件:2429 (+1)。
[1.167.0] — 2026-08-13
修復 (LOW,設計系統) — 抬升表面現在與分隔線區分開(D-3)。 --panel-2 / --surface-elev1 解析為 --slate,與分隔線 --line / --border 相同,沒有視覺區分。
修復
- 專用的主題感知權杖
--elev(淺色#eef1f6/ 深色#1e232e,在兩種主題下都與--slate不同)現在支撐抬升表面;分隔線保持--slate。其餘發現(D-2、D-4、D-5、P4-ETA)記入docs/UX-ROADMAP.md待辦。
說明
- 僅 CSS 權杖;無行為/JS/i18n/路由/CSP/SSRF/寫入變更。
tests/elevation-token.test.mjs(+2)。套件:2428 (+2)。
[1.166.0] — 2026-08-13
修復 (LOW) — 評分標準術語現在與規範文件一致。 career-ops.org/docs 描述為「五個維度加上整體綜合評分」,但 Web UI、cvstart.org 和 wiki 都說「六維度評分標準」(5 + 1 = 6,但用詞不一致)。
修復
- 採用文件措辭 — 「五個維度加上綜合評分」 — 一致套用於 README ×17、cvstart.org 網站 ×17、說明指南 ×17、
docs/career-ops-canonical.md和 wiki(Home ×17 + Features)。
說明
- 僅文件/行銷文案;無程式碼/i18n 鍵/路由/CSP/SSRF/寫入變更。
tests/rubric-terminology.test.mjs(+2)。套件:2426 (+2)。
[1.165.0] — 2026-08-13
修復 (LOW) — 「Two-pager」術語現在在每種語言內保持一致。 阿拉伯語側邊欄顯示拉丁文「Two-pager」,而 <h1> 已完全在地化 — 是在其他方面鏡像的 RTL 導航中唯一的拉丁文字串。
修復
- 已落實決策: 每種語言的
nav.twoPager與twoPager.title使用一致術語(要麼都用拉丁文,要麼都在地化)。只有阿拉伯語不一致;其導覽標籤現已在地化(「الصفحتان」)。新的探針測試會在任何語言再次分裂時失敗。
說明
- 僅文案;無路由/CSP/SSRF/寫入變更。更改 1 個 i18n 值(ar);無新增鍵(快照 1219)。
tests/two-pager-term-consistency.test.mjs(+2)。套件:2424 (+2)。
[1.164.0] — 2026-08-13
修復 (LOW) — 頂欄搜尋佔位符在任何語言下都不再溢出。 「Find a company, role or URL…」在搜尋欄收縮時被截斷,「…or URL」部分從未顯示。
修復
top.search(×17)現為簡短的 「搜尋或貼上 URL」(每種語言 ≤24 字元),即使在窄欄也能容納並保留 URL 提示。index.html回退一致;aria-label保留完整說明。
說明
- 僅文案;無路由/CSP/SSRF/寫入變更。重寫 1 個現有 i18n 鍵 ×17(無新增;快照 1219)。
tests/search-placeholder-fit.test.mjs(+2)。套件:2422 (+2)。
[1.163.0] — 2026-08-13
修復 (LOW) — 應用內「詢問文件」助手現在涵蓋將報告匯出為 PDF。 儘管 #/reports/:slug 有可用的 📄 Generate PDF 控制項,它此前卻回答指南未涵蓋此內容。
修復
- 在全部 17 個說明包的 §10 報告下新增 「將報告匯出為 PDF」 H3(按鈕位置、檔案寫入
output/*.pdf、需要 Playwright、傳送前檢查)。助手檢索現在會顯示報告章節。
說明
- 僅文件/說明;無程式碼/路由/CSP/SSRF/寫入變更。說明門檻 112 → 113 H3(31 H2 不變)。
tests/help-reports-pdf-section.test.mjs(+2)。套件:2420 (+2)。
[1.162.0] — 2026-08-13
修復 (MEDIUM) — 說明 “?” 現在是 ≥24×24 的指標目標 (WCAG 2.5.8)。 .help-hint 在每個標題上為 padding:0 的 18×18 px,低於最小值。
修復
.help-hint盒子現在為 24×24(可測量目標),而可見圓環仍為 18px — 由置中的::before繪製,字形和<h1>基線不變。hover/啟用/焦點狀態隨圓環移動;外邊距 6→3px 保持間距。
說明
- 僅 CSS;無 JS/i18n/路由/CSP/SSRF/寫入變更。
tests/help-hint-target-size.test.mjs(+2)。套件:2418 (+2)。
[1.161.0] — 2026-08-13
修復 (MEDIUM) — #/reports 顯示「未偵測到評分」標籤而非空白。 在 v1.159.0 的多語言解析器之後,仍無法解析評分的報告顯示空白區域,與失敗無法區分。
修復
- 評分儲存格現在分支:有評分 → 色調藥丸;無評分 →
.score-muted標籤(「未偵測到評分」,×17)+「開啟報告…」提示。卡片仍是可鍵盤操作的role="link",日期照常顯示。 - 複用現有中性權杖;無新顏色。
說明
- 僅用戶端;無路由/CSP/SSRF/寫入變更。i18n 鍵 +2 ×17(快照 1217 → 1219)。套件:2416 (+3)。
[1.160.0] — 2026-08-13
修復 (HIGH) — 供應方文案不再與 7 家供應方的承諾矛盾。 #/config 稱即時評估「使用你的 Anthropic 或 Gemini 金鑰」,OpenAI 金鑰「不被 Web UI 使用」;儀表板寫「Anthropic-first scoring」 — 自 7 供應方級聯(v1.157.0)起皆為錯誤。
修復
config.providerModelNote(×17):現聲明 ⚡ 即時評估以無頭方式在七個供應方金鑰(Anthropic · Gemini · OpenAI · Qwen · OpenRouter · GitHub Models · Hermes)中任意一個上執行,自動排序並回退。刪除關於 OpenAI 的錯誤句子。dash.quick.evaluateSub(×17):供應方中立(「0–5 匹配評分」)。Keys: N / 5→N / 7。
說明
- 僅文案;無路由/CSP/SSRF/寫入變更。無新增 i18n 鍵(快照 1217)。套件:2413 (+3)。
[1.159.0] — 2026-08-13
修復 (HIGH) — 報告中繼資料不再與語言耦合。 以非英語語言產生的報告在 #/reports 上顯示空白中繼資料列(無評分/日期/合法性),因為 parseReportHeader 只辨識英文粗體標籤。
修復
parseReportHeader現在解析語言無關的## Machine SummaryYAML 區塊(score:/legitimacy:/date:— 與auto-pipeline已讀取的來源相同)。優先順序:英文標籤 → Machine Summary → 在地化標籤(REPORT_LABELS,17 種語言)。英文報告逐位元組一致。- 數字解析容錯(
1.5/5、1,5/5、1.5 из 5、4.5 out of 5);內文無日期時回退到檔案 mtime。
說明
- 僅讀取/解析;無路由、CSP、SSRF 或父層寫入變更。無新增 i18n 鍵。套件:2410 (+8)。
[1.158.0] — 2026-08-12
修復 — 兩個顯示層面的小問題(分頁標題中洩漏的 «?» 以及著陸頁錯誤的供應商數量)。 僅顯示,無行為、安全或資料流變更。
修復
- HelpHint 的 «?» 不再洩漏到
document.title。路由器從未處理的h1.textContent衍生分頁標題,導致顯示為「Vacancy search?」而非「Vacancy search」。現在router.js::focusNewView複製標題、移除.help-hint後再讀取文字;頁面上可見的 «?» 保持不變。 - cvstart.org 顯示「17 AI providers」而非「7」。
Features.astro的sub()在按卡片替換前就把所有{n}改為語言數(17);現在{n}按卡片解析(供應商 → 7,語言 → 17)。
說明
- 無伺服器、路由、CSP、SSRF 或 i18n 鍵變更。套件:2402 項測試(+1)。
[1.157.0] — 2026-08-12
修復 —— 即時評估現在可用任一已設定的供應方執行,不再僅限 Anthropic/Gemini。 僅設定 OPENROUTER_API_KEY 的使用者被錯誤強制進入手動模式。
修復
- 根本原因: 無金鑰的
LLM_PROVIDER釘選(如init寫入的LLM_PROVIDER=claude)會走進死胡同;現在會在已設定的供應方之間按 auto 順序回退(在selectActiveProvider與兩條派發級聯中)。 - 用戶端門控(
#/deep與 mode-page 檢視)現改用window.ProviderStatus(/api/status/providers,全部 7 個),不再用過時的 Anthropic/Gemini 探測;重寫文案(deep/eval × 17)+ 儀表板「即時評估」徽章 +config.llmProviderHint。
說明
- 無安全變更。套件:2401 項測試(+5)。
[1.156.0] — 2026-08-12
重構 —— 將 scan.js 拆分到大小上限以下(P-16)+ 一個 CodeQL 修復。 scan.js 原有 906 行;提取了兩個保持行為的工廠 → 648 行。完成 P-15/P-16 檢視拆分。
變更
- 新增
scan/runner.js(掃描執行引擎)與scan/filters.js(過濾狀態機),透過ctx/refs包;scan.js連接兩者。
修復
- CodeQL
js/useless-assignment-to-local(#428)於config/tab-controller.js:let n = i;→let n;。
說明
- 純重構,行為不變;4 個讀取原始碼的測試已改指向。兩個大檢視現均低於 800(P-15/P-16 完成)。套件:2396 項測試。
[1.155.0] — 2026-08-12
重構 —— 將 config.js 拆分到大小上限以下(P-15)。 config.js 原有 1030 行(超過 800 行上限);提取了兩個保持行為的模組,降到 783 行。
變更
- 新增
config/field-specs.js(欄位資料 + 模型清單)與config/tab-controller.js(分頁列工廠);config.js引用它們,渲染邏輯不變。
說明
- 純重構,行為不變;6 個讀取原始碼的測試已改指向。
scan.js(906)維持原樣(已部分拆分;核心耦合過重,機械拆分反而更糟)。套件:2396 項測試。
[1.154.0] — 2026-08-12
新指南 —— 「在雲端執行整個技術棧」。 career-ops 自身沒有雲/伺服器說明,故新增一份:把父級 career-ops 流水線、此 career-ops-ui 檢視器與 AI 引擎(透過 Claude Code 的 Claude 訂閱、本機 Hermes,或 API 金鑰)放到一台常開小型伺服器上的分步指南。以 17 種語言的說明 §31、README 章節和 wiki 頁面提供。
新增
- 說明 §31 「在雲端執行整個技術棧」(× 17)—— 三個部分、開通 + 安裝、選擇引擎、安全暴露(HTTPS 反向代理 + 認證 + CSP/SSRF/XSS/無金鑰不變式)。說明包擴展到 31 H2 / 112 H3。
- README —— 「在雲端執行整個技術棧」章節(× 17)+ wiki 的 Cloud-Deployment 頁面。
說明
- 僅文件 —— 無路由、伺服器或用戶端改動;無新增 i18n 鍵。說明的 4 個測試改為 31 H2 / 112 H3 契約。套件:2396 項測試(不變)。
[1.153.0] — 2026-08-12
Jobvite 掃描器遷移到公開 XML 來源(父專案同步)。 父專案下線了 Jobvite JSON API(現在回傳零職缺);web-ui 的 source 用的正是這個失效端點,因此任何被追蹤的 Jobvite 公司都靜默掃描為空。移植父專案修復(#2623):現在讀取以 companyEId 為鍵的公開按租戶 XML 來源。
修復
- source 呼叫已下線的 JSON API 並回傳零職缺;現改為呼叫
https://app.jobvite.com/CompanyJobs/Xml.aspx?c={companyEId}並解析 XML<result><job>…(CDATA + 實體解碼,detail-url優先於apply-url)。
變更
companyEId解析:(1) 入口的company_eid:,(2) 明確api:的c=參數,(3) 看板頁探索。fetchText(http-json.mjs)在 non-ok 錯誤上附加.location/.retryAfter(唯讀,向後相容)。
說明
- 安全 — 兩個主機(
jobs.jobvite.com、app.jobvite.com)在每次請求前由assertJobviteUrl固定:僅 https、嚴格白名單、從不跟隨重新導向。companyEId僅為?c=值;source 數量不變。 - 套件:2396 項測試(+4)。
[1.152.0] — 2026-08-12
Hermes 供應方 — 接線完成 + 文件同步。 對 v1.151.0 Hermes 整合的程式碼審查發現兩處真實缺口與四項完整性事項,皆於此修正;並將全應用的 LLM 供應方清單在所有文件面與 17 種語言中補齊為完整的七個。
修復
#/config無法強制 Hermes —LLM_PROVIDER下拉僅列出六個供應方,因此可設定HERMES_API_KEY卻無法在 UI 中強制 Hermes。現在hermes是第 8 個選項,新增的一致性測試可防止下拉再次與LLM_PROVIDERS偏離。- 較短的自架金鑰被靜默拒絕 —
isUsableKey的 20 字元下限是按雲端金鑰校準的;hasHermesKey現改用放寬的 8 字元下限(Hermes 文件範例為 19 字元)。
變更
- 供應方清單在 README(× 17)、應用內說明(× 17)、
config.llmProviderHint字典(× 17)與docs/sdd中統一為完整七個;hermesChatUrl會補全無路徑的主機;手動回退文案點名 Hermes。
說明
- 安全性不變 — 無新路由、無 SSRF/CSP 變動;health/doctor 新增一列
HERMES_API_KEY。 - 套件:2392 項測試(+2)。
[1.151.0] — 2026-08-12
Hermes 現已成為已接上的 LLM 供應方(Phase 5) — Phase 5 的調查確認 Nous Research 的 Hermes 提供一個 相容 OpenAI 的 API Server(hermes gateway → POST /v1/chat/completions),因此 career-ops-ui 現在像 OpenAI/Qwen 一樣透過本機 Hermes 執行即時評估。在 應用設定 中設定 HERMES_API_KEY,它便加入 auto 順序(最後一個)。收尾路線圖最後一個未決項 —— Phase 5, Shape A。
新增
- Hermes LLM 供應方(Shape A) — 共享
runOpenAICompatible客戶端之上的runHermes(server/lib/openai.mjs),在 兩個 級聯(llm-dispatch.mjs+routes/llm.mjs)中設閘,auto 順序尾端 +LLM_PROVIDER=hermes固定項、/api/status/providers、llm-pricing.mjs。以 Bearer 認證存取可設定的本機 base URL(預設http://127.0.0.1:8642/v1)—— 這是 已設定 的供應方端點(如 OpenRouter/Qwen),而非使用者提供的職缺 URL,因此不經過 SSRF 防護。 #/config欄位 —HERMES_API_KEY(機密) +HERMES_BASE_URL+HERMES_MODEL(預設hermes-agent),6 個新 i18n 鍵 × 17 種語言(快照 1208 → 1214)。
變更
- 調查已解決:
docs/integrations/HERMES.md、應用內說明 §30(× 17)、README 預告(× 14)、hermes-bridge技能與路線圖,從「規劃中 / 尚未接上」轉為 已接上(Shape A)。無需 Shape B(客製的代理執行環境 relay)。
說明
- 安全: 供應方的 fetch 是一個已設定端點,與其它相容 OpenAI 的供應方同類 —— 無新增 SSRF 面,無 CSP/清洗器改動。
HERMES_API_KEY是SECRET_KEY(絕不回顯)。 - 測試(CI 隔離、樁傳輸):
tests/hermes-provider.test.mjs(+5);v1.146.0 的「無 Hermes 分支」哨兵被 反轉,改為斷言其已接上;供應方面測試更新為 7 供應方順序。 - 套件:2390 項測試(+5)。
[1.150.0] — 2026-08-12
一致的空狀態(Phase 4 打磨) — 每個「尚無內容」面板現在都透過唯一的共享 .empty 樣式繪製,而不再由個別視圖用魔法數字 40px 行內重複宣告外觀。一次小的視覺一致性修正;#/activity、#/cv-studio、#/stats、#/usage 的空狀態現在與其它所有面板一致(權杖化的 48px 內距 + 虛線邊框)。
變更
#/activity、#/cv-studio、#/stats、#/usage移除了空面板上的行內style: { padding: '40px', textAlign: 'center', color: 'var(--foggy)' }—— 這三個屬性共享的.empty類別已經提供(--space-7= 48px、置中、淡色、虛線邊框)。於是這四個與其它約 25 個.empty面板繪製完全一致。- 各視圖正當的覆寫(
#/dashboardwidth:100%、#/pipelineborder:none)未動 —— 僅移除純冗餘的重複宣告。
說明
- 僅用戶端 CSS 用法清理 —— 無路由、伺服器、i18n 鍵或 CSS 規則改動(
.empty類別本身不變);字典快照 1208。已在瀏覽器驗證(#/usage空面板計算為 48px 內距 + 虛線邊框,0 主控台錯誤)。 - 新哨兵測試
tests/empty-state-consistency.test.mjs讓.empty保持唯一真實來源。Phase 5(Hermes 供應方)仍被阻擋。 - 套件:2385 項測試(+2:
tests/empty-state-consistency.test.mjs)。
[1.149.0] — 2026-08-12
入口已移入設定(Phase 4) — #/portals 現位於 Setup 導覽分組中、應用設定 旁,而不再在 Sourcing 下。自 v1.144.0 起它就是一個設定介面(啟用/停用追蹤的公司 + ATS 健康探測),而非 sourcing 操作 —— 所以這才是它該在的位置。僅導覽調整;頁面與路由不變。
變更
#/portals導覽項 → Setup 分組(位於public/index.html),緊接 應用設定 之後。已從 Sourcing 分組移除(該分組保留 Scan / Pipeline / Auto-pipeline / 已融資公司)。#/portals路由、視圖與nav.portals標籤均不變 —— 僅側邊欄位置移動。
說明
- 僅導覽標記 —— 無路由、視圖、i18n 鍵或伺服器改動。已在瀏覽器驗證(0 主控台錯誤);由
tests/portals-nav-placement.test.mjs保護。 - 套件:2383 項測試(+2:
tests/portals-nav-placement.test.mjs)。
[1.148.0] — 2026-08-12
更清爽的掃描篩選(Phase 4)—— 篩選面板現已改為整潔的網格 —— #/scan 的篩選面板從寬度參差、由剛性方框組成的 flex-wrap 改為響應式網格,「套用 / 重設」操作現在獨佔一列並靠右對齊。篩選項與行為不變 —— 只是更易閱讀。一次設計打磨(無 parent-sync)。
變更
#/scan篩選面板 → 響應式網格 ——.scan-filters現為display: grid,欄為repeat(auto-fill, minmax(180px, 1fr)),間距均勻,使 11 個帶標籤的篩選項在任意寬度下都對齊成整潔的欄,而不再參差地換行。- 套用 / 重設操作 橫跨整個網格獨佔一列,以一條細線分隔並靠右對齊。移除了
scan.js中舊的隱藏標籤技巧 + 內部 flex 包裹。
說明
- 僅 CSS + 少量 DOM 清理 —— 每個篩選項 id(
#scan-filter-*、#scan-apply)與SR.render()的接線均未改動,因此 Playwright 流程不受影響。無新增 i18n 鍵。 - 已在瀏覽器驗證(0 主控台錯誤);由
tests/scan-filters-grid.test.mjs保護。 - 套件:2381 項測試(+3:
tests/scan-filters-grid.test.mjs)。
[1.147.0] — 2026-08-12
Hermes & Telegram —— 應用內說明章節 + cvstart.org 介面(Phase 5b,第 2 部分) —— Hermes 文件工作的第二部分,也是最後一部分:操作說明現已放入應用自己的說明指南中,涵蓋全部 17 種語言,應用內文件助理也據此回答 Hermes 相關問題。仍僅限文件 —— Hermes LLM 供應方路徑仍處於 規劃中 / 尚未接上(Phase 5)。
新增
- 應用內說明 §30「Hermes & Telegram」× 17 種語言 —— 新的指南章節(Hermes 是什麼 + 兩種整合形態;在雲端伺服器上執行;經 Hermes 轉發到 Telegram + 「不該公開什麼」規則),可從
#/help存取。docs-assistant/DocsFab的 grounding 會自動取得它(兩者都讀取docs/help/<lang>.md)。 - cvstart.org —— 指向 Hermes 指南的連結,跳轉到 GitHub 文件。
變更
- 說明套件門檻提升至 29 → 30 H2 / 105 → 108 H3(
canonical-docs-coverage、help-ui、help-ru-config-section);§30 新增 3 個 H3。
說明
- 目前仍沒有任何程式碼呼叫 Hermes。 新哨兵測試
tests/help-hermes-section.test.mjs斷言每種語言都包含帶有語言無關錨點(docs/integrations/HERMES.md、hermes-bridge、#/help、127.0.0.1、Telegram)的 §30。該供應方仍卡在 Phase 5 的 API 合約調查上。 - 這就收尾了 Phase 5b 的 文件 + 技能 交付物;供應方整合(Phase 5)仍是一個獨立且被阻擋的事項。
- 套件:2378 項測試(+2:
tests/help-hermes-section.test.mjs)。
[1.146.0] — 2026-08-12
Hermes 代理 + Telegram——整合指南 + 一個 skill(Phase 5b,第 1 部分) — 你可以在雲端伺服器上執行 career-ops-ui,並透過 Nous Research 的 Hermes 代理把它的事件(一次完成的掃描、一份新報告、一次緊急跟進)串接到 Telegram。本次發布提供設計 + 部署文件與一個 hermes-bridge skill;Hermes LLM 供應方路徑仍處於規劃中/尚未接上的狀態(卡在 Phase 5 的 API 契約調查上)。這是刻意讓文件先行於程式碼。
新增
docs/integrations/HERMES.md— 深度指南:兩種整合形態(相容 OpenAI 的 endpoint 與代理執行環境)、雲端伺服器部署(reverse proxy + HTTPS + systemd,在無頭伺服器上對 parent 的唯讀約定)、經 Hermes 轉發到 Telegram,以及一份威脅模型「不可暴露的內容」清單(不向頻道暴露履歷/薪資/報告內文/金鑰)。- README 中的
## Hermes agent + Telegram預告 — 英文 README 中的簡短指引 + 連結,並同步到已完整翻譯的各語言 README。 - 一個讓指南可落實執行的
hermes-bridgeskill(.claude/skills/hermes-bridge/)——前提條件與範圍檢查(Node ≥ 18、金鑰是否存在、透過 SSRF 安全路徑確認 endpoint 可連通),絕不將金鑰寫入磁碟/日誌,並拒絕捏造 Hermes 的 endpoint 或宣稱該供應方已接上。 docs/architecture/OVERVIEW.md中新增 Integrations 小節連結到該指南。
說明
- 目前還沒有任何程式碼呼叫 Hermes。 一個哨兵測試(
tests/hermes-docs.test.mjs)斷言「規劃中/尚未接上」的誠實標記仍然存在,並確認llm-dispatch.mjs中沒有 Hermes/Nous 分支——因此日後接上該供應方時,必須在同一次變更中同步更新文件 + roadmap。 - 延後至 v1.147.0(Phase 5b,第 2 部分):應用內說明中的「Hermes & Telegram」H2 小節 × 17 種語言,以及 cvstart.org 的行銷頁面。
- 套件:2376 項測試(+4:
tests/hermes-docs.test.mjs)。
[1.145.0] — 2026-08-12
有洞察力的統計(續):可重建圖表 — #/stats 的「目標職位趨勢」分頁新增 建立圖表 小工具:選擇指標 × 維度即可即時重繪。使用者提出的 UX 需求(無 parent-sync)。
新增
- 指標 × 維度可重建圖表 — 選擇指標(職缺數 / 薪資中位數 / 平均薪資)和維度(依國家/地區 / 依職位),長條圖即時重繪。薪資類指標遵循貨幣 + 每年 ⇄ 每月切換;職缺數為簡單計數。
- 8 個新 i18n 鍵 × 17 種語言;快照 1200 → 1208。
說明
- 已在瀏覽器驗證(0 主控台錯誤)。套件:2372 項測試(+2)。
[1.144.0] — 2026-08-12
設定與過濾(階段 4,第 1 部分):啟用/停用追蹤的入口 — 現在可在 #/portals 開啟或關閉受監看的公司,掃描器會遵循此設定。使用者提出的 UX 需求(無 parent-sync)。
新增
#/portals上依公司的啟用/停用開關 — 一鍵關閉某入口(EN 掃描器已略過enabled: false的公司,因此停用的入口會從此後所有掃描中移除)或重新開啟,並帶樂觀提示。POST /api/portals/toggle— 一次明確的使用者寫入,外科式且經解析驗證地切換portals.yml中某公司的enabled旗標(註解、順序及其他欄位均保留)。5 個新 i18n 鍵 × 17 種語言;快照 1195 → 1200。
說明
- 掃描器改動為零 —
en-scanner.mjs已依enabled !== false過濾。套件:2370 項測試(+3)。
[1.143.0] — 2026-08-12
更易理解(續):核心工作流頁面的 ? 提示 — 說明 ? 現在涵蓋九個主要操作頁面,支援所有語言。使用者回報的 UX 改進(無 parent-sync)。
新增
- 再為 9 個檢視標題加上
?說明提示 —#/scan,#/evaluate,#/cv-studio,#/tracker,#/config,#/deep,#/batch,#/auto,#/apply均獲得內聯?(透過HelpHint.title),點擊開啟在地化的「這是什麼 / 如何使用 / 會得到什麼」彈出框 — 與 v1.139.0 相同的 CSP 安全元件。 - 9 個新 i18n 鍵 × 17 種語言(
help.hint.scan/…/apply);快照 1186 → 1195。
說明
- 已在瀏覽器驗證(0 主控台錯誤)。套件:2365 項測試(+1)。
[1.142.0] — 2026-08-12
修正:不再出現「Unknown」職業原型 — #/orientation 現在始終從八個具名的職業向量中排名,而非偶爾回答「Unknown」並建議你在其上「加倍投入」。使用者回報的修正(無 parent-sync)。
修復
#/orientation— AI 提示現在禁止集合之外的原型。 模型必須從恰好八個具名向量中排出前三,且絕不回答「Unknown」/「N/A」/「資料不足」或臆造標籤。履歷單薄時仍以較低信心指出最接近的三個並說明缺少哪些證據,而非拒答。
說明
- 僅伺服器端提示變更(
buildOrientationPrompt);無 i18n/架構變更。套件:2364 項測試(+1)。
[1.141.0] — 2026-08-12
有洞察力的統計(續):募資公司資訊強化 — #/funded 更具視覺化:公司標誌、依募資額的圖表,以及含輪次 / 金額 / 發現評分 / 建議操作的卡片。使用者回報的 UX 改進(無 parent-sync)。
變更
#/funded— 扁平表格 → 卡片網格。 每家近期募資的公司現在都是一張卡片,含標誌(由公司名推導,失敗時用字母頭像)、輪次+金額標籤、上層專案的發現評分與建議操作,以及募資新聞連結與日期。- 募資額視覺化 — 依已揭露金額排名的頭部公司橫向長條圖;“$120M”/“€1.5B” 等自由文字金額由新的
parseAmount解析為量級。3 個新 i18n 鍵 × 17 種語言。
說明
- 仍為
GET /api/company-funded之上的唯讀;簡介與薪資範圍不在募資資訊來源中。套件:2363 項測試(+2)。
[1.140.0] — 2026-08-12
有洞察力的統計:更豐富的薪資數字 — #/stats 的「我的管道」薪資細分現在顯示平均值(不只是中位數)、每年 ⇄ 每月切換,以及依國家的最低 · 平均 · 中位數 · 最高表格。Phase 3 的第一部分。使用者回報的 UX 改進(無 parent-sync)。
新增
- 平均薪資 —
RoleStats.salaryStats現在於minUsd/medianUsd/maxUsd之外回傳avgUsd。中位數抗離群值,平均值揭示偏斜,兩者結合便讀作一個分佈。 - 薪資部分的每年 ⇄ 每月切換與依國家的最低 · 平均 · 中位數 · 最高表格(連動貨幣與週期選擇器)。8 個新 i18n 鍵 × 17 種語言。
說明
- 數字仍僅來自可解析薪資的職缺並正規化為 USD(僅供參考)。套件:2361 項測試(+1)。
[1.139.0] — 2026-08-12
更易理解:? 說明提示 — 一個可重複使用且符合 CSP 的 ? 按鈕,點擊後以您的語言說明「這是什麼 / 如何運作 / 會得到什麼」。使用者回報的 UX 改進(無 parent-sync)。
新增
?說明提示彈出框(window.HelpHint)——標題旁的圓形?會開啟一個輕量、隨主題變化並在 RTL 下鏡像的彈出框,透過UI.md()顯示在地化說明;具可存取性(role="tooltip"、aria-expanded、按 Esc 或點擊外部關閉、焦點回歸)且符合 CSP。- 在
#/stats的 5 個分頁和 8 個 AI/分析檢視標題(career-plan、定位、two-pager、人脈、模擬面試、記憶、funded、每週彙總)上新增?—— 14 個新 i18n 鍵 × 17 種語言。
說明
- 所有檢視原本就有一行副標題;
?在此基礎上按需提供更深入的說明,也讓空狀態自我說明。套件:2360 項測試(+4)。
[1.138.0] — 2026-08-12
依介面語言生成 — 所有 AI 生成現在都以你在介面中選擇的語言回覆,並含評審驅動的測試加固。使用者回報的 UX 改進(無 parent-sync)。
變更
- AI 生成現在遵循介面語言。 當介面設為俄語、西班牙語、日語……時,生成文字會以該語言返回,而不再總是英語。輸出語言指令已貫穿所有生成端點——職涯規劃、定位、市場報告、模擬面試、人脈計畫、「向文件提問」、記憶便箋建議以及 two-pager 草稿。程式碼與識別碼保持英文(如 two-pager 的 YAML 鍵),僅正文、標題與要點被在地化。
修復
- CSS 顏色角色守衛(
tests/css-role-tokens.test.mjs)——一個靜態金絲雀,斷言 v1.137.0 暗色模式別名權杖絕不反轉角色:文字角色權杖(--fg/--danger/--ok/…)絕不用作background,表面角色權杖(--card/--panel/--line/…)絕不用作文字color,涵蓋全部 CSS 與 SPA 內聯樣式。 UI.md()XSS 載入器自檢 ——從api.js載入md()的測試現在在擷取後立即用md('<script>…')探測,若跳脫缺失即拋錯,使未來的錯誤切片響亮地失敗,而不是讓安全套件在被截斷的函式上變綠。#/career-plan捲動守衛 ——生成後的scrollIntoView僅在預覽仍連接到文件時執行。
說明
docs/UX-ROADMAP.md已更新:?說明提示 + 頁面說明 + 空狀態改為 v1.139.0;Nous Research / Hermes 供應方(含雲端伺服器 + Telegram 部署指南與 Hermes 技能)記為 階段 5 / 5b。- 套件:2356 項測試(+5)。
[1.137.0] — 2026-08-11
可讀性與呈現修復 — 深色模式對比、圖表標籤,以及職涯規劃。一次由使用者回報驅動的 UX 修正(非父專案同步)。
修復
- 深色模式下多個畫面出現白底白字/黑底黑字 — 多個檢視所參照的十五個 CSS 自訂屬性(
--fg、--panel、--panel-2、--ok、--danger、--card、……)從未宣告,因此退回為硬編碼的淺色/黑色數值:淺色模式下無妨,深色模式下卻無法閱讀(#/pipeline概覽晶片、#/stats的活動分頁、#/config的 “Active / Keys” + “✓ set”、#/two-pager各區段、#/mock-interview的問題泡泡、錯誤文字)。現已將其別名指向真正會隨主題變化的 token,因此會自動跟隨主題切換 —— 經自動化稽核工具驗證,全部 29 個檢視共 0 項 WCAG-AA 對比失敗;#/config的活動分頁已改為易讀的淡色徽章樣式。一項回歸防護(tests/dark-theme-tokens.test.mjs)確保它們持續維持別名對應。 #/stats的圖表標籤原本會在單字中間被截斷(“Senior Backend Engineer” → “…Enginee”)— 現在會以省略號結尾,完整標籤則保留在滑鼠停留提示中。#/career-plan原本將產生的規劃以未經處理的 Markdown 顯示 — 現在會自動渲染為格式化、易讀的文字(可編輯的 Markdown 仍保留在文字框中;Preview 可切換顯示方式)。
備註
#/career-plan、#/two-pager、#/stats與每週面試摘要並非故障 — 在你產生規劃/取得資料之前,它們會顯示空白狀態。更清楚的頁面內說明與?說明提示已排入下一步計畫(docs/UX-ROADMAP.md)。
[1.136.0] — 2026-08-11
對齊父專案 career-ops v1.26.x(v1.26.0 主線之後)— 一個新的零驗證來源,加上對 web-ui 鏡像程式碼的一系列品質與穩健性移植。註冊表現有 79 個來源 = 74 個英文 + 5 個俄文(ALL_ADAPTERS 74)。
新增
eightfold(Eightfold AI,#2684)— 透過零驗證的https://<tenant>.eightfold.ai/api/apply/v2/jobsAPI 讀取人才招募看板,主機固定為*.eightfold.ai(品牌化的careers.<company>.comCNAME 則刻意予以拒絕);採分頁讀取,並設有安全上限、失效看板拋出、URL 去重。含來源 + adapter + CI 隔離測試套件;已出現在#/scan的 Source 篩選器與首頁。
修復
- 支援 Unicode 的去重與職稱鍵(#2569 / #2587 / #2667)— 新的共用
normalizeTextKey(NFKC,保留任何文字系統的字母/符號/數字)取代了僅限 ASCII 的鍵:detect-reposts現在能將全形/半形與標點差異的公司變體歸為同一群(“Acme, Inc.” 等同於 “Acme Inc”),且絕不會把不同的非拉丁文雇主誤併;而role-matcher會折合全形職稱,並保留非拉丁文職稱字詞,而非將其抹除。 fetchJsonWithRetry不再對遭拒的重新導向進行重試(#2657)—redirect:'error'防護遇上 3xx 屬於確定性結果,因此現已標記為不可重試,會直接快速失敗,而不會白白耗盡重試預算。title_filter.positive的 AND 群組(#2552)— positive 項目中以空白分隔的+現在會要求每個詞彙皆須出現在職稱中,不論順序。oraclecloud現已接受帶編號的租戶頂級網域oraclecloud1.com … oraclecloud99.com(#2683)— 一個有界的網域家族(不含前導零、至多 2 位數字),絕非萬用字元頂級網域。workable強化(#2675)— 針對由 Cloudflare 代管的主機加入重試、類瀏覽器標頭與請求序列化。personio在 XML 動態消息被停用時會改用 HTML 爬取作為後備方案,而不是直接回傳空結果。states的 FALLBACK 別名已與父專案重新同步(#2615)。
備註
- 未移植(web-ui 未鏡像該功能,或僅限 CLI):
reply-matcher(#2672)、jd-similarity(#2661)、jd-skill-gap(#2686)、掃描的環境變數路徑(#2568)/--flag=value(#2589)解析,以及求職信/CV 範本/doctor/ollama/generate-pdf 相關變更。網頁版的js-yaml/nanoidHIGH 級別安全公告已於 web-ui v1.135.0 修補。
[1.135.0] — 2026-08-11
對齊父專案 career-ops v1.26.0 — 五個新的零驗證掃描來源,加上對 web-ui 既有四個看板的正確性修復。註冊表現有 78 個來源 = 73 個英文 + 5 個俄文(ALL_ADAPTERS 73)。
新增
- 五個新掃描來源(各自為一個來源 + adapter + CI 隔離測試套件;皆已出現在
#/scan的 Source 篩選器與 cvstart.org 首頁):join(JOIN)— 透過join.com/companies/<slug>中 Next.js 的__NEXT_DATA__讀取公司自己的 JOIN 看板(主機固定、頁數上限)。getro(Getro)— 透過公開的api.getro.comPOST API 讀取創投「人才網絡」投資組合看板,依最新優先排序分頁;每筆職缺皆歸屬於投資組合中的雇主,而非基金本身。consider(Consider)— 透過同源 POST 讀取 getconsider.com 的創投投資組合看板;設定驅動的主機由結構化 SSRF 防護把關(僅限公開 HTTPS 主機)。joinup(JOINUP)— 瑞士看板 joinup.ch,讀取伺服器端渲染(SSR)後的最新頁面;爬蟲邏輯故障時採失敗封閉策略。remotli(Remotli)— remotli.ch,瑞士公司的遠端職缺(瑞士法郎薪資);會發出雇主自身的 ATS 投遞連結,使跨站重複刊登得以去重。
修復
- a16z Speedrun 不會再因暫時性異常而中止整個看板 — 頁面擷取現已改用共用的
fetchJsonWithRetry(僅對暫時性的 429/5xx/逾時進行有限次數重試,永不重試永久性的 4xx),並已重新調整頁數上限以配合單頁 50 筆職缺。 - arbeitsagentur 已改用 v6 版 Jobsuche API(
/pc/v6/jobs)— 舊版 v4 端點已回傳 404;回應結構已重新命名,遠端篩選現已改為伺服器端縮限。 - thehub 已改用 v2 版
jobsandfeaturedAPI;各列不再附帶刊登日期,並排除於時效篩選之外。 - hackernews 現能可靠找到每月的「Who is hiring?」討論串 — 已將 Algolia 查詢改為以
author_whoishiring帳號標籤過濾,取代原本的自由文字查詢。
備註
- 未移植(web-ui 已屬安全、由中繼吸收,或僅限 CLI):Unicode 角色去重/公司比對鍵(web-ui 的轉發分組本就以純小寫字串作為公司鍵,因此不同的非拉丁文雇主名稱永遠不會被誤併);跟進的拒絕延遲訊號 + 獲投公司微調(皆以唯讀方式中繼,失敗自動降級);掃描的環境變數可覆寫路徑與
--flag=value解析(web-ui 以同進程執行掃描器);User-Agent 整併重構(web-ui 已將其集中管理);以及僅限 CLI 的項目(未受信任內容名單、oferta/offer-prep、doctor、求職信/CV 範本變更)。
[1.134.1] — 2026-08-05
驗證強化 — 本次修復源自一次全專案稽核。
修復
successfactors現在不會在掃描中途失敗時捨棄已擷取的職缺(v1.134.0 死板拋出邏輯移植所致的回歸)— 其分頁迴圈原本沒有try/catch,因此第 2 頁起(第 1 頁已成功)發生失敗即會拋出錯誤並捨棄所有已收集的結果;而若該次失敗是404(超出範圍的startrow),en-scanner便會將一個仍在運作的租戶誤判為失效長達數日。現已對齊phenom/radancy:第 0 頁失敗仍會拋出錯誤(判定為失效看板),但較晚頁面的失敗會保留已取得的部分結果。#/scan篩選晶片現已可用鍵盤操作(WCAG 2.1.1)— 面向晶片(以及「清除」晶片)原本是帶有點擊事件處理器的span,卻沒有tabindex/角色,導致鍵盤與螢幕閱讀器使用者無法聚焦或切換它們。現在皆已附上role="button"、tabindex="0"、aria-pressed,並支援 Enter/Space 鍵啟用。- 三個硬編碼的英文字串現已完成本地化 —
#/scan信任徽章提示、#/scan搬遷欄位標頭,以及#/dashboard評分標頭原本皆為裸露字面值,i18n 對應完整性檢查機制看不到它們(因為它們從未被定義為鍵),因此在所有非英文語系中始終顯示英文。現已改用scan.trustTip+scan.col.reloc(2 個新鍵)以及重複使用既有的track.col.score,並附上原始碼靜態測試把關。
[1.134.0] — 2026-08-05
對齊父專案 career-ops v1.25.0。
新增
- 新增掃描來源:getManfred(
manfred)—— 一個橫跨全站的西班牙/歐盟科技職缺消息來源,附帶公開薪資,取自www.getmanfred.com/api/v2/public/offers(零驗證、主機固定 + 僅限 HTTPS、單一請求取得完整目錄)。新增來源 + adapter,以及一套 CI 隔離測試套件(tests/sources-manfred.test.mjs);註冊表現有 73 個來源 = 68 個英文 + 5 個俄文(ALL_ADAPTERS68)。已出現在#/scan的 Source 篩選器,以及 cvstart.org 首頁。
修復
- a16z Speedrun 消息來源會靜默截斷至 50 筆職缺(#2404)—— 該消息來源每頁上限為 50 筆,但此來源原本請求
PER_PAGE = 100,導致第一頁後分頁即中止。已修正為 50。 - 失效的職缺板現在會拋出錯誤,而非誤判為「正常但空白」(#2379)——
cryptocurrencyjobs、phenom、radancy、successfactors:當沒有任何一次請求成功解析時,現在會拋出錯誤(使#/portals健康檢查與掃描能記錄真實的失敗),而非將其吞噬為一份空清單;掃描過程中若在至少一次成功之後才失敗,仍會保留部分結果。 - workable 現已改用公開 widget API(#5ab8425)—— 已切換至
apply.workable.com/api/v1/widget/accounts/<slug>,可於單一請求中取得大型帳號的完整職缺清單,大型帳號因此不再遭到截斷。
備註
- 未移植(僅限 CLI 或未鏡射至 web-ui):detect-reposts #2389 的標題分組效能重寫;Unicode 公司鍵修復(web-ui 自身的追蹤器去重機制已對非拉丁字元安全);
scan --since;cv-facts;CV 範本/PDF 稽核工作;doctor;modes 未受信任內容指令。
[1.133.1] — 2026-08-02
修復
#/funded(獲投公司)現在會渲染結果 — 兩個錯誤讓此表格即使在父專案的company-funded.mjs已回傳完整清單時,仍一律顯示查無獲投公司。(1)檢視原本從res.candidates讀取結果,但父專案實際發出的鍵是companies(每筆為{ company, amount, round, funding: { sources: [{ source, url, observed_date }] } });客戶端現在讀取正確的鍵,並對映至真實的證據結構。(2)結果表格先前以可變參數方式將儲存格傳入UI.el('tr', {}, …),但UI.el(tag, attrs, children)的children參數僅接受單一節點或陣列,因此只有第一欄(公司)會被渲染 — 儲存格現在改以陣列傳入。已在真實瀏覽器中驗證:四個消息來源共 11 間公司皆已正確渲染,涵蓋公司/募資訊號/來源/日期四欄,證據連結可正常運作,0 主控台錯誤。空結果現在也會一併顯示各來源的診斷資訊,讓「今日無新聞」與「來源被封鎖」得以區分。tests/parity-routes-v1133.test.mjs新增回歸測試把關:假父專案指令稿現在會發出真實的companies輸出結構(原始測試固件鏡射了錯誤的candidates結構 — 這正是此錯誤能夠綠燈上線的原因),並新增原始碼靜態測試哨兵,斷言funded.js讀取的是res.companies(絕非res.candidates),且以陣列形式建構表格列的子節點(+1 → 2144)。
[1.133.0] — 2026-08-01
新增
- 獲投公司探索(
#/funded,對齊父專案 #2117) — 一個新的唯讀檢視,透過GET /api/company-funded中繼父專案 career-ops 的company-funded.mjs:一份「先審閱、後採用」的近期獲得資金公司清單,發掘自公開、且主機固定的資金動態消息來源(TechCrunch、PR Newswire、The Guardian、Hacker News)。此中繼以--json --dry-run執行腳本(JSON 輸出至 stdout,不寫入任何檔案),絕不將使用者輸入納入--sources,附帶速率限制,並由使用者觸發(一個 Discover 按鈕,絕不在掛載時自動執行)。新增路由模組server/lib/routes/funded.mjs+public/js/views/funded.js,歸類於 Sourcing 之下。 - 每週面試摘要(
#/interview-digest,對齊父專案 #2129/#2130) — 一個新的唯讀檢視,透過GET /api/interview/weekly-digest中繼父專案零 LLM 的weekly-digest.mjs:機械式彙整面試場次筆記——本週與哪些公司、哪些輪次進行了面試、重複出現的職能,以及盡力而為的待補缺口。選用的?from=&to=範圍僅在兩者皆為合法YYYY-MM-DD時才會被納入;空範圍屬於合法的available:true摘要。新增至server/lib/routes/interview.mjs+public/js/views/interview-digest.js,歸類於 Analytics 之下。 - 兩個中繼皆遵循既有的失敗自動降級
available:false契約,適用於父專案腳本缺席時(CI、獨立安裝)。新增 26 個 i18n 鍵 ×17 語系;CI 隔離測試套件tests/parity-routes-v1133.test.mjs(+5 → 2143)。
備註
- 父專案 career-ops 已推進超過 v1.24.0,帶來 Next.js
web/應用的 Follow-up Tracker 頁面(#1422)與後端 PDF 渲染(#2182)——未移植:web-ui 已有自己的跟進中繼與 PDF 執行器,而底層的followup-cadence.mjs強化透過外殼呼叫中繼即可免費取得。set-status.mjs/tracker-utils.mjs的變更屬於 CLI 內部,未鏡像移植。
[1.132.0] — 2026-07-31
變更
#/scan結果渲染子系統抽取至public/js/lib/scan-results.js(檔案大小規範債務攤還 —public/js/views/scan.js已成長至 ~1254 行)。該子系統(renderResults、buildChipRow、getRows、列/面向建構器、選項繪製器,以及FALLBACK_SOURCES註冊表鏡像)已移入一個window.ScanResults.create(ctx)工廠函式,其閉包捕捉檢視所提供的情境物件。無行為變化 — 函式原封不動搬移,閉包變數改接至ctx.*;scan.js現為 ~906 行(第二輪抽取以邁向 800 行目標,現正規劃中)。- 原始碼靜態測試透過
tests/helpers/scan-src.mjs::loadScanSrc()讀取這兩個檔案;tests/scan-fallback-sources.test.mjs現在改為從scan-results.js讀取註冊表鏡像。 - 新增瀏覽器內回歸測試把關 —
tests/playwright-scan-filters.mjs植入一份固定的data/last-scan.json,並驅動每一個#/scan篩選器,斷言精確的列數(npm run test:e2e:browser);並新增了穩定的篩選控制項 ID(#scan-filter-*、#scan-apply)。 - README「最新版本」橫幅精簡為單行摘要 + 完整變更日誌連結(冗長的多版本敘事牆已退役)。已套用至全部 17 個語系。
[1.131.2] — 2026-07-31
變更
app.css拆分為三個依序載入的樣式表(檔案大小規範債務 — 單一檔案已成長至約 1990 行,遠超 800 行的硬性上限)。現分為app.css(約 672 行 — 無障礙、設計權杖/主題、側邊欄、主內容區、按鈕、內容外殼)、components.css(約 595 行 — 卡片、格線、分頁器、徽章、表格、表單、紀錄/主控台、markdown、語言切換器、篩選晶片、連線橫幅),以及overlays.css(約 737 行 — 提示訊息、通知抽屜、彈窗、雜項/響應式、[dir="rtl"]鏡像、docs-fab、usage-hud),每個檔案皆在硬性上限之內。- 切分方式為連續且依原順序,因此串接結果與拆分前的檔案逐位元組完全相同;
index.html依序以三個<link>載入。無任何行為、標記或 i18n 變更。 - 斷言 CSS 的測試現在透過共用的
tests/helpers/css.mjs::loadAppCss()輔助函式讀取串接結果。新增tests/css-modularization.test.mjs鎖定此拆分(檔案存在 · 各檔案 ≤ 800 行 ·index.html連結順序)→ 測試套件 2138。已於瀏覽器中驗證:三個樣式表皆能正確解析且其規則正確生效。
- 切分方式為連續且依原順序,因此串接結果與拆分前的檔案逐位元組完全相同;
[1.131.1] — 2026-07-31
修復
- 兩個 v1.130.0 來源的配接器主機固定一致性(程式碼審查跟進項目,縱深防禦;對合法輸入無行為變化):
a16z-speedrun-talent配接器現在會在buildEndpoint重新驗證api:/a16z-speedrun-talent:覆寫值(HTTPS + 精確主機speedrun-talent-network.com),失敗時降級回退至規範動態消息 — 與cryptocurrencyjobs配接器一致,確保非法主機值永遠不會進入擷取槽位(先前僅依賴擷取時的assertSpeedrunUrl把關)。精確主機檢查現已整併為單一匯出的SPEEDRUN_TALENT_HOST_RE,由把關函式與配接器共用。cryptocurrencyjobs解析器 —cleanUrl現在使用與assertCryptocurrencyJobsUrl及配接器覆寫值相同的精確比對主機把關(原為endsWith,會誤放行子網域)。解析器絕不會比 SSRF 把關更寬鬆:sub.cryptocurrencyjobs.co的項目連結會被捨棄。- +2 個測試 → 2135。
[1.131.0] — 2026-07-31
新增
#/trackerCRM 階段分頁看板(移植自父專案 web app 的/pipeline檢視)。追蹤器原本的漏斗晶片列 + 狀態下拉選單,已由階段分頁列取代:一個 All 分頁,外加每個規範狀態各一個分頁 — Evaluated · Applied · Responded · Interview · Offer · Rejected · Discarded · SKIP · Hired — 每個分頁都顯示即時的全歷史計數,包含零計數的階段,讓完整漏斗隨時可見(CRM 風格)。使用中的分頁驅動篩選;再次點擊會清除回到 All。各列仍保有其分數色調、合法性、PDF 與報告等操作項,且啟用標誌後,公司欄現在會顯示品牌標誌(預設關閉 → 零額外請求)。- 新增唯讀路由
GET /api/tracker/stages,回傳規範漏斗(依序排列的標籤)+ 別名摺疊對映表,來源為server/lib/states.mjs(templates/states.yml,並附內建回退)— 因此客戶端永不硬編碼狀態白名單。舊版無參數的GET /api/tracker回應維持不變(僅{ rows })。 - 新增純函式、附單元測試的客戶端函式庫
public/js/lib/tracker-stages.js,依伺服器的階段將各列分類,並容許零散的 markdown 粗體與在地化別名(例如aplicado→Applied)。分頁具備無障礙支援(role tablist/tab、aria-selected、≥44 px 命中區域、計數包含在每個分頁的無障礙名稱中)。無新增 i18n 鍵。測試套件現為 2133 個。
- 新增唯讀路由
[1.130.0] — 2026-07-31
新增
- 兩個新掃描來源,移植自父專案 career-ops v1.24.0(同進程,無新相依;皆出現於
#/scan的 Source 篩選器與 cvstart.org 落地頁):- a16z Speedrun(
a16z-speedrun-talent,#2231)— a16z Speedrun 人才網絡(talent-network)全站 JSON 動態消息。主機固定為speedrun-talent-network.com,僅限 HTTPS,0 起始分頁並附頁數上限,依公司貫穿q/設定,失敗自動降級。 - Cryptocurrency Jobs(
cryptocurrencyjobs)— Web3 職缺看板cryptocurrencyjobs.co,透過其公開 RSS 2.0 動態消息擷取(零驗證)。兩階段 XML 實體解碼,僅列出遠端職缺,雇主名稱從標題尾端的「“… at”」解析而得。 - 註冊表總數現為 72 個來源 = 67 個英文 + 5 個俄文(
ALL_ADAPTERS= 67 個英文入口配接器)。
- a16z Speedrun(
修復
echojobs— 混合制職缺與遠端職缺保持可區分(鏡像父專案 #2258)。不分大小寫的hybrid標記現在會產生"<City> · Hybrid"(無城市時則為單純的Hybrid)與workplaceType: 'Hybrid',而不再被併入Remote。radancy— 舊版 TalentBrew 標記語言 + JSON 結果片段傳輸(鏡像父專案 a3e6df9),以可注入的opts.fetchJson把關。
備註
- 未移植 — 僅限 CLI 的父專案功能。 career-ops v1.24.0 龐大的 CLI/模式面向仍不進入 web-ui(它是檢視器 + 輕量寫入通道,不是模式主機):合規/管轄區資料表、聯絡人電話簿 + vCard、面試逐字稿覆盤 / 通話平台偵測、ledger set-status、結果紀錄、兩階段篩選、jd-similarity、具版本的申請-CV artifact schema、doctor 的 Playwright-MCP 偵測,以及
portals/fix-slugs.mjs。存在於父專案scan.mjs中的掃描編排變更 — Interamt.de 的 Playwright 掃描器、iCIMS 反向 ATS 全面掃描、國家資格遠端篩選、DNS 查詢節流、StepStone 的rltr去重,以及掃描歷史的正規化公司欄位 — 皆不適用:web-ui 以同進程執行 EN/RU 掃描器,不會 shell 呼叫scan.mjs。 - 已涵蓋。
role-matcher的重音摺疊修復(#2209)已於 v1.127.0 移植,此處為 no-op。
[1.129.1] — 2026-07-29
修復
- 對 v1.128/v1.129 web 移植的 AI 審查跟進(均為諮詢性,源頭修復):
job-facets.js級別優先序(顯式修飾詞現在勝過管理詞 —Senior Engineering Manager→senior,原為lead);states.mjs回退不再被固定(成功讀取仍記憶化,回退不快取回傳 — 啟動時父專案短暫不可用會在下次呼叫重讀)+ 對存在但損毀的檔案console.warn;score-tone.js— 無評分的列為中性(muted)而非紅色;domainFromName()在/api/logo前跳過非 ASCII slug;+tests/states.test.mjs隔離守衛。+4 個測試 → 2073。
[1.129.0] — 2026-07-29
新增
#/scan級別面向 + 時長欄 — v1.128.0 的job-facets.js函式庫現已接入掃描 UI(先前僅邏輯)。新的級別下拉將每筆職缺標題歸入 lead/staff/senior/mid/junior/intern(JobFacets.seniorityFromTitle),並依結果中實際存在的項自動填入(與國家面向一致);無級別詞的標題一律通過。可在已儲存搜尋、重設與套用中保持。結果表新增級別徽章欄與零 token 的時長欄(今天/N天,來自JobFacets.daysSince)。12 個 i18n 鍵 ×17,+3 個測試 → 2069。
[1.128.0] — 2026-07-29
新增
- 從父專案自有 Web 應用(
../web/,Next.js)移植四項解決方案 — 以原生 JS/ESM 重新實作,無新相依:(1)server/lib/states.mjs即時讀取templates/states.yml作為追蹤器狀態詞彙的唯一來源(含 CI 回退)— 免除每次發佈的手動白名單重新同步;POST 將別名(西班牙語/舊版)摺疊為規範標籤,GET 漏斗按規範狀態分桶;(2)ATS 託管列的公司標誌 —domainFromName()(約 90 個品牌→網域);(3)score-tone.js— 4 級評分色調(≥4.2/3.8/3.0 + 字母回退);(4)job-facets.js— seniority/source/days 面向。+21 個測試。
備註
- 未移植(僅概念):父專案的代理動作層(
actions/registry.ts+api/assistant/route.ts)— 供docs-fab升級為副駕時的藍圖。無新來源(註冊表 70),無 i18n/help 變更。
[1.127.0] — 2026-07-29
新增
- 三個新掃描來源(career-ops v1.23.0 一致性) — 註冊表現提供 70 個配接器(65 EN + 5 RU):Flowxtra(免驗證全站聚合器)、VDAB(法蘭德斯公共就業服務關鍵字 API)、iCIMS(
careers-<tenant>.icims.com入口,區別於jibeapply)。此外 Cursor 回歸 CLI 名單(parent #2115):cli-detect現偵測cursor(10 個工具),並在 help/README/config ×17 還原名單。
修復
- agenticjobs 從 HTML 抓取改為 REST API(#2167);當
location.name僅為工作模式時,Greenhouse 從/offices還原城市(#2104);role-matcher 一致性(#1933/#2164/#2009:MTS 前綴、product基線、重音摺疊、次基線分歧)。
備註
- 未移植。 v1.23.0 大部分為 web-ui 不呼叫的 CLI/儀表板介面(batch-tailor、discover-ats、NL/PT 模式、PDF 主題、Go 儀表板、updater/doctor);中繼腳本無需改動。父專案 VERSION → 1.23.0。
[1.126.1] — 2026-07-25
修復
- v1.126.0 重新同步遺漏的兩處 CLI 名單漂移 — (1)
#/config的 API keys 分頁導語(config.providerModelNote,i18n ×17)只列出 7 個 CLI — 現在 Antigravity 與 Grok Build 已插入 OpenCode 之後;(2) 說明指南(×17)的第二個對比表列以及 CI 建置的網站 help 仍寫著Inside Claude Code / Codex / Cursor / Gemini CLI(含過時的 Cursor)— 現為完整名單。兩處使用了 v1.126.0 掃描模式未涵蓋的斜線/間隔號分隔符。i18n 快照已重新生成;套件仍為 1969。
[1.126.0] — 2026-07-25
新增
- AI CLI 工具分頁現在偵測 career-ops 全部 8 個一級 CLI —
#/config名單已與父專案docs/SUPPORTED_CLIS.md同步:server/lib/routes/cli-detect.mjs新增 Grok Build CLI(grok)與 Kimi CLI(kimi),Antigravity 現在優先探測其規範二進位agy。唯讀 PATH 掃描現回報 9 個工具,仍然從不執行找到的二進位。
變更
- 與 career-ops.org/docs 的文件重新同步 — 已將每個文件面與父專案的即時頁面(全部 31 頁已讀)核對。規範 AI 助手名單(help ×17 + README ×17)現列出 8 個一級 CLI — Claude Code、Codex、OpenCode、Antigravity CLI、Grok Build CLI、Qwen Code、Kimi、GitHub Copilot CLI — 外加 Gemini CLI(舊版包裝)。說明包保持 29 H2 / 105 H3 結構。
[1.125.4] — 2026-07-23
變更
- site 相依套件(dependabot #151–#153)—
site/中sharp0.34.5→0.35.3、svgo4.0.1→4.0.2、fast-uri(dev)3.1.3→3.1.4;Astro 建置通過,對 SPA/伺服器無影響。
備註
- 父專案一致性巡檢(career-ops
37d17ec..254764a,v1.22.0 之後) — 無需移植:set-status錯列防護(#2108)僅限 CLI(web-ui 的追蹤器列在 UI 中明確選取,且沒有路由呼叫set-status.mjs);在地化模式的 Risk Summary(#2109)涉及 web-ui 從不讀取的modes/<lang>/檔案(僅讀取頂層modes/*.md);update-system資訊清單驗證(#2111)僅限更新器;其餘為父專案文件(土耳其語 README、SIGNATURES ×4、SCRIPTS.md、es 重音)。父專案 VERSION 維持 1.22.0 —parentVersion不變。
[1.125.3] — 2026-07-23
修復
- 丹麥語與印地語的 LLM 提示詞以英文回答(使用者回報)—
server/lib/prompts.mjs中的LOCALE_NAMES與五個SCAFFOLD_STRINGS區塊從未擴充到da與hi,導致resolveLocale()回退至en,深度研究(即時與手動)、模式執行、評估、面試、人脈、CV Studio 等所有 AI 提示詞在這兩個語言下都遺失了# Output language指令。現在兩者皆為一等公民: 語言指令 + 在地化鷹架。tests/locale-scaffold.test.mjs的迴歸閘門現在遍歷正規的 17 語言清單而非硬編碼的 12 個,新的結構一致性閘門會使任何回退到英文的鷹架鍵失敗 — 未來遺漏prompts.mjs的語言無法再出貨(+12 個測試,套件現為 1969 個)。
[1.125.2] — 2026-07-22
修復
- Gemini 深度研究:HTTP 502(
MALFORMED_FUNCTION_CALL)(#145,由 @Alien10140 貢獻)— 即時/api/deep提示詞要求模型「Use WebFetch / WebSearch」並將簡報存檔,但無工具的 API 供應方沒有工具通道;Gemini 以函式呼叫而非文字回應,呈現為空白的 HTTP 502。buildDeepPrompt與bundleProjectContext新增headless旗標:即時執行(Anthropic/Gemini/備援串接)取得無工具提示詞,僅憑內嵌上下文撰寫簡報;供 Claude Code 複製貼上的提示詞則保留工具指示。tests/critical-fixes.test.mjs新增 1 個測試。
變更
- Gemini 預設模型越過已棄用的
gemini-2.0-flash(#144,由 @Alien10140 貢獻)— 設定下拉選單、gemini.mjs的伺服器備援(先前與提示悄悄不一致)、OpenRouter 備援鏈、config.geminiModelHint×17 及說明指南 ×17 現統一指向gemini-3.6-flash。新的防漂移閘門tests/gemini-default-model.test.mjs(+5 個測試)將所有表面釘在同一字面值上 — 套件現為 1957 個測試。
[1.125.1] — 2026-07-21
修復
- SuccessFactors:多品牌 RMK 租戶保留其品牌路徑(父專案 #2099,v1.22.0 之後)— 同時經營多個收購品牌、共用同一套 RMK 執行個體的控股公司,以路徑片段來區分品牌(
careers.nemetschek.com/Bluebeam/vs…/Vectorworks/);此轉接器先前會將設定的 URL 收斂為其 origin,因而悄悄地只掃描母品牌的職缺。現在該端點會保留品牌前綴,只剝除結尾的/search/或/tile-search-results/區段,確保掃描絕不會自我重複;單一網域的租戶逐位元組不變。新增匯出的resolveTenantBase輔助函式,並在tests/sources-successfactors.test.mjs中移植 1 個測試區塊。
[1.125.0] — 2026-07-21
新增
- cvstart.org:「求職來源」登陸頁區塊 — 在截圖與比較清單之間新增一個區塊,將全部 67 個掃描來源以可點擊標籤的形式列出(62 個英文求職看板/ATS,外加獨立列在小標題下的 5 個俄文看板),每個標籤都連結到該來源的公開網站。此清單於建置時從實際的轉接器登錄檔(
sync-assets.mjs→facts.sources)同步而來,因此永遠不會與應用程式本身出現落差;Sources.astro中人工整理的連結對照表由新增的tests/site-sources.test.mjs把關。頁首導覽新增了 Sources 錨點;新增 4 個網站 i18n 鍵 × 17 種語言。同時修正了登陸頁 JSON-LD 中inLanguage清單先前遺漏hi的問題。
[1.124.0] — 2026-07-21
新增
- 五個掃描來源(與父專案 v1.22.0 對齊,#1808/#1572/#2024/#2055)— Welcome to the Jungle(全站 JSON API)、Agentic Engineering Jobs(agentic/AI 工程看板)、Jobvite(零認證按租戶 ATS)、Gem(按租戶 ATS),以及 Alibaba Group(求職 JSON API,美團/騰訊模式)。每一個都是主機固定、CI 隔離的來源 + 轉接器組合;註冊表現在提供 67 個轉接器(62 個英文 + 5 個俄文);
#/scan的 Source 下拉選單後備清單及其漂移關卡已同步更新;新增五個測試套件tests/sources-{wttj,agenticjobs,jobvite,gem,alibaba}.test.mjs。
修復
- Arbeitsagentur:僅當
homeofficetyp為VOLLSTAENDIG時才判定為全國遠端(與父專案 #1981 對齊)—homeoffice=nv_true查詢也會回傳混合辦公的職缺,因此遠端判定現在會以小批次方式對照職缺詳情端點逐一確認每筆結果,並採取失敗封閉策略(查詢失敗時保留該職缺原本的城市,讓地點篩選器仍能正常運作)。 - SmartRecruiters:公開職缺網址建置時未帶
/postings/(與父專案 #2047 對齊)— 對於公開網站省略該區段的租戶,連結現在會導向公開職缺頁面,而非導致 404。
備註
- 父專案 v1.22.0 同時出貨了一些 CLI 端變更,網頁介面並不透過命令列呼叫它們,或已自行涵蓋對應功能:簡體中文 CV 模板 + PDF 排版、
/expand模式、供應方 prompt 快取微調(Gemini/OpenAI/Ollama)、逐步 token 明細(網頁介面有自己的用量計量器)、追蹤器寫入鎖序列化(網頁介面自 v1.21 起已透過withFileLock進行寫入路由)、掃描的visa_filter+ 絕對刊登日期 CLI 旗標(網頁介面有自己的「刊登於…之內」時效篩選器),以及已見來源去重種子(網頁介面掃描器維持自有的掃描歷史去重機制)。
[1.123.0] — 2026-07-17
新增
- Oracle Recruiting Cloud 掃描來源(與父專案 v1.21.0 對齊,#1929)— Oracle Fusion/ORC 求職網站的零認證
recruitingCEJobRequisitionsREST API(JPMorgan Chase、Oracle、BNY Mellon、American Express、Honeywell 等公司採用):主機固定為*.fa[.<region>][.ocs].oraclecloud.com,站點編號從每間受追蹤公司的careers_url解析而得,採用附硬性頁數上限的位移分頁,並附上具備 WAF 意識的類瀏覽器標頭。註冊表現在提供 62 個轉接器(57 個英文 + 5 個俄文);#/scan的 Source 下拉選單後備清單及其漂移關卡已同步更新;新增 CI 隔離測試套件tests/sources-oraclecloud.test.mjs。
修復
- 重複刊登偵測器:基礎職稱與專門後綴變體保持區分(與父專案 #1922 對齊)— 「Senior Analytics Engineer」不再與「Senior Analytics Engineer, People Analytics」歸入同一群組:當某職稱的詞元是另一職稱詞元的嚴格子集,且多出的詞元屬於真正的專門化用語(而非基礎詞彙)時,兩者會被視為各自獨立、可分別刊登的職缺。重複刊登註記(如「(Repost)」、「relisted」)現已被列為中繼雜訊並納入停用詞。
tests/detect-reposts.test.mjs新增 2 項斷言。
備註
- 父專案 v1.21.0 同時出貨了一些 CLI 端變更,網頁介面並不透過命令列呼叫它們,或已自行涵蓋對應功能:重複投遞同一公司的警示(網頁介面自 v1.84.0 起已內建再投遞冷卻機制)、求職信的
--format/--report旗標、面試紅旗訊號/面板情報/未出席通知信的提示模式、掃描信任訊號與入口網站健康狀態持久化(網頁介面以自有的 in-process 掃描器搭配trust-validator與 Portals 健康頁面運作),以及統計/薪資落差擴充功能(以唯讀、失敗自動降級的方式轉發)。
[1.122.0] — 2026-07-16
新增
- 印地語(हिन्दी)— 第 17 種語言 — 完整的 UI 詞典(約 1,110 個鍵)、完整的應用程式內說明指南(29 個 H2/105 個 H3 對齊)、
README.hi.md、全新的CHANGELOG.hi.md(依循 de/it/tr 先例,自 v1.122.0 起開始)、cvstart.org 落地頁與方法論/授權/更新日誌/說明頁面、語言切換器(🇮🇳)、瀏覽器語言自動偵測,以及在地化的儀表板截圖。每一道 ×16 對齊關卡現在都改為 ×17 執行:i18n 詞典對齊與快照、說明指南 H2/H3 關卡、更新日誌對齊、網站的check-i18n,以及 Playwright 語系巡檢。
[1.121.0] — 2026-07-16
新增
- cvstart.org:方法論、授權與更新日誌頁面 — 落地頁在全部 16 種語言中新增三個章節,與既有的比較區塊並列:/methodology/(六維度 0.0–5.0 評分準則、4.0 分投遞門檻,以及絕不做的規則 — 這是 career-ops.org/methodology 的在地化摘要)、/license/(標準 MIT 授權文字並附 NOTICE.md 指引),以及 /changelog/(即本檔案,依語系從儲存庫 16 份翻譯後的 CHANGELOG 渲染)。新增頁首「Methodology」項目與頁尾 Resources 連結;
sync-assets.mjs現在會在建置時同步 CHANGELOG ×16 與 LICENSE 至落地頁,讓這些頁面永遠不會與儲存庫失去同步。 - 跨文件的方法論連結 — README(全部 16 個)、應用程式內說明指南 §1 的正式指南清單(全部 16 種語言),以及 wiki,現在都連結到 career-ops.org/methodology(FAQ 與詞彙表亦同),與既有的 career-ops.org/docs 指南並列。
變更
- 更新 README 發布橫幅與徽章(測試數 1850,發布版本 v1.121.0)— 橫幅先前仍停留在宣布 v1.119.5。
[1.120.0] — 2026-07-16
新增
- CareerOps 宣言(父專案 v1.20.0 對齊)— 父專案發布了 CareerOps 宣言(
MANIFESTO.md· career-ops.org/manifesto),現已在其 README、更新程式與 Go 儀表板中呈現。網頁介面同步跟進:新的側邊欄頁尾連結會開啟宣言頁面(全部 16 個語言區域新增footer.manifestoi18n 鍵),應用程式內說明指南在全部 16 種語言中新增了 §29「CareerOps 宣言」,README 解說了宣言是什麼、如何簽署,cvstart.org 落地頁頁尾也連結至該頁面。
備註
- 父專案 v1.20.0 同時修復了
upskill目標模式下已知技能的抑制邏輯、讓 dotenv 靜默以使scan --json的 stdout 保持可解析,並修正 HTML 履歷範本讓職稱標頭與其條列項目保持在一起——這些皆為 CLI 端表面,網頁介面並不透過命令列呼叫它們,因此無需變更網頁介面程式碼。
[1.119.5] — 2026-07-13
修復
- 落地頁語言按鈕不再折行 — v1.119.2 加入旗幟後,頁首切換器標籤(如「🇷🇺 Русский」)在較窄的桌面寬度下可能折成三行;切換器標籤及下拉選單所有選項現在均為
whitespace-nowrap—— 旗幟 + 語言名始終一行。 頁尾語言清單也從固定兩欄網格改為可換行的一行式項目——「🇧🇷 Português (Brasil)」同樣不再從名稱中間斷開。
[1.119.4] — 2026-07-13
變更
- LICENSE 載明作者 — 版權行現為 Sergei Emelianov (Fighter90) https://sergey-cv.com and career-ops-ui contributors(MIT 規範本文未動)。新增 NOTICE.md 詳細闡述授權:版權歸屬、MIT 授權確切涵蓋什麼(程式碼、文件、翻譯、落地頁、wiki)、不涵蓋什麼(你的執行期資料、父專案、職缺看板內容、商標)、第三方元件表(express/js-yaml — MIT;Astro/Tailwind — MIT;Figtree 與 JetBrains Mono 字型 — SIL OFL 1.1;sharp — Apache-2.0)以及可選的署名行。
[1.119.3] — 2026-07-13
新增
- SECURITY.md — CONTRIBUTING 指向的安全政策現在真的存在了:支援的版本、私密回報流程(儲存庫已啟用 GitHub 私密漏洞回報 — Security 標籤 →「Report a vulnerability」)、綁定 localhost 的單一使用者應用威脅模型(範圍內:惡意職缺內容的 XSS / SSRF / 路徑穿越 / 金鑰洩漏 / 削弱 CSP;範圍外:對自己 localhost 的 DoS 與父專案的問題),以及給審閱者的強化基線。
[1.119.2] — 2026-07-13
新增
- CONTRIBUTING.md — 落地頁與 README 一直連結的貢獻者指南現在真的存在了:安裝、專案地圖、安全/免建置硬規則、測試層級、新增掃描來源的「雙註冊表」演練、×16 i18n 契約、提交/PR 規範與發布流程。
- 落地頁語言旗幟 — cvstart.org 的語言切換器、頁尾語言網格和「用你的語言閱讀」橫幅現在在每個語言的自稱旁顯示其旗幟(與應用語言
<select>相同的區域指示符集;在缺少旗幟字形的平台上退化為區域字母)。 - 落地頁頁尾修復 — 失效的 Discussions 連結(儲存庫未啟用該功能)現指向專案 wiki,頁尾新增作者署名:Sergei Emelianov(sergey-cv.com · LinkedIn)。
[1.119.1] — 2026-07-13
修復
#/scan的來源篩選器追上了註冊表 — Source 下拉選單背後的靜態FALLBACK_SOURCES清單(僅在GET /api/scan/sources無法連線時使用)自 v1.87.0 起悄悄落後:離線後備中缺少 20 個提供方(Amazon、Avature、SAP SuccessFactors、Get on Board、Dassault Systèmes、beesite、HigherEdJobs、JibeApply (iCIMS)、softgarden、Cornerstone、Phenom、Radancy、Deutsche Bahn、EchoJobs、TKMS、Heckler & Koch、Rheinmetall、LaraJobs 以及新增的 Meituan / 騰訊)。現已與全部 61 個同步,並由漂移測試守護——只要用戶端清單與伺服器註冊表出現分歧(值與標籤),CI 即失敗。+1 個測試(1845)。
[1.119.0] — 2026-07-13
父專案 career-ops v1.19.0 對齊 + cvstart.org 落地頁煥新。
新增
- 2 個新掃描提供方 — 美團(
zhaopin.meituan.com)與騰訊(careers.tencent.com):中國科技公司職缺板塊的免認證公開 JSON API,依主機自動偵測或以明確provider:選擇,支援按關鍵字的伺服器端搜尋、分頁與按 URL 去重 — 現共 61 個轉接器(56 個英文 + 5 個俄文)。+20 個測試(1844)。 - 落地頁貢獻者區塊 — cvstart.org 展示所有貢獻過程式碼者的頭像(建置時呼叫 GitHub
/contributorsAPI,過濾機器人),已在地化至全部 16 種語言,並連結到完整貢獻者圖譜。 - 落地頁即時 GitHub 星標計數 — 頁首徽章現在每次造訪都從 GitHub API 在用戶端重新整理(建置時快照作為後備),每週排程的 Pages 重建保持快照與貢獻者清單新鮮;CI 中的 API 呼叫已使用權杖認證。
修復
- Workday CXS 請求攜帶瀏覽器式標頭(父專案 #1813)— Cloudflare 保護的租戶(實測:geico)對缺少常規 UA/
accept-language/origin/referer的請求回應 500;擷取器現從 CXS URL 本身推導 origin 與站點 slug。Glints 請求也獲得同樣的瀏覽器 UA + origin/referer,兩者皆來自http-json.mjs中共享的BROWSER_LIKE_USER_AGENT常數。
[1.118.4] — 2026-07-10
修復
- 從俄羅斯 IP 掃描 hh.ru 回傳 0 筆結果(區域子網域連結) — 從俄羅斯住宅 IP,hh.ru 會將搜尋 302 重新導向到區域子網域(
sochi.hh.ru、spb.hh.ru等),並在該子網域上回傳職缺連結。解析器以固定主機https://hh.ru/vacancy/尋找標題連結,與區域連結一個都不匹配,因此完全可用的掃描默默記錄為 0。現在它接受任意*.hh.ru主機(adsrv.hh.ru/click?…廣告仍被排除 —— 它們沒有/vacancy/<id>路徑),並將每個結果 URL 正規化為https://hh.ru/vacancy/<id>。已實地驗證:先前回傳 0 的sochi.hh.ru頁面現在解析出 17 筆真實職缺。+1 個測試(1824)。
[1.118.3] — 2026-07-10
修復
- hh.ru 毫無錯誤地回傳 0 筆結果(VPN 檢查中介頁) — hh.ru 現在會把它判定為 VPN/代理的網路(資料中心 IP)以 302 重新導向到
/vpncheeck中介頁(「VPN мешает работе сайта」),該頁以 HTTP 200 回應且不含任何職缺卡片,因此掃描在完全沒有錯誤的情況下回報 0 筆。掃描器現在透過回應的最終 URL 偵測此重新導向,在本次執行的剩餘時間停用 hh.ru,並輸出誠實提示:流量必須真正經由住宅 IP 出口 — 即使瀏覽器開關已關閉,系統層級的 VPN/代理仍可能保持啟用。+1 個測試(1823)。
[1.118.2] — 2026-07-10
維護
- 著陸頁跟進(#118) —
site/README.md與 Astro 7(#116 的安全升級)保持一致,移除未使用的 import,並為著陸頁建置指令碼新增 4 個可執行守衛: i18n 對齊門在字典損壞時可證明地失敗,sync-assets絕不寫入site/之外 — 套件 1822。解決 2 個 CodeQL 警報(1 個在原始碼修復,1 個作為預期建置行為予以駁回)。
[1.118.1] — 2026-07-10
修復
- 在俄羅斯境外掃描 hh.ru — hh.ru 現在對非俄羅斯 IP 的公開搜尋頁面回傳 HTTP 451(區域性法律封鎖)。掃描器將 451 與 403 同等處理: 首次封鎖後,本次執行剩餘時間內停用 hh.ru,並在日誌中如實提示需要俄羅斯 IP / VPN 出口,不再浪費剩餘查詢和其他 RU 來源。說明 §7 已在 16 種語言中更新。測試 +1(1818)。
[1.118.0] — 2026-07-09
父專案 career-ops v1.18.0 對齊包。
新增
- 9 個新掃描提供方 — Cornerstone OnDemand (
csod), Phenom (phenom), Radancy (radancy), Deutsche Bahn (deutschebahn), EchoJobs (echojobs), TKMS (tkms), Heckler & Koch (hecklerkoch), Rheinmetall (rheinmetall), LaraJobs (larajobs) — 現共 54 個轉接器。Lever 轉接器還可識別 EU 租戶看板(jobs.eu.lever.co)。 - 追蹤器
Hired狀態(與父專案states.yml對齊): 已接受的 offer 擁有獨立的正規狀態、慶祝徽章及#/tracker上的「拿到工作」橫幅;漏斗與轉換圖表將其計為已通過所有階段。 #/stats的累計分頁 — 唯讀中繼父專案的stats.mjs(累計追蹤器彙總、累計漏斗比率、掃描器總數、入口覆蓋)及salary-gap.mjs的薪酬觀察(期望 vs 職缺標註 vs 實際,依申請)。新路由GET /api/stats/lifetime與GET /api/stats/salary-gap— 零 token 外殼呼叫,無父專案時安全降級為{available:false}。- 16 個語系全部新增 28 個 i18n 鍵;說明指南 §14/§26 已在所有語言更新。
測試
- 新增 38 個單元測試(三個提供方對齊套件 + 中繼/狀態路由) — 共 1817 個。
[1.117.2] — 2026-07-06
對齊外殼呼叫的空追蹤器修復。 當追蹤器還沒有申請時,父腳本以代碼 1 和結構化 {error} JSON 退出;跟進節奏板和拒絕模式分頁把它顯示為「script-error」。兩條路由現在將其轉達為健康的空狀態(available:true, empty:true),UI 顯示誠實的「暫無內容」訊息。已對真實父專案即時驗證。
新增:無。
[1.117.1] — 2026-07-06
v1.117.0 加固(CodeQL 分診)。 三個外殼呼叫端點(GET /api/followup、POST /api/followup/seed、GET /api/stats/patterns)現在帶有共享的按 IP 限流器(每個請求產生子行程;環回時為 no-op)。新增到 CV 的 URL 文字擷取將標籤剝離到不動點,然後刪除所有剩餘的 </>——對 LLM 提示詞文字而言可證明完整的淨化。有效輸入行為不變。
新增:無。
[1.117.0] — 2026-07-06
父專案對齊包——把父 career-ops 的六項能力帶進 UI。 (1) #/followup 的跟進節奏板:來自 followup-cadence.mjs 的每申請緊急度(🔴/🟠/🟡/🔵)+ 播種跟進日期按鈕(followup-seed.mjs --backfill)。(2) 拒絕模式:統計的第四個分頁執行 analyze-patterns.mjs(唯讀)——結果構成、建議、各 ATS 供應商推進率。(3) 新增到 CV:CV Studio 卡片把 URL 或貼上文字變成僅基於該來源的 ATS 要點(僅建議、不寫入;URL 擷取有 SSRF 防護)。(4) 4 個新掃描提供方 — beesite、HigherEdJobs(RSS)、JibeApply(iCIMS)、softgarden——註冊表現有 50 個轉接器(45 EN + 5 RU),全部出現在 Scan 下拉選單。(5) Apply 清單新增淘汰項預掃描步驟。(6) reconcile 執行器(/api/run/reconcile)。外殼呼叫路由在無父腳本時誠實降級。
- 新路由模組
server/lib/routes/followup.mjs(第 31 個)+ 新路由 + 8 個 source/adapter 檔案。測試:新增 6 + 7;套件 1737 → 1750。新增 41 個 i18n 鍵 ×16。說明 §13/§17/§24/§26 擴充 ×16。
新增:GET /api/followup、POST /api/followup/seed、GET /api/stats/patterns、POST /api/cv-studio/add-entry、POST /api/run/reconcile。
[1.116.0] — 2026-07-06
用量計量重做 + 首個端到端元件測試。 AI 用量計量(v1.114.0)已正確固定:現在固定在左側邊欄底部(佔滿側邊欄寬度,與側邊欄同一表面),並在側邊欄底部預留與自身等高的空間,使選單永不被遮擋——導覽與版本頁尾始終在其上方自由捲動。它即時刷新(每 15 秒,以及分頁聚焦和路由切換時),每個視窗列現在顯示真實的 <權杖> · <預估費用>(進度條按 30 天視窗縮放),而非始終 100% 的「占比」。此外:CV 匯入器中一個持久的 typeof 屏障從根源關閉了反覆出現的 CodeQL 型別混淆誤報,新的 Playwright 端到端測試在真實瀏覽器中驅動兩個常駐元件。
public/js/lib/usage-hud.js+app.css、server/lib/cv-import.mjs。測試:tests/playwright-widgets.mjs(2 E2E)+tests/usage-hud.test.mjs(10)。說明 §6 擴充 ×16。
新增:無。
[1.115.0] — 2026-07-06
設計打磨(保守,保留珊瑚色品牌)。 對共享設計系統的一次輕量精修——不重構、不改調色盤。儀表板指標卡片現在在懸停時輕微抬起並帶上珊瑚色邊框(與快捷操作磁貼一致);內容卡片輕微抬起;primary / dark / danger 按鈕獲得靜止陰影與柔和的懸停抬升以增加層次;大數字用 tabular-nums 對齊;互動控件在 2px 鍵盤環後獲得柔和的珊瑚色聚焦光暈。所有動效都尊重 prefers-reduced-motion,光暈僅限於控件——絕非全域 *:focus-visible。
- 僅 CSS(
public/css/app.css);無標記、i18n、路由或 CSP 改動。測試:tests/design-polish-v1115.test.mjs(5)。已用 Playwright 即時驗證。
新增:無。
career-ops-ui v1.267.1 · page 4/9 · mirror of the project changelog for cvstart.org