Agent Skills › qxiansheng001/ai-job-hunter

qxiansheng001/ai-job-hunter

GitHub

AI行业岗位猎手,通过画像初始化、岗位扫描及JD分析三步流程辅助求职。支持自动状态检测与子技能路由,适配多环境路径,提升求职效率。

5 skills 3

Install All Skills

npx skills add qxiansheng001/ai-job-hunter --all -g -y
More Options

List skills in collection

npx skills add qxiansheng001/ai-job-hunter --list

Skills in Collection (5)

AI行业岗位猎手,通过画像初始化、岗位扫描及JD分析三步流程辅助求职。支持自动状态检测与子技能路由,适配多环境路径,提升求职效率。
开始求职 AI岗位猎手 帮我找AI工作 job-hunter 分析AI岗位
npx skills add qxiansheng001/ai-job-hunter --skill ai-job-hunter -g -y
SKILL.md
Frontmatter
{
    "name": "ai-job-hunter",
    "description": "AI行业岗位猎手。当用户说\"开始求职\"、\"AI岗位猎手\"、\"帮我找AI工作\"、\"job-hunter\"、 \"分析AI岗位\"或类似找AI行业工作的意图时触发。 自动检测进度状态,路由到对应子 skill 执行。 包含:画像初始化(job-init) → 岗位扫描(job-scan) → 分析学习(job-analyze)",
    "allowed-tools": "Bash(*), Read, Write, Edit, Glob, Skill"
}

ai-job-hunter — AI行业岗位猎手

工作流

job-init → job-scan → job-analyze

各步骤作为独立子 skill 实现,支持自动路由和状态检测。

脚本路径

所有 Python 脚本位于 scripts/ 目录:

  • scripts/scraper/boss_scraper.py — BOSS直聘 CDP 爬虫
  • scripts/export/clean_and_export.py — 数据清洗 → Excel
  • scripts/analysis/jd_analyzer.py — JD 文本分析 → Markdown 报告
  • scripts/analysis/gap_analyzer/ — 能力差距分析 → 学习计划

状态文件

数据目录可通过 AI_JOB_HUNTER_DATA 环境变量配置,默认为 skill 目录同级的 ai-job-hunter-data/。 所有路径引用已自动适配 — 无论 skill 安装在项目级还是全局级均可正常工作。 状态文件 $AI_JOB_HUNTER_DATA/.skill-state.json 保存所有进度状态。

自动设置

首次进入自动安装依赖:

# === 自动发现 skill 根目录(适配项目级/全局级安装) ===
SKILL_DIR="${AI_JOB_HUNTER_DIR:-}"
[ -n "$SKILL_DIR" ] && SKILL_DIR="${SKILL_DIR//\\//}"
if [ -z "$SKILL_DIR" ]; then
  [ -d ".claude/skills/ai-job-hunter" ] && SKILL_DIR=".claude/skills/ai-job-hunter"
  [ -z "$SKILL_DIR" ] && [ -d "$HOME/.claude/skills/ai-job-hunter" ] && SKILL_DIR="$HOME/.claude/skills/ai-job-hunter"
fi
DATA_DIR="${AI_JOB_HUNTER_DATA:-$(dirname "$SKILL_DIR")/ai-job-hunter-data}"
mkdir -p "$DATA_DIR/subjects"
pip install -q -r "$SKILL_DIR/requirements.txt" 2>/dev/null || pip install -r "$SKILL_DIR/requirements.txt"

子技能路由

状态检测(FSM 路由)

# === 自动发现 skill 根目录(适配项目级/全局级安装) ===
SKILL_DIR="${AI_JOB_HUNTER_DIR:-}"
[ -n "$SKILL_DIR" ] && SKILL_DIR="${SKILL_DIR//\\//}"
if [ -z "$SKILL_DIR" ]; then
  [ -d ".claude/skills/ai-job-hunter" ] && SKILL_DIR=".claude/skills/ai-job-hunter"
  [ -z "$SKILL_DIR" ] && [ -d "$HOME/.claude/skills/ai-job-hunter" ] && SKILL_DIR="$HOME/.claude/skills/ai-job-hunter"
