bfi-cli 0.1.75 → 0.1.77

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/cli.mjs +210 -7
  2. package/package.json +1 -1
package/dist/cli.mjs CHANGED
@@ -8240,7 +8240,7 @@ async function runYmc(args, globalOpts) {
8240
8240
  const token = globalOpts.token;
8241
8241
  const api = new YmcApi(token ?? null, void 0, dryRun);
8242
8242
  if (!sub || sub === "--help" || sub === "-h") {
8243
- printHelp$1();
8243
+ printHelp$2();
8244
8244
  return;
8245
8245
  }
8246
8246
  if (sub === "help") {
@@ -8583,6 +8583,12 @@ async function runYmc(args, globalOpts) {
8583
8583
  const sub2 = rest[0] || "search";
8584
8584
  const rest2 = rest.slice(1);
8585
8585
  const searchBase = (process.env.BFI_WIKI_BASE || YMC_DEFAULT_BASE.replace(/\/api\/v2$/, "/api/v1")) + "/search/";
8586
+ const wikiToken = api.token;
8587
+ if (!wikiToken) {
8588
+ console.error("未认证。先运行:bfi auth login --token <sk-token>(或传 --token)");
8589
+ process.exit(1);
8590
+ }
8591
+ const authHeaders = { Authorization: `Bearer ${wikiToken}` };
8586
8592
  if (sub2 === "search") {
8587
8593
  const kw = positionals(rest2)[0];
8588
8594
  if (!kw) {
@@ -8602,6 +8608,7 @@ async function runYmc(args, globalOpts) {
8602
8608
  const req = mod.request(searchBase + "unified", {
8603
8609
  method: "POST",
8604
8610
  headers: {
8611
+ ...authHeaders,
8605
8612
  "Content-Type": "application/json",
8606
8613
  Accept: "application/json",
8607
8614
  "Content-Length": Buffer.byteLength(payload)
@@ -8623,7 +8630,7 @@ async function runYmc(args, globalOpts) {
8623
8630
  }
8624
8631
  const parsed = JSON.parse(raw0(resp));
8625
8632
  if (parsed.code !== 0) {
8626
- console.error(`✗ ${parsed.msg}`);
8633
+ console.error(`✗ ${parsed.msg ?? parsed.detail ?? JSON.stringify(parsed).slice(0, 200)}`);
8627
8634
  process.exit(1);
8628
8635
  }
8629
8636
  console.log(JSON.stringify(parsed.data, null, 2));
@@ -8644,6 +8651,7 @@ async function runYmc(args, globalOpts) {
8644
8651
  const req = mod.request(searchBase + "detail", {
8645
8652
  method: "POST",
8646
8653
  headers: {
8654
+ ...authHeaders,
8647
8655
  "Content-Type": "application/json",
8648
8656
  Accept: "application/json",
8649
8657
  "Content-Length": Buffer.byteLength(payload)
@@ -8665,7 +8673,7 @@ async function runYmc(args, globalOpts) {
8665
8673
  }
8666
8674
  const parsed = JSON.parse(raw0(resp));
8667
8675
  if (parsed.code !== 0) {
8668
- console.error(`✗ ${parsed.msg}`);
8676
+ console.error(`✗ ${parsed.msg ?? parsed.detail ?? JSON.stringify(parsed).slice(0, 200)}`);
8669
8677
  process.exit(1);
8670
8678
  }
8671
8679
  const d = parsed.data;
@@ -8806,7 +8814,7 @@ async function runYmc(args, globalOpts) {
8806
8814
  }
8807
8815
  default:
8808
8816
  console.error(`未知子命令:${sub}`);
8809
- printHelp$1();
8817
+ printHelp$2();
8810
8818
  process.exit(1);
8811
8819
  }
8812
8820
  }
@@ -8927,7 +8935,11 @@ const HELP = {
8927
8935
  call: `bfi ymc call <route> -e <env> [--data '<json>'] [-t <time> | --start-time <s> --end-time <e>] [--timeout <秒>] [--json]
8928
8936
  通用透传:覆盖全部注册表端点(warningCall/warningSql/exceptionHistory/bpr/list/alert/detail/tool/list/app/history/environment/uba/query ...)。
8929
8937
  完整清单与参数声明:curl http://172.20.35.178:8901/openapi.json 或 /docs(Swagger UI)。
8930
- 时间参数(-t/--start-time/--end-time)由服务端按端点 time_fields 展开为 beginTs/endTs 等。
8938
+ 时间参数(-t/--start-time/--end-time)由服务端按端点 time_fields 展开为 beginTs/endTs 等——
8939
+ 禁止在 --data JSON 里手传 start/end/start_time(数字 422、字符串被忽略返回空)。
8940
+ ⚠️ app/history、jvm/history 等资源端点的 appId 必须带环境前缀(如 stage-dc-core1-<appCode>,
8941
+ 可用 bfi ymc call app/list --data '{"keyword":"<appCode>"}' 查得);CLI 的 --app 参数则传裸名。
8942
+ 数据可能为空(覆盖不全)——一次空即换通道,不做参数变体重试。
8931
8943
  示例:
8932
8944
  bfi ymc call warningCallstat --data '{"curAppCode":"yonbip-scm-scmmp","page":1,"pageSize":10}' -e core3 -t 1h
8933
8945
  bfi ymc call app/history --data '{"appId":"daily-x","queryType":"podCpuUsage"}' -e daily -t 1d`
@@ -8937,11 +8949,11 @@ function printCommandHelp(cmd) {
8937
8949
  if (h) console.log(h);
8938
8950
  else {
8939
8951
  console.error(`未知子命令:${cmd}`);
8940
- printHelp$1();
8952
+ printHelp$2();
8941
8953
  process.exit(1);
8942
8954
  }
8943
8955
  }
8944
- function printHelp$1() {
8956
+ function printHelp$2() {
8945
8957
  console.log(`
8946
8958
  bfi ymc — 观测查询(v2 API:YMC/Kibana/SLS/trace)
8947
8959
 
@@ -8985,6 +8997,194 @@ bfi ymc — 观测查询(v2 API:YMC/Kibana/SLS/trace)
8985
8997
  详细帮助:bfi ymc help <命令>(或 bfi ymc <命令> -h)——含参数说明/默认值/示例。
8986
8998
  `);
8987
8999
  }
9000
+ const METRICS = [
9001
+ "entry",
9002
+ "fail",
9003
+ "costtime",
9004
+ "content"
9005
+ ];
9006
+ const RESOURCES = [
9007
+ "type-doc",
9008
+ "type-info",
9009
+ "listener-doc"
9010
+ ];
9011
+ function printHelp$1() {
9012
+ console.log(`bfi event — YonBIP 事件中心取数(诊断编排见 bfi-diagnose-event 技能)
9013
+
9014
+ 用法:
9015
+ bfi event monitor <metric> [过滤参数]
9016
+ metric: entry|fail|costtime|content
9017
+ 过滤: --log-date D --source-id S --event-type-code ET --node-code N --datacenter DC --size N
9018
+ bfi event master <resource> [action[:target]]
9019
+ resource: type-doc|type-info|listener-doc
9020
+ action[:target]:
9021
+ list | code:<编码> | id:<ID> | latest:<源ID,类型编码> | source-type:<源ID,类型编码>
9022
+ source-node:<源ID,节点编码> | event-type:<类型编码> | micro-service:<微服务编码>
9023
+ bfi event stat <dc> <date> [metric_type] [--page N] [--size N]
9024
+ date: yyyy-MM-dd 单日;metric_type: enter|fail|response_time_4s_|response_time_2s_4s|body_size_512k_1m|body_size_1m_
9025
+ bfi event record <dc> <date> --source-id S --event-type ET --node-code N --ds-code DS [--record-status fail] [--record-id ID] [--tenant-code T] [--size ≤20]
9026
+ bfi event content <dc> <date> --event-id E --ds-code DS --tenant-code T
9027
+ bfi event dclist <dc>
9028
+ 全局: --json / --dry-run / --token <tok>
9029
+
9030
+ 示例:
9031
+ bfi event master type-doc code:PC_PRODUCT_STOP
9032
+ bfi event dclist core1
9033
+ bfi event stat core1 2026-09-14 fail
9034
+ bfi event record core1 2026-09-14 --source-id MULILANG --event-type MULILANGCHANGE --node-code N --ds-code YonBip_core1_2_service`);
9035
+ }
9036
+ function missing(name) {
9037
+ console.error(`缺少参数 ${name}。运行 bfi event --help 查看用法。`);
9038
+ process.exit(1);
9039
+ }
9040
+ async function runEvent(args, globalOpts) {
9041
+ const sub = args[0];
9042
+ const rest = args.slice(1);
9043
+ if (!sub || sub === "--help" || sub === "-h" || flag(rest, "--help") || flag(rest, "-h")) {
9044
+ printHelp$1();
9045
+ return;
9046
+ }
9047
+ const jsonMode = flag(rest, "--json");
9048
+ const dryRun = flag(rest, "--dry-run");
9049
+ const api = new YmcApi(globalOpts.token ?? null, void 0, dryRun);
9050
+ if (!dryRun && !api.token) {
9051
+ console.error("未认证。先运行:bfi auth login --token <sk-token>(或传 --token)");
9052
+ process.exit(1);
9053
+ }
9054
+ const reqs = positionals(rest);
9055
+ const call = async (path, body) => emit(await api.call(path, body), jsonMode);
9056
+ const num = (name, dflt) => Number(opt(rest, name) ?? dflt);
9057
+ const str = (name) => opt(rest, name);
9058
+ if (sub === "monitor") {
9059
+ const metric = reqs[0];
9060
+ if (!metric || !METRICS.includes(metric)) {
9061
+ console.error("缺少/无效 metric(entry|fail|costtime|content)。例:bfi event monitor fail");
9062
+ process.exit(1);
9063
+ }
9064
+ const body = {
9065
+ metric,
9066
+ size: num("--size", 200)
9067
+ };
9068
+ for (const [cliName, key] of Object.entries({
9069
+ "--log-date": "log_date",
9070
+ "--source-id": "source_id",
9071
+ "--event-type-code": "event_type_code",
9072
+ "--node-code": "node_code",
9073
+ "--datacenter": "datacenter"
9074
+ })) {
9075
+ const v = str(cliName);
9076
+ if (v) body[key] = v;
9077
+ }
9078
+ await call("event/monitor", body);
9079
+ return;
9080
+ }
9081
+ if (sub === "master") {
9082
+ const resource = reqs[0];
9083
+ if (!resource || !RESOURCES.includes(resource)) {
9084
+ console.error("缺少/无效 resource(type-doc|type-info|listener-doc)。例:bfi event master type-doc code:PC_PRODUCT_STOP");
9085
+ process.exit(1);
9086
+ }
9087
+ let action = "list";
9088
+ let target;
9089
+ const second = reqs[1];
9090
+ if (second && second.includes(":")) {
9091
+ const i = second.indexOf(":");
9092
+ action = second.slice(0, i);
9093
+ target = second.slice(i + 1);
9094
+ } else if (second) {
9095
+ action = "code";
9096
+ target = second;
9097
+ }
9098
+ await call("event/master", {
9099
+ resource,
9100
+ action,
9101
+ target,
9102
+ query: {
9103
+ page: num("--page", 0),
9104
+ size: num("--size", 200)
9105
+ }
9106
+ });
9107
+ return;
9108
+ }
9109
+ if (sub === "stat") {
9110
+ const dc = reqs[0];
9111
+ const date = reqs[1];
9112
+ if (!dc || !date) {
9113
+ console.error("用法: bfi event stat <dc> <date> [metric_type]");
9114
+ process.exit(1);
9115
+ }
9116
+ await call("event/stat", {
9117
+ dc,
9118
+ date,
9119
+ metric_type: reqs[2] ?? "fail",
9120
+ page: num("--page", 0),
9121
+ size: num("--size", 1e3)
9122
+ });
9123
+ return;
9124
+ }
9125
+ if (sub === "record") {
9126
+ const dc = reqs[0];
9127
+ const date = reqs[1];
9128
+ if (!dc || !date) {
9129
+ console.error("用法: bfi event record <dc> <date> --source-id S --event-type ET --node-code N --ds-code DS");
9130
+ process.exit(1);
9131
+ }
9132
+ const sourceId = str("--source-id");
9133
+ const eventType = str("--event-type");
9134
+ const nodeCode = str("--node-code");
9135
+ const dsCode = str("--ds-code");
9136
+ if (!sourceId) missing("--source-id");
9137
+ if (!eventType) missing("--event-type");
9138
+ if (!nodeCode) missing("--node-code");
9139
+ if (!dsCode) missing("--ds-code");
9140
+ const body = {
9141
+ dc,
9142
+ date,
9143
+ source_id: sourceId,
9144
+ event_type: eventType,
9145
+ node_code: nodeCode,
9146
+ ds_code: dsCode,
9147
+ record_status: str("--record-status") ?? "fail",
9148
+ size: num("--size", 20)
9149
+ };
9150
+ const rid = str("--record-id");
9151
+ if (rid) body.record_id = rid;
9152
+ const tc = str("--tenant-code");
9153
+ if (tc) body.tenant_code = tc;
9154
+ await call("event/record", body);
9155
+ return;
9156
+ }
9157
+ if (sub === "content") {
9158
+ const dc = reqs[0];
9159
+ const date = reqs[1];
9160
+ const eventId = str("--event-id");
9161
+ const dsCode = str("--ds-code");
9162
+ const tenantCode = str("--tenant-code");
9163
+ if (!dc || !date || !eventId || !dsCode || !tenantCode) {
9164
+ console.error("用法: bfi event content <dc> <date> --event-id E --ds-code DS --tenant-code T");
9165
+ process.exit(1);
9166
+ }
9167
+ await call("event/content", {
9168
+ dc,
9169
+ date,
9170
+ event_id: eventId,
9171
+ ds_code: dsCode,
9172
+ tenant_code: tenantCode
9173
+ });
9174
+ return;
9175
+ }
9176
+ if (sub === "dclist") {
9177
+ const dc = reqs[0];
9178
+ if (!dc) {
9179
+ console.error("用法: bfi event dclist <dc>");
9180
+ process.exit(1);
9181
+ }
9182
+ await call("event/dclist", { dc });
9183
+ return;
9184
+ }
9185
+ console.error(`未知子命令: ${sub}。运行 bfi event --help`);
9186
+ process.exit(1);
9187
+ }
8988
9188
  function loadSourceMapConsumer() {
8989
9189
  return createRequire(import.meta.url)("source-map").SourceMapConsumer;
8990
9190
  }
@@ -9670,6 +9870,9 @@ async function main() {
9670
9870
  case "fe-locate":
9671
9871
  await runFeLocate(restArgs, globalOpts);
9672
9872
  break;
9873
+ case "event":
9874
+ await runEvent(restArgs, globalOpts);
9875
+ break;
9673
9876
  case "auth":
9674
9877
  if (restArgs[0] === "logout") await runLogout();
9675
9878
  else if (restArgs[0] === "whoami") await runWhoami(globalOpts);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bfi-cli",
3
- "version": "0.1.75",
3
+ "version": "0.1.77",
4
4
  "description": "用友大业财BFI统一命令行工具,支持技能,技能包,元数据,UI元数据等",
5
5
  "type": "module",
6
6
  "bin": {