求职工作台 · 使用手册
English(主版):usage-guide.md | 本文件是简体中文同步版,内容与主版一致。
从零开始把工作台跑起来,以及日常使用的完整说明。
遇到问题先看最后的「常见问题」,覆盖了黑屏、端口占用等已踩过的坑。
一、一次性环境准备
只需做一次。已配好可跳过。
必装
| 软件 | 用途 | 检查命令 |
|---|---|---|
| Python 3.12+ | 后端与 CLI 脚本(3.12 是支持与 CI 验证的基线;3.9+ 或可运行但未验证) | python --version |
| Node.js 18+ | 前端构建 | node --version |
| Chrome 或 Edge | PDF 生成(headless 渲染) | 一般自带 |
安装依赖(各一次)
# 后端依赖(上限已随 3.12 基线逐步放宽、每条跑全量回归后才合;当前值见 web/backend/requirements.txt)
cd <仓库目录>\web\backend
pip install -r requirements.txt
# 后端启动时导入领域包(jobws_core),缺了 uvicorn 会直接退出:
pip install ../../packages/jobws-core
# 前端依赖
cd <仓库目录>\web\frontend
npm install
初始化你的工作区(已有 personal/ 的跳过)
python tools/jobws.py init --target personal --domain hvac-cooling
插件换成你专业的:
--domain可选值见docs/README.md的「领域插件」表(含适用人群)。
把 AI 工作流分发到你的 AI CLI(用桌面安装包的用户也要跑一次)——评分 / 投递 / 追踪这些 AI 技能靠这一步分发,不跑的话 Web 界面正常但 AI 侧没有工作流:
python tools/jobws.py skills install --target user
只想先看看界面长什么样、不想先填任何真实信息的话,用 --demo:
python tools/jobws.py init --target demo --demo
它会额外铺一份占位数据(8 条投递 / 3 场面试 / 2 位联系人 / 1 个 Offer /
3 场宣讲会 / 6 道题 / 6 封邮件 / 7 张解析卡 / 1 份简历),公司与人名全是假的,可以直接上手体验或截图;
同时会默认装入 software-backend 插件(demo 数据的方向字段依赖它)。
启动后在右上角工作区下拉里选 demo 即可。
填档案:AGENTS.md(评分的前置条件)
init 之后,工作区根目录会生成 AGENTS.md(模板与逐项说明见 template/AGENTS.example.md)。第三节「硬门槛事实」必须填——学历 / 专业 / 届数 / 英语 / 城市,是岗位评分工作流硬门槛判定的唯一事实源:
- 不填的后果:字段停留在
[待填]的岗位会被判成「待补档案」——不打分、不终止,但也没有结论; - 填好之后:硬门槛按事实判定,只有明确不满足才终止;
- 城市要求分两级:硬性不可行(要求本地户籍、必须长期驻外)才判不通过;"本地优先"这类偏好只在「培养与稳定性」里轻度扣分(-3 / -5,合计不超过 5),不再一票否决。
第五节是自定义红线(默认两条:简历动词经得起追问、不编造经历),按需追加。
二、日常启动:Web 界面
方式一:一键启动(推荐)
cd <仓库目录>\web
.\start.ps1
脚本会自动:清掉被占用的端口 → 启动后端(8765)→ 启动前端(5173)→ 等待就绪 → 自动打开浏览器。
关闭方式:关掉脚本所在的控制台窗口,两个服务一起停。
方式二:手动启动(需要看后端日志时用)
开两个终端:
# 终端一:后端
cd <仓库目录>\web\backend
python -m uvicorn main:app --port 8765
# 终端二:前端(Windows 必须用 npm.cmd,直接跑 npm 会静默失败)
cd <仓库目录>\web\frontend
npm.cmd run dev
访问地址
| 地址 | 是什么 |
|---|---|
| http://localhost:5173 | 工作台界面(日常用这个) |
| http://localhost:8765/docs | 后端 API 交互文档(FastAPI 自动生成) |
前端把
/api请求代理到 8765,所以浏览器只跟 5173 打交道。
方式三:双击 exe(免环境,适合给别人用 / 快速查看)
构建产物在 web/backend/dist/job-workbench-backend/,双击其中的 job-workbench-backend.exe:
- 没服务在跑 → 启动后端 + 自动打开浏览器(黑色控制台窗口是服务日志,关掉=停服务)
- 服务已在跑 → 直接打开浏览器,不会重复起服务
- 端口被其他程序占用 → 人话提示,窗口保持打开(不会闪退)
⚠️ exe 是"干净分发物",不读你的个人数据。便携版的工作区在 exe 旁边(
personal/,默认为空)——这是刻意设计,避免你的求职数据随安装包散播。自己日常用方式一/二(数据在仓库根);exe 用来验证产品或发给别人。硬要 exe 读自己的数据,设环境变量JOBWS_DATA_DIR指向仓库根(不推荐,容易数据分叉)。
重新构建 exe:
powershell -ExecutionPolicy Bypass -File scripts\build_backend_exe.ps1
桌面安装包(Electron 壳,v0.1.1 起)
不想配环境可以用 Release 里的 job-workbench-setup-*.exe(Electron 窗口 + 打包好的后端,双击装完即用)。数据目录:安装版在 %APPDATA%\job-workbench\personal\,绿色版(backend exe 旁有 portable.txt)在 exe 旁 personal\——卸载安装版不影响 %APPDATA% 里的数据。
安装包现在是向导式:可以自选安装位置,并选择「为所有用户 / 仅为我」。升级旧版时请沿默认选项(「仅为我」+ 原目录)——选「所有用户」会装到 Program Files 并与旧安装分叉。静默安装仍可用:/S(/D=<目录> 可指定位置)。
桌面版可以调界面缩放:设置页的「界面大小」滑块(拖动即预览,整个界面含文字一起缩放),或 Ctrl + = 放大、Ctrl + - 缩小(0.5 级步进,约 0.58x–1.73x)、Ctrl + 0 复位;级别会记住,重启沿用,滑块与快捷键互相同步。
一键重建安装包(前端 dist → PyInstaller 后端 exe → NSIS):
powershell -ExecutionPolicy Bypass -File scripts\build_desktop.ps1
产物在 web/electron/release/job-workbench-setup-<版本>-win64.exe(产品名英文化为 Job Workbench:安装包与开始菜单项是英文;窗口标题跟随界面语言)。冒烟:<安装包> /S 静默安装到默认的「仅为我」位置(/D=<目录> 可指定位置),启动后验证 http://127.0.0.1:8765。
三、Web 界面八个页面
看板(首页)
打开就是它。回答三个问题:投了几家、几家还在流程中、接下来七天该干什么。
- 顶部四张统计卡:投递总数 / 流程中 / 近七天待办 / 已过截止(点击可下钻到追踪表)
- 投递漏斗:每个阶段多少人(待投→已投→笔试→…→签约),点柱子按阶段下钻
- 待推进:健康度异常(紧急/逾期/停滞)的活跃岗位清单,每条带具体理由,点击下钻
- 近七天待办:下次动作日期或截止日期落在未来 7 天的记录(可一键顺延 7 天)
- 近 7 天宣讲会:宣讲会 / 招聘会里时间落在未来 7 天的活动(点条目直达「准备」页的宣讲会页签)
- 已过截止提醒:还停在「待投」但截止日期已过的记录(红色)
- 静默提醒:长期无进展的活跃岗位(默认超 14 天)
- 周期复盘:阶段转化率(从时间线重建)、停留中位天数、失败归因与失败原因聚类
追踪表
所有投递记录的表格。六件事:
- 筛选与搜索:按阶段 / 方向 / 批次过滤,关键字搜公司、岗位或备注
- 排序:下次动作日期 / 评分 / 停留天数 / 健康度(紧急 > 逾期 > 停滞 > 正常,徽章悬停显示理由)
- 改状态:点某行的「当前阶段」下拉框直接改(待投→已投→笔试…),改完自动保存
- 新增与批量导入:右上「新增投递」逐条录入;「批量导入」粘贴或上传 CSV,先出差异预览(新增/重复/错误分色,带行号与原因),有错误行时禁提交
- 状态原因:每行就地编辑;进入「已挂 / 已放弃」必须填原因,且这两态一旦进入就不可再改阶段(想重新投要新建一条)
- 行展开:查看该记录的变更时间线与当前阶段停留天数
两条约束(CLI 与网页同源,自动拦): 1. 终态不回退:已挂 / 已放弃后「当前阶段」锁定,只可补状态原因与备注 2. 同公司+岗位去重:重复录入会被拦截并提示既有记录 id(挂了之后再投一次则放行)
方向下拉框的选项来自工作区装入的领域插件(
config/directions/),不是写死的。
岗位池
管理你看过的岗位。每张卡片显示公司_岗位、评分、档位。
- 新建岗位:粘贴完整 JD 原文(职责+任职要求)系统原样存档;或粘贴网页链接自动抓取正文(需登录 / 反爬 / 纯 JS 渲染的页面会明确提示手动粘贴,不假装成功)
- 点开详情:左边 JD 原文,右边解析卡
- 资格硬门槛(置顶优先):解析卡顶部的「资格硬门槛」卡片先于分数展示——通过(绿)/ 不通过(红)/ 待补档案(琥珀:档案缺事实,不打分、不终止,卡片点名缺哪些字段并指向 AGENTS.md)/ 待确认(中性描边)四态。不通过时明确标红置顶,这时分数是次要信息(说明资格不够,别投)
- 评分下钻:四维(技术/经历/方向/培养)每条可点开,展开逐条命中明细——每条带能力分层(Primary/Secondary/Weak)+ 证据标签(精确/模糊/语义徽章)+ 命中说明。想知道"为什么得这个分"点开看
- 简历差距面板:该 JD 与你简历的差距清单,区分「可召回」(母版里有)与「真实缺口」(只能补经历)
- 解析卡:评分由 AI 在 CodeBuddy 里完成后写入
解析卡.md,这里自动显示四维度进度条 + 总分 + 档位 - 还没评分的岗位显示"尚未生成解析卡"及操作指引——网页不做评分,评分是 AI 的工作
简历工坊
双模式:
- 标准版式(数据驱动):左结构化表单、右 A4 实时预览;页面直接新建版本;生成 PDF 后回显 ATS 校验与纸型检查;含防超页护栏
- 版式与强调色:版式下拉内置经典 / 紧凑 / 强调三套(全部单栏、过 ATS 校验;紧凑适合内容多、要压一页);强调色四档(石墨灰 / 商务蓝 / 深墨绿 / 酒红)与版式自由组合,切换即刷新预览,生成的 PDF 与预览同源。命令行等价物:
resume render --template std_compact --resume-accent 酒红 - 一键导入:上传 PDF / Word(.docx) / Markdown / 纯文本 → 抽取成结构化字段。抽取而非生成:模型未抽到的字段标黄、疑似补全的标红,核对页逐段确认后才落盘
- AI 改写建议:BYOK 模型只改写既有事实的表述,反编造护栏不过不能采用
- 导出 Word:零依赖
.doc,方便往网申系统粘贴文本(排版以 PDF 为准) - 高级模板(手写 HTML 精排版):只读浏览与一键生成
底部还有版本谱系:哪版简历投了哪些岗位、各走到哪一步。
准备
投递之前的事归一处——宣讲会、题库与笔记都在这里(2026-09-18 从「进展」页迁来:那页的定位是"投递之后",这两件恰恰在投递之前):
- 宣讲会 / 招聘会:活动时间、形式、地点与收获,可导出
.ics(提前 1 小时提醒);不推进任何阶段。看板「近 7 天宣讲会」点一下直达这里 - 题库(两个视图):「我的题库」= 自建可编辑的
questions.csv(领域 / 科目 / 状态未看·看过·会了/ 答案要点),可从03_面试准备/**/*.md只读解析 → 预览 → 确认导入(两段式);点任意一行打开详情,在弹窗里改答案要点、标记三态、调难度、改标签与备注——同样先看差异表再确认(确认前不落盘,取消不留痕);「被问过的」= 面过的问题按公司 + 岗位归集、关键词检索——面试前先过一遍这家公司问过你什么;命令行可jobws bank export --csv <文件>导出整个题库、jobws bank import-csv <文件>从 CSV 导入(预览后凭令牌落盘;导出再导入是幂等的)、jobws bank due看今日待复习(未看恒在;看过 3 天 / 会了 14 天;空/脏数据保守计待复习)、jobws bank wrong看错题本(--add/--remove <题目id>标记——标记就是给「标签」加/去「错题」,界面里在题目详情改标签同效);jobws bank delete删题——单题--id Q012,误导入想整批撤回用--origin 导入 --today(也可按--domain/--subject/--keyword/--company组合)——同样先给「将删哪几行」的预览,确认后凭令牌落盘,落盘前把整表快照写到工作区之外(默认<快照根>/<工作区名>/question-deletes/questions-before-delete-<时间戳>.csv,jobws apply会打印确切路径;恢复 = 回到删除前一刻的整表状态,把那份 CSV 复制回05_投递追踪/questions.csv——删除之后的其它改动会一并被冲掉)。落盘前还核对行指纹(id + 题目 + 领域 + 科目 + 创建日期):id 会被复用,预览之后那一行被改过或被新题顶替就整体拒绝、要求重新预览。界面里在题目详情弹窗底部点「删除这道题」同效(批量删只在命令行) - 新增题目(2026-09-21):面板顶部的「新增题目」自拟一道题入库——填领域 / 科目 / 难度 / 答案要点,先预览将写入的字段、确认后落盘(与 CLI
jobws bank add、MCPpreview_add_question同一份校验);列表每行还会带「待复习」与「错题」徽章——到期按复习间隔算(未看恒在、看过3 天、会了14 天),鼠标悬停徽章能看到"为什么算到期";错题按标签判定(与训练面板同一套标签口径) - 训练(题库的「练」入口):抽题 → 盲答(答案默认折叠)→ 展开对答案 → 自评三态 / 标错题 → 下一题。三种模式:重练队列(错题 ∪ 今日待复习)、只错题、随机;可按领域 / 科目 / 状态 / 关键词收窄。写操作零新增(自评改「状态」、标错题改「标签」,都先看差异再确认);命令行同效:
jobws bank drill --mode due|wrong|random --n 5。三处口径要留意:本轮存在会话里——每写一题工作区指纹会触发整页刷新,抽到的题与进度(含折叠状态)会原样回来,不会被刷新清空;「未看」在状态本来就是未看时不发写请求(没有可写的差异),直接进下一题;「看过」按复习规则不写「最近复习」,该题因此仍在重练队列里(未看 / 看过但没记录 → 保守计待复习),要让它 14 天后才再出现就点「会了」。一轮走完的结束卡会给出本轮真正落盘的写入数(取消 / 预览失败 / 冲突不计)与题库三态现状——"会了"在涨才是进度。可以全程用键盘:空格 / Enter 看答案、1 / 2 / 3 三态自评、W 标错题、← / → 上一题 / 下一题、Esc 关掉确认卡(请求在飞时 Esc 不响应);焦点在输入框或下拉里时不抢键——打开「一轮题数」下拉后空格不会变成"看答案",盲答纪律不被自己破坏 - 笔记:
03_面试准备与04_知识库的 Markdown 直接读——左侧目录树(README显示为「目录说明」、_模板_/_示例_淡显、空文件与读不了的文件带标记、可按文件名过滤),右侧渲染成正文(标题 / 列表 / 勾选框 / 表格 / 代码块 / 引用),长文右侧有「本页大纲」,超 256 KB 截断并显式告知。改内容用自己的编辑器,切回来 10 秒内自动刷新(并回到原页签与原文件);勾选框可点——点一下弹出「原行 → 新行」差异,确认后只改这一行的一个字符,文件其余内容一个字节都不动(走全站唯一的两段式写通道;预览之后这一行若被改过则拒绝并要求重新预览);全文搜索可按关键词搜文件名与正文,点结果直接打开并滚到命中行(命中过多只列前 50 条并说明;读不动或超过 256 KB 的文件会列出"没搜全",不静默少给)
进展
投递之后的主战场,四个子 Tab:
- 面试:三段式记录(问题 → 回答要点 → 复盘),48 小时内待定的琥珀高亮,一键导出
.ics日历 - 邮件:往来邮件台账(面试邀约 / 笔试通知 / 拒信…)——可关联投递记录、标签行内改;有 Message-ID 的邮件给「打开原邮件」(Gmail 搜索深链),无可用深链的邮箱(Outlook / QQ / 163 等)给「复制主题去邮箱搜索」的降级提示;会议链接列承接解析出的入会地址(腾讯会议 / Zoom / Teams / Meet…);邮件不会自动改阶段
- 联系人:招聘方联系人跟进节奏,超期琥珀提醒,一键「已联系」
- Offer 对比:多个 offer 的已知事实并排,只并排、不推荐
素材库
事实库(00_事实库/)的只读浏览(由 CLI / AI 生成维护):事实卡以正文排版显示(表格 / 勾选框 / 引用 / 代码块),超 256 KB 截断并显式告知;外部改完切回来 10 秒内自动刷新。简历相关文件已迁往「简历工坊」(2026-09-03),此处不再重复展示。
设置(Provider)
导航栏「设置」页配置 AI Provider(BYOK,自带 key):
- 服务商预设:从下拉选一家(DeepSeek / 智谱 GLM / 通义千问 / Kimi / 硅基流动 / OpenAI),地址模板自动填入;也可选「自定义(兼容 OpenAI)」手填任意兼容端点。地址写法有问题时只给非阻断提示(例如通义千问必须用
…/compatible-mode/v1、不要把/chat/completions当 base_url 填),不拦你保存——很多网关的路径本就是自定义的。 - Base URL:OpenAI 兼容端点(含
/v1,如https://api.orcarouter.ai/v1) - API Key:只存本地,界面只显示脱敏后的末尾 4 位
- 默认模型:在这里设一次,简历导入 / 简历改写 / 邮件 AI 三处共用;三处仍可就地临时改,但那是本地覆盖,不会改掉这里的默认值。留空则三处都要求手填。
- 测试连接:调
{base_url}/models验证 key 有效并列出模型(同时给出总数与"只显示前 N 个"的说明);返回的模型名是可点的小胶囊,点一下即填入默认模型。拉不到列表不代表不能用——有些服务没实现/models,直接手填模型名即可。出网 HTTPS 默认校验证书(抓取 JD、简历改写同一策略):本机证书库加载失败时会拒绝连接并提示修证书库(certmgr.msc),不会静默跳过校验——key 不会在未校验的连接上发出。显式降级用JOBWS_HTTP_TLS=insecure(不推荐) - 数据与隐私:整包导出 zip、快照备份到系统用户目录、快照一键还原(先演练后落盘)、诊断包导出(版本 / 平台 / 自检摘要 / 日志尾部——不含工作区数据与凭证)、打开数据目录、无遥测声明
- 到点提醒:开关 + 「提前几天」(3 / 5 / 7 天);通知按事项每天一次,点通知直达追踪表对应记录(详见「进展」章的完整口径)
- 设置页可搜索(含
@modified只看改过的项)与单项还原;改动项带标记 - 导成 Obsidian 笔记(命令行):
python tools/jobws.py export --obsidian <目录>——八张 CSV 各成一个目录、每行一笔记,frontmatter 带上原表全部字段(供 Obsidian Bases / Dataview 过滤排序),题库笔记带 spaced-repetition 卡片语法;输出目录带时间戳、不覆盖旧导出、不改工作区(是快照,不是同步)。加--notes另把03_面试准备/04_知识库/00_事实库的 Markdown 投影成笔记(保留目录层级、全量不截断、正文按原意搬运),这样手机上除了刷题也读得到材料全文;训练卡目录不重复投影(它已在题库里);隐藏文件(草稿、原子写临时名等)按设计跳过、不入清单,读失败与超 2 MiB 的单篇跳过并列进导出目录的 README;导出目录必须在工作区之外(落在里面会直接报错)。更新手机端:加--sync-to <固定的库目录>,把新快照镜像进一个固定名字的 Obsidian 库——白名单条目(八张表目录 /README.md/jobws.base/ 材料目录)按托管语义镜像(会被覆盖;源里删了的题库里也删,有删除时必须加--yes确认,否则拒绝执行、库目录零改动);白名单之外的文件与库里的.obsidian/一个字节不动;只差复习注释(<!--SR:…-->)或空白(空行 / 行尾空格)的笔记不覆盖——前者是手机刷出的进度,被覆盖就归零;正文真改了才更新(那篇笔记里的卡进度归零)。没有强制覆盖开关:确要对齐就删掉库目录里对应文件后重跑(会被当「新增」复制过去)。每次先打印「新增 / 更新 / 删除」计划再执行,--dry-run只看计划不改库;升级版本后第一次同步先--dry-run(渲染模板若变会整库更新、所有卡进度归零)。更新的完整顺序(手工拷贝时):① 手机库拷回电脑、覆盖电脑上的库目录(把进度带回来)→ ② 跑同步 → ③ 把库目录拷回手机;用网盘双向同步则该往返自动完成 - 还没有 API Key?:未存 key 时,页面会给出一个推荐 Provider 的注册入口,以及一个「一键填入该 Provider 端点」的按钮(预设值只在源码里定义一处)。这个入口在界面上明确标注为推广链接——通过它注册会给本项目作者返佣,你的价格与权益不受影响;点击只是打开网页,不会有任何数据从本应用发出。该入口当前指向 OrcaRouter。
本工作台的 AI 判断默认由 AI CLI(CodeBuddy 等)完成,Provider 是可选的 BYOK 增强入口(简历导入 / AI 改写用)。
只读邮箱拉取(可选)
如果你的邮箱支持 IMAP,工作台可以把最近的招聘邮件拉回来,省掉逐封复制粘贴。在设置页 → 「邮箱只读拉取」里配置(填 IMAP 授权码,不是网页登录密码;多数邮箱要先在网页版设置里开启 IMAP 服务)。
支持哪些邮箱:配置区顶部是服务商下拉——QQ 邮箱 / Foxmail、网易 163、网易 126、yeah.net、Gmail、Outlook / Hotmail、阿里云邮箱、新浪邮箱、搜狐邮箱,另加「其它(手工填写)」。选中即带出服务器与端口,你自己改过之后就不会再被覆盖;也可以只填邮箱地址、服务器留空按域名推断。每个服务商自带就地引导(去网页版哪里开、授权码 / 应用专用密码怎么拿);163 / 126 / yeah.net 另有一条硬要求——客户端必须在打开文件夹之前声明身份(IMAP ID),本工作台会自动完成,你不用管。Outlook / Hotmail 个人账号暂不支持:微软自 2024-09-16 起停用基本认证,第三方客户端必须走 OAuth2,而本工作台目前只有「用户名 + 授权码」,所以界面上直接标注并说明原因,而不是留一个填了就错的输入框(可行性调研见 OAuth2 连 IMAP 的可行性)。测试连接成功后可以点「读取可用文件夹」拿候选(只读 LIST,点一次连一次),点一下填入、仍可手填。
它怎么工作、以及它不会做什么:
- 只读:连接使用
SELECT (readonly)与BODY.PEEK——不发信、不标已读、不移动、不删除任何邮件。 - 只在点击时连接:只有你点「从邮箱拉取」时才会连一次邮箱——没有后台定时器、轮询或连接保活。
- 凭证默认存进系统凭据管理器:桌面版把授权码写进 Windows 凭据管理器,工作区里的
config/imap.json只保留一条引用;界面与错误消息里脱敏,也不会进入导出 / 备份 zip。源码 / CLI 形态(或显式JOBWS_CREDENTIAL_STORE=plaintext)是明文回退:那时授权码就写在<工作区>/config/imap.json里,能读到你用户目录的进程都能读到它——请把工作区当敏感目录看待,不要放在同步盘或公共共享里。桌面版读到旧明文会自动迁移进凭据管理器;迁移写失败时明文原样保留(绝不丢钥匙)。换电脑、换 Windows 账户,或把工作区目录拷到别的机器之后,系统里取不到这条引用——应用会明确提示「重新保存」,而不是假装成「还没配置」。需要「忘掉」这把钥匙时,设置页可以直接清除已保存的凭据——系统存储里的条目与配置文件里的引用会一并删除(之后再用需重新输入)。 - 默认校验服务器证书:连接会对邮件服务器证书做系统证书库校验。如果本机 Windows 证书库有损坏条目,
create_default_context()会失败、连接被拒绝(授权码不能在未校验的连接上传输)。确认了解风险——连接可能被中间人截获——后,可显式设置环境变量JOBWS_IMAP_TLS=insecure跳过校验。 - 默认 dry-run:拉取只列出邮件,在你逐条确认建议之前不会往追踪表写任何东西。
常见流程:投递追踪 → 「从邮箱拉取」 → 选时间范围(最近 7 / 30 / 90 天)→ 本地关键词筛选 → 点一封邮件 → 核对解析出的建议 → 确认写回。正文的三种口径界面上都会标注:拉取列表是原文(保留引用与签名、超 140 字截断);点开后预填的是完整原文(后端上限 4000 字,顶到上限标「已截断」);✨建议卡里的「出处」是摘录(已去掉引用与签名、仅用于解析)——三处不同是刻意的,不是数据丢了。如果这封邮件对应的投递还没记录,空态里会直接给一个「创建记录」表单(当前阶段默认按邮件内容推断)。
拉取列表里的邮件有三条去向:点邮件正文 = 走「解析 → 建议 → 确认」更新投递状态;点 ✨ = 就地展开解析建议(时间 / 截止事项 / 链接有效期 / 会议链接 / 建议阶段 / 对应岗位,共六类,每条都带原文出处与把握程度,逐条确认才写入——邀请类邮件优先按日历附件解析,比正文正则可靠);点右侧的「+」小图标 = 把这封邮件的元数据记入邮件台账(主题 / 发件人 / 日期 / Message-ID)——之后到「进展 → 邮件」里补标签与关联,不用再手打一遍。
解析建议里,把握程度为「需核对」的取值(原文没写年份、相对日期如「明天」「本周五」)必须勾选「我已核对取值」才允许写入;会议链接卡片可以直接复制或打开,写进台账后也能在「进展 → 邮件」里再次打开或复制。解析建议只在拉取流程里出现——手工粘贴的正文没有日历附件,仍走「粘贴邮件」的原有解析对话框。配置了 BYOK Provider(设置 → Provider)之后,底部还会出现可选 AI 增强:填模型名后手动跑一次,同一条建议链路、一律标「AI」且同样需要你核对——AI 只产建议,绝不直接写入。
正文里「请在 X 前完成在线测评 / 笔试」这类句子会被识别为截止事项(第五类候选):卡片上带任务名(如"完成在线测评")与日期,确认后同时写入投递记录的「下次动作日期」与「下次动作」。这两个字段正是到点提醒(看板「近七天待办」与系统通知)读的,所以倒计时会自动出现,不需要额外设置;相对日期支持「今天 / 明天 / 后天 / 大后天 / 本周X / 下周X」(后两者按周一为起点),算出的日期若已过去,那就是"已过期"信号,按「需核对」提示你确认。「N 天内 / N 个工作日内 / 链接 N 小时内有效」这类时长表达以邮件发出的那天为基准(三天前收到的邮件今天再看应当已经过期),工作日跳过周末、不跳法定节假日;「链接…有效」与「要交的东西」是两类候选(前者是链接会失效,要你复制保存)。
到点提醒的完整口径(桌面端):设置页可调「提前几天提醒」(3 / 5 / 7 天,默认 3)。满足任一条就发一条系统通知:已过期(含「截止日期已过仍待投」与「下次动作日期已过」两类,按过期天数排在前)、提前 N 天内的待办(今天到期的与还剩几天的在正文里分开写)、近 7 天宣讲会。去重是按事项、每天一次——同一条今天报过就不再报,但今天新出现的照样会报(旧口径"一天只报一次"会把新出现的截止项漏掉)。点通知会跳到追踪表并自动展开那一条,不用自己找。应用内容区顶部还有一条常驻提醒条(读同一个端点、受同一个开关约束):打开应用就能看到「N 条已过期 / 近 N 天 N 条待办 / N 场宣讲会」,点一下跳到对应页面;没有到点事项时它不出现、也不占位。关掉开关,通知与提醒条一起停;关窗即停,没有后台服务、不建托盘。
四、让 AI 干活:jwb-jd / jwb-apply 工作流
网页负责看和记,判断类的工作交给 AI。在 CodeBuddy 里用自然语言:
接进别的 AI 宿主(MCP,可选)
工作台还能作为一个 MCP 服务接进支持 MCP 的其它 AI 宿主(Claude Code / Codex / Gemini CLI 等):AI 能读投递记录、岗位池与看板,并在你确认之后写入 (先给差异表,你点头才落盘)。
- 安装与三种宿主的配置形态:
docs/mcp-integration.md(配置键名按宿主不同,别照抄) - 四个入口(命令行 / AI 宿主 / 编辑器插件 / 桌面界面)各能做什么:
docs/four-ends.md
解析一个岗位(jwb-jd 工作流)
把 JD 原文贴给我,或者说"解析这份 JD"。AI 会:
- 在
personal/01_岗位池/<公司>_<岗位>/存 JD 原文 - 跑硬门槛过滤(学历→专业→届数→英语→城市,对照
personal/AGENTS.md) - 通过后四维度评分(技术30/经历25/方向30/培养15),回查事实卡核验
- 校验加总并输出档位(75–100 强烈投 / 60–74 投 / 45–59 斟酌 / 30–44 大概率跳过 / 0–29 不投)
硬门槛不过会直接拦下,不打分不写材料。比如对外语有硬性要求的岗位会被你的外语红线拦住。
生成投递包(jwb-apply 工作流)
说"给 XX 岗位生成投递包"。AI 会:选对应方向的简历版本 → 按需微调四处(项目事实不动)→ 生成 PDF → ATS 校验(页数/文本层/关键事实)→ 归档到 05_投递追踪/applications/ → 写入追踪表 → 列出改动清单交你确认后 git 提交。
更新进展(jwb-track)
面试完说"把 XX 更新到一面",或直接在网页追踪表里点下拉框。
改简历后重新出 PDF(jwb-resume 工作流)
说"重建简历 PDF",或命令行:
python tools/jobws.py resume --workspace personal --version hvac
五、CLI 命令速查(不用网页时)
所有命令在仓库根目录执行。--workspace personal 可省略(默认就是它)。
# 追踪表
python tools/jobws.py track list # 全部记录
python tools/jobws.py track list --due-within 7 # 未来 7 天到期
python tools/jobws.py track list --stage 笔试 # 按阶段筛
python tools/jobws.py track add --company "某公司" --role "岗位" --direction hvac --batch 正式批 ...
python tools/jobws.py track update --id A001 --stage 一面 --next "准备口述" --next-date 2026-09-10
python tools/jobws.py track history --id A001 # 变更时间线
python tools/jobws.py track import --file 待导入.csv --dry-run # CSV 批量导入(只预览差异)
python tools/jobws.py track import --file 待导入.csv # 预览通过后写入
python tools/jobws.py track interview add --app A001 --round 一面 --questions "..." # 面试记录
python tools/jobws.py track contact add --name "张工" --app A001 # 招聘方联系人
python tools/jobws.py track offer add --company "某公司" --monthly "..." # Offer 事实
python tools/jobws.py track mail add --subject "面试邀请(一面)" --app A001 --tag 邀约 # 邮件台账
python tools/jobws.py track mail list --app A001 # 某条投递的往来邮件
python tools/jobws.py track check # schema 自检(坏文件隔离)
# 投递漏斗看板(Markdown,含周期复盘与失败原因聚类)
python tools/jobws.py report --stdout
# 简历 PDF + ATS 校验
python tools/jobws.py resume --workspace personal # 全部版本
python tools/jobws.py resume --version hvac # 指定版本
python tools/jobws.py resume render --workspace personal # 数据驱动标准版式
python tools/jobws.py resume render --template std_compact --resume-accent 酒红 # 换版式 + 强调色
# JD 解析卡评分校验
python tools/jobws.py jd "personal/01_岗位池/<目录>/解析卡.md" --domain hvac-cooling --direction hvac
python tools/jobws.py jd --gap --resume hvac "personal/01_岗位池/<目录>/解析卡.md" # JD↔简历差距
上文的阶段名(
笔试、一面……)会原样写进你的数据文件,所以界面与文档里保留中文;它们按固定词表校验(STAGES,定义在jobws_core.tracker),不能简单改成英文。
六、数据在哪、怎么备份
所有数据都是纯文本文件,在 personal/ 下:
| 目录 | 内容 |
|---|---|
00_事实库/ |
项目/实习事实卡——唯一事实源 |
01_岗位池/ |
每个岗位一个目录:JD 原文 + 解析卡 |
02_简历工坊/ |
简历 md + HTML 模板 + 生成的 PDF + 照片 |
03_面试准备/ |
自我介绍、项目表达、行为面、复盘(题库已迁至下方 05_投递追踪/questions.csv) |
04_知识库/ |
知识词典目录——按需自建(骨架里只有一份 README) |
05_投递追踪/ |
八张表:tracker.csv(投递)+ history.csv(变更时间线)+ interviews / contacts / offers / talks / mails / questions.csv |
AGENTS.md |
你的档案:硬门槛事实、诚实红线 |
备份(重要):personal/ 已整体 gitignore——git 不追踪你的数据,仓库镜像克隆不会带走它们。主备份方式:
- 设置页「立即备份」:快照到系统用户目录(工作区之外,推荐,一键完成)
- 设置页「整包导出 zip」:随时可带走的完整工作区
⚠️ 分享仓库给任何人之前无需担心数据——
personal/不在仓库里;但不要把personal/目录本身发给别人(含姓名、照片、联系方式)。
七、常见问题
打开 localhost:5173 黑屏 / 连不上
按顺序排查:
- 服务活着吗:
cd web && .\start.ps1重启(会自动清端口)。Vite 是前台进程,启动它的终端关了服务就没了——这是最常见原因 - 浏览器缓存了旧版 JS:
Ctrl + F5强制刷新 - 还是黑屏:页面现在有 ErrorBoundary,崩溃会显示错误文字而不是黑屏;按 F12 看 Console,把报错发我
启动脚本报错
start.ps1 用了三层回退定位仓库根(参数 → 脚本位置 → 向上找 AGENTS.md)。如果报"无法定位仓库根",在仓库目录内运行,或显式指定:
.\start.ps1 -RepoRoot <仓库目录>
npm 命令没反应
Windows 下手动启动前端必须用 npm.cmd run dev。直接 npm run dev 在某些调用方式下会静默失败(无报错、端口不监听)。
端口被占用
start.ps1 会自动释放 8765/5173。手动释放:
Get-NetTCPConnection -LocalPort 8765 -State Listen | ForEach-Object { Stop-Process -Id $_.OwningProcess -Force }
网页里岗位卡片没有评分
评分必须满足两点:解析卡.md 存在 且 四项加总与总分自洽(会被 jd_score 规则校验)。如果手改过解析卡导致格式不对,网页会当作"未评分"。用 python tools/jobws.py jd <解析卡路径> 看具体哪里不自洽。
CSV 用 Excel 打开乱码
不会乱码——写入用了 UTF-8 BOM(utf-8-sig)。如果乱码,说明文件被其他工具重写过编码,联系我修复。
双击 exe 没反应
console=True 黑窗一闪而过通常意味着启动即失败。原因与处置:
- 端口被占 → exe 现在会给出明确提示并保持窗口(除非被杀软拦截)。先
Get-NetTCPConnection -LocalPort 8765 -State Listen看占用者 - 刚构建的 exe 数据为空是正常的——见上文"方式三"(exe 是干净分发物,不读仓库根数据)
网页标题显示 "Vite + React + TS"
旧版构建残留的缓存或未刷新产物。Ctrl+F5 强刷;仍不行则重新构建前端(cd web/frontend && npm.cmd run build)并重启后端。新的正确标题是 "Job Workbench"(窗口标题跟随界面语言,中文界面为「求职工作台」)。
.ps1 脚本报 ParserError / 中文乱码
含中文的 .ps1 必须存成 UTF-8 带 BOM。若文件被无 BOM 地重存,Windows PowerShell 5.1 会按 GBK 误解码导致语法错误。两个脚本(start.ps1、build_backend_exe.ps1)都已带 BOM;手动改它们时不要去掉 BOM。
八、技术文档导航
| 想了解 | 看哪份 |
|---|---|
| 整体架构(三层分离、领域插件) | docs/specs/2026-08-30-general-workbench-design.md |
| Web 层设计(API 契约、并发与安全) | docs/specs/2026-08-30-web-prototype-design.md |
| AI 工作流定义 | 根 skills/ 下九个 SKILL.md(五个求职向 + 一个扩展向 + 三个开发向;主文件精简、细节在各自的 references/。tools/jobws.py skills install 一并分发技能 / 命令 / 子代理三类资产到各 AI CLI) |
| 毕业条件 / 支持策略 / 数据兼容承诺 | docs/support-and-compatibility.md(什么时候算正式版、支持哪些环境、升级为什么不要求转换数据) |
| 关键决策(为什么这样定) | docs/decisions/ 下的短档(写入人工确认、单一发布节点、数据兼容、hooks 默认关闭) |
| 文档总索引 | docs/README.md |
外观:主题与字体
设置页「外观」卡(设备级偏好,只影响这台机器、不随工作区导出):
- 主题:默认暗之外内置浅色与 8 套开源皮肤(Catppuccin Mocha·Latte / Nord / Tokyo Night / Rosé Pine + Dawn / Gruvbox / Everforest),支持「跟随系统」;「自定义主题…」改关键色并实时显示对比度,保存后进入主题列表;可导入 tweakcn / shadcn 的 CSS 或导出的 JSON。
- 字体:界面字体 12 款可选(Inter 默认,另有 Geist、IBM Plex Sans、Manrope、Plus Jakarta Sans、DM Sans、Figtree、Outfit、Public Sans、Source Sans 3、Work Sans、Atkinson Hyperlegible Next,以及系统字体与衬线);等宽字体独立可选 6 款(Maple Mono 默认,另有 JetBrains Mono、Fira Code、Geist Mono、IBM Plex Mono、Source Code Pro),管代码 / 编号 / 日期;数字字体另设一槽(Geist Mono 默认,可选 JetBrains Mono、IBM Plex Mono 或「跟随界面字体」),管 KPI / 计数 / 天数 / 百分比等数值。全部随应用本地打包(OFL-1.1、离线可用),只含拉丁子集——中文始终走系统栈。界面字号为连续滑块(80%–150%,步进 5%)。终端字体请在你的终端软件里设置——
jobws prefs doctor会给出推荐清单(Maple Mono / JetBrains Mono / 更纱黑体)。 - 偏好分层:主题 / 字体是设备级(存本机);
jobws prefs(theme / font / resume_style)是工作区级物料偏好,供 CLI、技能与导出使用。
主题改动会过门禁 jobws lint themes(完整性 / 对比度 / 明度阶梯)——10 套内置主题全部满足正文 4.5:1、大字与图形 3:1。