fi
DATA_DIR="${AI_JOB_HUNTER_DATA:-$(dirname "$SKILL_DIR")/ai-job-hunter-data}"
python -c "
import sys; sys.path.insert(0, '$SKILL_DIR/scripts')
from utils.fsm import detect_state
import json
try:
    with open('$DATA_DIR/.skill-state.json') as f:
        state = detect_state(json.load(f))
except FileNotFoundError:
    state = None
print(f'STATE={state.value if state else \"no_state\"}')
"

根据 STATE 输出路由:

STATE 路由
no_state 调用 Skill 执行 job-init
profile_done 调用 Skill 执行 job-scan
scan_done 调用 Skill 执行 job-analyze(生成 JD 分析)
analyze_done 调用 Skill 执行 job-analyze(生成学习计划)
plan_done 提示用户学习计划已就绪,调用 Skill 执行 job-status

子技能列表

子技能 触发词 功能
job-init "初始化画像"、"填写资料" 用户画像采集
job-scan "找岗位"、"帮我搜索"、"推荐岗位" 岗位推荐+抓取+清洗
job-analyze "分析岗位"、"做学习计划"、"分析JD" JD分析+学习计划

触发方式

"开始求职" / "AI岗位猎手" / "帮我找AI工作" / "job-hunter" / "分析AI岗位" / "看看AI岗位要求" / "找工作"

基于JD和市场数据,结合用户画像生成岗位分析报告与个性化学习计划。支持30/60/90天周期选择、商业变现模块配置及费曼学习法融合。自动校验上下文依赖并处理路径兼容问题。
用户需要分析特定岗位的市场需求与能力差距 用户希望获取针对目标岗位的定制化学习路线图
skills/job-analyze/SKILL.md
npx skills add qxiansheng001/ai-job-hunter --skill job-analyze -g -y
SKILL.md
Frontmatter
{
    "name": "job-analyze",
    "description": "JD 市场需求分析 + 能力差距分析 + 学习计划。需要先有 .skill-state.json 且 job_search 已完成。可路由到 job-scan。",
    "allowed-tools": "Bash(*), Read, Write, Edit, Glob, Skill, WebSearch, WebFetch",
    "argument-hint": ""
}

/job-analyze — 岗位分析与学习计划

Step 0:上下文检查

# === 自动发现 skill 根目录(适配项目级/全局级安装) ===
SKILL_DIR="${AI_JOB_HUNTER_DIR:-}"
[ -n "$SKILL_DIR" ] && SKILL_DIR="${SKILL_DIR//\\//}"
if [ -z "$SKILL_DIR" ]; then
  [ -d ".claude/skills/ai-job-hunter" ] && SKILL_DIR=".claude/skills/ai-job-hunter"
  [ -z "$SKILL_DIR" ] && [ -d "$HOME/.claude/skills/ai-job-hunter" ] && SKILL_DIR="$HOME/.claude/skills/ai-job-hunter"
fi
DATA_DIR="${AI_JOB_HUNTER_DATA:-$(dirname "$SKILL_DIR")/ai-job-hunter-data}"
test -f "$DATA_DIR/.skill-state.json" && echo EXISTS || echo MISSING
  • MISSING → 调用 Skill 执行 job-init

读取 $DATA_DIR/.skill-state.json,检查 job_search.status == "done"

  • 未完成 → 告知用户"请先完成岗位扫描",调用 Skill 执行 job-scan

读 SKILL_DIR 下的 shared-references/analysis-rubric.md 参考分析方法论。

画像完整性检查

读取 $DATA_DIR/.skill-state.jsonprofile,检查以下字段是否缺失:

  • ai_experience_level
  • self_drive_score
  • strength_tags

如果任一缺失:

你的画像信息不完整(缺少 AI 经验等级、自驱力评分或核心优势标签), 建议先更新画像再生成计划,否则计划将使用默认值。

是否现在更新?[y/n]

  • y → 调用 Skill 执行 job-init(仅补充缺失字段)
  • n → 继续使用默认值生成

Step 1:JD 分析

python "$SKILL_DIR/scripts/analysis/jd_analyzer.py" \
  --input {clean_file} \
  --title "{keyword}"

