job-pro 0.8.0 → 0.8.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/index.js +111 -53
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -51,67 +51,72 @@ import * as webank from "./webank.js";
51
51
  import * as horizonrobotics from "./horizonrobotics.js";
52
52
  import * as cambricon from "./cambricon.js";
53
53
  import { memoryList, memoryGet, memorySet, memoryEvent, memoryClear, } from "./memory.js";
54
- const VERSION = "0.8.0";
54
+ const VERSION = "0.8.2";
55
+ const COMPANIES = [
56
+ { key: "tencent", family: "Bespoke", source: "join.qq.com", label: "Tencent / 腾讯" },
57
+ { key: "bytedance", family: "Bespoke", source: "jobs.bytedance.com", label: "ByteDance / 字节跳动" },
58
+ { key: "alibaba", family: "Bespoke", source: "campus-talent.alibaba.com", label: "Alibaba / 阿里巴巴" },
59
+ { key: "meituan", family: "Bespoke", source: "zhaopin.meituan.com", label: "Meituan / 美团" },
60
+ { key: "xiaohongshu", family: "Bespoke", source: "job.xiaohongshu.com", label: "Xiaohongshu / 小红书" },
61
+ { key: "jd", family: "Bespoke", source: "campus.jd.com", label: "JD / 京东" },
62
+ { key: "kuaishou", family: "Bespoke", source: "campus.kuaishou.cn", label: "Kuaishou / 快手" },
63
+ { key: "baidu", family: "Bespoke", source: "talent.baidu.com", label: "Baidu / 百度" },
64
+ { key: "netease", family: "Bespoke", source: "hr.163.com", label: "NetEase / 网易" },
65
+ { key: "didi", family: "Bespoke", source: "talent.didiglobal.com", label: "Didi / 滴滴" },
66
+ { key: "bilibili", family: "Bespoke", source: "jobs.bilibili.com", label: "Bilibili / 哔哩哔哩" },
67
+ { key: "pdd", family: "Bespoke", source: "careers.pinduoduo.com", label: "PDD / 拼多多" },
68
+ { key: "huawei", family: "Bespoke", source: "career.huawei.com", label: "Huawei / 华为" },
69
+ { key: "weibo", family: "Bespoke", source: "career.sina.com.cn", label: "Weibo / 微博" },
70
+ { key: "mihoyo", family: "Bespoke", source: "ats.openout.mihoyo.com", label: "miHoYo / 米哈游" },
71
+ { key: "pingan", family: "Bespoke", source: "campus.pingan.com", label: "Ping An / 平安" },
72
+ { key: "trip", family: "Bespoke", source: "careers.ctrip.com", label: "Trip.com / 携程" },
73
+ { key: "unitree", family: "Bespoke", source: "www.unitree.com", label: "Unitree / 宇树科技" },
74
+ { key: "byd", family: "Bespoke", source: "job.byd.com", label: "BYD / 比亚迪" },
75
+ { key: "antgroup", family: "Bespoke", source: "hrcareersweb.antgroup.com", label: "Ant Group / 蚂蚁集团" },
76
+ { key: "liauto", family: "Bespoke", source: "www.lixiang.com", label: "Li Auto / 理想汽车" },
77
+ { key: "sf", family: "Bespoke", source: "campus.sf-express.com", label: "SF Express / 顺丰" },
78
+ { key: "oppo", family: "Bespoke", source: "careers.oppo.com", label: "OPPO" },
79
+ { key: "xiaomi", family: "Feishu", source: "xiaomi.jobs.f.mioffice.cn", label: "Xiaomi / 小米" },
80
+ { key: "nio", family: "Feishu", source: "nio.jobs.feishu.cn", label: "NIO / 蔚来" },
81
+ { key: "minimax", family: "Feishu", source: "vrfi1sk8a0.jobs.feishu.cn", label: "MiniMax" },
82
+ { key: "moonshot", family: "Moka", source: "app.mokahr.com/moonshot", label: "Moonshot / 月之暗面" },
83
+ { key: "zhipu", family: "Feishu", source: "zhipu-ai.jobs.feishu.cn", label: "Zhipu / 智谱AI" },
84
+ { key: "iqiyi", family: "Feishu", source: "careers.iqiyi.com", label: "iQIYI / 爱奇艺" },
85
+ { key: "agibot", family: "Feishu", source: "agirobot.jobs.feishu.cn", label: "Agibot / 智元机器人" },
86
+ { key: "lilith", family: "Feishu", source: "lilithgames.jobs.feishu.cn", label: "Lilith Games / 莉莉丝 — needs local Chrome" },
87
+ { key: "zerooneai", family: "Feishu", source: "01ai.jobs.feishu.cn", label: "01.AI / 零一万物" },
88
+ { key: "baichuan", family: "Feishu", source: "cq6qe6bvfr6.jobs.feishu.cn", label: "Baichuan / 百川智能" },
89
+ { key: "sensetime", family: "Beisen Wecruit", source: "hr.sensetime.com", label: "SenseTime / 商汤" },
90
+ { key: "horizonrobotics", family: "Beisen Wecruit", source: "wecruit.hotjob.cn", label: "Horizon Robotics / 地平线" },
91
+ { key: "vivo", family: "Beisen iTalent", source: "vivo.zhiye.com", label: "vivo" },
92
+ { key: "iflytek", family: "Beisen iTalent", source: "iflytek.zhiye.com", label: "iFlytek / 科大讯飞" },
93
+ { key: "megvii", family: "Moka", source: "app.mokahr.com/megviihr", label: "Megvii / 旷视" },
94
+ { key: "deepseek", family: "Moka", source: "app.mokahr.com/high-flyer", label: "DeepSeek / 深度求索" },
95
+ { key: "galaxyuniversal", family: "Moka", source: "app.mokahr.com/yinhetongyong", label: "Galaxy Universal / 银河通用" },
96
+ { key: "stepfun", family: "Moka", source: "app.mokahr.com/step", label: "StepFun / 阶跃星辰" },
97
+ { key: "cambricon", family: "Moka", source: "app.mokahr.com/cambricon", label: "Cambricon / 寒武纪" },
98
+ { key: "geely", family: "Moka", source: "app.mokahr.com/geely", label: "Geely / 吉利" },
99
+ { key: "xpeng", family: "Greenhouse / Lever (intl arm)", source: "boards.greenhouse.io/xpengmotors", label: "XPeng / 小鹏汽车 — US AI" },
100
+ { key: "weride", family: "Greenhouse / Lever (intl arm)", source: "jobs.lever.co/weride", label: "WeRide / 文远知行 — US / 广州" },
101
+ { key: "hoyoverse", family: "Greenhouse / Lever (intl arm)", source: "boards.greenhouse.io/hoyoverse", label: "HoYoverse / 米哈游国际" },
102
+ { key: "hikvision", family: "Liepin (third-party)", source: "api-c.liepin.com", label: "Hikvision / 海康威视" },
103
+ { key: "cicc", family: "Liepin (third-party)", source: "api-c.liepin.com", label: "CICC / 中金" },
104
+ { key: "cainiao", family: "Liepin (third-party)", source: "api-c.liepin.com", label: "Cainiao / 菜鸟" },
105
+ { key: "webank", family: "Liepin (third-party)", source: "api-c.liepin.com", label: "WeBank / 微众银行" },
106
+ ];
55
107
  const HELP = `
56
108
  job-pro — query Chinese big-tech campus recruiting from your terminal
57
109
  (job.ha7ch.com)
58
110
 
59
111
  USAGE
60
112
  job-pro <company> <verb> [options]
113
+ job-pro list [--compact] list all 50 companies + source family
61
114
  job-pro --version
62
115
  job-pro help
63
116
 
64
- COMPANIES
65
- tencent join.qq.com (Tencent / 腾讯)
66
- bytedance jobs.bytedance.com (ByteDance / 字节跳动)
67
- alibaba campus-talent.alibaba.com (Alibaba / 阿里巴巴)
68
- meituan zhaopin.meituan.com (Meituan / 美团)
69
- xiaohongshu job.xiaohongshu.com (Xiaohongshu / 小红书)
70
- jd campus.jd.com (JD / 京东)
71
- kuaishou campus.kuaishou.cn (Kuaishou / 快手)
72
- xiaomi xiaomi.jobs.f.mioffice.cn (Xiaomi / 小米 — Feishu ATSX)
73
- baidu talent.baidu.com (Baidu / 百度)
74
- netease hr.163.com (NetEase / 网易)
75
- didi talent.didiglobal.com (Didi / 滴滴 — mixed campus+social)
76
- bilibili jobs.bilibili.com (Bilibili / 哔哩哔哩)
77
- pdd careers.pinduoduo.com (PDD / 拼多多 — notices only, jobs need auth)
78
- nio nio.jobs.feishu.cn (NIO / 蔚来 — Feishu ATSX)
79
- minimax vrfi1sk8a0.jobs.feishu.cn (MiniMax — Feishu ATSX)
80
- huawei career.huawei.com (Huawei / 华为)
81
- weibo career.sina.com.cn (Weibo / 微博 — auth-gated, limited)
82
- mihoyo campus.mihoyo.com (miHoYo / 米哈游 — SPA, limited)
83
- pingan campus.pingan.com (Ping An / 平安 — unified group)
84
- sensetime hr.sensetime.com (SenseTime / 商汤 — auth-gated, limited)
85
- trip careers.ctrip.com (Trip.com / 携程)
86
- unitree www.unitree.com (Unitree / 宇树科技 — robotics)
87
- byd job.byd.com (BYD / 比亚迪 — JWT-gated, limited)
88
- antgroup talent.antgroup.com (Ant Group / 蚂蚁集团 — OAuth-gated, limited)
89
- liauto www.lixiang.com (Li Auto / 理想汽车)
90
- moonshot moonshot.jobs.feishu.cn (Moonshot / 月之暗面 — Feishu, 0 jobs)
91
- zhipu zhipu-ai.jobs.feishu.cn (Zhipu / 智谱AI — Feishu, social)
92
- hikvision hr.hikvision.com (Hikvision / 海康威视 — geo-blocked, limited)
93
- iqiyi careers.iqiyi.com (iQIYI / 爱奇艺 — Feishu ATSX)
94
- megvii joinus.megvii.com (Megvii / 旷视 — Moka-gated, limited)
95
- lilith jobs.lilith.com (Lilith Games / 莉莉丝 — DNS-blocked, limited)
96
- agibot agirobot.jobs.feishu.cn (Agibot / 智元机器人 — Feishu, 661 jobs)
97
- deepseek www.deepseek.com (DeepSeek / 深度求索 — Moka-gated, limited)
98
- zerooneai www.01.ai (01.AI / 零一万物 — limited)
99
- galaxyuniversal galbot.com (Galaxy Universal / 银河通用 — Moka-gated, limited)
100
- stepfun stepfun.com (StepFun / 阶跃星辰 — Moka-gated, limited)
101
- cicc cicc.com (CICC / 中金 — geo-blocked, limited)
102
- baichuan www.baichuan-ai.com (Baichuan / 百川智能 — no public API, limited)
103
- xpeng boards.greenhouse.io (XPeng / 小鹏汽车 — Greenhouse, US AI center)
104
- weride jobs.lever.co/weride (WeRide / 文远知行 — Lever)
105
- hoyoverse boards.greenhouse.io (HoYoverse / 米哈游国际 — Greenhouse)
106
- iflytek campus.iflytek.com (iFlytek / 科大讯飞 — iTalent-gated, limited)
107
- oppo careers.oppo.com (OPPO — bespoke 500, limited)
108
- vivo hr.vivo.com (vivo — BPM-gated, limited)
109
- sf campus.sf-express.com (SF Express / 顺丰 — captcha-gated, limited)
110
- cainiao cainiao.com (Cainiao / 菜鸟 — DNS-blocked, limited)
111
- geely geely.com (Geely / 吉利汽车 — DNS-blocked, limited)
112
- webank webank.com (WeBank / 微众银行 — WeChat-only, limited)
113
- horizonrobotics app.mokahr.com (Horizon Robotics / 地平线 — Moka-gated, limited)
114
- cambricon cambricon.com (Cambricon / 寒武纪 — DNS-blocked, limited)
117
+ 50 companies, all live. Run \`job-pro list\` for the full table grouped
118
+ by ATS family (Bespoke / Feishu / Beisen Wecruit / Beisen iTalent / Moka
119
+ / Greenhouse-Lever / Liepin). Coverage summary at job.ha7ch.com.
115
120
 
116
121
  VERBS (same surface for every company)
117
122
  search <kw> search openings (free text)
@@ -395,6 +400,53 @@ async function runCompany(adapter, company, rawArgs) {
395
400
  }
396
401
  die(`unknown verb: ${verb}. Try \`job-pro help\`.`);
