@xbongbong/xbbcli 2.1.1 → 2.4.0

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 (263) hide show
  1. package/README.md +97 -6
  2. package/auth-login.js +306 -0
  3. package/auth-logout.js +175 -0
  4. package/auth-status.js +105 -0
  5. package/bin/xbbcli.js +15 -2
  6. package/buyer-inquiry-detail.js +2 -14
  7. package/buyer-inquiry-list.js +2 -14
  8. package/clue-add-couser.js +2 -14
  9. package/clue-add.js +2 -14
  10. package/clue-back.js +2 -14
  11. package/clue-del.js +2 -14
  12. package/clue-delete-couser.js +2 -14
  13. package/clue-delete-mainuser.js +2 -14
  14. package/clue-detail.js +2 -14
  15. package/clue-distribution.js +2 -14
  16. package/clue-edit.js +2 -14
  17. package/clue-handover.js +3 -15
  18. package/clue-list.js +2 -14
  19. package/clue-thorough-delete.js +2 -14
  20. package/communicate-add.js +2 -14
  21. package/communicate-del.js +2 -14
  22. package/communicate-detail.js +2 -14
  23. package/communicate-edit.js +2 -14
  24. package/communicate-list.js +2 -14
  25. package/communicate-plan-add.js +2 -14
  26. package/communicate-plan-cancel.js +2 -14
  27. package/communicate-plan-del.js +2 -14
  28. package/communicate-plan-detail.js +2 -14
  29. package/communicate-plan-list.js +2 -14
  30. package/communicate-plan-single-operate.js +2 -14
  31. package/contact-add-couser.js +2 -14
  32. package/contact-add-mainuser.js +2 -14
  33. package/contact-add.js +2 -14
  34. package/contact-del.js +2 -14
  35. package/contact-delete-couser.js +2 -14
  36. package/contact-delete-mainuser.js +2 -14
  37. package/contact-detail.js +2 -14
  38. package/contact-edit.js +2 -14
  39. package/contact-handover.js +2 -14
  40. package/contact-list.js +2 -14
  41. package/contract-add-couser.js +2 -14
  42. package/contract-add-mainuser.js +2 -14
  43. package/contract-add.js +2 -14
  44. package/contract-del.js +2 -14
  45. package/contract-delete-couser.js +2 -14
  46. package/contract-delete-mainuser.js +2 -14
  47. package/contract-detail.js +2 -14
  48. package/contract-edit.js +2 -14
  49. package/contract-handover.js +2 -14
  50. package/contract-list.js +2 -14
  51. package/contract-outstock-add.js +2 -14
  52. package/contract-outstock-del.js +2 -14
  53. package/contract-outstock-detail.js +2 -14
  54. package/contract-outstock-edit.js +2 -14
  55. package/contract-outstock-list.js +2 -14
  56. package/customer-add-couser.js +2 -14
  57. package/customer-add.js +2 -14
  58. package/customer-back.js +2 -14
  59. package/customer-del.js +2 -14
  60. package/customer-delete-couser.js +2 -14
  61. package/customer-delete-mainuser.js +2 -14
  62. package/customer-detail.js +2 -14
  63. package/customer-distribution.js +2 -14
  64. package/customer-edit.js +2 -14
  65. package/customer-handover.js +2 -14
  66. package/customer-invoice-address-add.js +2 -14
  67. package/customer-invoice-address-edit.js +2 -14
  68. package/customer-invoice-address.js +2 -14
  69. package/customer-invoice-info-add.js +2 -14
  70. package/customer-invoice-info-edit.js +2 -14
  71. package/customer-invoice-info.js +2 -14
  72. package/customer-list.js +2 -14
  73. package/department-add.js +2 -14
  74. package/department-del.js +2 -14
  75. package/department-edit.js +2 -14
  76. package/department-list.js +2 -14
  77. package/form-data-add-couser.js +2 -14
  78. package/form-data-add-mainuser.js +2 -14
  79. package/form-data-add.js +2 -14
  80. package/form-data-del.js +2 -14
  81. package/form-data-delete-couser.js +2 -14
  82. package/form-data-delete-mainuser.js +2 -14
  83. package/form-data-detail.js +2 -14
  84. package/form-data-edit.js +2 -14
  85. package/form-data-handover.js +2 -14
  86. package/form-data-list.js +2 -14
  87. package/form-get.js +2 -14
  88. package/form-list.js +2 -14
  89. package/{ai-call-add-task.js → hkh-call-add-task.js} +4 -16
  90. package/{ai-word-list.js → hkh-word-list.js} +4 -16
  91. package/invoice-add.js +3 -15
  92. package/invoice-cancel.js +3 -15
  93. package/invoice-del.js +3 -15
  94. package/invoice-detail.js +3 -15
  95. package/invoice-edit.js +3 -15
  96. package/invoice-get-amount-detail.js +3 -15
  97. package/invoice-list.js +3 -15
  98. package/invoice-red.js +3 -15
  99. package/label-add.js +3 -15
  100. package/label-all-list.js +3 -15
  101. package/label-batch-add.js +3 -15
  102. package/label-batch-remove.js +3 -15
  103. package/label-del-completely.js +3 -15
  104. package/label-del.js +3 -15
  105. package/label-edit.js +3 -15
  106. package/label-group-add.js +3 -15
  107. package/label-group-del.js +3 -15
  108. package/label-group-list.js +3 -15
  109. package/label-group-update.js +3 -15
  110. package/label-list.js +3 -15
  111. package/label-reduction.js +3 -15
  112. package/label-repeat.js +3 -15
  113. package/market-activity-add.js +2 -14
  114. package/market-activity-del.js +2 -14
  115. package/market-activity-detail.js +2 -14
  116. package/market-activity-edit.js +2 -14
  117. package/market-activity-handover.js +2 -14
  118. package/market-activity-list.js +2 -14
  119. package/opportunity-add-couser.js +2 -14
  120. package/opportunity-add-mainuser.js +2 -14
  121. package/opportunity-add.js +2 -14
  122. package/opportunity-del.js +2 -14
  123. package/opportunity-delete-couser.js +2 -14
  124. package/opportunity-delete-mainuser.js +2 -14
  125. package/opportunity-detail.js +2 -14
  126. package/opportunity-edit.js +2 -14
  127. package/opportunity-handover.js +2 -14
  128. package/opportunity-list.js +2 -14
  129. package/package.json +2 -2
  130. package/pay-plan-add-couser.js +2 -14
  131. package/pay-plan-add-mainuser.js +2 -14
  132. package/pay-plan-add.js +2 -14
  133. package/pay-plan-delete-couser.js +2 -14
  134. package/pay-plan-delete-mainuser.js +2 -14
  135. package/pay-plan-handover.js +2 -14
  136. package/pay-sheet-add-bad.js +2 -14
  137. package/pay-sheet-add-couser.js +2 -14
  138. package/pay-sheet-add-mainuser.js +2 -14
  139. package/pay-sheet-add-red.js +2 -14
  140. package/pay-sheet-add-write-off.js +2 -14
  141. package/pay-sheet-del.js +2 -14
  142. package/pay-sheet-delete-couser.js +2 -14
  143. package/pay-sheet-delete-mainuser.js +2 -14
  144. package/pay-sheet-detail.js +2 -14
  145. package/pay-sheet-edit-bad.js +2 -14
  146. package/pay-sheet-edit-red.js +2 -14
  147. package/pay-sheet-edit-write-off.js +2 -14
  148. package/pay-sheet-get-amount-detail.js +2 -14
  149. package/pay-sheet-list.js +2 -14
  150. package/payment-add-couser.js +2 -14
  151. package/payment-add-mainuser.js +2 -14
  152. package/payment-add.js +2 -14
  153. package/payment-del.js +2 -14
  154. package/payment-delete-couser.js +2 -14
  155. package/payment-delete-mainuser.js +2 -14
  156. package/payment-detail.js +2 -14
  157. package/payment-edit.js +2 -14
  158. package/payment-handover.js +2 -14
  159. package/payment-list.js +2 -14
  160. package/payment-sheet-add-bad-debt.js +2 -14
  161. package/payment-sheet-add-pre.js +2 -14
  162. package/payment-sheet-add-red.js +2 -14
  163. package/payment-sheet-add-write-off.js +2 -14
  164. package/payment-sheet-del.js +2 -14
  165. package/payment-sheet-detail.js +2 -14
  166. package/payment-sheet-edit-bad-debt.js +2 -14
  167. package/payment-sheet-edit-red.js +2 -14
  168. package/payment-sheet-edit-write-off.js +2 -14
  169. package/payment-sheet-get-amount-detail.js +2 -14
  170. package/payment-sheet-handover.js +2 -14
  171. package/payment-sheet-list.js +2 -14
  172. package/product-add.js +2 -14
  173. package/product-category-add.js +2 -14
  174. package/product-category-del.js +2 -14
  175. package/product-category-list.js +2 -14
  176. package/product-category-update.js +2 -14
  177. package/product-del.js +2 -14
  178. package/product-detail.js +2 -14
  179. package/product-edit.js +2 -14
  180. package/product-list.js +2 -14
  181. package/product-online.js +2 -14
  182. package/quotation-add-couser.js +3 -15
  183. package/quotation-add-mainuser.js +3 -15
  184. package/quotation-add.js +3 -15
  185. package/quotation-del.js +3 -15
  186. package/quotation-delete-couser.js +3 -15
  187. package/quotation-delete-mainuser.js +3 -15
  188. package/quotation-detail.js +3 -15
  189. package/quotation-edit.js +3 -15
  190. package/quotation-handover.js +2 -14
  191. package/quotation-list.js +3 -15
  192. package/refund-add.js +2 -14
  193. package/refund-del.js +2 -14
  194. package/refund-detail.js +2 -14
  195. package/refund-edit.js +2 -14
  196. package/refund-list.js +2 -14
  197. package/role-list.js +2 -14
  198. package/sign-in-list.js +2 -14
  199. package/stage-get.js +2 -14
  200. package/stage-jump.js +2 -14
  201. package/supplier-add.js +2 -14
  202. package/token-del.js +5 -0
  203. package/token-generate.js +2 -14
  204. package/token-list.js +20 -2
  205. package/token-set.js +6 -374
  206. package/token-use.js +5 -0
  207. package/user-add.js +2 -14
  208. package/user-del.js +2 -14
  209. package/user-edit.js +2 -14
  210. package/user-handover.js +2 -14
  211. package/user-list.js +2 -14
  212. package/work-order-add.js +2 -14
  213. package/work-order-asset-add-couser.js +3 -15
  214. package/work-order-asset-add-mainuser.js +3 -15
  215. package/work-order-asset-add.js +3 -15
  216. package/work-order-asset-del-couser.js +3 -15
  217. package/work-order-asset-del-mainuser.js +3 -15
  218. package/work-order-asset-del.js +3 -15
  219. package/work-order-asset-detail.js +3 -15
  220. package/work-order-asset-edit.js +3 -15
  221. package/work-order-asset-handover.js +3 -15
  222. package/work-order-asset-list.js +3 -15
  223. package/work-order-del.js +2 -14
  224. package/work-order-detail.js +2 -14
  225. package/work-order-dynamic-list.js +2 -14
  226. package/work-order-edit.js +2 -14
  227. package/work-order-list.js +2 -14
  228. package/work-order-operate.js +2 -14
  229. package/work-order-template-detail.js +2 -14
  230. package/work-order-template-list.js +2 -14
  231. package/work-report-daily-add.js +2 -14
  232. package/work-report-daily-del.js +2 -14
  233. package/work-report-daily-detail.js +2 -14
  234. package/work-report-daily-edit.js +2 -14
  235. package/work-report-daily-get-work-plan.js +2 -14
  236. package/work-report-daily-list.js +2 -14
  237. package/work-report-monthly-add.js +2 -14
  238. package/work-report-monthly-del.js +2 -14
  239. package/work-report-monthly-detail.js +2 -14
  240. package/work-report-monthly-edit.js +2 -14
  241. package/work-report-monthly-list.js +2 -14
  242. package/work-report-weekly-add.js +2 -14
  243. package/work-report-weekly-del.js +2 -14
  244. package/work-report-weekly-detail.js +2 -14
  245. package/work-report-weekly-edit.js +2 -14
  246. package/work-report-weekly-list.js +2 -14
  247. package/work-task-add-couser.js +2 -14
  248. package/work-task-add.js +2 -14
  249. package/work-task-delete-couser.js +2 -14
  250. package/work-task-detail.js +2 -14
  251. package/work-task-edit.js +2 -14
  252. package/work-task-handover.js +2 -14
  253. package/workorder-add-couser.js +2 -14
  254. package/workorder-delete-couser.js +2 -14
  255. package/workorder-handover.js +2 -14
  256. package/workorderlist.js +2 -14
  257. package/workorderproductlist.js +2 -14
  258. package/worktimerecorddetail.js +2 -14
  259. package/worktimerecordlist.js +2 -14
  260. package/xbb-browser.js +330 -0
  261. package/xbb-config.js +146 -0
  262. package/xbb-token-store.js +389 -0
  263. package/version.js +0 -18