其中 {clean_file}{keyword}$DATA_DIR/.skill-state.jsonjob_search 读取。

Step 2:报告输出

报告已保存到本地:$DATA_DIR/subjects/{keyword}/JD_Analysis_Report.md

更新 $DATA_DIR/.skill-state.jsonanalysis.report_title=keywordanalysis.report_file=$DATA_DIR/subjects/{keyword}/JD_Analysis_Report.mdanalysis.generated_at=now

Step 3a:选择学习周期

询问用户:

你希望学习计划周期多长? 1. 30天速成 — 核心技能速通,适合有基础/全职学习者 2. 60天标准 — 稳扎稳打,含项目实战,面试就绪(默认) 3. 90天深入 — 完整体系,含架构/源码/优化,适合零基础或在职

用户选择后存入变量 {duration}(30 / 60 / 90)。

坚持周期 × 时长联动检查

读取 $DATA_DIR/.skill-state.jsonprofile.commitment_period

  • "不设限" → 自动推荐 90 天:

    你的坚持周期为「不设限」——长期主义是成为专家的唯一路径。推荐 90 天深度版。 是否接受推荐?[y/n]

    • y → 设 {duration}=90
    • n → 保持已选的 {duration}
  • "1个月" 且 {duration} > 30

    你的坚持周期为 1 个月,但你选择了 {duration} 天计划。 建议调整为 30 天速成版,或延长坚持周期。 是否调整?[1] 改为 30 天 [2] 保持当前 [3] 先修改画像

  • 其他情况(2个月/3个月/6个月):如果坚持周期(月数)* 30 < {duration}

    你的坚持周期为 {period},建议计划不超过该周期。当前选择了 {duration} 天,确认继续?[y/n]

Step 3b:商业模块询问

询问用户:

是否需要包含「技术内容创作与技能变现」模块?(y/n) 该模块为技能驱动型——根据你学习的具体技术栈,规划对应的内容输出和变现路径, 学什么就输出什么、变现什么,不会出现与你技能无关的通用建议。

内容分发支持 6 大平台(抖音/B站/小红书/知乎/博客/掘金),根据你的画像标签 推荐主攻平台,按学习进度生成多平台分发日历,每个平台有专属标题和内容调性。

注意:流量和兼职属于锦上添花,不会挤占核心技能学习时间,所有输出内容都建立在已学知识之上。

如果 Step 3a 选了 30 天且 Step 3b 选了 y:

注意:30天速成计划已经非常紧凑,加入商业模块可能会影响核心学习进度。 确认继续?(y/n)

  • y → 生成含商业模块的 30 天计划
  • n → 生成不含商业模块的 30 天计划

用户选择后存入变量 {business}(y / n)。

Step 3c:学习理念确认

在生成计划前,向用户说明:

你的学习计划将深度融合两种顶级学习方法:

费曼学习法 — 通过教别人来检验真懂。每天都有「费曼输出任务」, 要求你用大白话向小白讲清楚当天的核心概念,卡住的地方就是盲区。

第一性原理 — 回归本质的深度思考。每个阶段末有 5 层追问, 最终还有核心技术的拆解任务(问题本质→核心原理→最小实现→设计取舍)。

这两种方法贯穿每一天的学习,帮你不仅学会技能,更能理解底层原理。

如果 {business} 为 y,追加说明:

你的计划还包含技术内容创作与技能变现模块。请注意:该模块属于锦上添花, 不会挤占核心技能学习时间。所有输出内容都建立在已学知识之上,学什么就输出什么、变现什么。 (如果觉得时间紧张,可随时回到 Step 3b 关闭该模块)

确认继续?(y/n)

  • y → 进入配置确认
  • n → 询问用户需要什么调整

Step 3c-bis:计划配置确认

在生成完整计划前,先调用预览模式展示配置摘要:

python "$SKILL_DIR/scripts/analysis/gap_analyzer/__main__.py" \
  --profile "$DATA_DIR/.skill-state.json" \
  --report "$DATA_DIR/subjects/{keyword}/JD_Analysis_Report.md" \
  --title "{keyword}" \
  --duration {duration} \
  --business {business} \
  --commitment "{commitment_period}" \
  --preview 2>/dev/null > "$DATA_DIR/_preview_config.json"

