job-pro 0.8.1 → 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 -67
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -51,81 +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.1";
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 (50 all live; see job.ha7ch.com for the full matrix)
65
-
66
- Bespoke per-company API
67
- tencent join.qq.com (Tencent / 腾讯)
68
- bytedance jobs.bytedance.com (ByteDance / 字节跳动)
69
- alibaba campus-talent.alibaba.com (Alibaba / 阿里巴巴)
70
- meituan zhaopin.meituan.com (Meituan / 美团)
71
- xiaohongshu job.xiaohongshu.com (Xiaohongshu / 小红书)
72
- jd campus.jd.com (JD / 京东)
73
- kuaishou campus.kuaishou.cn (Kuaishou / 快手)
74
- baidu talent.baidu.com (Baidu / 百度)
75
- netease hr.163.com (NetEase / 网易)
76
- didi talent.didiglobal.com (Didi / 滴滴)
77
- bilibili jobs.bilibili.com (Bilibili / 哔哩哔哩)
78
- pdd careers.pinduoduo.com (PDD / 拼多多)
79
- huawei career.huawei.com (Huawei / 华为)
80
- weibo career.sina.com.cn (Weibo / 微博)
81
- mihoyo ats.openout.mihoyo.com (miHoYo / 米哈游)
82
- pingan campus.pingan.com (Ping An / 平安)
83
- trip careers.ctrip.com (Trip.com / 携程)
84
- unitree www.unitree.com (Unitree / 宇树科技)
85
- byd job.byd.com (BYD / 比亚迪)
86
- antgroup hrcareersweb.antgroup.com (Ant Group / 蚂蚁集团)
87
- liauto www.lixiang.com (Li Auto / 理想汽车)
88
- zerooneai 01ai.jobs.feishu.cn (01.AI / 零一万物)
89
- baichuan cq6qe6bvfr6.jobs.feishu.cn (Baichuan / 百川智能)
90
- sf campus.sf-express.com (SF Express / 顺丰)
91
- oppo careers.oppo.com (OPPO)
92
-
93
- Feishu Recruiting (ATSX)
94
- xiaomi xiaomi.jobs.f.mioffice.cn (Xiaomi / 小米)
95
- nio nio.jobs.feishu.cn (NIO / 蔚来)
96
- minimax vrfi1sk8a0.jobs.feishu.cn (MiniMax)
97
- moonshot moonshot.jobs.feishu.cn (Moonshot / 月之暗面)
98
- zhipu zhipu-ai.jobs.feishu.cn (Zhipu / 智谱AI)
99
- iqiyi careers.iqiyi.com (iQIYI / 爱奇艺)
100
- agibot agirobot.jobs.feishu.cn (Agibot / 智元机器人)
101
- lilith lilithgames.jobs.feishu.cn (Lilith Games / 莉莉丝 — needs local Chrome)
102
-
103
- Beisen Wecruit
104
- sensetime hr.sensetime.com (SenseTime / 商汤)
105
- horizonrobotics wecruit.hotjob.cn (Horizon Robotics / 地平线)
106
-
107
- Beisen iTalent (zhiye)
108
- vivo vivo.zhiye.com (vivo)
109
- iflytek iflytek.zhiye.com (iFlytek / 科大讯飞)
110
-
111
- Moka (app.mokahr.com)
112
- megvii app.mokahr.com/megviihr (Megvii / 旷视)
113
- deepseek app.mokahr.com/high-flyer (DeepSeek / 深度求索)
114
- galaxyuniversal app.mokahr.com/yinhetongyong (Galaxy Universal / 银河通用)
115
- stepfun app.mokahr.com/step (StepFun / 阶跃星辰)
116
- cambricon app.mokahr.com/cambricon (Cambricon / 寒武纪)
117
- geely app.mokahr.com/geely (Geely / 吉利)
118
-
119
- Greenhouse / Lever (international arm only)
120
- xpeng boards.greenhouse.io/xpengmotors (XPeng / 小鹏汽车 — US AI)
121
- weride jobs.lever.co/weride (WeRide / 文远知行 — US / 广州)
122
- hoyoverse boards.greenhouse.io/hoyoverse (HoYoverse / 米哈游国际)
123
-
124
- Third-party (Liepin aggregator — no canonical public feed exists)
125
- hikvision api-c.liepin.com (Hikvision / 海康威视)
126
- cicc api-c.liepin.com (CICC / 中金)
127
- cainiao api-c.liepin.com (Cainiao / 菜鸟)
128
- webank api-c.liepin.com (WeBank / 微众银行)
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.
129
120
 
130
121
  VERBS (same surface for every company)
131
122
  search <kw> search openings (free text)
@@ -409,6 +400,53 @@ async function runCompany(adapter, company, rawArgs) {
409
400
  }
410
401
  die(`unknown verb: ${verb}. Try \`job-pro help\`.`);
411
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
+ }
412
450
  async function main() {
413
451
  const args = process.argv.slice(2);
414
452
  const cmd = args[0];
@@ -420,12 +458,18 @@ async function main() {
420
458
  console.log(VERSION);
421
459
  return;
422
460
  }
461
+ if (cmd === "list" || cmd === "companies") {
462
+ const compact = args.includes("--compact");
463
+ printCompanyList(compact);
464
+ return;
465
+ }
423
466
  const adapter = ADAPTERS[cmd];
424
467
  if (adapter) {
425
468
  await runCompany(adapter, cmd, args.slice(1));
426
469
  return;
427
470
  }
428
- 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.`);
429
473
  }
430
474
  main().catch((err) => {
431
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.1",
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",