cbs-4px-merchant-cli 0.0.1

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 (76) hide show
  1. package/README.4px.md +90 -0
  2. package/README.cainiao.md +90 -0
  3. package/README.md +90 -0
  4. package/dist/cli.d.ts +2 -0
  5. package/dist/cli.js +247 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/commands/auth.d.ts +3 -0
  8. package/dist/commands/auth.js +39 -0
  9. package/dist/commands/auth.js.map +1 -0
  10. package/dist/commands/claim.d.ts +10 -0
  11. package/dist/commands/claim.js +69 -0
  12. package/dist/commands/claim.js.map +1 -0
  13. package/dist/commands/config.d.ts +3 -0
  14. package/dist/commands/config.js +129 -0
  15. package/dist/commands/config.js.map +1 -0
  16. package/dist/commands/error-handler.d.ts +5 -0
  17. package/dist/commands/error-handler.js +57 -0
  18. package/dist/commands/error-handler.js.map +1 -0
  19. package/dist/commands/label.d.ts +2 -0
  20. package/dist/commands/label.js +54 -0
  21. package/dist/commands/label.js.map +1 -0
  22. package/dist/commands/order.d.ts +2 -0
  23. package/dist/commands/order.js +91 -0
  24. package/dist/commands/order.js.map +1 -0
  25. package/dist/commands/product.d.ts +10 -0
  26. package/dist/commands/product.js +74 -0
  27. package/dist/commands/product.js.map +1 -0
  28. package/dist/commands/track.d.ts +2 -0
  29. package/dist/commands/track.js +54 -0
  30. package/dist/commands/track.js.map +1 -0
  31. package/dist/commands/update.d.ts +27 -0
  32. package/dist/commands/update.js +304 -0
  33. package/dist/commands/update.js.map +1 -0
  34. package/dist/errors.d.ts +31 -0
  35. package/dist/errors.js +58 -0
  36. package/dist/errors.js.map +1 -0
  37. package/dist/generated/site.d.ts +7 -0
  38. package/dist/generated/site.js +9 -0
  39. package/dist/generated/site.js.map +1 -0
  40. package/dist/index.d.ts +2 -0
  41. package/dist/index.js +5 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/services/api-client.d.ts +20 -0
  44. package/dist/services/api-client.js +141 -0
  45. package/dist/services/api-client.js.map +1 -0
  46. package/dist/services/config-manager.d.ts +10 -0
  47. package/dist/services/config-manager.js +49 -0
  48. package/dist/services/config-manager.js.map +1 -0
  49. package/dist/services/install-detector.d.ts +17 -0
  50. package/dist/services/install-detector.js +54 -0
  51. package/dist/services/install-detector.js.map +1 -0
  52. package/dist/services/update-checker.d.ts +56 -0
  53. package/dist/services/update-checker.js +242 -0
  54. package/dist/services/update-checker.js.map +1 -0
  55. package/dist/types/index.d.ts +153 -0
  56. package/dist/types/index.js +3 -0
  57. package/dist/types/index.js.map +1 -0
  58. package/dist/utils/logger.d.ts +15 -0
  59. package/dist/utils/logger.js +47 -0
  60. package/dist/utils/logger.js.map +1 -0
  61. package/dist/utils/output.d.ts +13 -0
  62. package/dist/utils/output.js +19 -0
  63. package/dist/utils/output.js.map +1 -0
  64. package/package.json +54 -0
  65. package/scripts/postinstall.js +184 -0
  66. package/site-meta.json +9 -0
  67. package/skill/SKILL.md +167 -0
  68. package/skill/reference/auth.md +62 -0
  69. package/skill/reference/claim.md +66 -0
  70. package/skill/reference/config.md +71 -0
  71. package/skill/reference/index.md +51 -0
  72. package/skill/reference/label.md +51 -0
  73. package/skill/reference/order.md +68 -0
  74. package/skill/reference/product.md +70 -0
  75. package/skill/reference/track.md +57 -0
  76. package/skill/reference/update.md +102 -0