python -c "
import json, os
DATA_DIR = '$DATA_DIR'
with open(os.path.join(DATA_DIR, '_preview_config.json')) as f:
    d = json.load(f)

print('========== 计划生成配置确认 ==========')
print()
print(f'目标岗位: {d[\"title\"]}')
print(f'数据来源: BOSS直聘 ({d[\"total_jobs\"]}个岗位样本)')
print(f'学习周期: {d[\"duration\"]}天 | 每周投入: {d[\"weekly_hours\"]} | 强度: {d[\"intensity\"]}')
print(f'AI经验等级: {d[\"ai_experience_level\"]} → 起点: {d[\"start_point\"]}')
ed = d.get('self_drive_score', '?')
print(f'自驱力: {ed}/5 → 监督: {d[\"supervision\"]}')
strengths = '、'.join(d['core_strengths']) if d.get('core_strengths') else '无'
print(f'核心优势: {strengths}')
print()
print('权重分配:')
print(f'  [60%] 市场驱动 — 必备技能 {d[\"essential_count\"]}项 + 加分技能 {d[\"bonus_count\"]}项')
print(f'  [30%] 画像匹配 — 起点: {d[\"start_point\"]}')
sup_count = d.get('supplement_count', 0)
sup_pct = d.get('supplement_percent', 0)
print(f'  [10%] 合理补充 — {sup_count}项 ({sup_pct}%)')
print()
print(f'商业模块: {\"包含\" if d.get(\"business_module\", False) else \"不包含\"}')
print()
print('计划详情:')
print(f'  计划模型: {\"连续知识单元\" if d.get(\"plan_model\") == \"continuous\" else \"按周切割\"}')
print(f'  总天数: {d.get(\"total_days\", d[\"duration\"])} 天(含 {d.get(\"review_day_count\", 0)} 个复盘日)')
total_h = d.get('total_days', d['duration']) * d.get('daily_hours', 0)
dh_display = d.get('daily_hours_display', '')
print(f'  预计总学习小时数: ~{int(total_h)}h(日均{dh_display})')
print(f'  实战项目: {d.get(\"project_count\", 0)} 个 | 开源贡献: {d.get(\"os_contribution_count\", 0)} 次')
print(f'  技能覆盖: 必备技能 {d.get(\"essential_coverage\", \"N/A\")} | 加分技能 {d.get(\"bonus_coverage\", \"N/A\")}')
print()
print('(提示:如需调整每日学习量,可退出后使用 --adjust 0.8~1.2 参数重新生成)')
print('请确认: 输入 Y 继续生成,输入 N 调整参数。')
print('==========================================')
"

rm -f "$DATA_DIR/_preview_config.json"

展示配置摘要后,询问用户:

请确认是否按以上配置生成学习计划?(y/n)

  • y → 进入 Step 3d 生成完整计划
  • n → 询问调整项:
    • 1 — 重新选择学习周期(返回 Step 3a)
    • 2 — 切换商业模块开关(返回 Step 3b)
    • 3 — 生成 30 天精简版(自动关闭补充模块)
    • 其他 — 请描述你想调整的内容

Step 3d:生成学习计划

python "$SKILL_DIR/scripts/analysis/gap_analyzer/__main__.py" \
  --profile "$DATA_DIR/.skill-state.json" \
  --report "$DATA_DIR/subjects/{keyword}/JD_Analysis_Report.md" \
  --title "{keyword}" \
  --duration {duration} \
  --business {business} \
  --commitment "{commitment_period}"

其中 {commitment_period}$DATA_DIR/.skill-state.jsonprofile.commitment_period 读取。

Step 4:学习计划输出

学习计划已保存到本地:$DATA_DIR/subjects/{keyword}/Learning_Plan_{duration}days_定制版[_with_business].md

更新 $DATA_DIR/.skill-state.jsonlearning_plan.target_role=keywordplan_file=$DATA_DIR/subjects/{keyword}/Learning_Plan_{duration}days_定制版[_with_business].mdprogress.status=in_progress