397
402
  }
403
+ function printCompanyList(compact) {
404
+ // Validate the directory still matches the ADAPTERS map. If a company
405
+ // appears in only one place, treat it as a bug.
406
+ const adapterKeys = new Set(Object.keys(ADAPTERS));
407
+ const dirKeys = new Set(COMPANIES.map((c) => c.key));
408
+ const missingInDir = [...adapterKeys].filter((k) => !dirKeys.has(k));
409
+ const missingInAdapters = [...dirKeys].filter((k) => !adapterKeys.has(k));
410
+ if (missingInDir.length || missingInAdapters.length) {
411
+ console.error("INTERNAL: COMPANIES directory diverged from ADAPTERS map.\n" +
412
+ (missingInDir.length ? ` missing from directory: ${missingInDir.join(", ")}\n` : "") +
413
+ (missingInAdapters.length ? ` missing from adapters: ${missingInAdapters.join(", ")}\n` : ""));
414
+ }
415
+ if (compact) {
416
+ // Machine-readable: emit a JSON array of { key, family, source, label }.
417
+ console.log(JSON.stringify(COMPANIES));
418
+ return;
419
+ }
420
+ // Human-readable: group by family, fixed-width left column.
421
+ const byFamily = new Map();
422
+ for (const c of COMPANIES) {
423
+ if (!byFamily.has(c.family))
424
+ byFamily.set(c.family, []);
425
+ byFamily.get(c.family).push(c);
426
+ }
427
+ const order = [
428
+ "Bespoke",
429
+ "Feishu",
430
+ "Beisen Wecruit",
431
+ "Beisen iTalent",
432
+ "Moka",
433
+ "Greenhouse / Lever (intl arm)",
434
+ "Liepin (third-party)",
435
+ ];
436
+ const keyWidth = Math.max(...COMPANIES.map((c) => c.key.length));
437
+ const srcWidth = Math.max(...COMPANIES.map((c) => c.source.length));
438
+ console.log(`job-pro — 50 companies, all live. ATS-family breakdown:`);
439
+ for (const family of order) {
440
+ const entries = byFamily.get(family);
441
+ if (!entries)
442
+ continue;
443
+ console.log(`\n${family} (${entries.length})`);
444
+ for (const c of entries) {
445
+ console.log(` ${c.key.padEnd(keyWidth)} ${c.source.padEnd(srcWidth)} ${c.label}`);
446
+ }
447
+ }
448
+ console.log(`\nTotal: ${COMPANIES.length}. Run \`job-pro <key> search "…"\` against any of them.`);
449
+ }
398
450
  async function main() {
399
451
  const args = process.argv.slice(2);
400
452
  const cmd = args[0];
@@ -406,12 +458,18 @@ async function main() {
406
458
  console.log(VERSION);
407
459
  return;
408
460
  }
461
+ if (cmd === "list" || cmd === "companies") {
462
+ const compact = args.includes("--compact");
463
+ printCompanyList(compact);
464
+ return;
465
+ }
409
466
  const adapter = ADAPTERS[cmd];
410
467
  if (adapter) {
411
468
  await runCompany(adapter, cmd, args.slice(1));
412
469
  return;
413
470
  }
414
- die(`unknown company: ${cmd}. Supported: ${Object.keys(ADAPTERS).join(", ")}. Try \`job-pro help\`.`);
471
+ die(`unknown company: ${cmd}. Try \`job-pro list\` for the full list, ` +
472
+ `or \`job-pro help\` for usage.`);
415
473
  }
416
474
  main().catch((err) => {
417
475
  console.error("Error:", err instanceof Error ? err.message : err);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "job-pro",
3
- "version": "0.8.0",
3
+ "version": "0.8.2",
4
4
  "description": "Query Chinese big-tech campus recruiting from your terminal. 50 companies, all 50 live. 46 via each company's own API; the 4 with no public canonical feed (Hikvision, CICC, Cainiao, WeBank) surfaced via Liepin as a clearly-labeled third-party fallback. No signup, no token, no server.",
5
5
  "homepage": "https://job.ha7ch.com",
6
6
  "repository": "https://github.com/HA7CH/job-pro",