career-ops-job-search
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseCareer-Ops Job Search Pipeline
Career-Ops 求职管道
Skill by ara.so — Daily 2026 Skills collection.
Career-Ops turns Claude Code into a full job search command center. It evaluates offers with A-F scoring, generates ATS-optimized PDFs, scans 45+ company portals, and tracks everything in a single source of truth — all powered by Claude AI agents.
技能由 ara.so 开发 — 2026年度每日技能精选。
Career-Ops 将Claude Code转变为完整的求职指挥中心。它可以用A-F评分体系评估offer,生成ATS优化的PDF,扫描超过45个公司招聘门户,并在单一可信数据源中追踪所有进度 — 所有功能均由Claude AI agents驱动。
Installation
安装
bash
undefinedbash
undefined1. Clone the repo
1. 克隆仓库
git clone https://github.com/santifer/career-ops.git
cd career-ops
git clone https://github.com/santifer/career-ops.git
cd career-ops
2. Install Node dependencies (for PDF generation via Playwright)
2. 安装Node依赖(用于通过Playwright生成PDF)
npm install
npx playwright install chromium
npm install
npx playwright install chromium
3. Configure your profile
3. 配置你的个人档案
cp config/profile.example.yml config/profile.yml
cp config/profile.example.yml config/profile.yml
Edit config/profile.yml with your name, target roles, location, comp range, etc.
编辑config/profile.yml,填写你的姓名、目标岗位、所在地、薪资范围等信息
4. Configure portal scanner
4. 配置门户扫描器
cp templates/portals.example.yml portals.yml
cp templates/portals.example.yml portals.yml
Add/remove companies you want to track
添加/移除你想要追踪的公司
5. Add your CV in Markdown
5. 添加Markdown格式的简历
Create cv.md in project root — this is what the AI reads to evaluate fit
在项目根目录创建cv.md — AI会读取该文件评估岗位匹配度
cat > cv.md << 'EOF'
cat > cv.md << 'EOF'
Your Name
你的姓名
Experience
工作经历
...your CV content in markdown...
EOF
...Markdown格式的简历内容...
EOF
6. Build the Go dashboard (optional but recommended)
6. 构建Go仪表盘(可选但推荐)
cd dashboard
go build -o career-dashboard .
cd ..
undefinedcd dashboard
go build -o career-dashboard .
cd ..
undefinedPrerequisites
前置要求
- Node.js 18+ (for Playwright/PDF)
- Go 1.21+ (for dashboard TUI)
- Claude Code (CLI) with an active Anthropic API key
claude
bash
undefined- Node.js 18+(用于Playwright/PDF生成)
- Go 1.21+(用于仪表盘终端界面TUI)
- Claude Code(命令行工具)以及可用的Anthropic API密钥
claude
bash
undefinedVerify Claude Code is installed
验证Claude Code是否安装成功
claude --version
claude --version
Open career-ops in Claude Code
在Claude Code中打开career-ops
claude # run from the career-ops directory
---claude # 在career-ops目录下运行
---Core Commands
核心命令
All commands run inside Claude Code as slash commands. Paste into the Claude Code session:
/career-ops → Show all available modes
/career-ops {job URL or JD} → Full auto-pipeline: evaluate + PDF + tracker entry
/career-ops scan → Scan pre-configured portals for new offers
/career-ops pdf → Generate ATS-optimized CV for last evaluated offer
/career-ops batch → Batch evaluate multiple offers in parallel
/career-ops tracker → View application pipeline status
/career-ops apply → AI-assisted application form filling
/career-ops pipeline → Process all pending URLs in queue
/career-ops contacto → Generate LinkedIn outreach message
/career-ops deep → Deep company research report
/career-ops training → Evaluate a course or certification
/career-ops project → Evaluate a portfolio project fit所有命令都作为斜杠命令在Claude Code内运行,粘贴到Claude Code会话中即可使用:
/career-ops → 查看所有可用模式
/career-ops {岗位URL或岗位描述} → 全自动化流程:评估 + 生成PDF + 录入追踪系统
/career-ops scan → 扫描预设的招聘门户获取新岗位
/career-ops pdf → 为上一个评估的岗位生成ATS优化的简历PDF
/career-ops batch → 并行批量评估多个岗位
/career-ops tracker → 查看申请流程状态
/career-ops apply → AI辅助填写申请表单
/career-ops pipeline → 处理队列中所有待处理的URL
/career-ops contacto → 生成LinkedIn outreach消息
/career-ops deep → 生成深度公司调研报告
/career-ops training → 评估课程或认证的价值
/career-ops project → 评估作品集项目的匹配度Auto-detection shortcut
自动识别快捷方式
Just paste a raw job URL or job description text — career-ops detects it and runs the full pipeline automatically:
https://boards.greenhouse.io/anthropic/jobs/12345只需粘贴原始岗位URL或岗位描述文本 — career-ops会自动识别并运行完整流程:
https://boards.greenhouse.io/anthropic/jobs/12345Or paste the full JD text — Claude auto-routes it
或者粘贴完整的JD文本 — Claude会自动路由处理
---
---Configuration Files
配置文件
config/profile.yml
config/profile.ymlconfig/profile.yml
config/profile.ymlThis is your candidate profile. Claude reads this for every evaluation.
yaml
undefined这是你的候选人档案,Claude每次评估都会读取该文件的内容。
yaml
undefinedconfig/profile.yml
config/profile.yml
name: "Your Name"
title: "Head of Applied AI"
location: "Madrid, Spain"
timezone: "CET"
remote_preference: "remote-first"
target_roles:
- "Head of AI"
- "AI Engineer"
- "LLMOps Engineer"
- "Solutions Architect (AI)"
compensation:
currency: "EUR"
minimum: 120000
target: 150000
equity: true
languages:
- "English (C2)"
- "Spanish (Native)"
archetypes:
- "LLMOps"
- "Agentic"
- "PM-AI"
- "Solutions Architect"
undefinedname: "你的姓名"
title: "应用AI负责人"
location: "西班牙马德里"
timezone: "CET"
remote_preference: "远程优先"
target_roles:
- "AI负责人"
- "AI工程师"
- "LLMOps工程师"
- "解决方案架构师(AI方向)"
compensation:
currency: "EUR"
minimum: 120000
target: 150000
equity: true
languages:
- "英语(C2)"
- "西班牙语(母语)"
archetypes:
- "LLMOps"
- "Agentic"
- "PM-AI"
- "解决方案架构师"
undefinedportals.yml
portals.ymlportals.yml
portals.ymlConfigure which company job boards to scan:
yaml
undefined配置要扫描的公司招聘板:
yaml
undefinedportals.yml (copied from templates/portals.example.yml)
portals.yml(从templates/portals.example.yml复制而来)
companies:
-
name: "Anthropic" url: "https://www.anthropic.com/careers" board: "greenhouse"
-
name: "ElevenLabs" url: "https://elevenlabs.io/careers" board: "ashby"
-
name: "n8n" url: "https://n8n.io/careers" board: "custom"
job_boards:
ashby:
base_url: "https://jobs.ashbyhq.com"
greenhouse:
base_url: "https://boards.greenhouse.io"
lever:
base_url: "https://jobs.lever.co"
search_queries:
- "AI engineer remote"
- "LLMOps"
- "Head of AI Europe"
undefinedcompanies:
-
name: "Anthropic" url: "https://www.anthropic.com/careers" board: "greenhouse"
-
name: "ElevenLabs" url: "https://elevenlabs.io/careers" board: "ashby"
-
name: "n8n" url: "https://n8n.io/careers" board: "custom"
job_boards:
ashby:
base_url: "https://jobs.ashbyhq.com"
greenhouse:
base_url: "https://boards.greenhouse.io"
lever:
base_url: "https://jobs.lever.co"
search_queries:
- "AI engineer remote"
- "LLMOps"
- "Head of AI Europe"
undefinedtemplates/states.yml
templates/states.ymltemplates/states.yml
templates/states.ymlCanonical pipeline statuses (edit to match your workflow):
yaml
undefined标准的流程状态(可根据你的工作流编辑):
yaml
undefinedtemplates/states.yml
templates/states.yml
statuses:
- id: "pending" label: "Pending Review"
- id: "evaluating" label: "Under Evaluation"
- id: "applied" label: "Applied"
- id: "screening" label: "HR Screening"
- id: "interview" label: "Interviewing"
- id: "offer" label: "Offer Received"
- id: "rejected" label: "Rejected"
- id: "withdrawn" label: "Withdrawn"
---statuses:
- id: "pending" label: "待审核"
- id: "evaluating" label: "评估中"
- id: "applied" label: "已申请"
- id: "screening" label: "HR筛选中"
- id: "interview" label: "面试中"
- id: "offer" label: "已收到offer"
- id: "rejected" label: "已被拒绝"
- id: "withdrawn" label: "已撤回申请"
---Modes Directory
模式目录
Each file in is a Claude skill that defines behavior for one command:
modes/modes/
├── _shared.md # Shared context injected into every mode — customize this first
├── oferta.md # /career-ops {JD} — full evaluation pipeline
├── pdf.md # /career-ops pdf — PDF CV generation
├── scan.md # /career-ops scan — portal scanner
├── batch.md # /career-ops batch — parallel evaluation
├── tracker.md # /career-ops tracker — pipeline viewer
├── apply.md # /career-ops apply — form filling
├── pipeline.md # /career-ops pipeline — process queue
├── contacto.md # /career-ops contacto — LinkedIn outreach
├── deep.md # /career-ops deep — company research
├── training.md # /career-ops training — cert evaluation
└── project.md # /career-ops project — portfolio project fitmodes/modes/
├── _shared.md # 注入到每个模式的共享上下文 — 优先自定义这个文件
├── oferta.md # /career-ops {JD} — 完整评估流程
├── pdf.md # /career-ops pdf — PDF简历生成
├── scan.md # /career-ops scan — 门户扫描
├── batch.md # /career-ops batch — 并行评估
├── tracker.md # /career-ops tracker — 流程查看器
├── apply.md # /career-ops apply — 表单填写
├── pipeline.md # /career-ops pipeline — 处理队列
├── contacto.md # /career-ops contacto — LinkedIn outreach
├── deep.md # /career-ops deep — 公司调研
├── training.md # /career-ops training — 认证评估
└── project.md # /career-ops project — 作品集项目匹配度Customizing modes via Claude
通过Claude自定义模式
Ask Claude to modify the system from within Claude Code:
undefined在Claude Code中直接要求Claude修改系统:
undefinedIn your Claude Code session:
在你的Claude Code会话中:
"Change the archetypes in _shared.md to focus on backend engineering roles"
"Translate all modes to English"
"Add Mistral and Cohere to portals.yml"
"Update the scoring weights in oferta.md to weight compensation at 20%"
"Add a new mode called 'referral' for tracking employee referrals"
---"修改_shared.md中的原型,聚焦后端工程岗位"
"将所有模式翻译成英文"
"在portals.yml中添加Mistral和Cohere"
"更新oferta.md中的评分权重,将薪资权重设为20%"
"添加一个名为'referral'的新模式,用于追踪员工内推"
---Go Dashboard TUI
Go 仪表盘终端界面(TUI)
The terminal dashboard provides a visual pipeline browser with filtering and sorting.
终端仪表盘提供可视化的流程浏览器,支持筛选和排序。
Building and running
构建和运行
bash
cd dashboard
go build -o career-dashboard .
./career-dashboardbash
cd dashboard
go build -o career-dashboard .
./career-dashboardDashboard features
仪表盘功能
- 6 filter tabs: All, Pending, Applied, Interviewing, Offer, Rejected
- 4 sort modes: Date, Score, Company, Status
- Grouped/flat view: Toggle between company groups and flat list
- Lazy-loaded previews: Press Enter to read the full evaluation report
- Inline status changes: Update status without leaving the TUI
- 6个筛选标签:全部、待处理、已申请、面试中、Offer、已拒绝
- 4种排序模式:日期、评分、公司、状态
- 分组/平铺视图:在公司分组和平铺列表之间切换
- 懒加载预览:按Enter键查看完整评估报告
- 内联状态修改:无需离开TUI即可更新状态
Go module structure
Go模块结构
go
// dashboard/main.go — entry point
package main
import (
tea "github.com/charmbracelet/bubbletea"
"github.com/charmbracelet/lipgloss"
)
func main() {
p := tea.NewProgram(initialModel(), tea.WithAltScreen())
if _, err := p.Run(); err != nil {
log.Fatal(err)
}
}go
// dashboard/model.go — core data model
package main
import "time"
type Application struct {
ID string `json:"id"`
Company string `json:"company"`
Role string `json:"role"`
Score string `json:"score"` // A, B+, B, C, D, F
Status string `json:"status"`
URL string `json:"url"`
ReportPath string `json:"report_path"`
PDFPath string `json:"pdf_path"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
Archetype string `json:"archetype"` // LLMOps, Agentic, PM, SA...
CompRange string `json:"comp_range"`
Notes string `json:"notes"`
}
type Model struct {
applications []Application
filtered []Application
cursor int
activeTab int
sortMode int
grouped bool
preview string
showPreview bool
width int
height int
}go
// dashboard/main.go — 入口文件
package main
import (
tea "github.com/charmbracelet/bubbletea"
"github.com/charmbracelet/lipgloss"
)
func main() {
p := tea.NewProgram(initialModel(), tea.WithAltScreen())
if _, err := p.Run(); err != nil {
log.Fatal(err)
}
}go
// dashboard/model.go — 核心数据模型
package main
import "time"
type Application struct {
ID string `json:"id"`
Company string `json:"company"`
Role string `json:"role"`
Score string `json:"score"` // A, B+, B, C, D, F
Status string `json:"status"`
URL string `json:"url"`
ReportPath string `json:"report_path"`
PDFPath string `json:"pdf_path"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
Archetype string `json:"archetype"` // LLMOps, Agentic, PM, SA...
CompRange string `json:"comp_range"`
Notes string `json:"notes"`
}
type Model struct {
applications []Application
filtered []Application
cursor int
activeTab int
sortMode int
grouped bool
preview string
showPreview bool
width int
height int
}Reading pipeline data from TSV
从TSV读取流程数据
go
// dashboard/data.go
package main
import (
"encoding/csv"
"os"
"path/filepath"
)
func loadApplications(dataDir string) ([]Application, error) {
tsvPath := filepath.Join(dataDir, "pipeline.tsv")
f, err := os.Open(tsvPath)
if err != nil {
return nil, err
}
defer f.Close()
r := csv.NewReader(f)
r.Comma = '\t'
r.LazyQuotes = true
records, err := r.ReadAll()
if err != nil {
return nil, err
}
var apps []Application
for _, record := range records[1:] { // skip header
if len(record) < 8 {
continue
}
apps = append(apps, Application{
ID: record[0],
Company: record[1],
Role: record[2],
Score: record[3],
Status: record[4],
URL: record[5],
})
}
return apps, nil
}go
// dashboard/data.go
package main
import (
"encoding/csv"
"os"
"path/filepath"
)
func loadApplications(dataDir string) ([]Application, error) {
tsvPath := filepath.Join(dataDir, "pipeline.tsv")
f, err := os.Open(tsvPath)
if err != nil {
return nil, err
}
defer f.Close()
r := csv.NewReader(f)
r.Comma = '\t'
r.LazyQuotes = true
records, err := r.ReadAll()
if err != nil {
return nil, err
}
var apps []Application
for _, record := range records[1:] { // 跳过表头
if len(record) < 8 {
continue
}
apps = append(apps, Application{
ID: record[0],
Company: record[1],
Role: record[2],
Score: record[3],
Status: record[4],
URL: record[5],
})
}
return apps, nil
}Batch Processing
批量处理
Batch mode evaluates multiple offers in parallel using sub-agents.
claude -p批量模式使用子代理并行评估多个岗位。
claude -pSetup batch queue
设置批量队列
bash
undefinedbash
undefinedCreate a batch input file — one URL per line
创建批量输入文件 — 每行一个URL
cat > batch/queue.txt << 'EOF'
https://boards.greenhouse.io/company/jobs/123
https://jobs.lever.co/company/456
https://jobs.ashbyhq.com/company/789
EOF
undefinedcat > batch/queue.txt << 'EOF'
https://boards.greenhouse.io/company/jobs/123
https://jobs.lever.co/company/456
https://jobs.ashbyhq.com/company/789
EOF
undefinedRun batch evaluation
运行批量评估
bash
undefinedbash
undefinedFrom Claude Code session:
在Claude Code会话中:
/career-ops batch
/career-ops batch
Or directly from terminal using the runner script:
或者直接在终端使用运行脚本:
cd batch
./batch-runner.sh queue.txt
undefinedcd batch
./batch-runner.sh queue.txt
undefinedbatch/batch-runner.sh
batch/batch-runner.shbatch/batch-runner.sh
batch/batch-runner.shbash
#!/usr/bin/env bashbash
#!/usr/bin/env bashbatch-runner.sh — orchestrates parallel claude -p workers
batch-runner.sh — 协调并行claude -p工作进程
QUEUE_FILE="${1:-queue.txt}"
MAX_PARALLEL=4
PROMPT_FILE="batch-prompt.md"
while IFS= read -r url; do
[[ -z "$url" || "$url" == #* ]] && continue
# Launch sub-agent for each URL
claude -p "$(cat $PROMPT_FILE)\n\nEvaluate this offer: $url" \
--output-format json \
>> ../data/batch-results.jsonl &
# Throttle parallelism
while [[ $(jobs -r | wc -l) -ge $MAX_PARALLEL ]]; do
sleep 2
donedone < "$QUEUE_FILE"
wait
echo "Batch complete. Results in data/batch-results.jsonl"
---QUEUE_FILE="${1:-queue.txt}"
MAX_PARALLEL=4
PROMPT_FILE="batch-prompt.md"
while IFS= read -r url; do
[[ -z "$url" || "$url" == #* ]] && continue
# 为每个URL启动子代理
claude -p "$(cat $PROMPT_FILE)\n\nEvaluate this offer: $url" \
--output-format json \
>> ../data/batch-results.jsonl &
# 控制并行数
while [[ $(jobs -r | wc -l) -ge $MAX_PARALLEL ]]; do
sleep 2
donedone < "$QUEUE_FILE"
wait
echo "批量处理完成,结果保存在data/batch-results.jsonl"
---PDF Generation
PDF 生成
PDFs are generated via Playwright rendering an HTML template with injected keywords.
PDF通过Playwright渲染注入了关键词的HTML模板生成。
Triggering PDF generation
触发PDF生成
undefinedundefinedIn Claude Code — after an evaluation:
在Claude Code中 — 完成评估后:
/career-ops pdf
/career-ops pdf
Claude will:
Claude会执行以下操作:
1. Read the last evaluation report
1. 读取上一份评估报告
2. Extract keywords from the job description
2. 从岗位描述中提取关键词
3. Inject them into templates/cv-template.html
3. 将关键词注入templates/cv-template.html
4. Render with Playwright to output/{company}-{role}.pdf
4. 使用Playwright渲染为output/{公司}-{岗位}.pdf
undefinedundefinedManual Playwright PDF render (Node.js)
手动Playwright PDF渲染(Node.js)
javascript
// scripts/generate-pdf.js
const { chromium } = require('playwright');
const fs = require('fs');
const path = require('path');
async function generatePDF(htmlContent, outputPath) {
const browser = await chromium.launch();
const page = await browser.newPage();
await page.setContent(htmlContent, { waitUntil: 'networkidle' });
await page.pdf({
path: outputPath,
format: 'A4',
margin: { top: '20mm', bottom: '20mm', left: '15mm', right: '15mm' },
printBackground: true,
});
await browser.close();
console.log(`PDF generated: ${outputPath}`);
}
// Usage
const template = fs.readFileSync('templates/cv-template.html', 'utf8');
const company = process.argv[2] || 'company';
const role = process.argv[3] || 'role';
const outputPath = path.join('output', `${company}-${role}.pdf`);
generatePDF(template, outputPath);javascript
// scripts/generate-pdf.js
const { chromium } = require('playwright');
const fs = require('fs');
const path = require('path');
async function generatePDF(htmlContent, outputPath) {
const browser = await chromium.launch();
const page = await browser.newPage();
await page.setContent(htmlContent, { waitUntil: 'networkidle' });
await page.pdf({
path: outputPath,
format: 'A4',
margin: { top: '20mm', bottom: '20mm', left: '15mm', right: '15mm' },
printBackground: true,
});
await browser.close();
console.log(`PDF已生成:${outputPath}`);
}
// 使用示例
const template = fs.readFileSync('templates/cv-template.html', 'utf8');
const company = process.argv[2] || 'company';
const role = process.argv[3] || 'role';
const outputPath = path.join('output', `${company}-${role}.pdf`);
generatePDF(template, outputPath);Pipeline Data Structure
流程数据结构
Career-ops stores data in (gitignored):
data/data/
├── pipeline.tsv # Main tracker — all applications
├── batch-results.jsonl # Batch evaluation outputs
└── urls-pending.txt # Queue for /career-ops pipeline
reports/
└── {company}-{role}-{date}.md # Full evaluation reports
output/
└── {company}-{role}.pdf # Generated CVsCareer-ops将数据存储在目录下(已加入gitignore):
data/data/
├── pipeline.tsv # 主追踪文件 — 所有申请记录
├── batch-results.jsonl # 批量评估输出
└── urls-pending.txt # /career-ops pipeline的待处理队列
reports/
└── {公司}-{岗位}-{日期}.md # 完整评估报告
output/
└── {公司}-{岗位}.pdf # 生成的简历Pipeline TSV format
流程TSV格式
tsv
id company role score status url archetype comp_range created_at updated_at report_path pdf_path
abc123 Anthropic AI Engineer A applied https://... LLMOps $150k-$200k 2026-04-05 2026-04-05 reports/anthropic-ai-engineer.md output/anthropic-ai-engineer.pdftsv
id company role score status url archetype comp_range created_at updated_at report_path pdf_path
abc123 Anthropic AI Engineer A applied https://... LLMOps $150k-$200k 2026-04-05 2026-04-05 reports/anthropic-ai-engineer.md output/anthropic-ai-engineer.pdfEvaluation Scoring System
评估评分体系
Career-ops scores offers on 10 weighted dimensions producing an A-F grade:
| Dimension | Weight | What it measures |
|---|---|---|
| Role fit | 20% | Match between JD requirements and your CV |
| Level alignment | 15% | Seniority match |
| Compensation | 15% | Comp vs your target range |
| Tech stack | 15% | Stack overlap with your skills |
| Company stage | 10% | Startup/scale-up/enterprise fit |
| Remote policy | 10% | Location/remote match |
| Growth potential | 5% | Career trajectory opportunity |
| Mission alignment | 5% | Personal interest in the domain |
| Interview signals | 3% | Glassdoor/process quality signals |
| Recruiter quality | 2% | JD quality, clarity, red flags |
Grade thresholds: A ≥ 85, B+ ≥ 75, B ≥ 65, C ≥ 50, D ≥ 35, F < 35
Career-ops从10个加权维度对岗位进行评分,生成A-F等级:
| 维度 | 权重 | 评估内容 |
|---|---|---|
| 岗位匹配度 | 20% | JD要求与你的简历的匹配程度 |
| 级别匹配度 | 15% | 职级匹配度 |
| 薪资 | 15% | 薪资与你的目标范围的匹配度 |
| 技术栈 | 15% | 技术栈与你的技能的重叠度 |
| 公司阶段 | 10% | 初创/扩张/成熟企业的匹配度 |
| 远程政策 | 10% | 地点/远程政策匹配度 |
| 成长潜力 | 5% | 职业发展机会 |
| 使命匹配度 | 5% | 个人对领域的兴趣度 |
| 面试信号 | 3% | Glassdoor/面试流程质量信号 |
| 招聘人员质量 | 2% | JD质量、清晰度、风险信号 |
等级阈值:A ≥ 85, B+ ≥ 75, B ≥ 65, C ≥ 50, D ≥ 35, F < 35
Common Patterns
常用使用场景
Evaluate a single offer end-to-end
端到端评估单个岗位
undefinedundefinedIn Claude Code session (claude command in project root):
在Claude Code会话中(在项目根目录运行claude命令):
Claude will:
Claude会执行以下操作:
1. Scrape the job description
1. 爬取岗位描述
2. Detect archetype (LLMOps, Agentic, PM-AI, etc.)
2. 识别原型(LLMOps、Agentic、PM-AI等)
3. Score against your cv.md and profile.yml
3. 对照你的cv.md和profile.yml进行评分
4. Generate 6-block evaluation report → reports/
4. 生成6模块评估报告 → 存入reports/目录
5. Create ATS-optimized PDF → output/
5. 生成ATS优化的PDF → 存入output/目录
6. Add entry to data/pipeline.tsv
6. 在data/pipeline.tsv中添加记录
undefinedundefinedAdd a company to the scanner
向扫描器添加公司
yaml
undefinedyaml
undefinedIn portals.yml, add under companies:
在portals.yml的companies下添加:
- name: "Langfuse" url: "https://langfuse.com/careers" board: "ashby" filter_keywords: - "AI" - "engineer" - "remote"
undefined- name: "Langfuse" url: "https://langfuse.com/careers" board: "ashby" filter_keywords: - "AI" - "engineer" - "remote"
undefinedThen run:
然后运行:
/career-ops scan
undefined/career-ops scan
undefinedBuild interview story bank
构建面试故事库
The STAR+R system accumulates stories across evaluations:
undefinedSTAR+R系统会在多次评估中积累故事:
undefinedAfter several evaluations, run:
完成多次评估后运行:
/career-ops tracker
/career-ops tracker
Claude surfaces your strongest STAR stories and maps them
Claude会展示你最有竞争力的STAR故事,并将它们映射到常见行为问题。故事积累在:
to common behavioral questions. Stories accumulate in:
reports/_story-bank.md
reports/_story-bank.md
—
undefinedundefinedSalary negotiation script generation
薪资谈判脚本生成
undefinedundefinedAfter receiving an offer:
收到offer后:
/career-ops {paste the offer details}
/career-ops {粘贴offer详情}
Claude generates:
Claude会生成:
- Counter-offer script with specific numbers
- 带有具体数字的还价脚本
- Geographic discount pushback if applicable
- 适用时的地域折扣反驳话术
- Competing offer leverage language
- 利用其他offer作为筹码的话术
- Email templates for each scenario
- 每种场景的邮件模板
---
---Troubleshooting
问题排查
Playwright/PDF issues
Playwright/PDF相关问题
bash
undefinedbash
undefinedChromium not found
找不到Chromium
npx playwright install chromium
npx playwright install chromium
PDF generation fails silently
PDF生成静默失败
node scripts/generate-pdf.js 2>&1 | head -50
node scripts/generate-pdf.js 2>&1 | head -50
Font not loading in PDF (Space Grotesk / DM Sans)
PDF中字体不显示(Space Grotesk / DM Sans)
Ensure fonts/ directory has the .woff2 files
确保fonts/目录下有.woff2文件
ls fonts/
ls fonts/
SpaceGrotesk-.woff2 DMSans-.woff2
SpaceGrotesk-.woff2 DMSans-.woff2
undefinedundefinedGo dashboard won't build
Go仪表盘构建失败
bash
cd dashboard
go mod tidy
go build -o career-dashboard .bash
cd dashboard
go mod tidy
go build -o career-dashboard .Missing Bubble Tea dependency
缺少Bubble Tea依赖
go get github.com/charmbracelet/bubbletea
go get github.com/charmbracelet/lipgloss
go get github.com/charmbracelet/bubbles
undefinedgo get github.com/charmbracelet/bubbletea
go get github.com/charmbracelet/lipgloss
go get github.com/charmbracelet/bubbles
undefinedTSV parsing errors
TSV解析错误
bash
undefinedbash
undefinedCheck pipeline.tsv for malformed rows
检查pipeline.tsv中是否有格式错误的行
awk -F'\t' 'NF != 12 {print NR": "NF" fields: "$0}' data/pipeline.tsv
awk -F'\t' 'NF != 12 {print NR": "NF" fields: "$0}' data/pipeline.tsv
Re-run integrity check via Claude:
通过Claude重新运行完整性检查:
"Run pipeline integrity check and fix any malformed rows in pipeline.tsv"
"运行流程完整性检查,修复pipeline.tsv中所有格式错误的行"
undefinedundefinedClaude Code not finding modes
Claude Code找不到模式
bash
undefinedbash
undefinedVerify CLAUDE.md is in project root
验证CLAUDE.md是否在项目根目录
ls CLAUDE.md # Must exist
ls CLAUDE.md # 必须存在
Verify modes directory
验证modes目录
ls modes/ # Should show *.md files
ls modes/ # 应该展示*.md文件
If Claude doesn't recognize /career-ops, re-open from project root:
如果Claude无法识别/career-ops,从项目根目录重新打开:
cd /path/to/career-ops
claude
undefinedcd /path/to/career-ops
claude
undefinedScanner blocked by bot detection
扫描器被机器人检测拦截
yaml
undefinedyaml
undefinedIn portals.yml, add delays for rate-limited sites:
在portals.yml中为有限流的站点添加延迟:
- name: "CompanyName" url: "https://company.com/careers" board: "greenhouse" scrape_delay_ms: 3000 user_agent: "Mozilla/5.0 (compatible)"
---- name: "CompanyName" url: "https://company.com/careers" board: "greenhouse" scrape_delay_ms: 3000 user_agent: "Mozilla/5.0 (compatible)"
---Project Structure Reference
项目结构参考
career-ops/
├── CLAUDE.md # Agent instructions (read by Claude Code)
├── cv.md # YOUR CV in markdown — create this
├── article-digest.md # Your proof points / portfolio (optional)
├── config/
│ └── profile.example.yml # Copy to profile.yml and fill out
├── modes/ # 14 Claude skill definitions
│ ├── _shared.md # Shared context — customize first
│ └── *.md # One file per /career-ops command
├── templates/
│ ├── cv-template.html # ATS CV template (Space Grotesk + DM Sans)
│ ├── portals.example.yml # Copy to portals.yml
│ └── states.yml # Pipeline status definitions
├── batch/
│ ├── batch-prompt.md # Self-contained worker prompt for sub-agents
│ └── batch-runner.sh # Parallel orchestrator
├── dashboard/ # Go TUI (Bubble Tea + Lipgloss)
│ ├── main.go
│ ├── model.go
│ ├── data.go
│ └── go.mod
├── fonts/ # Space Grotesk + DM Sans woff2 files
├── data/ # Runtime data — gitignored
├── reports/ # Evaluation reports — gitignored
├── output/ # Generated PDFs — gitignored
├── docs/
│ ├── SETUP.md
│ ├── CUSTOMIZATION.md
│ └── ARCHITECTURE.md
└── examples/ # Sample CV, report, proof pointscareer-ops/
├── CLAUDE.md # Agent指令(Claude Code读取)
├── cv.md # 你的Markdown格式简历 — 需自行创建
├── article-digest.md # 你的证明材料/作品集(可选)
├── config/
│ └── profile.example.yml # 复制为profile.yml并填写
├── modes/ # 14个Claude技能定义
│ ├── _shared.md # 共享上下文 — 优先自定义
│ └── *.md # 每个/career-ops命令对应一个文件
├── templates/
│ ├── cv-template.html # ATS简历模板(Space Grotesk + DM Sans)
│ ├── portals.example.yml # 复制为portals.yml
│ └── states.yml # 流程状态定义
├── batch/
│ ├── batch-prompt.md # 子代理的独立工作提示词
│ └── batch-runner.sh # 并行协调器
├── dashboard/ # Go TUI(Bubble Tea + Lipgloss)
│ ├── main.go
│ ├── model.go
│ ├── data.go
│ └── go.mod
├── fonts/ # Space Grotesk + DM Sans woff2文件
├── data/ # 运行时数据 — 已加入gitignore
├── reports/ # 评估报告 — 已加入gitignore
├── output/ # 生成的PDF — 已加入gitignore
├── docs/
│ ├── SETUP.md
│ ├── CUSTOMIZATION.md
│ └── ARCHITECTURE.md
└── examples/ # 示例简历、报告、证明材料Key Design Principles
核心设计原则
- Quality over quantity — the scoring system is designed to filter out weak fits, not to maximize application volume
- Claude customizes Claude — ask Claude to edit the modes, weights, and archetypes; it knows the file structure
- Single source of truth — is the canonical record; all commands read/write it consistently
data/pipeline.tsv - Gitignore your data — ,
data/,reports/, andoutput/are gitignored by default; your personal info stays localcv.md
- 质量优先于数量 — 评分体系旨在过滤掉匹配度低的岗位,而不是最大化申请数量
- Claude自定义Claude — 要求Claude编辑模式、权重和原型,它了解整个文件结构
- 单一可信数据源 — 是权威记录,所有命令都会一致地读写该文件
data/pipeline.tsv - 个人数据本地存储 — 、
data/、reports/和output/默认已加入gitignore,你的个人信息始终保存在本地cv.md