{"id":49720695,"url":"https://github.com/fighter90/career-ops-ui","last_synced_at":"2026-05-28T00:02:44.104Z","repository":{"id":355260517,"uuid":"1227387407","full_name":"Fighter90/career-ops-ui","owner":"Fighter90","description":"Airbnb-styled web UI for the career-ops AI job-search pipeline. Search Greenhouse/Ashby/Lever + hh.ru/Habr Career, evaluate JDs, track applications — all from the browser.","archived":false,"fork":false,"pushed_at":"2026-05-08T23:52:05.000Z","size":2007,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-09T01:28:14.539Z","etag":null,"topics":["airbnb-style","ashby","career-ops","claude-code","express","greenhouse-api","hh-ru","job-search","lever","sse"],"latest_commit_sha":null,"homepage":"https://github.com/Fighter90/career-ops-ui","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Fighter90.png","metadata":{"files":{"readme":"README.cn.md","changelog":"CHANGELOG.es.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":"docs/ROADMAP.md","authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-05-02T16:02:09.000Z","updated_at":"2026-05-08T23:47:58.000Z","dependencies_parsed_at":null,"dependency_job_id":"2d497eab-839a-4d87-9813-4da21c9e9869","html_url":"https://github.com/Fighter90/career-ops-ui","commit_stats":null,"previous_names":["fighter90/career-ops-ui"],"tags_count":13,"template":false,"template_full_name":null,"purl":"pkg:github/Fighter90/career-ops-ui","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Fighter90%2Fcareer-ops-ui","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Fighter90%2Fcareer-ops-ui/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Fighter90%2Fcareer-ops-ui/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Fighter90%2Fcareer-ops-ui/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Fighter90","download_url":"https://codeload.github.com/Fighter90/career-ops-ui/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Fighter90%2Fcareer-ops-ui/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32963174,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-12T23:30:32.555Z","status":"ssl_error","status_checked_at":"2026-05-12T23:30:18.191Z","response_time":102,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["airbnb-style","ashby","career-ops","claude-code","express","greenhouse-api","hh-ru","job-search","lever","sse"],"created_at":"2026-05-09T01:14:45.416Z","updated_at":"2026-05-13T01:01:31.596Z","avatar_url":"https://github.com/Fighter90.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# career-ops-ui\n\n\u003e 用于 [career-ops](https://github.com/santifer/career-ops) AI 求职流水线的 Airbnb 风格 Web 界面。\n\u003e 在单个浏览器标签中搜索、评估、深入研究、申请和跟踪每个职位 — 而不是在 Claude Code、终端和 markdown 文件之间来回切换。\n\n[English](README.md) | [Español](README.es.md) | [Português (Brasil)](README.pt-BR.md) | [한국어](README.ko-KR.md) | [日本語](README.ja.md) | [Русский](README.ru.md) | **简体中文** | [繁體中文](README.zh-TW.md)\n\n[![tests](https://img.shields.io/badge/tests-284%20passed-brightgreen)](README.md#tests)\n[![playwright](https://img.shields.io/badge/playwright-12%20smoke-brightgreen)](#tests)\n[![node](https://img.shields.io/badge/node-%E2%89%A518-blue)](README.md#requirements)\n[![license](https://img.shields.io/badge/license-MIT-blue)](LICENSE)\n[![release](https://img.shields.io/badge/release-v1.9.1-blue)](https://github.com/Fighter90/career-ops-ui/releases/tag/v1.9.1)\n\n\u003e 📦 **v1.9.1** — 服务器精简为 130 行的编排器 + `server/lib/routes/` 中的 12 个路由模块。`/api/evaluate` 的 Anthropic 对等(两个 key 同时存在时优先)。多 CLI 桥接(`AGENTS.md`、`GEMINI.md`)支持 Codex / Aider / Cursor / Gemini CLI。**284 个 unit + 12 个 Playwright 烟雾测试**。完整 production-readiness 评估:[`docs/PRODUCTION-READINESS.md`](docs/PRODUCTION-READINESS.md)。可用于 single-tenant loopback 部署;LAN 暴露的 auth gate 在 v2.0 (P-12)。\n\n\n![career-ops-ui — vacancy search](./public/images/screen_vacancy_found.png)\n\n## v1.10.1 新增内容\n\n- **安全：SSRF 攻击面收紧。** `isValidJobUrl` 现在会拒绝 RFC1918、链路本地（包括 AWS IMDS `169.254.169.254`）、`0.0.0.0`、整个 127/8 回环范围、CGNAT `100.64/10` 和 IPv6 ULA / 链路本地。预览代理在每一跳进行 DNS 解析，地址落入私有范围时直接阻断 — 防御 DNS 重绑定。\n- **活动日志守纪。** 仅记录成功的状态变更 — 不再有 4xx 噪声。`profile.save`、`config.save`、`cv.import` 事件现已出现在动态中。\n- **韩语帮助正文修复。** `GET /api/help/ko` 现可正确提供 `ko-KR.md`（之前因文件名与语言代码不一致而静默回退到英文）。\n- **LLM 提示尊重 UI 语言。** `/api/evaluate`、`/api/deep`、`/api/mode/:slug` 与 apply-helper 会根据 `body.lang` / `Accept-Language` 注入 \"Respond in X\" 指令。SPA 自动为每次请求附上当前 locale。\n- **`/api/evaluate` 尊重 `mode:'manual'`** — 可将提示复制到 Claude Code，而不消耗 Anthropic 额度。\n- **`DELETE /api/pipeline`** 同时接受 `?url=` 与 `body.url`；当 URL 不在收件箱时返回 `404`（不再是静默 `200`）。\n- **`scripts/post-qa-cleanup.mjs`** — 重放 QA 回归后的清理清单；默认 dry-run，幂等。\n\n## 一键安装\n\n```bash\ncurl -fsSL https://raw.githubusercontent.com/Fighter90/career-ops-ui/main/bin/setup.sh | bash\n```\n\n此命令克隆两个仓库 (career-ops + career-ops-ui),安装依赖,并在 http://127.0.0.1:4317 启动服务器。\n\n## 为什么?\n\n[career-ops](https://github.com/santifer/career-ops) 是一个强大的基于 Claude Code 的求职系统:粘贴 JD → 获得 0-5 适配评分、ATS 优化的 PDF 和跟踪器条目。在 Claude Code 内部运行良好,但数据分散在 `cv.md`、`data/applications.md`、`reports/*.md`、`data/pipeline.md`、`portals.yml`、`config/profile.yml` — 容易丢失,难以浏览。\n\n`career-ops-ui` 在其上添加一个精致的 UI:\n\n- **浏览** — 像 CRM 一样浏览跟踪器、报告和流水线。\n- **触发** — 触发扫描 (Greenhouse / Ashby / Lever **以及** hh.ru / Habr Career) 并查看实时 SSE 日志。\n- **评估** — 通过 Gemini API 评估 JD 或获取 Claude 的复制粘贴 prompt。\n- **编辑** — 使用并排 markdown 预览编辑 `cv.md`。\n- **维护** — doctor、verify、normalize、dedup、merge — 每个一键完成。\n\n纯加法:`career-ops/` 内部不会更改任何内容。你的自定义保持不变。\n\n## 各页面功能\n\n| 页面             | 功能                                                                                                              |\n| ---------------- | ----------------------------------------------------------------------------------------------------------------- |\n| **Dashboard**    | 聚合计数 (apps / pipeline / reports)、平均分、按状态分类、最新 5 个 apps + 最新报告。                                       |\n| **Scan**         | **🌐 单个 🌐 Scan 按钮** — 一次性扫描所有已启用的来源(EN:Greenhouse / Ashby / Lever,RU:hh.ru + Habr Career)。实时 SSE 日志 + 带 stack/level chip 过滤器和 location / Remote-Hybrid / reloc / source 过滤器的可点击结果表。 |\n| **Pipeline**     | 对 `data/pipeline.md` 进行 CRUD。从 URL 直接跳转到评估。                                                              |\n| **Evaluate**     | 粘贴 JD → 如果设置了 `GEMINI_API_KEY`,运行 `gemini-eval.mjs`;否则返回 Claude 的复制粘贴 prompt。                       |\n| **Deep research**| 为指定的公司/角色生成完整的 `modes/deep.md` prompt。                                                                  |\n| **Apply helper** | 生成申请清单;实际的 Playwright 表单填写仍在 Claude Code 中的 `/career-ops apply` 中。                                    |\n| **Tracker**      | `data/applications.md` 上的可过滤表 (状态、分数、自由文本)。normalize/dedup/merge 一键按钮。                            |\n| **Reports**      | 浏览和阅读 `reports/` 中的每个报告,带解析的 header (Score / Legitimacy / URL)。                                       |\n| **CV**           | `cv.md` 的实时 markdown 编辑器,带并排预览 + sync-check。                                                              |\n| **Profile**      | `config/profile.yml` + 原型的只读视图。                                                                              |\n| **Health**       | 所有 setup 检查在 OK / OPTIONAL / FAIL 徽章中 + 运行 `doctor.mjs` 和 `verify-pipeline.mjs` 的按钮。                       |\n\n## 要求\n\n| | |\n| --- | --- |\n| **Node.js** | ≥ 18 |\n| **career-ops** | 已克隆并 onboard |\n| **可选** | `.env` 中的 `GEMINI_API_KEY` 用于一键 JD 评估 |\n| **可选** | 如果在俄罗斯境外运行并希望 hh.ru API 停止返回 403,请使用 `.env` 中的 `HH_USER_AGENT` |\n\n## stack 和 level 的 chip 过滤器\n\n职位表包含以下内容的 multi-select chip:\n\n- **Stack:** PHP, Symfony, Laravel, Go, Rust, Node.js, TypeScript, Python, Ruby, Java, C#/.NET, C++, Backend, Frontend, Fullstack, Microservices, High-load, Distributed, DevOps/SRE, Data, ML/AI, Mobile, Security, Database, Cloud, API\n- **Level:** Lead/Tech Lead, Architect, Manager, Principal/Staff, Senior, Middle, Junior\n\n每个类别内多选 (OR),类别之间交集 (AND)。显示计数;只显示有结果的 chip。\n\n## 完整文档\n\n完整架构、API 参考、高级配置和安全注释 — 请参阅 [英文 README](README.md)。\n\n## 许可证\n\nMIT。基于 [santifer](https://santifer.io) 的 [career-ops](https://github.com/santifer/career-ops) 构建。\n\n---\n\n## 🌍 Getting Started — 安装后的第一步\n\n一键安装后,你有两个克隆的仓库和脚手架文件 (`cv.md`、`config/profile.yml`、`portals.yml`、`data/applications.md`、`data/pipeline.md` — 带 **EDIT ME** 标记)。首次启动时 Health 页面应全部为绿色。用真实数据替换占位符:\n\n### 1. 创建 CV (`cv.md`)\n\n- **A — 粘贴现有简历** 到 `career-ops/cv.md` 中,使用干净的 markdown。\n- **B — 从 UI 上传:** 点击 **CV** → **📁 上传简历** → 选择 `.md`/`.txt` → 检查预览 → 点击 **💾 保存**。\n- **C — 将 LinkedIn 给 Claude Code:** 在 Claude Code 中运行 `/career-ops`,请求「提取我的 CV 并写入 cv.md」。\n\n### 2. 个人资料 (`config/profile.yml`)\n\n替换占位符:姓名、邮箱、位置、LinkedIn、目标角色、**archetypes** (最重要)、薪资范围。\n\n### 3. 扫描器 (`portals.yml`)\n\n调整 `title_filter.positive`/`negative`。已预设 3 个 board (GitLab、Vercel、Linear)。更多内容:[`docs/portals-examples.md`](docs/portals-examples.md)。\n\n### 4. (可选) Gemini API key\n\n```bash\necho \"GEMINI_API_KEY=your-key\" \u003e\u003e career-ops/.env\n```\n\n### 5. 验证并开始\n\nHealth → 全部为绿。**🌐 搜索所有来源** → 带 chip 过滤器的表格 → 复制 URL → **Pipeline** → **Evaluate**。\n\n完整文档 (架构、API、安全):[英文 README](README.md)。\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffighter90%2Fcareer-ops-ui","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffighter90%2Fcareer-ops-ui","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffighter90%2Fcareer-ops-ui/lists"}