Step 5:下一步

学习计划已就绪,所有文件已保存到本地。你可以随时再次运行 /job-analyze 生成新的岗位分析。

AI求职画像初始化Skill。检测状态,直白管理期望,一次性收集用户技能、经验及自驱力等信息,解析并判定S0-S3起点档位,写入本地状态文件以支持后续精准岗位匹配。
需要初始化或更新AI求职个人画像 启动job-init流程
skills/job-init/SKILL.md
npx skills add qxiansheng001/ai-job-hunter --skill job-init -g -y
SKILL.md
Frontmatter
{
    "name": "job-init",
    "description": "AI 岗位求职画像初始化。按 cheat-on-skill 风格一次性开放提问,判定起点档位,写入 .skill-state.json。",
    "allowed-tools": "Bash(*), Read, Write, Edit, Glob",
    "argument-hint": ""
}

/job-init — 画像初始化(cheat-on-skill 风格)

Phase 0:状态检测

# === 自动发现 skill 根目录(适配项目级/全局级安装) ===
SKILL_DIR="${AI_JOB_HUNTER_DIR:-}"
[ -n "$SKILL_DIR" ] && SKILL_DIR="${SKILL_DIR//\\//}"
if [ -z "$SKILL_DIR" ]; then
  [ -d ".claude/skills/ai-job-hunter" ] && SKILL_DIR=".claude/skills/ai-job-hunter"
  [ -z "$SKILL_DIR" ] && [ -d "$HOME/.claude/skills/ai-job-hunter" ] && SKILL_DIR="$HOME/.claude/skills/ai-job-hunter"
fi
DATA_DIR="${AI_JOB_HUNTER_DATA:-$(dirname "$SKILL_DIR")/ai-job-hunter-data}"
test -f "$DATA_DIR/.skill-state.json" && echo EXISTS || echo MISSING
  • EXISTS:读取 $DATA_DIR/.skill-state.json,展示当前画像摘要,询问用户是否更新
    • 更新 → 进入 Phase 2(保留已有字段,只问需要改的),跳过已填字段
    • 不更新 → 提示用户下一步可以说"帮我找岗位"(→ job-scan)
  • MISSING:进入 Phase 1

Phase 1:期望管理(原样表达,语气直白)

这工具不会给你一份"AI 高薪岗位 Top10"那种水文清单——那些利益不中立,多是卖课/培训机构的获客漏斗。

我会做四件别人不做的事: ① 按你的真实底子匹配岗位,不给通用清单 ② 用 BOSS 直聘真实招聘数据看哪些 AI 岗在招、给多少 ③ 分析高频要求,做出可执行的学习路线 ④ 遇到带有"培训贷/包就业/付费内推"的,直接劝退

转型通常需要几个月的真实投入,不是"30 天速成"。认同我们再往下。

Phase 2:能力盘点(一次性抛出,开放回答)

一次性抛所有问题,用户自然语言回答,agent 解析提取。允许"不确定",对应字段记 null 或空串。

我先了解一下你的情况,下面几个问题一起回答就行,不确定的直接说不确定:

① 你现在掌握了哪些技术/技能?学历专业是什么? 编程语言、框架、工具……哪怕只学过一点也算。学历说清楚是什么学位、什么专业,在读的说年级。 例如:Python, LangChain, Docker;本科计算机科学大三

② AI 相关的经验到什么程度了? 完全零基础 / 懂基本概念但没做过项目 / 独立做过项目 / 资深从业者。不确定就说不确定。

③ 每周能稳定投入几小时学习?能坚持多久?过去 3 个月真实情况估,别往多了算。 例如:每周大概 10-15 小时,能坚持 3 个月。

④ 自驱力自评(1-5 分)? 这会决定学习计划里的监督提醒密度。 1 分=需要强监督;3 分=能按计划但会拖延;5 分=极强自驱力。

⑤ 你的核心优势是什么? 比如数学好、编程强、有项目经验、有管理经验、沟通表达强……多擅长就多写。

⑥ 目标城市在哪?现在是什么状态? 状态选项:在读 / 找实习 / 求职中 / 在职想转。不确定也直说。