package/auth-status.js ADDED
@@ -0,0 +1,105 @@
1
+ import fs from 'node:fs';
2
+ import os from 'node:os';
3
+ import path from 'node:path';
4
+ import { cli, Strategy } from './xbb-registry.js';
5
+ import { readActiveConfig, hasEnvConfig, isEnvActive, isEnvOnly, getEnvVarNames } from './xbb-config.js';
6
+
7
+ const CONFIG_DIR = path.join(os.homedir(), '.xbbcli');
8
+ const CONFIG_FILE = path.join(CONFIG_DIR, 'config.env');
9
+
10
+ function trim(value) {
11
+ return String(value ?? '').trim();
12
+ }
13
+
14
+ // token 只用于人眼确认是哪一枚,默认中间掩码;完整值需显式 --showToken
15
+ function maskToken(token) {
16
+ const value = trim(token);
17
+ if (!value) return '';
18
+ if (value.length <= 10) return `${value.slice(0, 2)}***`;
19
+ return `${value.slice(0, 6)}***${value.slice(-4)}`;
20
+ }
21
+
22
+ // 仅用于统计公司数量与检查重复启用,生效值一律以 readActiveConfig() 为准
23
+ function readCompanies() {
24
+ try {
25
+ const parsed = JSON.parse(fs.readFileSync(CONFIG_FILE, 'utf8'));
26
+ if (Array.isArray(parsed)) {
27
+ return parsed.filter((item) => item && typeof item === 'object');
28
+ }
29
+ if (parsed && Array.isArray(parsed.companies)) {
30
+ return parsed.companies.filter((item) => item && typeof item === 'object');
31
+ }
32
+ if (parsed && parsed.corpid) {
33
+ const { corpid, token, baseurl, userId } = parsed;
34
+ return [{ corpid, token, baseurl, userId, enable: true }];
35
+ }
36
+ return [];
37
+ } catch {
38
+ return [];
39
+ }
40
+ }
41
+
42
+ // 回显固定为 key/value 两列,只列配置值,不输出 status/source/message 之类的元信息
43
+ const FIELDS = ['corpid', 'corpName', 'userName', 'userId', 'baseurl', 'token'];
44
+
45
+ function toRows(values) {
46
+ return FIELDS.map((key) => ({ key, value: trim(values[key]) }));
47
+ }
48
+
49
+ function withNotes(rows, notes) {
50
+ return [...rows, ...notes.map((value) => ({ key: 'note', value }))];
51
+ }
52
+
53
+ async function authStatus(kwargs) {
54
+ const showToken = Boolean(kwargs.showToken);
55
+ const envActive = hasEnvConfig();
56
+ const envUsed = isEnvActive();
57
+ const active = readActiveConfig();
58
+ const companies = readCompanies();
59
+ const hasActive = Boolean(trim(active.corpid) || trim(active.token));
60
+ const source = hasActive ? (envUsed ? 'env' : 'config') : 'none';
61
+
62
+ if (kwargs.debug) {
63
+ const envNames = getEnvVarNames().filter((name) => trim(process.env[name])).join(', ');
64
+ process.stderr.write(`[debug] ConfigFile: ${CONFIG_FILE}\n[debug] Companies: ${companies.length}\n[debug] Source: ${source}\n[debug] XBB_ENV_ONLY: ${trim(process.env.XBB_ENV_ONLY) || 'unset'}\n[debug] EnvVarsSet: ${envNames || 'none'}\n`);
65
+ }
66
+
67
+ const token = trim(active.token);
68
+ const rows = toRows({ ...active, token: showToken ? token : maskToken(token) });
69
+
70
+ if (source === 'none') {
71
+ // 没有生效配置时不把残留的环境变量值当真值回显(XBB_BASEURL 等可能单独存在)
72
+ return withNotes(toRows({}), [
73
+ '没有处于激活状态的配置:config.env 中不存在 enable=true 的公司,环境变量 XBB_* 也为空;请先执行 xbbcli auth-login 或 xbbcli token-set',
74
+ ]);
75
+ }
76
+
77
+ if (source === 'env') {
78
+ const reason = isEnvOnly() ? 'XBB_ENV_ONLY=1 已强制使用环境变量' : 'config.env 中没有启用公司,回落到环境变量';
79
+ return withNotes(rows, [
80
+ `以上取值来自环境变量 XBB_*(${reason});环境变量模式不支持多公司切换,配置文件路径与公司数量见 --debug`,
81
+ ]);
82
+ }
83
+
84
+ const notes = [];
85
+ if (envActive) notes.push('环境变量 XBB_* 同时存在,但 config.env 启用项优先;如需彻底登出请执行 xbbcli auth-logout');
86
+ const enabledCount = companies.filter((item) => item.enable === true).length;
87
+ if (enabledCount > 1) notes.push(`config.env 中存在 ${enabledCount} 个 enable=true,仅第一条生效,请用 xbbcli token-use 修正`);
88
+ return withNotes(rows, notes);
89
+ }
90
+
91
+ cli({
92
+ site: 'xbb',
93
+ name: 'auth-status',
94
+ description: '回显当前激活的配置',
95
+ strategy: Strategy.PUBLIC,
96
+ access: 'read',
97
+ browser: false,
98
+ domain: 'proapi.xbongbong.com',
99
+ args: [
100
+ { name: 'showToken', type: 'bool', default: false, help: '显示完整 token;默认只输出中间掩码' },
101
+ { name: 'debug', type: 'bool', default: false, help: '在 stderr 输出配置文件路径、公司数量与生效的环境变量名(不含 token 明文)' },
102
+ ],
103
+ columns: ['key', 'value'],
104
+ func: authStatus,
105
+ });
package/bin/xbbcli.js CHANGED
@@ -21,12 +21,22 @@ async function loadCommands() {
21
21
  }
