career-ops SKILL.md 路由器解析让 8 种 Agent CLI 共用同一套 AI 求职命令中心【免费下载链接】career-opsOpen-source AI job search: scan job portals, evaluate listings into a structured A-H report with a global 1-5 score, tailor your CV, track applications — runs locally in your AI coding CLI (Claude Code, Codex, OpenCode, Antigravity…)项目地址: https://gitcode.com/GitHub_Trending/ca/career-opscareer-ops 是一个运行在 AI 编码 CLI 里的本地求职自动化系统扫描招聘门户、对职位做 A–H 结构化评估并给出 1–5 全局分、按职位定制简历 PDF、跟踪申请状态。它要跑在 Claude Code、Codex、OpenCode、Antigravity、Grok、Qwen、Kimi、Copilot 等多家 CLI 上而.qwen/skills/career-ops/SKILL.md正是这套命令中心的总路由Router它定义项目根如何解析、各 CLI 如何调用、30 个模式mode如何从一行输入映射到对应的modes/*.md指令文件以及每种模式执行前要加载哪些上下文。读完本篇你将理解多 CLI 技能路由的完整设计并能在自己的 agent CLI 会话中直接复现 career-ops 的调用方式。一、SKILL.md 的定位路由文件不是业务文件SKILL.md 全文约 200 行标题即# career-ops -- Router开头一句定调career-ops is a multi-CLI job-search command center. The routing below is shared across supported agent CLIs even when the invocation surface differs.它本身不执行评估、不渲染 PDF只做三件事解析 PROJECT_ROOT、把输入路由到某个模式、规定该模式执行前要读哪些文件。真正的业务逻辑住在modes/目录下的一堆 Markdown 指令文件中modes/auto-pipeline.md、modes/oferta.md、modes/pdf.md等SKILL.md 是它们前面的分发器。1.1 frontmatterCLI 的技能元数据文件头部的 YAML frontmatter 是各 agent CLI 发现与注册该技能所需的元数据--- name: career-ops description: - AI job search command center -- evaluate offers, generate CVs, scan portals, track applications. Use when the user pastes a job URL or JD, asks to scan portals, generate a CV/PDF, track applications, prepare for interviews, draft outreach/emails, or run any career-ops mode. arguments: mode user_invocable: true user-invocable: true argument-hint: [scan | discover | deep | pdf | text | latex | latex-tex | cover | email | add | expand | eu-swe | oferta | ofertas | apply | batch | tracker | agent-inbox | pipeline | contacto | training | project | interview-prep | interview | interview/plan | interview/practice | interview/debrief | interview-redflag | patterns | offer-prep | titles | upskill | followup | reply-watch | outcome | update] license: MIT ---几个关键字段的含义arguments: mode声明该技能接收一个位置参数mode后文所有路由逻辑都围绕$mode展开user_invocable/user-invocable: true双写不同 CLI 对字段下划线/连字符的命名不统一表示用户可以主动调用该技能argument-hint给 CLI 输入框的补全提示列出了全部合法子命令——包括interview/plan、interview/practice、interview/debrief这类带斜杠的二级模式对应modes/interview/子目录下的文件description同时承担触发器职责告诉模型当用户粘贴 JD、要求扫描门户、生成 PDF、准备面试时使用本技能。1.2 一份源码七份拷贝多 CLI 兼容策略值得注意的工程细节是这份 SKILL.md 在项目里存在多个完全一致的拷贝分别放在各 CLI 的技能发现目录下。仓库中的实际布局是.claude/skills/career-ops/SKILL.mdClaude Code.cursor/skills/career-ops/SKILL.mdCursor.opencode/skills/career-ops/SKILL.mdOpenCode.kimi/skills/career-ops/SKILL.md、.grok/skills/career-ops/SKILL.md、.antigravitycli/skills/career-ops/SKILL.md、.agents/skills/career-ops/SKILL.md经逐字节 diff 验证这七份文件与 .qwen/skills/career-ops/SKILL.md 完全相同。这是典型的路由语义与调用界面解耦每家 CLI 的技能发现机制不同有的读.claude/skills/有的读.opencode/skills/有的读通用.agents/skills/但路由规则本身只维护一份语义靠同步拷贝保证各 CLI 行为一致。package.json当前版本 1.31.0的 description 也印证了支持范围works with any AI coding CLI (Claude Code, Codex, OpenCode, Antigravity, Grok, Qwen, Kimi, Copilot)。此外 OpenCode 还提供了一层更薄的命令封装 .opencode/commands/career-ops.md内容只是把$ARGUMENTS透传并调用skill({ name: career-ops })——即命令层只负责把参数递进来路由仍全部由 SKILL.md 完成。二、Project Root Resolution一切路径解析的前提SKILL.md 在开始任何路由之前先规定了一条硬性前置规则Project Root Resolution 一节Before reading any repo-relative path, derivePROJECT_ROOTfrom this loadedSKILL.md: start at the skill files directory and walk upward until the nearest directory containing bothAGENTS.mdandmodes/.即从 SKILL.md 自身所在目录开始逐级向上直到找到同时包含AGENTS.md和modes/两个哨兵的目录将其定为PROJECT_ROOT此后路由器中出现的每个相对路径modes/、config/、data/、脚本、模板、输出路径都必须相对PROJECT_ROOT解析绝不能相对进程当前工作目录。这条规则解决的是两个真实场景嵌套检出仓库 clone 在比如Development\career-ops这样的子路径下子目录启动用户在仓库某个子目录里启动 CLI 会话。两条哨兵文件的选择也有讲究——AGENTS.md是项目的总行为契约见 AGENTS.mdmodes/是全部模式指令的目录两者同时存在即唯一标识这是一个 career-ops 根。SKILL.md 还给出失败兜底If those two sentinels cannot be found, stop and locate the career-ops checkout before reading or writing files.——找不到哨兵就停下不得瞎猜路径读写文件。从源码结构看这一层之上还有一层更细的Data Root概念modes/_shared.md定义了用户数据层cv.md、config/profile.yml、data/applications.md等的解析顺序——环境变量CAREER_OPS_ROOT/CAREER_OPS_DATA_DIR优先其次是仓库根的.career-ops-data标记文件最后回退到仓库根本身见 modes/_shared.md 的 Data Root Path Resolution 一节。SKILL.md 的 PROJECT_ROOT 规则负责找到项目根Data Root 规则负责项目根下用户数据放在哪二者共同保证同一套路由语义在任何检出位置、任何 CLI 下都指向相同文件。三、Invocation Notes各家 CLI 的入口差异与统一语义SKILL.md 用一节 Invocation Notes 把各 CLI 的调用面差异显式列出核心主张是最后一句无论入口是斜杠命令还是自然语言提示下面的路由语义保持不变。环境调用方式支持斜杠命令注册的 CLI以/career-ops暴露本路由器Cursor技能位于.cursor/skills/career-ops/自动发现按名称要某个模式或直接粘贴 JD/URL 触发 auto-pipeline交互式 Codex在仓库根用codexCodex 不保证有斜杠命令/career-ops不可用时让 Codex 按名称跑同一模式无头 Codex workercodex exec prompt文档同时给出了一组斜杠命令 ↔ Codex 自然语言提示的等价示例这是多 CLI 语义对齐的具体写法/career-ops {JD} ↔ Evaluate this JD with career-ops auto-pipeline: {JD or URL} /career-ops scan ↔ Run the career-ops scan mode and summarize new matches. /career-ops pipeline ↔ Run the career-ops pipeline mode for data/pipeline.md. /career-ops pdf ↔ Run the career-ops pdf mode for the latest evaluated role. /career-ops email ↔ Run the career-ops email mode for the latest evaluated role. /career-ops tracker ↔ Run the career-ops tracker mode and summarize the current statuses.四、Mode Routing从一行输入到 30 个模式4.1 路由表路由器从$mode确定模式SKILL.md 给出的完整映射如下已按文档顺序完整保留输入路由到的模式空 / 无参数discovery—— 显示命令菜单JD 文本或 URL无子命令auto-pipelineofertaofertaofertasofertascontactocontactodeepdeepinterview-prepinterview-prepinterviewintervieweu-sweregional/eu-sweeu-fintechregional/eu-fintechinterview/planinterview/planinterview/practiceinterview/practiceinterview/debriefinterview/debriefpdfpdftexttextlatexlatexlatex-texlatex-texemailemailaddaddexpandexpandtrainingtrainingprojectprojecttrackertrackeragent-inboxagent-inboxinboxagent-inboxpipelinepipelineapplyapplyscanscandiscoverdiscoverbatchbatchpatternspatternsoffer-prepoffer-preptitlestitlesupskillupskillfollowupfollowupreply-watchreply-watchoutcomeoutcomeinterview-redflaginterview-redflagupdateupdatecovercover可以看到路由不是纯粹的参数名 → 文件直映还包含三类转换别名折叠inbox→agent-inbox重定向到子目录eu-swe/eu-fintech→regional/eu-swe、regional/eu-fintech仓库中对应 modes/regional/eu-swe.mdinterview/*→modes/interview/下的 plan、practice、debrief默认捕获参数为空 → 进入 discovery 菜单。4.2 Auto-pipeline 的隐式触发路由表之外还有一条自动检测规则Auto-pipeline detection: If$modeis not a known sub-command AND contains JD text (keywords: responsibilities, requirements, qualifications, about the role, were looking for, company name role) or a URL to a JD, executeauto-pipeline.即用户什么都不加、直接粘贴一段 JD 文本或一个职位链接时路由器靠关键词responsibilities、requirements、qualifications、about the role、were looking for、公司名职位或 URL 特征判断这像一份 JD直接进 auto-pipeline 全流程既不识别为子命令、又不像 JD 的输入则回落到 discovery 菜单。这条规则让粘贴链接即用成为产品的主路径——也是argument-hint里第一个选项{JD}的含义。五、Output Language Directive路由之后、执行之前的语言指令SKILL.md 规定在任何模式执行前如果config/profile.yml存在先读取并解析两个键language.output→ 面向人类的输出语言ISO 语言码默认enlanguage.modes_dir→ 可选的市场模式目录只控制市场词汇与本地评估规则不控制行文语言。然后在加载完模式指令之后、产出任何用户可见内容之前注入如下指令Write all human-facing output in{language.output}regardless of the language of these instructions or of the job description. This includes reports, tracker notes, PDFs, cover letters, outreach, interview prep, form answers, and summaries. Iflanguage.modes_dirsupplies market-specific vocabulary, keep the market logic but explain terms in{language.output}when needed.language.output对行文语言有最终裁定权modes_dir只是市场语境不能强制行文语言。这一设计与 config/profile.example.yml 中的注释完全对应language: # Human-facing output language for reports, tracker notes, PDFs, cover # letters, outreach, and form answers. Use an ISO language code such as # en or zh-CN; zh-CN also enables Chinese PDF typography rules. # This is separate from language.modes_dir: modes_dir selects market # vocabulary/rules, while output selects the prose language. output: en # modes_dir: modes/de # optional: use DACH market vocabulary while still writing in English仓库里modes/下确实存在按市场/语言划分的指令目录如 modes/de/、modes/es/、modes/ru/、modes/zh/ 等modes_dir选择其中一个即为用德语市场词汇、但用你指定的语言输出这类组合的来源。六、Discovery Mode无参数时的完整命令菜单当$mode为空且 CLI 支持/career-ops时路由器展示如下菜单SKILL.md 原文保留这是全部模式的人读文档career-ops -- Command Center Available commands: /career-ops {JD} → AUTO-PIPELINE: evaluate report PDF tracker (paste text or URL) /career-ops pipeline → Process pending URLs from inbox (data/pipeline.md) /career-ops oferta → Evaluation only A-F (no auto PDF) /career-ops ofertas → Compare and rank multiple offers /career-ops contacto → LinkedIn power move: find contacts draft message /career-ops deep → Deep research prompt about company /career-ops interview-prep → Generate company-specific interview prep doc /career-ops interview → Interactive profile/CV onboarding interview /career-ops eu-swe → Calibrate a European SWE application before CV/apply/interview /career-ops eu-fintech → Scan 21 EU fintech portals for Product Manager roles (zero-token) /career-ops interview/plan → Time-blocked prep plan for an upcoming interview /career-ops interview/practice → Practice interview, one question at a time with feedback /career-ops interview/debrief → Post-interview debrief: close gaps, predict next round /career-ops pdf → PDF only, ATS-optimized CV /career-ops text → Tailored markdown CV (mirrors cv.md, no PDF) /career-ops latex → Export CV as LaTeX/Overleaf .tex /career-ops latex-tex → Tailor your own resume.tex in place (opt-in; cv.md stays default) /career-ops cover → Cover letter: standalone JD paste or /career-ops cover {slug} /career-ops email → Formal application email draft (draft-only; never sends, submits, or clicks) /career-ops add → Add a project/paper/role to your CV (fetch preview confirm) /career-ops expand → Auto-discover and add missing competencies from profile links /career-ops training → Evaluate course/cert against North Star /career-ops project → Evaluate portfolio project idea /career-ops tracker → Application status overview /career-ops agent-inbox → Queue/drain requests for the next session (data/agent-inbox.md) /career-ops apply → Live application assistant (reads form generates answers) /career-ops scan → Scan portals and discover new offers /career-ops discover → Resolve a company list to scannable ATS boards append to portals.yml (zero-token) /career-ops batch → Batch processing with parallel workers /career-ops patterns → Analyze rejection patterns and improve targeting /career-ops offer-prep → Read a received offer/contract with the candidate: clause walk lawyer questions (not legal advice) /career-ops titles → Suggest adjacent job titles from your CV to broaden the search /career-ops upskill → Aggregate skill-gap analysis from your evaluated reports /career-ops followup → Follow-up cadence tracker: flag overdue, generate drafts /career-ops outcome → Record application outcome archive artifacts /career-ops update → Update career-ops system files with diff preview compat check Inbox: add URLs to data/pipeline.md → /career-ops pipeline Or paste a JD directly to run the full pipeline.菜单末尾也点明了两条主路径往data/pipeline.md里攒 URL 再跑pipeline或者直接粘贴 JD 跑完整流水线。对不支持菜单的 CLI如 Codex 纯文本会话SKILL.md 要求surface the same options in plain text并用第三节那组等价提示映射到同一模式。七、Context Loading by Mode三种加载档位与子代理委派路由确定模式后SKILL.md 的最后一节 Context Loading by Mode 规定执行前必须加载哪些上下文文件。这是一套按模式分档的上下文预算控制核心规则若modes/_custom.md存在在modes/_profile.md之后、所选模式文件之前读取它承载用户的家庭规则流程偏好可以覆盖工作流/风格默认值但永远不得引入关于候选人的事实性声明按模式分为三档加载档位一需要_shared.md 模式文件读取顺序为modes/_shared.mdmodes/_profile.md如存在modes/_custom.md如存在modes/{mode}.md适用于auto-pipeline、oferta、ofertas、pdf、text、contacto、apply、pipeline、scan、batch_shared.md是全局系统上下文真相来源清单、评分体系、模型分层表只有涉及评估/生成用户可见内容的模式才需要它——这正是 modes/_shared.md 顶部声明自身为系统规则、评分逻辑、工具配置的用途。档位二独立模式仅 profile custom 上下文读取modes/_profile.md如存在modes/_custom.md如存在modes/{mode}.md适用于tracker、agent-inbox、deep、interview-prep、interview、regional/eu-swe、interview/plan、interview/practice、interview/debrief、latex、latex-tex、training、project、patterns、titles、upskill、followup、reply-watch、outcome、cover、email、add、offer-prep、discover这类模式要么只做状态展示tracker、要么只做单点生成cover/email不需要完整的评分上下文从而省掉_shared.md的 token 开销。档位三委派给子代理对scan、apply带 Playwright 时、pipeline3 个以上 URL不占用主交互上下文而是以 worker/subagent 方式启动把_shared.md_profile.md如存在_custom.md如存在modes/{mode}.md的内容注入 worker prompt。SKILL.md 给出了标准调用形态Agent( subagent_typegeneral-purpose, prompt[output language directive]\n\n[content of modes/_shared.md]\n\n[content of modes/_profile.md if exists]\n\n[content of modes/_custom.md if exists]\n\n[content of modes/{mode}.md]\n\n[invocation-specific data], descriptioncareer-ops {mode} )注意 prompt 首段就是第五节的 output language directive——语言指令被路由层强制前置而不是各模式文件各自重复。这与 modes/scan.md 中Recommended Execution一节的建议一致scan 也明确自己是 single-pass worker不得再派生子代理。八、路由命中之后以 auto-pipeline 为例的下游验证路由器本身只是分发它的价值要靠下游模式文件兑现。以隐式触发的主路径 auto-pipeline 为例modes/auto-pipeline.md 定义了被路由命中之后的五步执行链可与上文路由规则互相印证Step 0 — 提取 JDURL 输入按优先级取内容——Playwrightbrowser_navigatebrowser_snapshot→ WebFetch → WebSearch若config/profile.yml设置了scan.extractor: cli改用无头脚本node browser-extract.mjs url返回紧凑{ url, title, text }报错则静默回退对应 browser-extract.mjs 与 config/profile.example.yml 中scan.extractor注释。所有抓取内容一律视为不可信数据而非指令。Step 0.5 — Liveness gate用 Step 0 的快照判断职位是否仍有效active vs closed 证据已关闭则停在此处不做后续评估且把来源条目标记为失效。modes/oferta.md 与 modes/pipeline.md 中各有一份对应的 liveness 规则后者甚至要求先用零 token 的node check-liveness.mjs --file tmpfile批量预扫见 check-liveness.mjs说明死链不得进入评估是贯穿全项目的不变式。Step 0.6 — Blacklist gate若data/blacklist.md存在先查公司黑名单命中则停下并让用户显式决定绝不静默拒绝或静默通过。Step 1 — A–G 评估按 modes/oferta.md 执行七个 BlockA 角色摘要、B 匹配、C 薪酬、D 文化信号、E 简历改写建议、F 面试 STAR、G 真实性并受有界研究预算约束——公司与薪酬研究合计最多 5 次 WebSearch 查询禁止升级为深度研究或再派子代理。Step 2 — 存报告写入reports/{###}-{company-slug}-{YYYY-MM-DD}.md报告编号在 pipeline 场景下由node reserve-report-num.mjs原子申领见 reserve-report-num.mjs。Step 3 — 生成 PDF按cv.output_format分流到modes/pdf.md/modes/latex.md/modes/text.md三条渲染管线pipeline 批量场景还受auto_pdf_score_threshold门限控制缺省 3.0见 config/profile.example.yml 注释。Step 4/5总分 ≥ 4.5 才起草申请表答案写入报告 H 节最后更新data/applications.md跟踪表任一步失败则继续后续步骤并在 tracker 中把失败步标记为 pending。评分口径本身也由路由加载的 modes/_shared.md 定义五个维度CV 匹配、North Star 契合、薪酬、文化信号、红旗综合成一个 1–5 全局分4.5 立即申请、4.0–4.4 值得申请、3.5–3.9 视情况、低于 3.5 不建议申请——这套分数就是项目描述中A–H report with a global 1–5 score的落点也是 discovery 菜单里各命令offer-prep、upskill、patterns 等共享的评分基准。九、动手复现最小配置与调用方式在只读仓库上体验这套路由最小步骤是复制配置模板cp config/profile.example.yml config/profile.yml至少填写candidate段与language.output路由的语言指令读的就是它个人事实性定制按 AGENTS.md 的数据契约写入modes/_profile.md或config/profile.yml程序性家庭规则写入modes/_custom.md可从 modes/_custom.template.md 拷贝——这三层文件正是第七节三档上下文加载读取的对象在支持斜杠命令的 CLI 中于仓库根执行/career-ops无参数看 discovery 菜单或/career-ops {JD}直接跑 auto-pipeline在 Codex 类无斜杠命令的 CLI 中用第三节的自然语言等价提示如Run the career-ops tracker mode and summarize the current statuses.——路由语义完全一致。用户层数据cv.md、config/、data/、reports/等与系统层modes/_shared.md、各*.mjs脚本、templates/、batch/的隔离由 DATA_CONTRACT.md 完整列举更新系统文件时用户定制不会被覆盖——这也是 SKILL.md 把路径解析、上下文加载这些系统行为与模式文件分开表述的原因。十、小结Router 文件值得借鉴的三个设计回看 SKILL.md它作为多 CLI 项目的技能路由器体现了三个可复用的工程模式哨兵目录 向上回溯的根解析用AGENTS.mdmodes/双哨兵定位 PROJECT_ROOT并强制一切路径相对项目根而非 CWD使嵌套检出与子目录启动都不破行为一致性一份路由语义、多份 CLI 发现拷贝七家 CLI 目录下的 SKILL.md 逐字节一致调用面差异被压缩到一页 Invocation Notes 一组等价提示示例里路由表本身零差异按模式分档的上下文加载全局规则_shared.md只在需要它的评估类模式加载展示/单点生成类模式只带 profile 与 custom重负载模式整体委派子代理并强制把语言指令注入 prompt 首位——把token 预算控制写进了路由层而不是留给各模式文件自觉。对想在 agent CLI 里搭命令中心的读者这份不到 200 行的 Router 文件及其背后的modes/目录结构是一个可以直接对照实现的参考先写路由与上下文加载契约再逐个补模式文件各 CLI 的适配成本会被压缩到 frontmatter 与目录名这一层。【免费下载链接】career-opsOpen-source AI job search: scan job portals, evaluate listings into a structured A-H report with a global 1-5 score, tailor your CV, track applications — runs locally in your AI coding CLI (Claude Code, Codex, OpenCode, Antigravity…)项目地址: https://gitcode.com/GitHub_Trending/ca/career-ops创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考