用户回答后,agent 解析提取到以下字段:

问题 state 字段
① 技能+学历 tech_stack(array), education(object)
② AI 经验 ai_experience_level(string)
③ 每周时长+周期 weekly_hours(string range), commitment_period(string)
④ 自驱力 self_drive_score(int), learning_self_rating(string)
⑤ 核心优势 strength_tags(array), advantage_tags(array)
⑥ 城市+状态 target_city/target_cities(array), status(string)

解析规则

  • ai_experience_level:从回答中匹配"零基础/无经验"→"无经验","懂概念/基础"→"有AI基础","独立做过项目"→"有AI项目经验","资深"→"AI领域资深从业者","有编程"→"有编程基础但AI零经验"。匹配不到或"不确定"→记空串
  • weekly_hours:从回答中提取数字范围,格式如 "10-15h"。匹配不到→null
  • commitment_period:匹配"1个月/2个月/3个月/6个月/不设限"。匹配不到或"不确定"→空串
  • self_drive_score:提取数字 1-5。匹配不到→null。同步 learning_self_rating(1→"需要外部强监督",2→"偶尔需要提醒",3→"能按计划但有拖延",4→"自律性强",5→"极强自驱力")
  • strength_tags:分割逗号/顿号,与预定义标签匹配。未匹配到的归入"其他(自定义)"。同步到 advantage_tags
  • target_cities:解析城市名,单值同时写 target_city

Phase 2.5:起点档位判定

读 SKILL_DIR 下的 shared-references/role-tiers.md,结合 tech_stackai_experience_levelself_drive_score 判定 S0-S3。

规则:

  • AI 领域资深从业者 / 自驱力 5 分 / 有项目经验 → 倾向于 S3
  • 有 AI 基础 / 有编程基础 + 自驱力 3-4 → S2
  • 无经验 + 自驱力 1-2 → S0
  • 其他组合 → 居中判断

我判断你的起点档位是 S2(有技术底子)。 你比我更懂自己——可以自己修正。

Phase 2.6:画像总览确认

生成以下预览让用户确认:

┌──── 我的职业画像总览 ─────────────────────────────────────┐
│                                                              │
│  档位         S2 · 有技术底子                                │
│  技能         Python, LangChain, LangGraph                    │
│  学历         本科 · 交通工程(大一)                         │
│  AI 经验      [等级] · [简述]                                 │
│  每周投入     [X]h → 日均约 [Y]h                              │
│  坚持周期     [X]                                              │
│  自驱力       [X]分 — [描述]                                  │
│  核心优势     [A、B、C]                                       │
│  目标城市     [城市]                                          │
│  状态         [状态]                                          │
│                                                              │
│  [1] 确认无误  [2] 修改某项  [3] 重新填写                     │
└──────────────────────────────────────────────────────────────┘

如果选择修改 → 问"想修改哪一项?新值是什么?" → 更新后重新展示预览。 如果确认 → 进入 Phase 3。

Phase 3:写入状态文件

读取 SKILL_DIR 下的 templates/state.template.json 填充数据。

date '+%Y-%m-%d %H:%M %Z %z'

写入 $DATA_DIR/.skill-state.json,设置 create_timeupdate_time 为当前时间。

Phase 4:下一步

画像已保存。接下来你可以说:

  • "帮我找岗位" — 开始扫描匹配的 AI 岗位
  • "分析 XX 岗位,做学习计划" — 直接进入学习计划
  • "修改我的画像" — 更新任意字段
AI岗位扫描技能。基于用户画像推荐匹配岗位,引导用户选择后自动启动Chrome登录BOSS直聘抓取数据,并清洗导出结果。需先完成画像初始化。
用户需要寻找AI相关工作岗位 用户希望自动化搜索和筛选BOSS直聘职位 用户已配置好个人画像并请求岗位推荐
skills/job-scan/SKILL.md
npx skills add qxiansheng001/ai-job-hunter --skill job-scan -g -y
SKILL.md
Frontmatter
{
    "name": "job-scan",
    "description": "AI 岗位扫描。推荐岗位 → 用户选择 → BOSS 直聘抓取 → 数据清洗。 需要先有状态文件($AI_JOB_HUNTER_DATA\/.skill-state.json)且 profile 已就绪。可在 allowed-tools 中调用 job-init。",
    "allowed-tools": "Bash(*), Read, Write, Edit, Glob, Skill",
    "argument-hint": ""
}