22
22
  }
23
23
 
24
+ function readVersion() {
25
+ try {
26
+ const parsed = JSON.parse(fs.readFileSync(path.join(root, 'package.json'), 'utf8'));
27
+ return String(parsed.version || '').trim() || 'unknown';
28
+ } catch {
29
+ return 'unknown';
30
+ }
31
+ }
32
+
24
33
  function printHelp() {
25
34
  const commands = [...getRegistry().values()].sort((a, b) => a.name.localeCompare(b.name));
26
- process.stdout.write('Usage: xbbcli <command> [options]\n\nCommands:\n');
35
+ process.stdout.write('Usage: xbbcli <command> [options]\n xbbcli -v | --version\n\nCommands:\n');
27
36
  for (const command of commands) {
28
37
  process.stdout.write(` ${command.name.padEnd(34)} ${command.description || ''}\n`);
29
38
  }
39
+ process.stdout.write(`\n ${'-v, --version'.padEnd(34)} show version\n`);
30
40
  }
31
41
 
32
42
  function printCommandHelp(command) {
@@ -100,7 +110,10 @@ function outputRows(rows, command, format) {
100
110
 
101
111
  await loadCommands();
102
112
  const [commandName, ...argv] = process.argv.slice(2);
103
- if (!commandName || commandName === '--help' || commandName === '-h') {
113
+ if (commandName === '--version' || commandName === '-v') {
114
+ process.stdout.write(`${readVersion()}\n`);
115
+ process.exitCode = 0;
116
+ } else if (!commandName || commandName === '--help' || commandName === '-h') {
104
117
  printHelp();
105
118
  process.exitCode = 0;
106
119
  } else {
@@ -3,6 +3,7 @@ import fs from 'node:fs';
3
3
  import os from 'node:os';
4
4
  import path from 'node:path';
5
5
  import { cli, Strategy } from './xbb-registry.js';
6
+ import { readActiveConfig } from './xbb-config.js';
6
7
 
7
8
  const CONFIG_FILE = path.join(os.homedir(), '.xbbcli', 'config.env');
8
9
  const BUYER_INQUIRY_DETAIL_API_URL = 'https://proapi.xbongbong.com/pro/v2/api/buyerInquiry/detail';
@@ -10,20 +11,7 @@ const DEFAULT_BASE_URL = 'https://proapi.xbongbong.com';
10
11
  const MISSING_TOKEN_MESSAGE = '缺少 token;请先执行 xbbcli token-set --corpid <CORPID> --token <TOKEN> --userId <USERID>';
11
12
 
12
13
  function readConfig() {
13
- try {
14
- const parsed = JSON.parse(fs.readFileSync(CONFIG_FILE, 'utf8'));
15
- const companies = Array.isArray(parsed)
16
- ? parsed
17
- : Array.isArray(parsed?.companies)
18
- ? parsed.companies
19
- : null;
20
- if (companies) {
21
- return companies.find((item) => item && item.enable) || {};
22
- }
23
- return parsed || {};
24
- } catch {
25
- return {};
26
- }
14
+ return readActiveConfig();
27
15
  }
28
16
 
29
17
  function getRuntimeConfig() {
@@ -3,6 +3,7 @@ import fs from 'node:fs';
3
3
  import os from 'node:os';
4
4
  import path from 'node:path';
5
5
  import { cli, Strategy } from './xbb-registry.js';
6
+ import { readActiveConfig } from './xbb-config.js';
6
7
 
7
8
  const CONFIG_FILE = path.join(os.homedir(), '.xbbcli', 'config.env');
8
9
  const BUYER_INQUIRY_LIST_API_URL = 'https://proapi.xbongbong.com/pro/v2/api/buyerInquiry/list';
@@ -11,20 +12,7 @@ const MISSING_TOKEN_MESSAGE = '缺少 token;请先执行 xbbcli token-set --co
11
12
  let lastPagination = null;
12
13
 
13
14
  function readConfig() {
14
- try {
15
- const parsed = JSON.parse(fs.readFileSync(CONFIG_FILE, 'utf8'));
16
- const companies = Array.isArray(parsed)
17
- ? parsed
18
- : Array.isArray(parsed?.companies)
19
- ? parsed.companies
20
- : null;
21
- if (companies) {
22
- return companies.find((item) => item && item.enable) || {};
23
- }
24
- return parsed || {};
25
- } catch {
26
- return {};
27
- }
15
+ return readActiveConfig();
28
16
  }
29
17
 
30
18
  function getRuntimeConfig() {
@@ -3,6 +3,7 @@ import os from 'node:os';
3
3
  import path from 'node:path';
4
4
  import crypto from 'node:crypto';
5
5
  import { cli, Strategy } from './xbb-registry.js';
6
+ import { readActiveConfig } from './xbb-config.js';
6
7
 
7
8
  const CONFIG_FILE = path.join(os.homedir(), '.xbbcli', 'config.env');
8
9
  const API_URL = 'https://proapi.xbongbong.com/pro/v2/api/clue/addCoUser';
@@ -10,20 +11,7 @@ const DEFAULT_BASE_URL = 'https://proapi.xbongbong.com';
10
11
  const MISSING_TOKEN_MESSAGE = '缺少 token;请先执行 xbbcli token-set --corpid <CORPID> --token <TOKEN> --userId <USERID>';
11
12
 
12
13
  function readConfig() {
13
- try {
14
- const parsed = JSON.parse(fs.readFileSync(CONFIG_FILE, 'utf8'));
15
- const companies = Array.isArray(parsed)
16
- ? parsed
17
- : Array.isArray(parsed?.companies)
18
- ? parsed.companies
19
- : null;
20
- if (companies) {
21
- return companies.find((item) => item && item.enable) || {};
22
- }
23
- return parsed || {};
24
- } catch {
25
- return {};
26
- }
14
+ return readActiveConfig();
27
15
  }
28
16
 
29
17
  function getRuntimeConfig() {
package/clue-add.js CHANGED
@@ -3,6 +3,7 @@ import fs from 'node:fs';
3
3
  import os from 'node:os';
4
4
  import path from 'node:path';
5
5
  import { cli, Strategy } from './xbb-registry.js';
6
+ import { readActiveConfig } from './xbb-config.js';
6
7
 
7
8
  const CONFIG_FILE = path.join(os.homedir(), '.xbbcli', 'config.env');
8
9
  const API_URL = 'https://proapi.xbongbong.com/pro/v2/api/clue/add';
@@ -10,20 +11,7 @@ const DEFAULT_BASE_URL = 'https://proapi.xbongbong.com';
10
11
  const MISSING_TOKEN_MESSAGE = '缺少 token;请先执行 xbbcli token-set --corpid <CORPID> --token <TOKEN> --userId <USERID>';
11
12
 
12
13
  function readConfig() {
13
- try {
14
- const parsed = JSON.parse(fs.readFileSync(CONFIG_FILE, 'utf8'));
15
- const companies = Array.isArray(parsed)
16
- ? parsed
17
- : Array.isArray(parsed?.companies)
18
- ? parsed.companies
19
- : null;
20
- if (companies) {
21
- return companies.find((item) => item && item.enable) || {};
22
- }
23
- return parsed || {};
24
- } catch {
25
- return {};
26
- }
14
+ return readActiveConfig();
27
15
  }
28
16
 
29
17
  function getRuntimeConfig() {
package/clue-back.js CHANGED
@@ -3,6 +3,7 @@ import os from 'node:os';
3
3
  import path from 'node:path';
4
4
  import crypto from 'node:crypto';
5
5
  import { cli, Strategy } from './xbb-registry.js';
6
+ import { readActiveConfig } from './xbb-config.js';
6
7
 
7
8
  const CONFIG_FILE = path.join(os.homedir(), '.xbbcli', 'config.env');
8
9
  const API_URL = 'https://proapi.xbongbong.com/pro/v2/api/clue/back';
@@ -10,20 +11,7 @@ const DEFAULT_BASE_URL = 'https://proapi.xbongbong.com';
10
11
  const MISSING_TOKEN_MESSAGE = '缺少 token;请先执行 xbbcli token-set --corpid <CORPID> --token <TOKEN> --userId <USERID>';
11
12
 
12
13
  function readConfig() {
13
- try {
14
- const parsed = JSON.parse(fs.readFileSync(CONFIG_FILE, 'utf8'));
15
- const companies = Array.isArray(parsed)
16
- ? parsed
17
- : Array.isArray(parsed?.companies)
18
- ? parsed.companies
19
- : null;
20
- if (companies) {
21
- return companies.find((item) => item && item.enable) || {};
22
- }
23
- return parsed || {};
24
- } catch {
25
- return {};
26
- }
14
+ return readActiveConfig();
27
15
  }
28
16
 
29
17
  function getRuntimeConfig() {
package/clue-del.js CHANGED
@@ -3,6 +3,7 @@ import fs from 'node:fs';
3
3
  import os from 'node:os';
4
4
  import path from 'node:path';
5
5
  import { cli, Strategy } from './xbb-registry.js';
6
+ import { readActiveConfig } from './xbb-config.js';
6
7
 
7
8
  const CONFIG_FILE = path.join(os.homedir(), '.xbbcli', 'config.env');
8
9
  const API_URL = 'https://proapi.xbongbong.com/pro/v2/api/clue/del';
@@ -10,20 +11,7 @@ const DEFAULT_BASE_URL = 'https://proapi.xbongbong.com';
10
11
  const MISSING_TOKEN_MESSAGE = '缺少 token;请先执行 xbbcli token-set --corpid <CORPID> --token <TOKEN> --userId <USERID>';
11
12
 
12
13
  function readConfig() {
13
- try {
14
- const parsed = JSON.parse(fs.readFileSync(CONFIG_FILE, 'utf8'));
15
- const companies = Array.isArray(parsed)
16
- ? parsed
17
- : Array.isArray(parsed?.companies)
18
- ? parsed.companies
19
- : null;
20
- if (companies) {
21
- return companies.find((item) => item && item.enable) || {};
22
- }
23
- return parsed || {};
24
- } catch {
25
- return {};
26
- }
14
+ return readActiveConfig();
27
15
  }
28
16
 
29
17
  function getRuntimeConfig() {
@@ -3,6 +3,7 @@ import os from 'node:os';
3
3
  import path from 'node:path';
4
4
  import crypto from 'node:crypto';
5
5
  import { cli, Strategy } from './xbb-registry.js';
6
+ import { readActiveConfig } from './xbb-config.js';
6
7
 
7
8
  const CONFIG_FILE = path.join(os.homedir(), '.xbbcli', 'config.env');
8
9
  const API_URL = 'https://proapi.xbongbong.com/pro/v2/api/clue/deleteCoUser';
@@ -10,20 +11,7 @@ const DEFAULT_BASE_URL = 'https://proapi.xbongbong.com';
10
11
  const MISSING_TOKEN_MESSAGE = '缺少 token;请先执行 xbbcli token-set --corpid <CORPID> --token <TOKEN> --userId <USERID>';
11
12
 
12
13
  function readConfig() {
13
- try {
14
- const parsed = JSON.parse(fs.readFileSync(CONFIG_FILE, 'utf8'));
15
- const companies = Array.isArray(parsed)
16
- ? parsed
17
- : Array.isArray(parsed?.companies)
18
- ? parsed.companies
19
- : null;
20
- if (companies) {
21
- return companies.find((item) => item && item.enable) || {};
22
- }
23
- return parsed || {};
24
- } catch {
25
- return {};
26
- }
14
+ return readActiveConfig();
27
15
  }
28
16
 
29
17
  function getRuntimeConfig() {
@@ -3,6 +3,7 @@ import os from 'node:os';
3
3
  import path from 'node:path';
4
4
  import crypto from 'node:crypto';
5
5
  import { cli, Strategy } from './xbb-registry.js';
6
+ import { readActiveConfig } from './xbb-config.js';
6
7
 
7
8
  const CONFIG_FILE = path.join(os.homedir(), '.xbbcli', 'config.env');
8
9
  const API_URL = 'https://proapi.xbongbong.com/pro/v2/api/clue/deleteMainUser';
@@ -10,20 +11,7 @@ const DEFAULT_BASE_URL = 'https://proapi.xbongbong.com';
10
11
  const MISSING_TOKEN_MESSAGE = '缺少 token;请先执行 xbbcli token-set --corpid <CORPID> --token <TOKEN> --userId <USERID>';
11
12
 
12
13
  function readConfig() {
13
- try {
14
- const parsed = JSON.parse(fs.readFileSync(CONFIG_FILE, 'utf8'));
15
- const companies = Array.isArray(parsed)
16
- ? parsed
17
- : Array.isArray(parsed?.companies)
18
- ? parsed.companies
19
- : null;
20
- if (companies) {
21
- return companies.find((item) => item && item.enable) || {};
22
- }
23
- return parsed || {};
24
- } catch {
25
- return {};
26
- }
14
+ return readActiveConfig();
27
15
  }
28
16
 
29
17
  function getRuntimeConfig() {
package/clue-detail.js CHANGED
@@ -3,6 +3,7 @@ import fs from 'node:fs';
3
3
  import os from 'node:os';
4
4
  import path from 'node:path';
5
5
  import { cli, Strategy } from './xbb-registry.js';
6
+ import { readActiveConfig } from './xbb-config.js';
6
7
 
7
8
  const CONFIG_FILE = path.join(os.homedir(), '.xbbcli', 'config.env');
8
9
  const API_URL = 'https://proapi.xbongbong.com/pro/v2/api/clue/detail';
@@ -10,20 +11,7 @@ const DEFAULT_BASE_URL = 'https://proapi.xbongbong.com';
10
11
  const MISSING_TOKEN_MESSAGE = '缺少 token;请先执行 xbbcli token-set --corpid <CORPID> --token <TOKEN> --userId <USERID>';
11
12
 
12
13
  function readConfig() {
13
- try {
14
- const parsed = JSON.parse(fs.readFileSync(CONFIG_FILE, 'utf8'));
15
- const companies = Array.isArray(parsed)
16
- ? parsed
17
- : Array.isArray(parsed?.companies)
18
- ? parsed.companies
19
- : null;
20
- if (companies) {
21
- return companies.find((item) => item && item.enable) || {};
22
- }
23
- return parsed || {};
24
- } catch {
25
- return {};
26
- }
14
+ return readActiveConfig();
27
15
  }
28
16
 
29
17
  function getRuntimeConfig() {
@@ -3,6 +3,7 @@ import os from 'node:os';
3
3
  import path from 'node:path';
4
4
  import crypto from 'node:crypto';
5
5
  import { cli, Strategy } from './xbb-registry.js';
6
+ import { readActiveConfig } from './xbb-config.js';
6
7
 
7
8
  const CONFIG_FILE = path.join(os.homedir(), '.xbbcli', 'config.env');
8
9
  const API_URL = 'https://proapi.xbongbong.com/pro/v2/api/clue/distribution';
@@ -10,20 +11,7 @@ const DEFAULT_BASE_URL = 'https://proapi.xbongbong.com';
10
11
  const MISSING_TOKEN_MESSAGE = '缺少 token;请先执行 xbbcli token-set --corpid <CORPID> --token <TOKEN> --userId <USERID>';
11
12
 
12
13
  function readConfig() {
13
- try {
14
- const parsed = JSON.parse(fs.readFileSync(CONFIG_FILE, 'utf8'));
15
- const companies = Array.isArray(parsed)
16
- ? parsed
17
- : Array.isArray(parsed?.companies)
18
- ? parsed.companies
19
- : null;
20
- if (companies) {
21
- return companies.find((item) => item && item.enable) || {};
22
- }
23
- return parsed || {};
24
- } catch {
25
- return {};
26
- }
14
+ return readActiveConfig();
27
15
  }
28
16
 
29
17
  function getRuntimeConfig() {
package/clue-edit.js CHANGED
@@ -3,6 +3,7 @@ import fs from 'node:fs';
3
3
  import os from 'node:os';
4
4
  import path from 'node:path';
5
5
  import { cli, Strategy } from './xbb-registry.js';
6
+ import { readActiveConfig } from './xbb-config.js';
6
7
 
7
8
  const CONFIG_FILE = path.join(os.homedir(), '.xbbcli', 'config.env');
8
9
  const API_URL = 'https://proapi.xbongbong.com/pro/v2/api/clue/edit';
@@ -10,20 +11,7 @@ const DEFAULT_BASE_URL = 'https://proapi.xbongbong.com';
10
11
  const MISSING_TOKEN_MESSAGE = '缺少 token;请先执行 xbbcli token-set --corpid <CORPID> --token <TOKEN> --userId <USERID>';
11
12
 
12
13
  function readConfig() {
13
- try {
14
- const parsed = JSON.parse(fs.readFileSync(CONFIG_FILE, 'utf8'));
15
- const companies = Array.isArray(parsed)
16
- ? parsed
17
- : Array.isArray(parsed?.companies)
18
- ? parsed.companies
19
- : null;
20
- if (companies) {
21
- return companies.find((item) => item && item.enable) || {};
22
- }
23
- return parsed || {};
24
- } catch {
25
- return {};
26
- }
14
+ return readActiveConfig();
27
15
  }
28
16
 
29
17
  function getRuntimeConfig() {
package/clue-handover.js CHANGED
@@ -2,7 +2,8 @@ import crypto from 'node:crypto';
2
2
  import fs from 'node:fs';
3
3
  import os from 'node:os';
4
4
  import path from 'node:path';
5
- import { cli, Strategy } from './xbb-registry.js';
5
+ import { cli, Strategy } from './xbb-registry.js';
6
+ import { readActiveConfig } from './xbb-config.js';
6
7
 
7
8
  const CONFIG_FILE = path.join(os.homedir(), '.opencli', 'xbb', 'config.env');
8
9
  const API_URL = 'https://proapi.xbongbong.com/pro/v2/api/clue/handover';
@@ -10,20 +11,7 @@ const DEFAULT_BASE_URL = 'https://proapi.xbongbong.com';
10
11
  const MISSING_TOKEN_MESSAGE = '缺少 token;请先执行 opencli xbb token-set --corpid <CORPID> --token <TOKEN> --userId <USERID>';
11
12
 
12
13
  function readConfig() {
13
- try {
14
- const parsed = JSON.parse(fs.readFileSync(CONFIG_FILE, 'utf8'));
15
- const companies = Array.isArray(parsed)
16
- ? parsed
17
- : Array.isArray(parsed?.companies)
18
- ? parsed.companies
19
- : null;
20
- if (companies) {
21
- return companies.find((item) => item && item.enable) || {};
22
- }
23
- return parsed || {};
24
- } catch {
25
- return {};
26
- }
14
+ return readActiveConfig();
27
15
  }
28
16
 
29
17
  function getRuntimeConfig() {
package/clue-list.js CHANGED
@@ -3,6 +3,7 @@ import fs from 'node:fs';
3
3
  import os from 'node:os';
4
4
  import path from 'node:path';
5
5
  import { cli, Strategy } from './xbb-registry.js';
6
+ import { readActiveConfig } from './xbb-config.js';
6
7
 
7
8
  const CONFIG_FILE = path.join(os.homedir(), '.xbbcli', 'config.env');
8
9
  const CLUE_LIST_API_URL = 'https://proapi.xbongbong.com/pro/v2/api/clue/list';
@@ -11,20 +12,7 @@ const MISSING_TOKEN_MESSAGE = '缺少 token;请先执行 xbbcli token-set --co
11
12
  let lastPagination = null;
12
13
 
13
14
  function readConfig() {
14
- try {
15
- const parsed = JSON.parse(fs.readFileSync(CONFIG_FILE, 'utf8'));
16
- const companies = Array.isArray(parsed)
17
- ? parsed
18
- : Array.isArray(parsed?.companies)
19
- ? parsed.companies
20
- : null;
21
- if (companies) {
22
- return companies.find((item) => item && item.enable) || {};
23
- }
24
- return parsed || {};
25
- } catch {
26
- return {};
27
- }
15
+ return readActiveConfig();
28
16
  }
29
17
 
30
18
  function getRuntimeConfig() {
@@ -3,6 +3,7 @@ import os from 'node:os';
3
3
  import path from 'node:path';
4
4
  import crypto from 'node:crypto';
5
5
  import { cli, Strategy } from './xbb-registry.js';
6
+ import { readActiveConfig } from './xbb-config.js';
6
7
 
7
8
  const CONFIG_FILE = path.join(os.homedir(), '.xbbcli', 'config.env');
8
9
  const API_URL = 'https://proapi.xbongbong.com/pro/v2/api/clue/thorough/delete';
@@ -10,20 +11,7 @@ const DEFAULT_BASE_URL = 'https://proapi.xbongbong.com';
10
11
  const MISSING_TOKEN_MESSAGE = '缺少 token;请先执行 xbbcli token-set --corpid <CORPID> --token <TOKEN> --userId <USERID>';
11
12
 
12
13
  function readConfig() {
13
- try {
14
- const parsed = JSON.parse(fs.readFileSync(CONFIG_FILE, 'utf8'));
15
- const companies = Array.isArray(parsed)
16
- ? parsed
17
- : Array.isArray(parsed?.companies)
18
- ? parsed.companies
19
- : null;
20
- if (companies) {
21
- return companies.find((item) => item && item.enable) || {};
22
- }
23
- return parsed || {};
24
- } catch {
25
- return {};
26
- }
14
+ return readActiveConfig();
27
15
  }
28
16
 
29
17
  function getRuntimeConfig() {
@@ -3,6 +3,7 @@ import os from 'node:os';
3
3
  import path from 'node:path';
4
4
  import crypto from 'node:crypto';
5
5
  import { cli, Strategy } from './xbb-registry.js';
6
+ import { readActiveConfig } from './xbb-config.js';
6
7
 
7
8
  const CONFIG_DIR = path.join(os.homedir(), '.xbbcli');
8
9
  const CONFIG_FILE = path.join(CONFIG_DIR, 'config.env');
@@ -10,20 +11,7 @@ const API_URL = 'https://proapi.xbongbong.com/pro/v2/api/communicate/add';
10
11
  const DEFAULT_BASE_URL = 'https://proapi.xbongbong.com';
11
12
 
12
13
  function readConfig() {
13
- try {
14
- const parsed = JSON.parse(fs.readFileSync(CONFIG_FILE, 'utf8'));
15
- const companies = Array.isArray(parsed)
16
- ? parsed
17
- : Array.isArray(parsed?.companies)
18
- ? parsed.companies
19
- : null;
20
- if (companies) {
21
- return companies.find((item) => item && item.enable) || {};
22
- }
23
- return parsed || {};
24
- } catch {
25
- return {};
26
- }
14
+ return readActiveConfig();
27
15
  }
28
16
 
29
17
  function getRuntimeConfig() {
@@ -3,6 +3,7 @@ import os from 'node:os';
3
3
  import path from 'node:path';
4
4
  import crypto from 'node:crypto';
5
5
  import { cli, Strategy } from './xbb-registry.js';
6
+ import { readActiveConfig } from './xbb-config.js';
6
7
 
7
8
  const CONFIG_DIR = path.join(os.homedir(), '.xbbcli');
8
9
  const CONFIG_FILE = path.join(CONFIG_DIR, 'config.env');
@@ -10,20 +11,7 @@ const API_URL = 'https://proapi.xbongbong.com/pro/v2/api/communicate/del';
10
11
  const DEFAULT_BASE_URL = 'https://proapi.xbongbong.com';
11
12
 
12
13
  function readConfig() {
13
- try {
14
- const parsed = JSON.parse(fs.readFileSync(CONFIG_FILE, 'utf8'));
15
- const companies = Array.isArray(parsed)
16
- ? parsed
17
- : Array.isArray(parsed?.companies)
18
- ? parsed.companies
19
- : null;
20
- if (companies) {
21
- return companies.find((item) => item && item.enable) || {};
22
- }
23
- return parsed || {};
24
- } catch {
25
- return {};
26
- }
14
+ return readActiveConfig();
27
15
  }
28
16
 
29
17
  function getRuntimeConfig() {
@@ -3,6 +3,7 @@ import os from 'node:os';
3
3
  import path from 'node:path';
4
4
  import crypto from 'node:crypto';
5
5
  import { cli, Strategy } from './xbb-registry.js';
6
+ import { readActiveConfig } from './xbb-config.js';
6
7
 
7
8
  const CONFIG_DIR = path.join(os.homedir(), '.xbbcli');
8
9
  const CONFIG_FILE = path.join(CONFIG_DIR, 'config.env');
@@ -10,20 +11,7 @@ const API_URL = 'https://proapi.xbongbong.com/pro/v2/api/communicate/detail';
10
11
  const DEFAULT_BASE_URL = 'https://proapi.xbongbong.com';
11
12
 
12
13
  function readConfig() {
13
- try {
14
- const parsed = JSON.parse(fs.readFileSync(CONFIG_FILE, 'utf8'));
15
- const companies = Array.isArray(parsed)
16
- ? parsed
17
- : Array.isArray(parsed?.companies)
18
- ? parsed.companies
19
- : null;
20
- if (companies) {
21
- return companies.find((item) => item && item.enable) || {};
22
- }
23
- return parsed || {};
24
- } catch {
25
- return {};
26
- }
14
+ return readActiveConfig();
27
15
  }
28
16
 
29
17
  function getRuntimeConfig() {