@@ -0,0 +1,304 @@
1
+ /**
2
+ * `mc update` — self-update the CLI (and its bundled skill via postinstall).
3
+ *
4
+ * Inspired by:
5
+ * - bailian-cli (npm-only, simple execSync flow)
6
+ * - lark-cli (JSON envelope protocol, install-method detection)
7
+ * - dws (钉钉) (rich flag matrix: --check / --tag / --force / -y / --json)
8
+ *
9
+ * MVP scope (PR1):
10
+ * mc update # upgrade to <tag> (default: latest)
11
+ * mc update --check # only report status
12
+ * mc update --tag pre # use a non-default dist-tag
13
+ * mc update --force # reinstall current version (skill repair)
14
+ * mc update -y # skip confirmation
15
+ * mc update --output json # AI-Agent envelope
16
+ *
17
+ * stdout = JSON envelope (only when --output json or piped); stderr = human messages.
18
+ */
19
+ import { spawn } from 'node:child_process';
20
+ import { createInterface } from 'node:readline';
21
+ import { createRequire } from 'node:module';
22
+ import chalk from 'chalk';
23
+ import { Command } from 'commander';
24
+ import { PACKAGE_NAME, BIN_NAME, } from '../generated/site.js';
25
+ import { fetchTagVersion, getRegistry, isNewer, recordUpgrade, } from '../services/update-checker.js';
26
+ import { detectInstall } from '../services/install-detector.js';
27
+ import * as logger from '../utils/logger.js';
28
+ import { detectOutputFormat, printJson } from '../utils/output.js';
29
+ const require = createRequire(import.meta.url);
30
+ const { version: CURRENT_VERSION } = require('../../package.json');
31
+ export function buildUpdateCommand() {
32
+ const cmd = new Command('update');
33
+ cmd
34
+ .description('升级 CLI 到最新版本(同步更新对应 skill)')
35
+ .option('--check', '只检查是否有新版本,不执行升级')
36
+ .option('--tag <tag>', 'npm dist-tag(latest | pre | test)', 'latest')
37
+ .option('--force', '强制重装当前版本(修复 skill 损坏)')
38
+ .option('-y, --yes', '跳过交互式确认')
39
+ .option('--output <format>', '输出格式: text | json')
40
+ .action(async (opts, command) => {
41
+ const globals = extractGlobals(command);
42
+ await runUpdate(opts, globals);
43
+ });
44
+ return cmd;
45
+ }
46
+ function extractGlobals(cmd) {
47
+ let root = cmd;
48
+ while (root.parent)
49
+ root = root.parent;
50
+ const o = root.opts();
51
+ return { output: o.output, verbose: o.verbose, dryRun: o.dryRun };
52
+ }
53
+ // ────────────────────────── Main flow ──────────────────────────
54
+ async function runUpdate(opts, globals) {
55
+ const tag = opts.tag || 'latest';
56
+ const format = detectOutputFormat(opts.output ?? globals.output);
57
+ const registry = getRegistry();
58
+ // 1. Probe registry for the target version.
59
+ if (format === 'text') {
60
+ logger.info(`检查更新: ${PACKAGE_NAME}@${tag} (registry: ${registry})`);
61
+ }
62
+ const latest = await fetchTagVersion(tag);
63
+ if (!latest) {
64
+ return emit(format, {
65
+ ok: false,
66
+ action: 'error',
67
+ package: PACKAGE_NAME,
68
+ registry,
69
+ tag,
70
+ previous_version: CURRENT_VERSION,
71
+ error: {
72
+ code: 'NETWORK',
73
+ message: `无法从 registry 获取 ${PACKAGE_NAME}@${tag}`,
74
+ hint: `请检查网络或 registry 配置(当前: ${registry}),或设置 BPORTAL_REGISTRY 环境变量临时切换`,
75
+ },
76
+ });
77
+ }
78
+ const hasNewer = isNewer(latest, CURRENT_VERSION);
79
+ // "up to date" covers both: same version, or local is ahead of registry.
80
+ const upToDate = !hasNewer;
81
+ // 2. --check: report status only.
82
+ if (opts.check) {
83
+ return emit(format, {
84
+ ok: true,
85
+ action: hasNewer ? 'update_available' : 'already_up_to_date',
86
+ package: PACKAGE_NAME,
87
+ registry,
88
+ tag,
89
+ previous_version: CURRENT_VERSION,
90
+ current_version: CURRENT_VERSION,
91
+ latest_version: latest,
92
+ ...(hasNewer
93
+ ? {
94
+ message: `发现新版本: ${CURRENT_VERSION} → ${latest}`,
95
+ upgrade_command: `${BIN_NAME} update`,
96
+ }
97
+ : {
98
+ message: latest === CURRENT_VERSION
99
+ ? `已是最新版本 v${CURRENT_VERSION}`
100
+ : `本地版本 v${CURRENT_VERSION} 领先于 registry 的 v${latest}`,
101
+ }),
102
+ });
103
+ }
104
+ // 3. Already up-to-date and not forced.
105
+ if (upToDate && !opts.force) {
106
+ return emit(format, {
107
+ ok: true,
108
+ action: 'already_up_to_date',
109
+ package: PACKAGE_NAME,
110
+ registry,
111
+ tag,
112
+ previous_version: CURRENT_VERSION,
113
+ current_version: CURRENT_VERSION,
114
+ latest_version: latest,
115
+ message: latest === CURRENT_VERSION
116
+ ? `已是最新版本 v${CURRENT_VERSION}`
117
+ : `本地版本 v${CURRENT_VERSION} 领先于 registry 的 v${latest},无需升级`,
118
+ });
119
+ }
120
+ // 4. Resolve install target. force-with-no-newer means "reinstall current"
121
+ // to repair a corrupted skill; otherwise install the newer registry version.
122
+ const targetVersion = hasNewer ? latest : CURRENT_VERSION;
123
+ // 5. Detect install method.
124
+ const install = await detectInstall();
125
+ const installCmd = `npm install -g ${PACKAGE_NAME}@${targetVersion} --registry ${registry}`;
126
+ if (install.method === 'manual') {
127
+ return emit(format, {
128
+ ok: false,
129
+ action: 'manual_required',
130
+ package: PACKAGE_NAME,
131
+ registry,
132
+ tag,
133
+ previous_version: CURRENT_VERSION,
134
+ latest_version: latest,
135
+ install_method: install.method,
136
+ message: '当前 CLI 非 npm 全局安装,无法自动升级',
137
+ hint: '请手动执行下方命令,或使用 npm 全局重装本工具',
138
+ upgrade_command: installCmd,
139
+ });
140
+ }
141
+ if (!install.npmAvailable) {
142
+ return emit(format, {
143
+ ok: false,
144
+ action: 'error',
145
+ package: PACKAGE_NAME,
146
+ registry,
147
+ tag,
148
+ previous_version: CURRENT_VERSION,
149
+ latest_version: latest,
150
+ install_method: install.method,
151
+ error: {
152
+ code: 'NPM_NOT_FOUND',
153
+ message: '系统未检测到 npm 命令',
154
+ hint: '请先安装 Node.js / npm,或手动重装本工具',
155
+ },
156
+ });
157
+ }
158
+ // 6. Confirm in interactive TTY (unless -y or json mode).
159
+ if (!opts.yes && format === 'text' && process.stdin.isTTY) {
160
+ const verb = hasNewer ? '升级' : '重装';
161
+ const arrow = targetVersion === CURRENT_VERSION
162
+ ? `v${CURRENT_VERSION}`
163
+ : `${chalk.dim(`v${CURRENT_VERSION}`)} → ${chalk.green(`v${targetVersion}`)}`;
164
+ const ok = await confirm(`${verb} ${chalk.cyan(PACKAGE_NAME)}: ${arrow} ?`);
165
+ if (!ok) {
166
+ logger.warn('已取消');
167
+ return;
168
+ }
169
+ }
170
+ // 7. Execute `npm install -g`.
171
+ if (format === 'text') {
172
+ logger.info(`执行: ${installCmd}`);
173
+ }
174
+ const result = await runNpmInstall(targetVersion, registry);
175
+ if (!result.ok) {
176
+ const isPerm = /EACCES|permission denied/i.test(result.stderr);
177
+ return emit(format, {
178
+ ok: false,
179
+ action: 'error',
180
+ package: PACKAGE_NAME,
181
+ registry,
182
+ tag,
183
+ previous_version: CURRENT_VERSION,
184
+ latest_version: latest,
185
+ install_method: install.method,
186
+ upgrade_command: installCmd,
187
+ error: {
188
+ code: isPerm ? 'EACCES' : 'NPM_INSTALL_FAILED',
189
+ message: tail(result.stderr, 500) || result.error || 'npm install 失败',
190
+ hint: isPerm
191
+ ? '权限不足。请使用 sudo,或修复 npm prefix 让全局安装无需特权(推荐):参见 https://docs.npmjs.com/resolving-eacces-permissions-errors-when-installing-packages-globally'
192
+ : `请手动执行: ${installCmd}`,
193
+ },
194
+ });
195
+ }
196
+ // 8. Record success and emit envelope.
197
+ recordUpgrade(CURRENT_VERSION, targetVersion, tag);
198
+ return emit(format, {
199
+ ok: true,
200
+ action: 'updated',
201
+ package: PACKAGE_NAME,
202
+ registry,
203
+ tag,
204
+ previous_version: CURRENT_VERSION,
205
+ current_version: targetVersion,
206
+ latest_version: latest,
207
+ install_method: install.method,
208
+ message: hasNewer
209
+ ? `已升级到 v${targetVersion}(skill 已通过 postinstall 自动同步)。重新打开终端使生效。`
210
+ : `已重装 v${targetVersion}(skill 已通过 postinstall 重新同步)。`,
211
+ });
212
+ }
213
+ // ────────────────────────── Output rendering ──────────────────────────
214
+ function emit(format, env) {
215
+ if (format === 'json') {
216
+ printJson(env);
217
+ if (!env.ok)
218
+ process.exitCode = 1;
219
+ return;
220
+ }
221
+ renderText(env);
222
+ if (!env.ok)
223
+ process.exitCode = 1;
224
+ }
225
+ function renderText(env) {
226
+ switch (env.action) {
227
+ case 'updated':
228
+ logger.success(env.message ?? `已升级到 v${env.current_version}`);
229
+ logger.info(`运行 ${BIN_NAME} --version 验证当前版本`);
230
+ break;
231
+ case 'already_up_to_date':
232
+ logger.success(env.message ?? `已是最新版本 v${env.current_version}`);
233
+ break;
234
+ case 'update_available':
235
+ logger.info(env.message ?? `发现新版本: ${env.previous_version} → ${env.latest_version}`);
236
+ if (env.upgrade_command)
237
+ logger.info(`运行 ${env.upgrade_command} 进行升级`);
238
+ break;
239
+ case 'manual_required':
240
+ logger.warn(env.message ?? '需要手动升级');
241
+ if (env.hint)
242
+ logger.info(env.hint);
243
+ if (env.upgrade_command) {
244
+ process.stderr.write('\n ' + chalk.cyan(env.upgrade_command) + '\n\n');
245
+ }
246
+ break;
247
+ case 'error':
248
+ if (env.error) {
249
+ logger.error(`[${env.error.code}] ${env.error.message}`);
250
+ if (env.error.hint)
251
+ logger.info(env.error.hint);
252
+ }
253
+ if (env.upgrade_command) {
254
+ process.stderr.write('\n ' + chalk.cyan(env.upgrade_command) + '\n\n');
255
+ }
256
+ break;
257
+ }
258
+ }
259
+ // ────────────────────────── npm subprocess ──────────────────────────
260
+ async function runNpmInstall(version, registry) {
261
+ return new Promise((resolve) => {
262
+ const cmd = process.platform === 'win32' ? 'npm.cmd' : 'npm';
263
+ const args = [
264
+ 'install',
265
+ '-g',
266
+ `${PACKAGE_NAME}@${version}`,
267
+ '--registry',
268
+ registry,
269
+ ];
270
+ const proc = spawn(cmd, args, {
271
+ // Inherit stdout/stderr so the user sees postinstall output (skill sync banner).
272
+ stdio: ['ignore', 'inherit', 'pipe'],
273
+ });
274
+ let stderr = '';
275
+ proc.stderr?.on('data', (chunk) => {
276
+ const s = chunk.toString();
277
+ stderr += s;
278
+ // Mirror to our stderr so the user sees real-time progress.
279
+ process.stderr.write(s);
280
+ });
281
+ proc.on('error', (err) => {
282
+ resolve({ ok: false, stderr, error: err.message });
283
+ });
284
+ proc.on('close', (code) => {
285
+ resolve({ ok: code === 0, stderr });
286
+ });
287
+ });
288
+ }
289
+ function tail(s, n) {
290
+ if (!s)
291
+ return '';
292
+ return s.length <= n ? s : s.slice(s.length - n);
293
+ }
294
+ // ────────────────────────── Confirmation ──────────────────────────
295
+ function confirm(question) {
296
+ return new Promise((resolve) => {
297
+ const rl = createInterface({ input: process.stdin, output: process.stderr });
298
+ rl.question(question + ' [y/N] ', (answer) => {
299
+ rl.close();
300
+ resolve(/^y(es)?$/i.test(answer.trim()));
301
+ });
302
+ });
303
+ }
304
+ //# sourceMappingURL=update.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ export declare class BportalError extends Error {
2
+ readonly code: string;
3
+ readonly hint?: string | undefined;
4
+ constructor(message: string, code?: string, hint?: string | undefined);
5
+ }
6
+ export declare class ConfigError extends BportalError {
7
+ constructor(message: string, hint?: string);
8
+ }
9
+ export declare class AuthRequiredError extends BportalError {
10
+ constructor();
11
+ }
12
+ export declare class ApiError extends BportalError {
13
+ readonly errCode: string;
14
+ constructor(errCode: string, message: string, hint?: string);
15
+ }
16
+ /** Structured error envelope for AI Agent consumption. */
17
+ export interface ErrorEnvelope {
18
+ error: {
19
+ code: string;
20
+ message: string;
21
+ hint?: string;
22
+ };
23
+ }
24
+ /**
25
+ * Signal thrown after dry-run output is printed.
26
+ * Not a real error — used to short-circuit command execution cleanly.
27
+ */
28
+ export declare class DryRunSignal {
29
+ readonly isDryRun = true;
30
+ }
31
+ export declare function toErrorEnvelope(e: unknown): ErrorEnvelope;
package/dist/errors.js ADDED
@@ -0,0 +1,58 @@
1
+ export class BportalError extends Error {
2
+ code;
3
+ hint;
4
+ constructor(message, code = 'BPORTAL_ERROR', hint) {
5
+ super(message);
6
+ this.code = code;
7
+ this.hint = hint;
8
+ this.name = 'BportalError';
9
+ }
10
+ }
11
+ export class ConfigError extends BportalError {
12
+ constructor(message, hint) {
13
+ super(message, 'CONFIG_ERROR', hint);
14
+ this.name = 'ConfigError';
15
+ }
16
+ }
17
+ export class AuthRequiredError extends BportalError {
18
+ constructor() {
19
+ super('API Key 未配置', 'AUTH_REQUIRED', '执行: mc auth login --api-key SK_xxx 或设置环境变量 BPORTAL_API_KEY');
20
+ this.name = 'AuthRequiredError';
21
+ }
22
+ }
23
+ export class ApiError extends BportalError {
24
+ errCode;
25
+ constructor(errCode, message, hint) {
26
+ super(message, errCode, hint);
27
+ this.errCode = errCode;
28
+ this.name = 'ApiError';
29
+ }
30
+ }
31
+ /**
32
+ * Signal thrown after dry-run output is printed.
33
+ * Not a real error — used to short-circuit command execution cleanly.
34
+ */
35
+ export class DryRunSignal {
36
+ isDryRun = true;
37
+ }
38
+ export function toErrorEnvelope(e) {
39
+ if (e instanceof BportalError) {
40
+ return {
41
+ error: {
42
+ code: e.code,
43
+ message: e.message,
44
+ ...(e.hint ? { hint: e.hint } : {}),
45
+ },
46
+ };
47
+ }
48
+ // Axios errors are handled separately in error-handler
49
+ const message = e instanceof Error ? e.message : String(e);
50
+ return {
51
+ error: {
52
+ code: 'UNKNOWN_ERROR',
53
+ message,
54
+ hint: '请检查输入参数或联系技术支持',
55
+ },
56
+ };
57
+ }
58
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,YAAa,SAAQ,KAAK;IAGnB;IACA;IAHlB,YACE,OAAe,EACC,OAAe,eAAe,EAC9B,IAAa;QAE7B,KAAK,CAAC,OAAO,CAAC,CAAC;QAHC,SAAI,GAAJ,IAAI,CAA0B;QAC9B,SAAI,GAAJ,IAAI,CAAS;QAG7B,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;IAC7B,CAAC;CACF;AAED,MAAM,OAAO,WAAY,SAAQ,YAAY;IAC3C,YAAY,OAAe,EAAE,IAAa;QACxC,KAAK,CAAC,OAAO,EAAE,cAAc,EAAE,IAAI,CAAC,CAAC;QACrC,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;IAC5B,CAAC;CACF;AAED,MAAM,OAAO,iBAAkB,SAAQ,YAAY;IACjD;QACE,KAAK,CACH,aAAa,EACb,eAAe,EACf,4DAA4D,CAC7D,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;IAClC,CAAC;CACF;AAED,MAAM,OAAO,QAAS,SAAQ,YAAY;IAEtB;IADlB,YACkB,OAAe,EAC/B,OAAe,EACf,IAAa;QAEb,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QAJd,YAAO,GAAP,OAAO,CAAQ;QAK/B,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;IACzB,CAAC;CACF;AAWD;;;GAGG;AACH,MAAM,OAAO,YAAY;IACd,QAAQ,GAAG,IAAI,CAAC;CAC1B;AAED,MAAM,UAAU,eAAe,CAAC,CAAU;IACxC,IAAI,CAAC,YAAY,YAAY,EAAE,CAAC;QAC9B,OAAO;YACL,KAAK,EAAE;gBACL,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,OAAO,EAAE,CAAC,CAAC,OAAO;gBAClB,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACpC;SACF,CAAC;IACJ,CAAC;IAED,uDAAuD;IACvD,MAAM,OAAO,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAC3D,OAAO;QACL,KAAK,EAAE;YACL,IAAI,EAAE,eAAe;YACrB,OAAO;YACP,IAAI,EAAE,gBAAgB;SACvB;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,7 @@
1
+ export declare const SITE_ID = "4px";
2
+ export declare const ENV = "prod";
3
+ export declare const BASE_URL = "https://b.4px.com";
4
+ export declare const AK_URL = "https://b.4px.com/site/ak-manage";
5
+ export declare const PACKAGE_NAME = "cbs-4px-merchant-cli";
6
+ export declare const BIN_NAME = "fmc";
7
+ export declare const REGISTRY = "https://registry.npmjs.org";
@@ -0,0 +1,9 @@
1
+ // Auto-generated by scripts/build.js. DO NOT EDIT.
2
+ export const SITE_ID = "4px";
3
+ export const ENV = "prod";
4
+ export const BASE_URL = "https://b.4px.com";
5
+ export const AK_URL = "https://b.4px.com/site/ak-manage";
6
+ export const PACKAGE_NAME = "cbs-4px-merchant-cli";
7
+ export const BIN_NAME = "fmc";
8
+ export const REGISTRY = "https://registry.npmjs.org";
9
+ //# sourceMappingURL=site.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"site.js","sourceRoot":"","sources":["../../src/generated/site.ts"],"names":[],"mappings":"AAAA,mDAAmD;AACnD,MAAM,CAAC,MAAM,OAAO,GAAG,KAAK,CAAC;AAC7B,MAAM,CAAC,MAAM,GAAG,GAAG,MAAM,CAAC;AAC1B,MAAM,CAAC,MAAM,QAAQ,GAAG,mBAAmB,CAAC;AAC5C,MAAM,CAAC,MAAM,MAAM,GAAG,kCAAkC,CAAC;AACzD,MAAM,CAAC,MAAM,YAAY,GAAG,sBAAsB,CAAC;AACnD,MAAM,CAAC,MAAM,QAAQ,GAAG,KAAK,CAAC;AAC9B,MAAM,CAAC,MAAM,QAAQ,GAAG,4BAA4B,CAAC"}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/dist/index.js ADDED
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env node
2
+ import { buildProgram } from './cli.js';
3
+ const program = buildProgram();
4
+ await program.parseAsync(process.argv);
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAExC,MAAM,OAAO,GAAG,YAAY,EAAE,CAAC;AAC/B,MAAM,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC"}
@@ -0,0 +1,20 @@
1
+ import { ConfigManager } from './config-manager.js';
2
+ import type { GlobalOptions, TrackDetailDTO, LabelPrintDTO, OrderDetailResp, ProductRecommendDTO, ProductRecommendRequest, ClaimListResp, ClaimListRequest } from '../types/index.js';
3
+ export declare class ApiClient {
4
+ private readonly config;
5
+ private readonly verbose;
6
+ private readonly dryRun;
7
+ constructor(config: ConfigManager, options?: GlobalOptions);
8
+ private createHttp;
9
+ private get;
10
+ private post;
11
+ /** Build a dry-run summary object for a GET request (no network call). */
12
+ dryRunInfo(path: string, params: Record<string, string>, withAuth: boolean): Promise<Record<string, unknown>>;
13
+ /** Build a dry-run summary object for a POST request (no network call). */
14
+ dryRunPostInfo(path: string, body: Record<string, unknown>, withAuth: boolean): Promise<Record<string, unknown>>;
15
+ getTrackDetail(orderNo: string): Promise<TrackDetailDTO>;
16
+ getLabelPrint(orderNo: string): Promise<LabelPrintDTO>;
17
+ getOrderDetail(orderNo: string): Promise<OrderDetailResp>;
18
+ getProductRecommend(request: ProductRecommendRequest): Promise<ProductRecommendDTO>;
19
+ listClaim(request: ClaimListRequest): Promise<ClaimListResp>;
20
+ }
@@ -0,0 +1,141 @@
1
+ import axios from 'axios';
2
+ import { ApiError, DryRunSignal } from '../errors.js';
3
+ export class ApiClient {
4
+ config;
5
+ verbose;
6
+ dryRun;
7
+ constructor(config, options) {
8
+ this.config = config;
9
+ this.verbose = options?.verbose ?? false;
10
+ this.dryRun = options?.dryRun ?? false;
11
+ }
12
+ async createHttp(withAuth) {
13
+ const baseURL = await this.config.resolveBaseUrl();
14
+ const headers = {
15
+ 'Content-Type': 'application/json',
16
+ };
17
+ if (withAuth) {
18
+ const apiKey = await this.config.requireApiKey();
19
+ headers['Authorization'] = `Bearer ${apiKey}`;
20
+ }
21
+ return axios.create({ baseURL, headers, timeout: 15000 });
22
+ }
23
+ async get(path, params, withAuth) {
24
+ if (this.dryRun) {
25
+ const info = await this.dryRunInfo(path, params, withAuth);
26
+ console.log(JSON.stringify(info, null, 2));
27
+ throw new DryRunSignal();
28
+ }
29
+ const http = await this.createHttp(withAuth);
30
+ const baseURL = await this.config.resolveBaseUrl();
31
+ if (this.verbose) {
32
+ const queryString = new URLSearchParams(params).toString();
33
+ const fullUrl = `${baseURL}${path}?${queryString}`;
34
+ process.stderr.write(`> GET ${fullUrl}\n`);
35
+ const authHeader = withAuth ? 'Bearer ****' : '(none)';
36
+ process.stderr.write(`> Authorization: ${authHeader}\n`);
37
+ }
38
+ const res = await http.get(path, { params });
39
+ if (this.verbose) {
40
+ process.stderr.write(`< ${res.status} ${res.statusText}\n`);
41
+ }
42
+ const resp = res.data;
43
+ if (!resp.success) {
44
+ throw new ApiError(resp.errCode, resp.errMsg, '请检查单号是否正确、API Key 是否有对应权限,或稍后重试');
45
+ }
46
+ return resp.data;
47
+ }
48
+ async post(path, params, withAuth) {
49
+ if (this.dryRun) {
50
+ const info = await this.dryRunPostInfo(path, params, withAuth);
51
+ console.log(JSON.stringify(info, null, 2));
52
+ throw new DryRunSignal();
53
+ }
54
+ const http = await this.createHttp(withAuth);
55
+ const baseURL = await this.config.resolveBaseUrl();
56
+ // Solon @Param reads from query string / form params, not JSON body
57
+ const formParams = new URLSearchParams();
58
+ for (const [k, v] of Object.entries(params)) {
59
+ if (v != null)
60
+ formParams.append(k, String(v));
61
+ }
62
+ if (this.verbose) {
63
+ const fullUrl = `${baseURL}${path}`;
64
+ process.stderr.write(`> POST ${fullUrl}\n`);
65
+ process.stderr.write(`> Params: ${formParams.toString()}\n`);
66
+ const authHeader = withAuth ? 'Bearer ****' : '(none)';
67
+ process.stderr.write(`> Authorization: ${authHeader}\n`);
68
+ }
69
+ const res = await http.post(path, formParams.toString(), {
70
+ headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
71
+ });
72
+ if (this.verbose) {
73
+ process.stderr.write(`< ${res.status} ${res.statusText}\n`);
74
+ }
75
+ const resp = res.data;
76
+ if (!resp.success) {
77
+ throw new ApiError(resp.errCode, resp.errMsg, '请检查参数是否正确、API Key 是否有对应权限,或稍后重试');
78
+ }
79
+ return resp.data;
80
+ }
81
+ /** Build a dry-run summary object for a GET request (no network call). */
82
+ async dryRunInfo(path, params, withAuth) {
83
+ const baseURL = await this.config.resolveBaseUrl();
84
+ return {
85
+ method: 'GET',
86
+ url: `${baseURL}${path}`,
87
+ params,
88
+ auth: withAuth ? 'Bearer ****' : 'none',
89
+ };
90
+ }
91
+ /** Build a dry-run summary object for a POST request (no network call). */
92
+ async dryRunPostInfo(path, body, withAuth) {
93
+ const baseURL = await this.config.resolveBaseUrl();
94
+ return {
95
+ method: 'POST',
96
+ url: `${baseURL}${path}`,
97
+ body,
98
+ auth: withAuth ? 'Bearer ****' : 'none',
99
+ };
100
+ }
101
+ async getTrackDetail(orderNo) {
102
+ return this.get('/api/bportal/tools/track/detail', { orderNo }, true);
103
+ }
104
+ async getLabelPrint(orderNo) {
105
+ return this.get('/api/bportal/tools/label/print', { orderNo }, true);
106
+ }
107
+ async getOrderDetail(orderNo) {
108
+ return this.get('/api/bportal/tools/order/detail', { orderNo }, true);
109
+ }
110
+ async getProductRecommend(request) {
111
+ const body = { country: request.country };
112
+ if (request.startCity)
113
+ body.startCity = request.startCity;
114
+ if (request.weight != null)
115
+ body.weight = request.weight;
116
+ if (request.postCode)
117
+ body.postCode = request.postCode;
118
+ if (request.isBattery)
119
+ body.isBattery = request.isBattery;
120
+ if (request.declareValue != null)
121
+ body.declareValue = request.declareValue;
122
+ return this.post('/api/bportal/tools/product/recommend', body, true);
123
+ }
124
+ async listClaim(request) {
125
+ const body = {};
126
+ if (request.createdStartTime)
127
+ body.createdStartTime = request.createdStartTime;
128
+ if (request.createdEndTime)
129
+ body.createdEndTime = request.createdEndTime;
130
+ if (request.claimStatus)
131
+ body.claimStatus = request.claimStatus;
132
+ if (request.bizNoList)
133
+ body.bizNoList = request.bizNoList;
134
+ if (request.pageNum != null)
135
+ body.pageNum = request.pageNum;
136
+ if (request.pageSize != null)
137
+ body.pageSize = request.pageSize;
138
+ return this.post('/api/bportal/tools/claim/list', body, true);
139
+ }
140
+ }
141
+ //# sourceMappingURL=api-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-client.js","sourceRoot":"","sources":["../../src/services/api-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { BportalConfig } from '../types/index.js';
2
+ export declare class ConfigManager {
3
+ load(): Promise<BportalConfig>;
4
+ save(config: BportalConfig): Promise<void>;
5
+ set<K extends keyof BportalConfig>(key: K, value: BportalConfig[K]): Promise<void>;
6
+ get<K extends keyof BportalConfig>(key: K): Promise<BportalConfig[K]>;
7
+ resolveBaseUrl(): Promise<string>;
8
+ resolveApiKey(): Promise<string | undefined>;
9
+ requireApiKey(): Promise<string>;
10
+ }