/job-scan — 岗位扫描

Step 0:上下文检查

# === 自动发现 skill 根目录(适配项目级/全局级安装) ===
SKILL_DIR="${AI_JOB_HUNTER_DIR:-}"
[ -n "$SKILL_DIR" ] && SKILL_DIR="${SKILL_DIR//\\//}"
if [ -z "$SKILL_DIR" ]; then
  [ -d ".claude/skills/ai-job-hunter" ] && SKILL_DIR=".claude/skills/ai-job-hunter"
  [ -z "$SKILL_DIR" ] && [ -d "$HOME/.claude/skills/ai-job-hunter" ] && SKILL_DIR="$HOME/.claude/skills/ai-job-hunter"
fi
DATA_DIR="${AI_JOB_HUNTER_DATA:-$(dirname "$SKILL_DIR")/ai-job-hunter-data}"
test -f "$DATA_DIR/.skill-state.json" && echo EXISTS || echo MISSING
  • MISSING → 告知用户"请先完成画像初始化",调用 Skill 工具执行 job-init

读取 $DATA_DIR/.skill-state.json,提取 profile(tech_stack、education、target_city 等)。

读取 SKILL_DIR 下的 shared-references/role-tiers.md 参考档位信息。

Step 1:推荐岗位

根据画像推荐 6 个最匹配的 AI 岗位。使用以下格式:

┌──── 推荐岗位列表 ──────────────────────────────────────────┐
│                                                              │
│  1. 大模型算法工程师         匹配度: 92%                    │
│     → 你的PyTorch经验+硕士学历高度匹配,大模型方向需求爆发   │
│  ...                                                         │
└────────────────────────────────────────────────────────────┘

推荐原则:

  • 岗位名称必须是真实市场上存在的
  • 匹配度基于:技术栈重合度、学历门槛、经验要求
  • 推荐理由要具体,诚实指出局限
  • 排除"实习/实习生"类岗位,只推荐正式/校招岗位

Step 2:用户选择

等待用户回复编号或岗位名称。确认后:

  1. 向用户确认搜索参数:岗位名称、城市(来自画像)、抓取数量(建议 50 条)
  2. keywordcity 写入 $DATA_DIR/.skill-state.jsonjob_search 字段

Step 3:BOSS 直聘抓取

前置检查

检测 Chrome 调试端口:

python -c "
import urllib.request, json
try:
    r = urllib.request.urlopen('http://127.0.0.1:9222/json/version', timeout=3)
    print('READY')
except: print('NOT_READY')
"

未就绪则自动启动 Chrome:

