Autonomous job-market watcher: monitors target companies' career pages on a cron schedule, judges every posting against the user's personal profile with LLM-...
---
name: jobwatch
description: "Autonomous job-market watcher: monitors target companies' career pages on a cron schedule, judges every posting against the user's personal profile with LLM-grade reasoning (visa, seniority, red lines), pushes Kill-Shot matches instantly, batches the rest into a daily digest, and archives everything into a knowledge base. Also tracks application status (applied/interview/offer) and answers queries like 'top jobs this week'. Use when: (1) user wants automated job hunting or job alerts, (2) user asks to monitor a company's careers page, (3) user says they applied to a job / got an interview (track it), (4) user asks about recent matched jobs or application stats, (5) a cron wake-up message references the jobwatch work cycle. Triggers: 'job search', 'job alert', 'monitor careers', 'find jobs for me', '求职监控', '盯岗位', '我投了', 'top jobs'."
---
# JobWatch — 求职监控 Agent 引擎
一条可 cron 运行的「岗位抓取 → 画像比对 → 分级行动」流水线,加上投递跟踪与查询。
**零必配依赖**:判级由你(agent)完成——用的就是主人给你配的模型;通知发到你们对话的
渠道;知识库默认本地文件。Firecrawl / Telegram 直连 / 2brain 均为可选增强。
```
① 感知 Greenhouse/Ashby/Lever 官方 API + Google Careers/RSS(Firecrawl 渲染 SPA)
② 推理 去重 + 硬过滤 + 岗位年龄计算(脚本)→ 你 × 主人画像判级 P1/P2/P3
③ 行动 知识库入库 · P1 即时提醒 · P2 每日摘要 · 投递跟进提醒
```
**数据目录(HOME)**:`<workspace>/jobwatch/`(config.json、profile/、state/、queue/、
runs/、kb_local/)。skill 目录本身保持只读。以下所有命令都从 HOME 目录运行:
`cd <workspace>/jobwatch && python3 <skill目录>/scripts/xxx.py`(首次运行任何脚本会
自动创建 HOME 并落地默认 config.json)。
## First-Run Onboarding(首次使用:面试主人,10 分钟)
一次只问一组,别倒问卷:
1. **目标域**:盯哪些公司?什么方向的岗位?
2. **背景**:几句话介绍(年限/领域/核心技术栈/差异化优势),或直接读主人丢来的简历。
3. **红线**:绝对不看什么岗位?需要 visa sponsorship 吗?地域/远程硬性要求?
4. **级别意向**(必须单独问):目标级别?IC 还是管理线?现任职级和求职意向经常不一致。
5. **配置选择(必须问,但给快捷选项)**:明确列出三项让主人选,同时告知
「回复"全部默认"即可跳过」:
- 通知:默认发到当前对话渠道;要独立低延迟推送可选 Telegram 直连
- 知识库:默认本地文件(kb_local/);有 2brain 账号可选 2brain(问答+图谱)
- JD 抓取:有 Firecrawl 或 Jina key 更干净(Google Careers 信源基本必需),
没有则用免 key 降级通道
主人选了非默认项 → 写 config.json 对应字段,并告诉 TA 在 HOME/.env 里要填哪几行
(参考 skill 目录 env.example),等 TA 填完再继续。
然后动手(主人不写任何文件):
1. 把 skill 目录的 `profile.template.md` 复制为 `HOME/profile/JOB_PROFILE.md`,按面试
答案填全五节,复述要点让主人确认。**这个文件是判级质量的全部来源,写具体。**
2. 每家公司跑 `python3 scripts/discover_board.py "<公司名>" [slug猜测]`,把命中的信源
写进 `HOME/config.json` 的 `sources`。探测不到的用 `gcareers`(Google 系)或 RSS。
3. 按画像生成 `config.json` 的 `prefilter.title_keywords`(20-30 个小写子串,宁宽勿窄)
和 `exclude_keywords`。
4. **校准(不可跳过)**:跑一轮 `python3 scripts/pipeline.py`,按下方 Work Cycle 完成
判级,挑 5 个代表性结果(P1/P2/P3 各有)问主人:这些判对了吗?按反馈修画像重验。
5. **演示推送(必做)**:校准通过后,把本轮判级最高的一个岗位按 P1 消息格式
(notify_telegram.render_p1_plain 的样式)完整发给主人,开头注明
「📬 示例:以后 P1 岗位的实时提醒长这样」——让主人上岗前就见过推送的样子。
6. 征得主人同意后注册定时任务:`python3 scripts/setup_cron.py --agent <你的agentId>`,
提醒主人跑 `openclaw gateway restart`。告诉主人上岗后会发生什么:P1 实时到这个
对话、每日 9:00 摘要、投递说一声我就记账。
## Work Cycle(cron 唤醒时执行)
1. `python3 scripts/pipeline.py`,读 stdout 的 JSON 摘要。
2. 若 `pending_judgment > 0`:读 `HOME/queue/pending_judgment.jsonl`(每行
`{item, jd_text, jd_tool}`,item 含 `posted_at`),逐条对照
`HOME/profile/JOB_PROFILE.md` 判级,追加写 `HOME/queue/judgments.jsonl`,
每行严格单行 JSON(无围栏无多余文字):
`{"doc_id":"...","match":"kill_shot|comfort_zone|wrong_scene",
"visa_risk":"low|medium|high|unknown","summary_zh":"≤150字:岗位/要求/匹配点差距",
"tags":["#3-5个"],"reasons":"1-2句依据"}`
判级准则:kill_shot=核心能力高度重合+符合级别意向+零红线;comfort_zone=相关但一般,
或高匹配但红线存疑;wrong_scene=触红线或错位。**挂出超 90 天的岗位视为疑似 ghost
job,除非匹配极强否则封顶 comfort_zone 并在 reasons 注明。**判不了的跳过(下轮重现),
不要编造。写完跑 `python3 scripts/apply_judgments.py`(校验/入库/通知入队/标已见)。
3. `python3 scripts/outbox.py list` → 有待发消息就把每条 `text` 通过你和主人的对话渠道
原样发出,然后 `python3 scripts/outbox.py archive`。
4. 摘要 `errors` 非空:偶发静默;连续 3 次同类失败才向主人发简短告警(环节/诊断/建议)。
5. 一切正常且无待发消息 → 静默结束,不输出任何内容。
digest 唤醒(jobwatch-digest):跑 `python3 scripts/daily_digest.py` 再执行第 3 步。
## Application Tracking(主人提到投递进展时)
- 「我投了 X」→ `python3 scripts/tracker.py find "<关键词>"` 拿 doc_id →
`python3 scripts/tracker.py set <doc_id> applied [备注]`
- 「X 约面试了 / 拒了 / 拿 offer 了」→ status 用 interview / rejected / offer
- 状态一览 `tracker.py list [status]`;统计 `tracker.py stats`;
投递 7 天无更新的会自动出现在每日摘要的跟进提醒里。
## Queries(主人问起时)
- 「本周有什么好岗位」→ `python3 scripts/query.py top 7`(P1/P2 列表),
想看细节读 `HOME/kb_local/` 里对应文档。
- 「监控跑得怎么样」→ `python3 scripts/query.py stats 7` + 看 `HOME/runs/` 最新日志。
- 深度问题(对比两家公司的要求、某方向技能趋势)→ 检索 `HOME/kb_local/` 的 JD 全文库。
## Config 速查(HOME/config.json)
- `sources[]`: kind ∈ greenhouse|ashby|lever|gcareers|rss
- `judge.mode`: `agent`(默认)| `api`(OpenAI 兼容端点,.env 配 LLM_API_KEY /
LLM_BASE_URL,更快更稳)
- `notify.mode`: `agent`(默认,outbox 播报)| `telegram`(直连,低延迟,自动复用
OpenClaw 的 bot 配置)
- `kb.backend`: `local`(默认)| `twobrain`(.env 配 TWOBRAIN_*)
- `prefilter`: 标题关键词硬过滤,改完下轮生效
## 红线
- 不修改 openclaw.json / cron 配置(setup_cron.py 除外且须主人同意);不直接编辑
state 文件——行动一律走脚本。
- 不修改 JOB_PROFILE.md,除非主人在校准中明确要求。
- 只读公开信源;不代替主人投递;除 outbox 播报/摘要/告警外不主动发消息。
don't have the plugin yet? install it then click "run inline in claude" again.