career-ops 高频问题完全指南从 Windows 安装报错到跨平台求职自动化实战【免费下载链接】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 求职工具 career-ops 的官方 FAQ 文档逐一拆解社区最常问到的十五类问题涵盖 Windows 技能安装修复、scan与scan:full的区别、批量运行避坑、低成本模型部署、跨公司职位重复投递cross-listing识别、自定义简历模板、数据可信度溯源、黑名单过滤等主题并结合仓库源码scaffolder/bin/skill-entrypoints.mjs、scan.mjs、scan-ats-full.mjs、fingerprint-core.mjs 等说明底层原理。读完你既能排查日常使用中的常见故障也能理解各功能的设计动机与实现边界。1. Windows 上技能未加载安装时的符号链接错误问题现象Windows 默认不创建符号链接symlink因此 Git 在检出仓库时会把 CLI 技能入口文件.claude/skills/、.opencode/skills/等目录下的文件以普通指针文件而非真正的软链接形式检出。结果是技能内容不会加载表现为Skills arent loading。官方解法无需手动执行mklink也无需开启 Windows 开发者模式Developer Mode。安装器与更新器都会自动检测这一情况# 已有安装执行一次修复 node update-system.mjs apply --confirm # 全新安装 npx santifer/career-ops init上述流程中的materializeSkillEntrypoints步骤会把指针文件替换为完整的规范技能内容。源码佐证scaffolder/bin/skill-entrypoints.mjs 中的materializeSkillEntrypoints(root)定义了这一机制它从规范路径读取权威技能内容readCanonical遍历.claude/skills/、.opencode/skills/、.grok/skills/、.kimi/skills/等入口点对每个入口执行lstat检查是真实符号链接则跳过说明已正常是普通文件且内容等于指针引用如../../../.agents/skills/career-ops/SKILL.md时才把文件内容整体替换为规范技能正文对应的ensureSkillEntrypoints则负责在入口缺失时补建指针文件。因此该修复是幂等、可重复执行的真链接不动、坏指针被实体化。相关回归测试也可在 test-all.mjs 中检索materializeSkillEntrypoints找到覆盖安装、更新、升级等场景。2.scan与scan:full的区别是什么两条命令对应两类扫描方向核心差异在于数据源的方向维度npm run scannpm run scan:full底层脚本scan.mjsscan-ats-full.mjs数据来源你配置在portals.yml中的公司清单直连其 ATS API反方向遍历公开 ATS 公司目录找出与你title_filter/location_filter匹配的新职位LLM Token 消耗零消耗纯 API 抓取零消耗匹配在本地完成适用场景日常每日/每周的固定公司发现更广泛的主动发现覆盖未加入portals.yml的公司package.json 中两脚本定义可直接印证scan: node scan.mjs、scan:full: node scan-ats-full.mjs。建议把npm run scan作为日常例行当你想跳出已跟踪公司清单、捕获来自新兴或尚未收录公司的职位时运行npm run scan:full。若 ATS 供应商的列表 API 本身返回了职位描述字段如 Lever 的descriptionPlainscan:full还会为每条新职位做内容指纹用于后面的跨列表检测见第 5 节。3. 批量运行中如何避免触发 Token 或速率限制FAQ 文档给出的核心策略是分批小跑 断点续跑# 每次只处理 5 个职位先检查输出质量 ./batch/batch-runner.sh --limit 5 # 中途被限流/网络错误打断后从已完成任务处继续 ./batch/batch-runner.sh --resume-paused关键原则若运行被速率限制或网络错误中断不要从头重跑。--resume-paused会跳过已完成的工作只接续未完成任务避免在已成功的工作上浪费 Token。源码佐证查看 batch/batch-runner.sh 的 usage 帮助文本可以发现完整参数面除--limit N与--resume-paused外还有--parallel N并行 worker 数默认 1、--dry-run只展示待处理项、--retry-failed只重试失败项、--start-from N、--max-retries N默认 2、--min-score N低于该分的职位跳过 PDF/跟踪默认关闭、--rate-limit-sleep N限流后等待秒数默认 300、--model NAME与--status/--watch进度查看等。注意该脚本依赖claude -p的--dangerously-skip-permissions与--append-system-prompt-file参数因此目前是 Claude Code 专用。4. 能否在更便宜或本地的模型上运行 career-ops可以——career-ops 对 AI 完全无绑定AI-agnostic可与任意 AI 编码 CLI 或独立脚本协作。低成本/本地模型完整指南见 docs/RUNNING_ON_A_BUDGET.md覆盖 OpenCode、Qwen CLI、DeepSeek、OpenRouter、Ollama 等提供商以及推荐的模型规格与省 Token 实践。零成本方案见 docs/FREE_TIER.md——career-ops 可在 Antigravity CLI 的免费额度上运行无需 API Key、无需付费订阅受 Google 每日配额限制。已付费但按 Token 计费怎么办这通常是环境中存在ANTHROPIC_API_KEY其优先级高于订阅。请查看预算指南中关于订阅的章节确认设置。5. 扫描时的 possible cross-listing 警告是什么意思当扫描器显示如下警告时⚠ Possible cross-listing: Acme Corp / Senior AI Engineer ↔ TalentBridge / Senior AI Engineer (similarity 0.96)它表示两家不同公司的两个职位描述几乎完全一致——通常是猎头/中介把雇主直聘岗位的 JD 原样转发只是删去或替换了雇主名。为什么重要如果你通过两个渠道都投递中介和雇主会各自独立看到你的申请形成重复投递double-submission可能损害与招聘团队的关系。该怎么办同时阅读两份 JD确认一份是雇主直发、一份是中介转发只选一个渠道投递。直投通常更稳妥若中介与用人经理关系好走中介也可能有用若两份职位其实是共享模板正文如通用工程师模板的不同岗位则该警告是误报可忽略并分别投递。技术原理源码级该警告源于 JD 内容指纹而非 URL 或公司名去重——后两者在直发中介场景下往往不同反而无法命中。从源码看fingerprint-core.mjs 设计为对规范化职位描述做 3-token shingle 的 64 位 SimHash16 个十六进制字符SimHash 是局部敏感哈希近似重复文本的指纹只差几个比特。扫描器对不同公司之间指纹相似度 ≥ 92%即 64 比特中至多 5 位不同且出现于 90 天时间窗内的两条记录发出警告指纹在本地根据 ATS API 已返回的文本计算不产生额外网络请求没有可用描述体的职位永远不会被赋指纹、也永远不会被标记指纹写入 data/scan-history.tsv 的第 8 列jd_fingerprint第 9 列为原始发布日期。完整列说明见 docs/SCRIPTS.md数据结构约定亦可参考 DATA_CONTRACT.md 中关于scan-history.tsv的描述。6. 能否使用自己的简历CV模板可以。在 config/profile.yml 中设置cv.template以及可选的cover_letter.template值为templates/目录下模板文件的 kebab-case 名称cv: template: modern # 解析到 templates/cv-template.modern.html cover_letter: template: modern # 解析到 templates/cover-letter-template.modern.html规则细节名字modern解析为templates/cv-template.modern.html求职信用templates/cover-letter-template.name.html留空则回退到内置默认模板templates/cv-template.html求职信为templates/cover-letter-template.html也可以按次选择在对话中直接要求use the modern template即可无需改配置。完整字段参考含注释见 config/profile.example.ymlcv.template注释说明它默认取templates/下cv-template.name.html并给出了modern与zh-minimal中文极简简历示例cover_letter.template同理。仓库中实际已交付的模板不止一套见第 10 节templates/sections/还提供可复用的段落片段。7. 为什么 career-ops 拒绝使用我故事库story bank里的数字一句话原因可信的数字 ≠ 已核实的数字。面试准备的文档往往为了匹配某个 JD 而草拟其措辞可能被后续吸收进interview-prep/story-bank.md。若无溯源检查一次准备中编造的数值会在下一次被复用逐渐洗成看似的事实。career-ops 采用两级信任模型一级用户撰写的原始来源——如cv.md、article-digest.md、config/profile.yml、modes/_profile.md、writing-samples/等是事实主张的地面真相ground truth二级累积/派生来源——如故事库、特定公司的面试准备可提供叙述与措辞但量化主张必须能追溯到一级来源或携带受支持的标记视为已核实**Provenance:** user-stated YYYY-MM-DD或**Provenance:** source: cv.md不视为已核实**Provenance:** derived-unverified、**Provenance:** user-cannot-confirm以及任意裸数值。本地审计命令无需调用 LLMnode story-provenance-check.mjs --summary源码佐证story-provenance-check.mjs 头注释把每条数值主张归类为四种existing数值本身可在 cv.md 等一级来源找到、supportedByResume数值不在 cv.md 但 cv.md 的陈述间接支撑、derived-unverified仅出现在 story-bank.md 且无 Provenance 字段是安全默认、user-cannot-confirmProvenance 字段被显式标为该值。脚本只读对标记的主张你应当对一级来源核实并修正数字、删除数字只保留叙述或者直接回答我不知道——最后一种回答被刻意设计为一等公民user-cannot-confirm标记能保证该数字在后续扫描中永不被当作已验证诚实的不确定永远不会通过重复被洗白成自信的事实。8. 如何阻止某家公司出现在扫描结果中三步启用公司黑名单复制模板templates/blacklist.example.md →data/blacklist.md每行列出一家公司可附带 Since / Scope / Reason 表格列作为你自选的记录保存即可生效。行为契约来自 templates/blacklist.example.md 与 docs/SCRIPTS.mdscan.mjs会跳过黑名单公司的职位——匹配是大小写与标点不敏感的与跟踪脚本共享的公司名规范化逻辑一致跳过从不静默运行摘要会报告N skipped (blacklist)并把计数写入data/scan-runs.tsv的filtered_blacklist列需要审计时可--include-blacklisted放行命中的职位会带note: blacklisted: {reason}注释流入data/pipeline.mdauto-pipeline、oferta、apply模式遇到命中会停下、引用你记录的原因并要求显式确认后才继续——你的决定始终优先黑名单只是闸门而非评分信号它绝不改动任何分数默认不存在黑名单文件 不过滤系统永远不会自动把公司加入列表。scan-ats-full.mjs同样遵循此规则。9.Discarded与SKIP有什么区别二者都是终态语义差异在于你对待这家公司的态度阶段Discarded已放弃description定义为 discarded by candidate or offer closed——你评估过、考虑过后来因候选人决定或职位关闭而停止推进SKIP跳过定义为 doesnt fit, dont apply——从来就不是候选人根本不适合投递。漏斗含义二者落在 dashboard 的不同分组因此在漏斗中统计口径不同——SKIP 属于筛选filteringDiscarded 属于中途退出dropping out。追踪漏斗时请勿混用。源码佐证templates/states.yml 是状态机事实源同时被 writercareer-ops与 dashboardreader消费。两个状态都是terminal: true且各自带大量多语言别名如discarded的西班牙语descartado/descartada、cerrada、canceladaskip的no_aplicar、geo blocker等便于多语言流水线写入精确状态。10. 只有一个简历模板吗不。templates/目录包含均可在仓库根下确认存在templates/cv-template.html内置默认 HTMLtemplates/cv-template.texLaTeX / Overleaftemplates/cv-template.zh-minimal.html中文极简风格配置cv.template: zh-minimaltemplates/resume-template.htmltemplates/cover-letter-template.html以及templates/sections/段落片段库此外可参考第 6 节能否用自己的简历模板。想深入了解 LaTeX 工作流的读者可继续阅读 docs/latex.md 相关模式文档但模板扩展的入口始终是config/profile.yml中的cv.template/cover_letter.template。11. 为什么某些扫描会打开 Chrome另一些不会Chromium 浏览器只在带--verify参数时启动。普通扫描读取公开 ATS API是纯文本请求不需要浏览器--verify用于核对某条职位是否真的仍然在线live这需要真实的页面加载因而启动 Chromium。如果验证失败报错会提示你运行npx playwright install chromium补齐浏览器二进制。12. 能在 Docker 或自托管环境中运行吗可以。仓库根目录下有 Dockerfile 与 docker-compose.yml。不过请注意边界career-ops 是local-first 且 human-in-the-loop本地优先、人在环上的因此 Docker 只负责封装运行环境它不会把 career-ops 变成一个自主常驻的服务也不会替你去投递职位。每次决策仍需你亲自确认。13. career-ops 支持多设备同步吗不支持。所有数据都是检出目录checkout里的文件没有任何云组件。需要多设备同步的用户做法是把整个目录放进某个同步盘/同步文件夹中。这与 docs/SETUP.md 描述的文件型数据契约一致参考 DATA_CONTRACT.md 中的数据文件清单。14. 如何让一个问题分配给我处理直接在对应 issue 下评论维护者会把 issue 分配给你该规则也写在 CONTRIBUTING.md 中。对 PR 而言无前置 issue 的贡献在以下范围内是受欢迎的bug 修复、零鉴权zero-auth的扫描器 provider、文档与翻译。只有新功能、新模式与架构变更才需要先提 issue、issue-first 流程。15. 不用终端能使用 career-ops 吗可以。官方在 docs/COWORK.md 中专门介绍了在 Claude Cowork 中运行的方式并已完成端到端验证。常见踩坑点Cowork 的 shell 没有 npm 网络访问权限所以必须先在一个普通终端里完成git clone与npm install再打开该文件夹——否则依赖安装会失败。附FAQ 速查表#问题一句话答案依据文件1Windows 技能不加载运行node update-system.mjs apply --confirmmaterializeSkillEntrypoints自动实体化技能文件scaffolder/bin/skill-entrypoints.mjs2scan vs scan:fullscan 扫你配置的公司scan:full 扫公开 ATS 目录里的新职位scan.mjs / scan-ats-full.mjs3批量限流--limit 5小跑验证中断后--resume-paused续跑batch/batch-runner.sh4便宜/本地模型完全 AI 无关见 docs/RUNNING_ON_A_BUDGET.md 与 docs/FREE_TIER.md—5cross-listing 警告64 位 SimHash JD 指纹相似度 ≥92% 且公司不同 → 疑似中介转投fingerprint-core.mjs6自定义简历模板cv.template: modern→templates/cv-template.modern.htmlconfig/profile.example.yml7故事库数字被拒派生来源的量化主张必须带Provenance且可溯源user-cannot-confirm永不升级story-provenance-check.mjs8屏蔽公司复制 templates/blacklist.example.md 到data/blacklist.mddocs/SCRIPTS.md9Discarded vs SKIP前者评估后放弃/关闭后者根本不合适漏斗口径不同templates/states.yml10模板数量不止一套HTML/LaTeX/zh-minimal/resume/cover-letter sectionstemplates/11Chrome 随机打开只有--verify活体校验才启动 Chromiumdocs/SCRIPTS.md12Docker/自托管可封装环境但不是自主服务、不会替你投递Dockerfile / docker-compose.yml13多设备同步不支持云端自建目录同步即可docs/SETUP.md14领取 issue评论即可bug/文档/翻译可免 issue 直接提 PRCONTRIBUTING.md15不用终端Claude Cowork 可用但 clone npm install须先在终端完成docs/COWORK.md以上就是 docs/FAQ.md 中全部高频问题的展开解答。若仍有疑问建议先查阅安装细节文档 docs/SETUP.md 及各功能对应的 SCRIPTS 文档新场景下请以本仓库当前版本的实际文件与命令为准。【免费下载链接】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),仅供参考