python -c "
import subprocess, os, time, urllib.request, json, sys
import platform
_chrome_paths = {
    'Windows': r'C:\Program Files\Google\Chrome\Application\chrome.exe',
    'Darwin': '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome',
}
chrome = _chrome_paths.get(platform.system(), 'google-chrome')
profile = os.path.expanduser(r'~\.ai-job-hunter-chrome')
os.makedirs(profile, exist_ok=True)
subprocess.Popen([chrome,
    '--remote-debugging-port=9222',
    f'--user-data-dir={profile}',
    '--no-first-run', '--no-default-browser-check',
    '--new-window', 'https://www.zhipin.com'],
    stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
for i in range(20):
    time.sleep(1)
    try:
        urllib.request.urlopen('http://127.0.0.1:9222/json/version', timeout=2)
        print('READY')
        sys.exit(0)
    except: pass
print('TIMEOUT')
"

启动后立即停下来告知用户:

请在打开的 Chrome 窗口中登录 BOSS直聘(zhipin.com)。 登录后告诉我"已登录",我再开始抓取。Claude 必须等待用户明确回复。

执行抓取

python "$SKILL_DIR/scripts/scraper/boss_scraper.py" \
  --keyword "{岗位名称}" \
  --city "{城市编码(全国 100010000,北京 101010100)}" \
  --max-items 50

城市编码参考 SKILL_DIR 下的 shared-references/city_codes.md(如果存在)或使用常用编码。

抓取结果

完成后告知用户抓取数量,更新 $DATA_DIR/.skill-state.jsonjob_search 字段。

Step 4:数据清洗

python "$SKILL_DIR/scripts/export/clean_and_export.py" \
  --output "$DATA_DIR/subjects/{keyword}/jobs_clean.xlsx"

更新 $DATA_DIR/.skill-state.jsonjob_search.status=doneclean_file=$DATA_DIR/subjects/{keyword}/jobs_clean.xlsx

Step 5:下一步

告知用户下一步可以说"分析这些岗位"(→ job-analyze)。

学习进度陪跑技能,跟踪计划执行、打卡及卡点处理。需前置状态文件,支持动态调整任务、诊断阻塞原因、落盘产出,并具备反诈预警功能。
用户询问当前学习进度或打卡 用户在学习过程中遇到卡点寻求协助 用户希望调整学习计划或汇报进展
skills/job-status/SKILL.md
npx skills add qxiansheng001/ai-job-hunter --skill job-status -g -y
SKILL.md
Frontmatter
{
    "name": "job-status",
    "description": "学习进度陪跑。跟踪学习计划执行、每日打卡、卡点处理、进度调整。 需要先有 .skill-state.json 且 learning_plan 已生成。可路由到 job-analyze。",
    "allowed-tools": "Bash(*), Read, Write, Edit, Glob, Skill",
    "argument-hint": ""
}

/job-status — 学习进度陪跑

Step 0:上下文检查

DATA_DIR="${AI_JOB_HUNTER_DATA:-../ai-job-hunter-data}"
test -f "$DATA_DIR/.skill-state.json" && echo EXISTS || echo MISSING
  • MISSING → 调用 Skill 执行 job-init

读取 $DATA_DIR/.skill-state.jsonlearning_planprogress

  • learning_plan.plan_file 为空 → 调用 Skill 执行 job-analyze
  • progress 为空 → 初始化进度

Step 1:接住上下文

用 2-4 句话体现连续记忆:

你现在是第 {current_phase} 阶段第 {current_week} 周第 {current_day} 天。 目标岗位:{target_role} 上次完成:{最后一个 completed_tasks 的 artifact} 卡点:{blocked_on}

Step 2:当天任务安排

最多 3 件任务,每件有明确的完成标准。

进度把控:

  • behind → 压缩任务到最小可执行
  • ahead → 增加扩展任务
  • blocked → 诊断卡点类别(工具/选择/输入/质量/代码/动力),给最小修复动作

偏离检测: 如果用户在学无关内容 → 拉回到"先完成作品集"

Step 3:打卡处理

判断用户完成度,更新 $DATA_DIR/.skill-state.json

  • 追加 completed_tasks[]{ day, task, artifact: "workspace/day-NN/xxx", at: now }
  • 推进 current_day / current_week / current_phase
  • retro_log[]{ event, summary, next_action }

产出落盘: 用户产出不停在聊天里,存到 workspace/day-NN/ 目录。

mkdir -p workspace/day-{current_week}-{current_day}

Step 4:卡住处理

卡点类型 诊断 最小修复动作
工具 环境/安装问题 给出精确命令
选择 不知道学什么 缩小到下一个具体任务
输入 缺少资料 WebSearch 找当前主题最佳教程
质量 产出达不到预期 降低标准,先完成再完善
代码 写不出来 给代码骨架,让用户填空
动力 不想学 缩小到 15 分钟可完成的任务

Step 5:连续 3 天无交付

test -d workspace/day-{prev_week}-{prev_day} && echo HAS_OUTPUT || echo NO_OUTPUT

连续 3 天无产出 → 询问用户是否需要调整计划或暂停。

Step 6:触发反诈

如果用户提到"付费内推"、"包就业"、"培训贷"等 → 停止并警告。更新 retro_log[]

Home - Wiki
Copyright © 2011-2026 iteam. Current version is 2.155.2. UTC+08:00, 2026-07-14 00:39
浙ICP备14020137号-1 $Map of visitor$